:root {
  --bg-pink: #ffb6c8;
  --bg-pink-deep: #ff8fab;
  --bg-pink-soft: #ffe4ec;
  --line-white: rgba(255, 255, 255, 0.62);
  --line-white-soft: rgba(255, 255, 255, 0.28);
  --cloud-bg: #ffffff;
  --cloud-text: #5a3d5c;
  --shadow: rgba(90, 61, 92, 0.25);
  --sprite-shadow: 0 4px 10px rgba(90, 61, 92, 0.22);
}

*,
*::before,
*::after {
  box-sizing: border-box;
}

html,
body {
  margin: 0;
  height: 100%;
  overflow: hidden;
}

body {
  font-family: system-ui, sans-serif;
  background: var(--bg-pink);
}

.scene {
  position: relative;
  width: 100%;
  min-height: 100dvh;
  min-height: calc(100dvh - env(safe-area-inset-top) - env(safe-area-inset-bottom));
  padding:
    env(safe-area-inset-top)
    env(safe-area-inset-right)
    env(safe-area-inset-bottom)
    env(safe-area-inset-left);
  background-color: #ffd6e3;
  background-image:
    radial-gradient(
      ellipse 55% 45% at 72% 18%,
      rgba(255, 255, 255, 0.72),
      transparent 62%
    ),
    radial-gradient(
      ellipse 50% 40% at 18% 78%,
      rgba(255, 182, 200, 0.55),
      transparent 58%
    ),
    radial-gradient(
      ellipse 90% 70% at 50% 100%,
      rgba(255, 105, 150, 0.22),
      transparent 55%
    ),
    repeating-linear-gradient(
      45deg,
      transparent,
      transparent 18px,
      var(--line-white) 18px,
      var(--line-white) 20px
    ),
    repeating-linear-gradient(
      -45deg,
      transparent,
      transparent 18px,
      var(--line-white-soft) 18px,
      var(--line-white-soft) 20px
    ),
    repeating-linear-gradient(
      0deg,
      transparent,
      transparent 47px,
      rgba(255, 255, 255, 0.14) 47px,
      rgba(255, 255, 255, 0.14) 49px
    ),
    repeating-linear-gradient(
      90deg,
      transparent,
      transparent 47px,
      rgba(255, 255, 255, 0.1) 47px,
      rgba(255, 255, 255, 0.1) 51px
    ),
    linear-gradient(
      148deg,
      #fff0f5 0%,
      var(--bg-pink-soft) 28%,
      var(--bg-pink) 52%,
      #ff7a9e 78%,
      var(--bg-pink-deep) 100%
    );
  overflow: clip;
  overflow: hidden;
}

.scene::before {
  content: "";
  position: absolute;
  inset: -20%;
  z-index: 0;
  pointer-events: none;
  opacity: 0.55;
  background:
    radial-gradient(
      circle at 30% 40%,
      rgba(255, 255, 255, 0.35) 0%,
      transparent 42%
    ),
    radial-gradient(
      circle at 70% 60%,
      rgba(255, 143, 171, 0.28) 0%,
      transparent 45%
    );
  animation: scene-glow-drift 22s ease-in-out infinite alternate;
}

.scene::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background: repeating-linear-gradient(
    120deg,
    transparent,
    transparent 80px,
    rgba(255, 255, 255, 0.04) 80px,
    rgba(255, 255, 255, 0.04) 82px
  );
}

@keyframes scene-glow-drift {
  0% {
    transform: translate(0, 0) scale(1);
  }
  100% {
    transform: translate(3%, -2%) scale(1.06);
  }
}

.flower-rain {
  position: absolute;
  inset: 0;
  z-index: 2;
  pointer-events: none;
  overflow: hidden;
}

.flower-rain__petal {
  position: absolute;
  top: -8vh;
  font-size: calc(1.1rem * var(--flower-size, 1));
  line-height: 1;
  will-change: transform;
  animation: flower-fall var(--flower-duration, 8s) linear var(--flower-delay, 0s)
    forwards;
  filter: drop-shadow(0 2px 4px rgba(90, 61, 92, 0.12));
}

.flower-rain__petal--static {
  top: auto;
  animation: none;
}

@keyframes flower-fall {
  0% {
    transform: translate3d(0, -5vh, 0) rotate(0deg);
    opacity: 0;
  }
  8% {
    opacity: 1;
  }
  100% {
    transform: translate3d(var(--flower-drift, 0px), var(--flower-fall-end, 108vh), 0)
      rotate(var(--flower-spin, 180deg));
    opacity: 0.88;
  }
}

.walkers {
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 1;
}

.walker {
  position: absolute;
  display: flex;
  flex-direction: column;
  align-items: center;
  width: auto;
  height: auto;
  isolation: isolate;
  will-change: left, top;
  pointer-events: auto;
  cursor: pointer;
}

.walker__sprite {
  height: clamp(72px, 18vh, 120px);
  width: auto;
  display: block;
  flex-shrink: 0;
  object-fit: contain;
  backface-visibility: hidden;
  filter: drop-shadow(var(--sprite-shadow));
  pointer-events: auto;
  cursor: pointer;
}

.cat-sprite {
  image-rendering: pixelated;
  image-rendering: crisp-edges;
  image-rendering: -moz-crisp-edges;
  -ms-interpolation-mode: nearest-neighbor;
}

.cat-sprite--flip {
  transform: scaleX(-1);
}

.walker.is-walking .walker__sprite:not(.cat-sprite--flip) {
  animation: walker-bob 0.35s steps(2) infinite;
}

.walker.is-walking .walker__sprite.cat-sprite--flip {
  animation: walker-bob-flip 0.35s steps(2) infinite;
}

@keyframes walker-bob-flip {
  0% {
    transform: scaleX(-1) translateY(0);
  }
  50% {
    transform: scaleX(-1) translateY(-2px);
  }
}

.walker__cloud {
  position: relative;
  min-width: min(42vw, 168px);
  padding: 0.85rem 1rem 0.75rem;
  margin-bottom: 0.35rem;
  transform: translateY(0) scale(1);
  z-index: 1;
  display: none;
}

.walker__cloud[hidden] {
  display: none !important;
}

.walker.is-sitting .walker__cloud:not([hidden]) {
  display: block;
  animation: cloud-bob 2.8s ease-in-out infinite;
}

.walker.is-sitting {
  animation: none !important;
  cursor: default;
}

.walker.is-sitting .walker__sprite {
  animation: none !important;
  cursor: default;
}

@keyframes walker-bob {
  0% {
    transform: translateY(0);
  }
  50% {
    transform: translateY(-2px);
  }
}

.walker--path-1.is-walking {
  animation: walk-path-1 var(--walk-duration, 4.5s) ease-in-out
    var(--walk-delay, 0s) infinite alternate;
}

.walker--path-2.is-walking {
  animation: walk-path-2 var(--walk-duration, 5.2s) ease-in-out
    var(--walk-delay, 0.4s) infinite alternate;
}

.walker--path-3.is-walking {
  animation: walk-path-3 var(--walk-duration, 4.8s) ease-in-out
    var(--walk-delay, 0.8s) infinite alternate;
}

.walker--path-4.is-walking {
  animation: walk-path-4 var(--walk-duration, 5.5s) ease-in-out
    var(--walk-delay, 0.2s) infinite alternate;
}

@keyframes cloud-bob {
  0%,
  100% {
    transform: translateY(0) scale(1);
  }
  50% {
    transform: translateY(-3px) scale(1.02);
  }
}

.walker--path-1.is-idle {
  left: 8%;
  top: 58%;
}

.walker--path-2.is-idle {
  left: 82%;
  top: 52%;
}

.walker--path-3.is-idle {
  left: 12%;
  top: 18%;
}

.walker--path-4.is-idle {
  left: 78%;
  top: 12%;
}

@keyframes walk-path-1 {
  from {
    left: -10%;
    top: 72%;
  }
  to {
    left: 8%;
    top: 58%;
  }
}

@keyframes walk-path-2 {
  from {
    left: 105%;
    top: 65%;
  }
  to {
    left: 82%;
    top: 52%;
  }
}

@keyframes walk-path-3 {
  from {
    left: -8%;
    top: 28%;
  }
  to {
    left: 12%;
    top: 18%;
  }
}

@keyframes walk-path-4 {
  from {
    left: 108%;
    top: 22%;
  }
  to {
    left: 78%;
    top: 12%;
  }
}

.walker.is-idle {
  animation: none;
}

.walker.is-idle img {
  animation: none;
}

.cloud-quote {
  position: relative;
  background: var(--cloud-bg);
  border-radius: 50% 50% 45% 45% / 55% 55% 45% 45%;
  box-shadow:
    -12px 6px 0 -3px var(--cloud-bg),
    14px 8px 0 -4px var(--cloud-bg),
    0 6px 18px var(--shadow);
  text-align: center;
}

.cloud-quote::after {
  content: "";
  position: absolute;
  bottom: -12px;
  left: 50%;
  transform: translateX(-50%);
  width: 18px;
  height: 18px;
  background: var(--cloud-bg);
  border-radius: 50%;
  box-shadow: 0 3px 8px var(--shadow);
}

.cloud-quote__line1,
.cloud-quote__line2 {
  margin: 0;
  font-family: "Press Start 2P", monospace;
  color: var(--cloud-text);
  line-height: 1.8;
  text-transform: lowercase;
}

.cloud-quote__line1 {
  font-size: clamp(0.45rem, 2vw, 0.55rem);
  margin-bottom: 0.5rem;
}

.cloud-quote__line2 {
  font-size: clamp(0.4rem, 1.8vw, 0.5rem);
}

.gift {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  z-index: 3;
  pointer-events: none;
  padding-bottom: env(safe-area-inset-bottom);
}

.gift__trigger {
  pointer-events: auto;
  position: relative;
  border: none;
  background: transparent;
  cursor: pointer;
  padding: 0.5rem;
  min-width: 44px;
  min-height: 44px;
  border-radius: 12px;
  transition: transform 0.15s ease;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}

.gift__trigger:hover {
  transform: scale(1.04);
}

.gift__trigger:focus-visible {
  outline: 3px solid #5a3d5c;
  outline-offset: 6px;
}

.gift__box {
  width: clamp(96px, 22vw, 140px);
  height: auto;
  image-rendering: pixelated;
  image-rendering: crisp-edges;
  display: block;
  filter: drop-shadow(0 8px 16px var(--shadow));
  transition: transform 0.2s ease, opacity 0.2s ease;
}

.gift__lid {
  display: none;
}

.gift__hint {
  position: absolute;
  bottom: -0.25rem;
  left: 50%;
  transform: translateX(-50%);
  font-family: "Press Start 2P", monospace;
  font-size: clamp(0.42rem, 2.5vw, 0.5rem);
  color: var(--cloud-text);
  opacity: 0.7;
  animation: hint-pulse 1.5s ease-in-out infinite;
  white-space: nowrap;
}

@keyframes hint-pulse {
  0%,
  100% {
    opacity: 0.45;
  }
  50% {
    opacity: 1;
  }
}

.gift__reveal {
  position: absolute;
  left: 50%;
  bottom: 55%;
  transform: translateX(-50%) translateY(40px) scale(0.3);
  opacity: 0;
  pointer-events: none;
}

.gift__reveal:not([hidden]) {
  display: block;
}

.gift__cat {
  height: clamp(80px, 20vh, 128px);
  width: auto;
  object-fit: contain;
  filter: drop-shadow(var(--sprite-shadow));
}

.gift__message,
.gift__dedication {
  pointer-events: none;
  margin: 0.75rem 1rem 0;
  max-width: min(92vw, 22rem);
  text-align: center;
  font-family: system-ui, sans-serif;
  color: var(--cloud-text);
  line-height: 1.55;
}

.gift__message {
  font-size: clamp(0.95rem, 4vw, 1.1rem);
  font-weight: 600;
}

.gift__dedication {
  font-size: clamp(0.8rem, 3.2vw, 0.95rem);
  opacity: 0.85;
}

.gift__message[hidden],
.gift__dedication[hidden] {
  display: none;
}

.gift__trigger.is-opening .gift__box {
  transform: translateY(-6px) scale(1.02);
}

.gift__trigger.is-revealed .gift__box {
  transform: translateY(4px) scale(0.96);
}

.gift__trigger.is-revealed .gift__reveal {
  animation: cat-pop 0.55s cubic-bezier(0.34, 1.4, 0.64, 1) forwards;
}

@keyframes cat-pop {
  0% {
    opacity: 0;
    transform: translateX(-50%) translateY(50px) scale(0.2);
  }
  70% {
    opacity: 1;
    transform: translateX(-50%) translateY(-20px) scale(1.08);
  }
  100% {
    opacity: 1;
    transform: translateX(-50%) translateY(-8px) scale(1);
  }
}

.gift__trigger.is-revealed .gift__hint {
  opacity: 0;
  animation: none;
}

.scene.is-reduced-motion .walker {
  animation: none !important;
}

.scene.is-reduced-motion .walker--path-1 {
  left: 8%;
  top: 58%;
}

.scene.is-reduced-motion .walker--path-2 {
  left: 82%;
  top: 52%;
}

.scene.is-reduced-motion .walker--path-3 {
  left: 12%;
  top: 18%;
}

.scene.is-reduced-motion .walker--path-4 {
  left: 78%;
  top: 12%;
}

.scene.is-reduced-motion .gift__trigger.is-revealed .gift__reveal {
  animation: none;
  opacity: 1;
  transform: translateX(-50%) translateY(-8px) scale(1);
}

.scene.is-reduced-motion .gift__hint {
  animation: none;
}

.scene.is-reduced-motion::before {
  animation: none;
}

.scene.is-reduced-motion .flower-rain__petal:not(.flower-rain__petal--static) {
  animation: none;
  opacity: 0;
}

@media (max-width: 480px) {
  .walker__sprite,
  .gift__cat {
    height: clamp(56px, 14vh, 72px);
  }

  .gift__box {
    width: clamp(72px, 20vw, 96px);
  }

  .walker__cloud {
    min-width: 110px;
    padding: 0.55rem 0.65rem 0.5rem;
  }

  .cloud-quote__line1 {
    font-size: 0.4rem;
    margin-bottom: 0.35rem;
  }

  .cloud-quote__line2 {
    font-size: 0.36rem;
  }

  .gift__trigger.is-revealed {
    transform: scale(0.92);
  }

  @keyframes walk-path-1 {
    from {
      left: -6%;
      top: 78%;
    }
    to {
      left: 4%;
      top: 68%;
    }
  }

  @keyframes walk-path-2 {
    from {
      left: 102%;
      top: 72%;
    }
    to {
      left: 88%;
      top: 62%;
    }
  }

  @keyframes walk-path-3 {
    from {
      left: -4%;
      top: 22%;
    }
    to {
      left: 6%;
      top: 14%;
    }
  }

  @keyframes walk-path-4 {
    from {
      left: 104%;
      top: 18%;
    }
    to {
      left: 86%;
      top: 10%;
    }
  }

  .walker--path-1.is-idle,
  .scene.is-reduced-motion .walker--path-1 {
    left: 4%;
    top: 68%;
  }

  .walker--path-2.is-idle,
  .scene.is-reduced-motion .walker--path-2 {
    left: 88%;
    top: 62%;
  }

  .walker--path-3.is-idle,
  .scene.is-reduced-motion .walker--path-3 {
    left: 6%;
    top: 14%;
  }

  .walker--path-4.is-idle,
  .scene.is-reduced-motion .walker--path-4 {
    left: 86%;
    top: 10%;
  }

  .gift__reveal {
    bottom: 52%;
  }
}

@media (max-width: 380px) {
  .walker__sprite,
  .gift__cat {
    height: 52px;
  }

  .gift__box {
    width: 68px;
  }

  @keyframes walk-path-1 {
    from {
      left: -4%;
      top: 80%;
    }
    to {
      left: 2%;
      top: 72%;
    }
  }

  @keyframes walk-path-2 {
    from {
      left: 100%;
      top: 74%;
    }
    to {
      left: 90%;
      top: 66%;
    }
  }

  @keyframes walk-path-3 {
    from {
      left: -2%;
      top: 20%;
    }
    to {
      left: 4%;
      top: 12%;
    }
  }

  @keyframes walk-path-4 {
    from {
      left: 102%;
      top: 16%;
    }
    to {
      left: 88%;
      top: 8%;
    }
  }

  .walker--path-1.is-idle,
  .scene.is-reduced-motion .walker--path-1 {
    left: 2%;
    top: 72%;
  }

  .walker--path-2.is-idle,
  .scene.is-reduced-motion .walker--path-2 {
    left: 90%;
    top: 66%;
  }

  .walker--path-3.is-idle,
  .scene.is-reduced-motion .walker--path-3 {
    left: 4%;
    top: 12%;
  }

  .walker--path-4.is-idle,
  .scene.is-reduced-motion .walker--path-4 {
    left: 88%;
    top: 8%;
  }
}
