@layer components {
  :root {
    /* Fluid type scale — clamp()-based, ~1.25 ratio, 360px -> 1440px. */
    --deck-text-step--1: clamp(0.78rem, 0.74rem + 0.2vw, 0.9rem);
    --deck-text-step-0: clamp(1rem, 0.94rem + 0.35vw, 1.2rem);
    --deck-text-step-1: clamp(1.3rem, 1.18rem + 0.65vw, 1.65rem);
    --deck-text-step-2: clamp(1.7rem, 1.5rem + 1vw, 2.25rem);
    --deck-text-step-3: clamp(2.2rem, 1.9rem + 1.6vw, 3.1rem);
    --deck-text-step-4: clamp(2.9rem, 2.4rem + 2.4vw, 4.3rem);
    --deck-text-step-5: clamp(3.6rem, 2.9rem + 3.4vw, 5.6rem);

    /* Spacing scale — 4px base. */
    --deck-space-1: 0.25rem;
    --deck-space-2: 0.5rem;
    --deck-space-3: 0.75rem;
    --deck-space-4: 1rem;
    --deck-space-5: 1.5rem;
    --deck-space-6: 2rem;
    --deck-space-7: 3rem;
    --deck-space-8: 4rem;
    --deck-space-9: 6rem;

    /* Motion timing — shared vocabulary for any hand-written transition. */
    --deck-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
    --deck-duration-fast: 150ms;
    --deck-duration-base: 300ms;
    --deck-duration-slow: 600ms;
  }

  /* Safe-margin helper matching the frame's own "6% inline / 7% block"
     contract — opt-in, ignorable. */
  .deck-safe {
    box-sizing: border-box;
    padding-inline: 6%;
    padding-block: 7%;
  }

  /* Crop helper for a full-bleed/hero image inside a fixed 16:9 slide. */
  .deck-img-cover {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
  }
}

/* Deliberately UNLAYERED — must win unconditionally, same reasoning
   SCRUM-4574's own reduced-motion block already established. */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}
