JSFiddle - React, Tailwind, and code Playground

by Young11

HTML

<div id="app" :class="{play:play}">
    <div :class="['Window-1 window', {active:active[1], prepare:prepare}]" @click="onSelect(1)">
       <div class="wrap">
         <div class="title">Появиться на точке<br> последнего выхода</div>
         <div class="hr"></div>
         <div class="title title-2">Вы не потеряете ничего</div>
       </div>
       <div class="loading-screen">
         <div class="logo"> </div>
         <div class="text">Загрузка...</div>
       </div>
     </div>
     <div :class="['Window-2 window', {gray:!spawns.window2, active:active[2], prepare:prepare}]" @click="onSelect(2)">
       <div v-if="spawns.window2" class="wrap">
         <div class="title">Появиться в своём доме</div>
         <div class="hr"> </div>
         <div class="title title-2">Содержимое инвентаря будет сброшено (кроме одежды)</div>
       </div>
       <div v-else class="wrap-lock">
         <div class="icon"> </div>
         <div class="title">Для разблокировки возможности появления<br> в доме необходимо его купить</div>
       </div>
       <div class="loading-screen">
         <div class="logo"> </div>
         <div class="text">Загрузка...</div>
       </div>
    </div>
    <div :class="['Window-3 window', {gray:!spawns.window3, active:active[3], prepare:prepare}]" @click="onSelect(3)" >
       <div v-if="spawns.window3" class="wrap">
         <div class="title">Появиться на территории фракции</div>
         <div class="hr"></div>
         <div class="title title-2">Содержимое инвентаря будет сброшено (кроме одежды)</div>
       </div>
       <div v-else="" class="wrap-lock">
         <div class="icon"> </div>
         <div class="title">Для разблокировки возможности появления<br> в фракции необходимо в неё вступить</div>
       </div>
       <div class="loading-screen">
         <div class="logo"> </div>
         <div class="text">Загрузка...</div>
       </div>
    </div> 
 </div>

CSS

.Window-1 {
  height: 100vh;
  top: 0;
  bottom: 0;
  left: 0;
  z-index: 0;
}

.Window-1:before {
  background: url("/img/window-1-bg.png") no-repeat center center;
  background-size: cover;
}

.Window-1:not(.active):hover:after {
  background: rgba(0, 44, 202, 0.2);
}

.Window-2 {
  height: 50vh;
  top: 0;
  right: 0;
  z-index: 1;
}

.Window-2:before {
  background: url("/img/window-2-bg.png") no-repeat center center;
  background-size: cover;
}

.Window-2:not(.active):not(.gray):hover:after {
  background: rgba(174, 0, 31, 0.2);
}

.Window-3 {
  height: 50vh;
  bottom: 0;
  right: 0;
  z-index: 2;
}

.Window-3:before {
  background: url("/img/window-3-bg.png") no-repeat center center;
  background-size: cover;
}

.Window-3:not(.active):not(.gray):hover:after {
  background: rgba(177, 128, 0, 0.2);
}

.window {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  width: 50%;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
      -ms-flex-direction: column;
          flex-direction: column;
  -webkit-box-pack: center;
      -ms-flex-pack: center;
          justify-content: center;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  overflow: hidden;
  position: fixed;
  -webkit-transition: width .3s, height .3s;
  transition: width .3s, height .3s;
}

.window.active {
  width: 100%;
  height: 100vh !important;
  z-index: 3 !important;
}

.window:before, .window:after {
  content: "";
  display: block;
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 0;
}

.window:before {
  -webkit-transform: scale(1.1);
          transform: scale(1.1);
  -webkit-transition: -webkit-transform .3s;
  transition: -webkit-transform .3s;
  transition: transform .3s;
  transition: transform .3s, -webkit-transform .3s;
}

.window.gray:before {
  -webkit-filter: grayscale(100%);
          filter: grayscale(100%);
}

.window:not(.active):not(.gray):hover:before {
  -webkit-transform:...

Vue

new Vue({
  el: '#app',
  data() {
    return {
      play: false,
      active: {'1':0,'2':0,'3':0},
      prepare: false,
      spawn: true,
      spawns: {
        window2: true,
        window3: false
      }
    }
  },
  methods: {
    onSelect(windowID) {
      if (this.spawn !== true && this.spawns.window2 !== true && this.spawns.window3 !== true)
        return false
        console.log(windowID)
      this.active[windowID] = true
      setTimeout(() => this.prepare = true, 6000)
      setTimeout(() => this.$emit("play", windowID), 8000)
    }
  }
});