:root {
  --scene-black: #050505;
  --scene-lime: #39ff14;
  --scene-pink: #ff2d95;
  --scene-cyan: #00f5ff;
  --scene-purple: #b44dff;
  --scene-red: #ff1744;
  --scene-cream: #f5f0ea;
}

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

body {
  margin: 0;
  min-height: 100vh;
  font-family: 'Rubik', system-ui, sans-serif;
  background: var(--scene-black);
  color: var(--scene-cream);
}

.scene-sticker-page {
  position: relative;
  z-index: 1;
  pointer-events: none;
}

.scene-sticker-page__outro {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: 5rem 1.25rem 2rem;
  max-width: 42rem;
  margin: 0 auto;
  text-align: center;
  pointer-events: auto;
  font-size: 0.9rem;
  color: rgb(245 240 234 / 0.7);
}

.scene-sticker-page__outro a {
  color: var(--scene-cyan);
}

.scene-sticker-page__scroll-spacer {
  height: 180vh;
}

/* --- Scene canvas --- */

.scene-sticker__canvas {
  position: fixed;
  inset: 0;
  z-index: 0;
  overflow: hidden;
  width: 100%;
  height: 100%;
  border: none;
  box-shadow: inset 0 0 80px rgb(57 255 20 / 0.06);
  background:
    radial-gradient(circle at 50% 120%, rgb(180 77 255 / 0.12), transparent 55%),
    var(--scene-black);
  cursor: crosshair;
  touch-action: manipulation;
}

.scene-sticker__checker {
  position: absolute;
  inset: 0 0 auto;
  height: 28%;
  background:
    linear-gradient(45deg, #111 25%, transparent 25%) 0 0 / 24px 24px,
    linear-gradient(-45deg, #111 25%, transparent 25%) 0 0 / 24px 24px,
    linear-gradient(45deg, transparent 75%, #111 75%) 0 0 / 24px 24px,
    linear-gradient(-45deg, transparent 75%, #111 75%) 0 0 / 24px 24px,
    #050505;
  mask-image: linear-gradient(to bottom, #000 70%, transparent);
  pointer-events: none;
}

.scene-sticker__stars {
  position: absolute;
  inset: 0;
  background-image:
    radial-gradient(circle, rgb(255 255 255 / 0.9) 0.6px, transparent 0.7px);
  background-size: 38px 38px;
  opacity: 0.35;
  pointer-events: none;
}

.scene-sticker__sparkle-field {
  position: absolute;
  inset: 0;
  pointer-events: none;
}

.scene-sticker__bg-spark {
  position: absolute;
  width: 10px;
  height: 10px;
  transform: translate(-50%, -50%) rotate(0deg) scale(1);
  opacity: 0.85;
  animation: bg-spark-twinkle calc(var(--frame-ms, 500ms) * 2) steps(1, end) infinite;
  animation-delay: var(--anim-delay, 0ms);
}

.scene-sticker__bg-spark::before,
.scene-sticker__bg-spark::after {
  content: '';
  position: absolute;
  left: 50%;
  top: 50%;
  background: #fff;
  transform: translate(-50%, -50%);
}

.scene-sticker__bg-spark::before {
  width: 2px;
  height: 10px;
}

.scene-sticker__bg-spark::after {
  width: 10px;
  height: 2px;
}

.scene-sticker__bg-spark[data-sparkle-frame='1'] {
  opacity: 0.35;
  transform: translate(-50%, -50%) rotate(22deg) scale(0.75);
}

@keyframes bg-spark-twinkle {
  0%,
  49.99% {
    opacity: 0.85;
    transform: translate(-50%, -50%) rotate(0deg) scale(1);
  }

  50%,
  100% {
    opacity: 0.35;
    transform: translate(-50%, -50%) rotate(22deg) scale(0.75);
  }
}

/* --- Sticker wraps --- */

.neon-sticker-wrap {
  position: absolute;
  width: var(--size, 120px);
  height: var(--size, 120px);
  transform:
    translate3d(
      calc(var(--tilt-x, 0px) + var(--scroll-x, 0px)),
      calc(var(--tilt-y, 0px) + var(--scroll-y, 0px)),
      0
    )
    rotate(calc(var(--base-r, 0deg) + var(--tilt-r, 0deg)));
  will-change: transform;
}

@media (hover: hover) and (pointer: fine) {
  .neon-sticker-wrap {
    transition: transform 0.12s ease-out;
  }
}

.scene-sticker__canvas--scrolling .neon-sticker-wrap {
  transition: none;
}

.neon-sticker-wrap--squish {
  animation: sticker-squish 420ms steps(2, end);
}

@keyframes sticker-squish {
  0% {
    transform:
      translate3d(
        calc(var(--tilt-x, 0px) + var(--scroll-x, 0px)),
        calc(var(--tilt-y, 0px) + var(--scroll-y, 0px)),
        0
      )
      rotate(calc(var(--base-r, 0deg) + var(--tilt-r, 0deg)))
      scale(1);
  }

  50% {
    transform:
      translate3d(
        calc(var(--tilt-x, 0px) + var(--scroll-x, 0px)),
        calc(var(--tilt-y, 0px) + var(--scroll-y, 0px) + 4px),
        0
      )
      rotate(calc(var(--base-r, 0deg) + var(--tilt-r, 0deg)))
      scale(0.82, 1.12);
  }

  100% {
    transform:
      translate3d(
        calc(var(--tilt-x, 0px) + var(--scroll-x, 0px)),
        calc(var(--tilt-y, 0px) + var(--scroll-y, 0px)),
        0
      )
      rotate(calc(var(--base-r, 0deg) + var(--tilt-r, 0deg)))
      scale(1);
  }
}

.neon-sticker-wrap--heart-1 { top: 14%; left: 6%; --size: clamp(88px, 11vw, 130px); }
.neon-sticker-wrap--heart-2 { top: 68%; left: 10%; --size: clamp(78px, 9vw, 110px); }
.neon-sticker-wrap--heart-3 { top: 36%; right: 7%; --size: clamp(72px, 8.5vw, 100px); }
.neon-sticker-wrap--star-1 { top: 10%; right: 12%; --size: clamp(82px, 10vw, 118px); }
.neon-sticker-wrap--star-2 { bottom: 12%; right: 16%; --size: clamp(92px, 11vw, 130px); }
.neon-sticker-wrap--star-3 { top: 44%; left: 38%; --size: clamp(58px, 7vw, 84px); }
.neon-sticker-wrap--skull-1 { top: 26%; left: 30%; --size: clamp(118px, 14vw, 170px); }
.neon-sticker-wrap--skull-2 { bottom: 8%; left: 34%; --size: clamp(96px, 11vw, 138px); }

.neon-sticker {
  display: block;
  width: 100%;
  height: 100%;
  overflow: visible;
}

.neon-sticker__outer {
  fill: none;
  stroke: var(--outline-neon, var(--scene-lime));
  stroke-width: 7;
  stroke-linejoin: round;
  stroke-linecap: round;
  paint-order: stroke fill;
}

.neon-sticker__inner {
  fill: none;
  stroke: var(--scene-black);
  stroke-width: 5;
  stroke-linejoin: round;
  stroke-linecap: round;
  paint-order: stroke fill;
}

.neon-sticker__fill {
  stroke: none;
  fill: var(--fill, var(--scene-pink));
}

.neon-sticker-wrap--heart-1 { --fill: var(--scene-cyan); --outline-neon: var(--scene-lime); }
.neon-sticker-wrap--heart-2 { --fill: var(--scene-red); --outline-neon: var(--scene-lime); }
.neon-sticker-wrap--heart-3 { --fill: var(--scene-purple); --outline-neon: var(--scene-lime); }
.neon-sticker-wrap--star-1 { --fill: var(--scene-purple); --outline-neon: var(--scene-lime); }
.neon-sticker-wrap--star-2 { --fill: var(--scene-purple); --outline-neon: var(--scene-lime); }
.neon-sticker-wrap--star-3 { --fill: var(--scene-purple); --outline-neon: var(--scene-lime); }
.neon-sticker-wrap--skull-1 { --outline-neon: var(--scene-lime); }
.neon-sticker-wrap--skull-2 { --outline-neon: var(--scene-lime); }

.neon-sticker-wrap--skull-1 .neon-sticker__fill,
.neon-sticker-wrap--skull-2 .neon-sticker__fill {
  fill: url(#skull-rainbow);
}

/* Skull face */

.neon-sticker-wrap--skull-1 .neon-sticker__inner,
.neon-sticker-wrap--skull-2 .neon-sticker__inner {
  stroke-width: 6;
}

.neon-sticker-wrap--skull-1 .neon-sticker__outer,
.neon-sticker-wrap--skull-2 .neon-sticker__outer {
  stroke-width: 8;
}

.neon-sticker__squint {
  fill: none;
  stroke: var(--scene-black);
  stroke-width: 5;
  stroke-linecap: round;
}

.neon-sticker__nose {
  fill: var(--scene-black);
  stroke: none;
}

.neon-sticker__crack {
  fill: none;
  stroke: var(--scene-black);
  stroke-width: 4;
  stroke-linecap: round;
  stroke-linejoin: round;
}

.neon-sticker__bow {
  fill: var(--scene-pink);
  stroke: var(--scene-black);
  stroke-width: 2.5;
}

.neon-sticker__whisker {
  fill: none;
  stroke: var(--scene-black);
  stroke-width: 3.5;
  stroke-linecap: round;
}

.neon-sticker__bone {
  fill: none;
  stroke: var(--scene-black);
  stroke-width: 4.5;
  stroke-linecap: round;
}

/* Click burst */

.scene-sticker__burst {
  position: absolute;
  pointer-events: none;
  z-index: 10;
  transform: translate(-50%, -50%);
}

.scene-sticker__spark {
  position: absolute;
  left: 0;
  top: 0;
  width: 8px;
  height: 8px;
  transform: translate(0, 0) scale(1);
  opacity: 1;
  animation: spark-fly 650ms steps(2, end) forwards;
  animation-delay: var(--delay, 0ms);
}

.scene-sticker__spark::before,
.scene-sticker__spark::after {
  content: '';
  position: absolute;
  left: 50%;
  top: 50%;
  background: #fff;
  transform: translate(-50%, -50%);
}

.scene-sticker__spark::before {
  width: 2px;
  height: 8px;
}

.scene-sticker__spark::after {
  width: 8px;
  height: 2px;
}

@keyframes spark-fly {
  0% {
    transform: translate(0, 0) scale(1) rotate(0deg);
    opacity: 1;
  }

  100% {
    transform: translate(var(--sx), var(--sy)) scale(0.4) rotate(45deg);
    opacity: 0;
  }
}
