/* ======================================= GLOBAL ======================================= */
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html {
  font-size: 16px;
}

html,
body {
  margin: 0;
  padding: 0;
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: #000;
  color: #fff;
  overflow: hidden;
  position: relative;
}

:root {
  --random-x: 0;
  --random-y: 0;
  --random-scale: 1;
  --random-rotate: 0deg;
  --random-skew: 0deg;
  --random-grayscale: 0%;
  --cut-random-x: 0;
  --cut-random-y: 0;
  --cut-random-skew-x: 0deg;
  --cut-random-skew-y: 0deg;
  --cut-random-scale: 1;
  --cut-random-hue: 0deg;
}

body {
  font-family: "fit-ultra-extended", sans-serif;
}

.font-hidden {
  font-family: sans-serif;
  visibility: hidden;
}

/* ======================================= TITLE ? fixed, perfectly centered ======================================= */
#title {
  position: absolute;
  top: 49%;
  left: 50%;
  transform: translate(-50%, -50%);
  font-family: "fit-ultra-extended", sans-serif;
  font-weight: 400;
  color: #fff;
  user-select: none;
  cursor: pointer;
  transition: font-size 0.08s;
  font-size: 4.5rem;
  animation: subtleAnimation 5s infinite;
  z-index: 999999 !important;
  will-change: transform, filter;
  /* ここ重要：テキストを本体に入れないで、疑似要素で表示 */
  color: transparent;
}

#title::after {
  content: attr(data-text); /* ←！！！必要！！！ */
  display: block;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  white-space: nowrap;
  color: #fff;
}

/* MOBILE */
@media only screen and (max-width: 767px) {
  #title {
    font-family: "erotica-big", sans-serif;
    font-size: 5.7rem;
    top: 45%;
    left: 49%;
  }

  #mobileVideo1,
  #mobileVideo2,
  #mobileVideo3,
  #mobileVideo4 {
    position: absolute;
    top: 0;
    left: 0;
    width: 100vw;
    height: 100vh;
    z-index: 0;
    display: block;
  }

  .media-pair,
  .media-video,
  .jpg-container,
  .png-container,
  #specialVideo {
    display: none !important;
  }
}

/* DESKTOP */
@media only screen and (min-width: 768px) {
  #title:hover {
    font-size: 4.4rem;
    animation: grayscaleEffect 0.06s, colorInvert 0.05s forwards;
  }

  #mobileVideo1,
  #mobileVideo2,
  #mobileVideo3,
  #mobileVideo4 {
    position: absolute;
    top: 0;
    left: 0;
    width: 100vw;
    height: 100vh;
    z-index: 0;
    display: none;
  }

  .media-pair,
  .media-video,
  .jpg-container,
  .png-container,
  #specialVideo {
    display: block;
  }
}

/* iPad etc */
@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) and (orientation: portrait),
  only screen and (min-device-width: 1024px) and (max-device-width: 1366px) and (orientation: landscape) {
  #title {
    font-family: "erotica-big", sans-serif;
    font-size: 9.5rem;
    top: 40%;
    left: 49%;
  }

  #mobileVideo1,
  #mobileVideo2,
  #mobileVideo3,
  #mobileVideo4 {
    position: absolute;
    top: 0;
    left: 0;
    width: 100vw;
    height: 100vh;
    z-index: 0;
    display: none;
  }

  .jpg-container,
  .png-container {
    position: relative;
    width: 100%;
    height: auto;
    display: block;
  }

  .media-pair,
  .media-video,
  #specialVideo {
    display: block;
  }
}

/* ======================================= STATIC LAYERS & GLITCH ELEMENTS ======================================= */
.blue-overlay {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 102, 0.04);
  z-index: 12000;
  pointer-events: none;
}

img,
video {
  animation: stretch2 0.1s;
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  z-index: 10000;
}
.glitch-lite {
    animation: glitchLite 0.15s steps(2, jump-end) 1;
}

@keyframes glitchLite {
    0%   { transform: translateX(0);    filter: none; }
    30%  { transform: translateX(3px);  filter: hue-rotate(45deg) contrast(200%); }
    60%  { transform: translateX(-3px); filter: hue-rotate(-45deg) contrast(250%); }
    100% { transform: translateX(0);    filter: none; }
}

/* ======================================= ANIMATIONS ======================================= */
@keyframes stretch2 {
  0% { transform: scale(0) }
  10% { transform: scale(4) }
  15% { transform: scale(6) }
  20% { transform: scale(3) }
  50% { transform: scaleX(1) }
  80% { transform: scale(4) }
  100% { transform: scale(0) }
}

@keyframes glitch {
  0% { transform: translate(0) }
  20% { transform: translate(-100px, -10px) }
  40% { transform: translate(10px, 10px) }
  60% { transform: translate(-10px, 10px) }
  80% { transform: translate(10px, -100px) }
  100% { transform: translate(0) }
}

@keyframes glitch2 {
  0% {
    transform: translate(0,0) scale(1) rotate(0deg) skew(0deg);
    filter: grayscale(0) hue-rotate(0deg);
  }
  20% {
    transform: translate(var(--random-x), var(--random-y)) scale(var(--random-scale)) rotate(var(--random-rotate)) skew(var(--random-skew));
    filter: grayscale(var(--random-grayscale)) hue-rotate(calc(var(--random-rotate) * 10));
  }
  40% {
    transform: translate(calc(var(--random-x) * -1), calc(var(--random-y) * -1)) scale(calc(var(--random-scale) + 0.1)) rotate(calc(var(--random-rotate) * -1)) skew(calc(var(--random-skew) * -1));
    filter: grayscale(calc(var(--random-grayscale) + 20%)) hue-rotate(calc(var(--random-rotate) * -10));
  }
  60% {
    transform: translate(var(--random-x), var(--random-y)) scale(var(--random-scale)) rotate(var(--random-rotate)) skew(var(--random-skew));
    filter: grayscale(var(--random-grayscale)) hue-rotate(calc(var(--random-rotate) * 5));
  }
  80% {
    transform: translate(calc(var(--random-x) * -1), calc(var(--random-y) * -1)) scale(calc(var(--random-scale) - 0.1)) rotate(calc(var(--random-rotate) * -1)) skew(calc(var(--random-skew) * -1));
    filter: grayscale(calc(var(--random-grayscale) + 10%)) hue-rotate(calc(var(--random-rotate) * -5));
  }
  100% {
    transform: translate(0,0) scale(1) rotate(0deg) skew(0deg);
    filter: grayscale(0) hue-rotate(0deg);
  }
}

.glitch2 {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 10110;
  animation: glitch2 0.5s steps(10) infinite, shake 0.05s infinite alternate, grayscaleEffect 0.05s infinite;
  transform-origin: left top;
}

@keyframes cutEffect {
  0% {
    transform: translate(0,0) skew(0deg,0deg) scale(1);
    filter: grayscale(0) hue-rotate(0deg);
  }
  20% {
    transform: translate(var(--cut-random-x), var(--cut-random-y))
      skew(var(--cut-random-skew-x), var(--cut-random-skew-y))
      scale(var(--cut-random-scale));
    filter: grayscale(var(--random-grayscale)) hue-rotate(var(--cut-random-hue));
  }
  40% {
    transform: translate(calc(var(--cut-random-x) * -1), calc(var(--cut-random-y) * -1))
      skew(calc(var(--cut-random-skew-x) * -1), calc(var(--cut-random-skew-y) * -1))
      scale(calc(var(--cut-random-scale) + 0.1));
    filter: grayscale(calc(var(--random-grayscale) + 30%)) hue-rotate(calc(var(--cut-random-hue) * -1));
  }
  60% {
    transform: translate(var(--cut-random-x), var(--cut-random-y))
      skew(var(--cut-random-skew-x), var(--cut-random-skew-y))
      scale(var(--cut-random-scale));
    filter: grayscale(var(--random-grayscale)) hue-rotate(var(--cut-random-hue));
  }
  80% {
    transform: translate(calc(var(--cut-random-x) * -1), calc(var(--cut-random-y) * -1))
      skew(calc(var(--cut-random-skew-x) * -1), calc(var(--cut-random-skew-y) * -1))
      scale(calc(var(--cut-random-scale) - 0.1));
    filter: grayscale(calc(var(--random-grayscale) + 20%)) hue-rotate(calc(var(--cut-random-hue) * .5));
  }
  100% {
    transform: translate(0,0) skew(0deg,0deg) scale(1);
    filter: grayscale(0) hue-rotate(0deg);
  }
}

.cut-effect {
  position: absolute;
  width: 100%;
  height: 100%;
  overflow: hidden;
  background-size: cover;
  background-repeat: no-repeat;
  mix-blend-mode: darken;
  animation: cutEffect 1.5s ease-in-out, shake 0.2s infinite alternate, grayscaleEffect 0.5s infinite;
}

@keyframes grayscaleEffect {
  0% { filter: grayscale(0%) }
  100% { filter: grayscale(100%) }
}

@keyframes colorInvert {
  0% { color: inherit }
  50% { color: #000 }
  100% { color: inherit }
}

h1.glitch3 {
  animation: grayscaleEffect 0.3s infinite, colorInvert 0.2s forwards;
}

@keyframes subtleAnimation {
  0% { opacity: 1 }
  90% { opacity: 1 }
  91% { opacity: .1 }
  92% { opacity: .2 }
  93% { opacity: .3 }
  94% { opacity: .4 }
  95% { opacity: 1 }
  96% { opacity: 1 }
  97% { opacity: .9 }
  98% { opacity: 1 }
  99% { opacity: .9 }
  100% { opacity: 1 }
}

@keyframes noiseAnimation2 {
  0% { transform: translate(1%,1%) skewX(0) matrix(1.1,0,0,1.1,0,0) }
  25% { transform: translate(2%,-2%) skewX(-1deg) matrix(1.1,0,0,1.1,0,0) }
  50% { transform: translate(-1%,1%) skewY(10deg) matrix(1.1,0,0,1.1,0,0) }
  75% { transform: translate(-2%,2%) skewX(1.5deg) matrix(1.1,0,0,1.1,0,0) }
  100%{ transform: translate(1%,1%) skewX(0) matrix(1.1,0,0,1.1,0,0) }
}

.noise-container {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 10000;
  mix-blend-mode: difference;
  transform-origin: top center;
  background-image: url(./embossed-paper.png);
  opacity: .05;
  animation: noiseAnimation2 0.05s infinite linear alternate, stretch 8.5s infinite alternate-reverse;
}

.glitch-canvas {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  mix-blend-mode: difference;
  opacity: .3;
  z-index: 10010;
  animation: stretch 0.2s infinite alternate, grayscaleEffect 0.5s infinite;
}

@keyframes noiseAnimation {
  0%,100% { transform: translate(0,0) }
  5%,10% { transform: translate(-5%,1%) }
  15%,20% { transform: translate(1%,-2%) }
  25%,30% { transform: translate(-2%,1%) }
  35%,40% { transform: translate(2%,-1%) }
  45%,50% { transform: translate(0,0) }
  55%,60% { transform: translate(5%,-2%) }
  65%,70% { transform: translate(-2%,1%) }
  75%,80% { transform: translate(2%,-1%) }
  85%,90% { transform: translate(-1%,2%) }
  95% { transform: translate(0,0) }
}

@keyframes shake {
  0%,100% { left: 0 }
  9%,29%,49%,69%,89% { transform: skewY(0.2deg) }
  10%,30%,50%,70%,90% { transform: skewX(1.2deg) }
  11%,31%,51%,71%,91% { left: -100px }
  12%,32%,52%,72%,92% { transform: skewX(0.2deg) }
  20%,40%,60%,80% { left: 100px }
}

.distorted {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 10000;
  animation: noiseAnimation 0.2s steps(50) infinite;
}

body.loaded {
  visibility: visible;
}

.hide-on-scroll {
  display: none;
}

#worldWrapper {
  width: 100%;
  height: 100%;
  transform-origin: center center;
  will-change: transform;
}

/* 全体反転 */
body.flipped-x {
  transform: scaleX(-1) rotate(0.001deg);
}

body.flipped-y {
  transform: scaleY(-1) rotate(0.001deg);
  transition: transform 0.1s linear;
}

body.flipped-x #glStage {
  transform: scaleX(-1);
}

body.flipped-y #glStage {
  transform: scaleY(-1);
}

@keyframes superGlitch {
  0% {
    transform: translate(0,0) rotate(0deg) scale(1);
    filter: hue-rotate(0deg) grayscale(0%);
  }
  10% {
    transform: translate(-2px,1px) rotate(-0.5deg) scale(1.01);
    filter: hue-rotate(15deg) grayscale(20%);
  }
  20% {
    transform: translate(3px,-1px) rotate(0.3deg) scale(.99);
    filter: hue-rotate(-10deg) grayscale(10%);
  }
  30% {
    transform: translate(-1px,2px) rotate(0.8deg) scale(1.02);
    filter: hue-rotate(5deg) grayscale(15%);
  }
  40% {
    transform: translate(2px,-2px) rotate(-0.3deg) scale(.98);
    filter: hue-rotate(-5deg) grayscale(5%);
  }
  50%,
  100% {
    transform: translate(0,0) rotate(0deg) scale(1);
    filter: hue-rotate(0deg) grayscale(0%);
  }
}

.super-glitch {
  animation: superGlitch 0.1s infinite steps(2);
  will-change: transform, filter;
}

.glitch-left {
  animation: glitchLeft 0.3s ease-out;
}

.glitch-right {
  animation: glitchRight 0.3s ease-out;
}

.glitch-top {
  animation: glitchTop 0.3s ease-out;
}

.glitch-bottom {
  animation: glitchBottom 0.3s ease-out;
}

@keyframes glitchLeft {
  0%   { transform: translate(-50%,-50%) skewX(0) }
  50%  { transform: translate(-55%,-50%) skewX(-8deg) }
  100% { transform: translate(-50%,-50%) skewX(0) }
}

@keyframes glitchRight {
  0%   { transform: translate(-50%,-50%) skewX(0) }
  50%  { transform: translate(-45%,-50%) skewX(8deg) }
  100% { transform: translate(-50%,-50%) skewX(0) }
}

@keyframes glitchTop {
  0%   { transform: translate(-50%,-50%) skewY(0) }
  50%  { transform: translate(-50%,-55%) skewY(-8deg) }
  100% { transform: translate(-50%,-50%) skewY(0) }
}

@keyframes glitchBottom {
  0%   { transform: translate(-50%,-50%) skewY(0) }
  50%  { transform: translate(-50%,-45%) skewY(8deg) }
  100% { transform: translate(-50%,-50%) skewY(0) }
}
/* =====================  SWIPE FLIP-BLIP  ===================== */
/* 連続再発火させるため：transform だけで一瞬反転、0→-1→0  */
@keyframes flipBlipY {
  0%   { transform: translateZ(0) scaleY(1); }
  49%  { transform: translateZ(0) scaleY(1); }
  50%  { transform: translateZ(0) scaleY(-1); }
  100% { transform: translateZ(0) scaleY(1); }
}

/* degrade（低FPS or prefers-reduced-motion）中は安全に無効化 */
body.flip-blip:not(.degrade) {
  animation: flipBlipY 0.18s linear;
  will-change: transform;
}

/* ===== 究極最終版：タイトルとタッチエリアを1ピクセル単位で完全一致させる ===== */
#title,
#title::after {
  pointer-events: none !important;
}

/* タッチエリアは #title と同じ位置基準を使う */
#title-tap-area {
  position: absolute;
  /* #title と同じ top / left を継承 */
  top: 49%;                      /* ← デスクトップと同じ */
  left: 50%;
  transform: translate(-50%, -50%);
  width: 460px;
  max-width: 96vw;
  height: 160px;                 /* 上下80pxずつ余裕 */
  z-index: 9999999;
  cursor: pointer;
  /* background: rgba(0,255,255,0.08); ← デバッグ用（完成したら削除） */
}

/* モバイル：#title が top:45% になるので、タッチエリアも合わせる */
@media only screen and (max-width: 767px) {
  #title-tap-area {
    top: 45%;                    /* ← #title と同じ */
    left: 49%;                   /* ← #title と同じ */
    width: 420px;
    max-width: 94vw;
    height: 150px;
  }
}

/* タブレット：#title が top:40% になるので合わせる */
@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) and (orientation: portrait),
       only screen and (min-device-width: 1024px) and (max-device-width: 1366px) and (orientation: landscape) {
  #title-tap-area {
    top: 40%;                    /* ← #title と同じ */
    left: 49%;                   /* ← #title と同じ */
    width: 520px;
    height: 180px;
  }
}