/* ==========================================================================
   tokens/base.css — LAYER 1: PRIMITIVE / STRUCTURAL TOKENS
   --------------------------------------------------------------------------
   Theme-invariant primitives. Nothing in this file knows about a brand, a
   colour or a mode; these values are the same in every theme and both colour
   modes. If a value here ever needs to change per theme, it belongs in
   theme-*.css instead.

   Naming convention
     --radius-*    corner radii, named steps (never raw px at the use site)
     --shadow-*    elevation, named steps
     --space-*     spacing scale (4px base, matching Bootstrap's rhythm)
     --z-*         stacking order, named by *purpose* not by number
     --bp-*        breakpoint values (documentation only — see the note below)
     --dur-*       transition durations
     --ease-*      transition easings

   Breakpoints: CSS custom properties CANNOT be used inside `@media`
   conditions, so the `--bp-*` tokens exist as the single documented source of
   truth for the values; media queries must repeat the literal number. They are
   listed here so a reader has one place to look.
   ========================================================================== */

:root {
  /* ---- radii ---------------------------------------------------------- */
  --radius-none: 0;
  --radius-sm: 4px;
  --radius-md: 8px;
  --radius-lg: 16px;
  --radius-xl: 24px;
  --radius-pill: 999px;

  /* ---- elevation ------------------------------------------------------ */
  --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.04);
  --shadow-sm: 0 0 44px rgba(0, 0, 0, 0.08);
  --shadow-md: 0 5px 22px rgba(0, 0, 0, 0.04);
  --shadow-lg: 0 20px 44px rgba(0, 0, 0, 0.08);
  --shadow-overlay: 0 6px 24px rgba(0, 0, 0, 0.125);
  /* the inset "pressed" state Bootstrap applies to :active buttons — kept
     inset so the refactor did not turn a press into a drop shadow */
  --shadow-pressed: inset 0 3px 5px rgba(0, 0, 0, 0.125);

  /* ---- spacing scale -------------------------------------------------- */
  --space-0: 0;
  --space-1: 0.25rem;
  --space-2: 0.5rem;
  --space-3: 0.75rem;
  --space-4: 1rem;
  --space-5: 1.5rem;
  --space-6: 2rem;
  --space-7: 2.5rem;
  --space-8: 3rem;
  --space-9: 4rem;
  --space-10: 5rem;

  /* ---- stacking order (by purpose) ------------------------------------ */
  --z-base: 1;
  --z-dropdown: 100;
  --z-sticky: 200;
  --z-overlay: 300;
  --z-modal: 400;
  --z-toast: 500;
  --z-preloader: 600;

  /* ---- motion --------------------------------------------------------- */
  --dur-fast: 0.15s;
  --dur-base: 0.3s;
  --dur-slow: 0.6s;
  --ease-base: ease-out;
  --ease-in-out: ease-in-out;

  /* ---- print -----------------------------------------------------------
     Paper is white in every theme and every colour mode, so printed output
     deliberately ignores the theme's colours. These live in layer 1 rather
     than in a theme file precisely because they must NOT vary — a dark-mode
     reader printing a policy page should still get black ink on white. */
  --print-ink: #000000;
  --print-paper: #FFFFFF;

  /* ---- type weights ---------------------------------------------------
     Named steps, not raw numbers at the use site, so a theme can make the
     whole page heavier without touching a component rule.
       --font-weight-heading  consumed by the h1–h6 rule and .zm-hero-title
       --font-weight-body     consumed by --bs-body-font-weight in the theme
     neo-brutalism (Prompt 33) raises both. */
  --font-weight-body: 400;
  --font-weight-heading: 700;

  /* ---- breakpoints (documentation only; repeat the literal in @media) -- */
  --bp-sm: 576px;
  --bp-md: 768px;
  --bp-lg: 991px;
  --bp-xl: 1200px;
  --bp-xxl: 1400px;
}
