.hero {
  position: relative;
  overflow: hidden;
  border-bottom: var(--border-w) solid var(--ink);
}

.hero__grain {
  position: absolute;
  inset: 0;
  background-image: url('/assets/grain.svg');
  background-repeat: repeat;
  opacity: 0.06;
  pointer-events: none;
}

.hero__inner {
  position: relative;
  padding: clamp(56px, 9vw, 104px) var(--gutter) clamp(64px, 10vw, 112px);
}

.hero__eyebrow {
  margin-bottom: 24px;
}

.hero__title {
  font-size: clamp(40px, 7.4vw, 92px);
  font-weight: 800;
  line-height: 1.02;
  letter-spacing: -0.045em;
  margin: 0 0 28px;
  max-width: 20ch;
}

.hero__title-highlight {
  font-family: var(--font-display);
  font-size: 0.66em;
  line-height: 1;
  letter-spacing: -0.02em;
  background: var(--acid);
  box-shadow: 0 0 0 6px var(--acid);
  border-radius: 2px;
  white-space: nowrap;
}

.hero__lead {
  font-size: 19px;
  line-height: 1.6;
  color: var(--ink-2);
  max-width: 46ch;
  margin: 0 0 36px;
}

.hero__actions {
  display: flex;
  flex-wrap: wrap;
  gap: 14px;
  align-items: center;
}

.hero__note {
  padding-left: 6px;
  color: var(--ink-3);
}

/* Stickers */
.hero__stickers {
  position: absolute;
  inset: 0;
  pointer-events: none;
}

.sticker {
  position: absolute;
  pointer-events: auto;
  cursor: grab;
  user-select: none;
  border: var(--border-w) solid var(--ink);
  box-shadow: var(--shadow-hard);
  font-weight: 700;
  touch-action: none;
}

/* Entrance state — JS adds this only while it's actually running the
   bounce-in animation. Visibility must never depend on an animation's
   fill-mode holding a value: `animation: none` (used to hand off to drag)
   throws away that held opacity, snapping the element back to its base
   style. Keeping the hidden state in a class instead means removing the
   class always leaves a fully visible, non-animated element behind. */
.sticker.sticker--entering {
  opacity: 0;
  animation: sticker-in 520ms cubic-bezier(0.34, 1.56, 0.64, 1) both;
}

/* Click (not drag) a sticker and it pops into confetti — this hides it while
   the burst plays; JS swaps back to .sticker--entering afterward to bounce
   it back in. */
.sticker.sticker--exploded {
  opacity: 0;
  pointer-events: none;
}

.confetti-piece {
  position: absolute;
  top: 0;
  left: 0;
  pointer-events: none;
  will-change: transform, opacity;
  z-index: 30;
}

.sticker--1 {
  top: 13%;
  right: 5%;
  padding: 12px 18px;
  background: var(--acid);
  color: var(--ink);
  border-radius: var(--radius-full);
  font-size: 17px;
}

.sticker--2 {
  bottom: 16%;
  right: 12%;
  padding: 14px 20px;
  background: var(--paper-2);
  color: var(--ink);
  border-radius: var(--radius-md);
  font-family: var(--font-mono);
  font-size: 13px;
  font-weight: 500;
}

.sticker--3 {
  top: 48%;
  right: 30%;
  width: 62px;
  height: 62px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--accent);
  color: var(--ink);
  border-radius: var(--radius-full);
  font-weight: 800;
  font-size: 19px;
}

.sticker--4 {
  bottom: 8%;
  left: 4%;
  padding: 10px 16px;
  background: var(--paper);
  color: var(--ink);
  border-radius: var(--radius-sm);
  font-size: 14px;
  font-weight: 600;
}

@keyframes sticker-in {
  0% {
    opacity: 0;
    transform: translate(var(--sx, 0px), 24px) rotate(0deg) scale(0.8);
  }
  60% {
    opacity: 1;
    transform: translate(var(--sx, 0px), -4px) rotate(var(--sr, 2deg)) scale(1.04);
  }
  100% {
    opacity: 1;
    transform: translate(var(--sx, 0px), 0px) rotate(var(--sr, 2deg)) scale(1);
  }
}

@media (max-width: 640px) {
  .hero__stickers {
    display: none;
  }
}
