:root {
  --pff-color-bg: #ffffff;
  --pff-color-fg: #1a1a1a;
  --pff-color-muted: #6b6b6b;
  --pff-color-accent: #1a1a1a;
  --pff-color-surface: #f5f5f5;
  --pff-color-border: #e2e2e2;
  --pff-color-focus: #1a1a1a;

  --pff-radius-default: 0.375rem;
  --pff-radius-sm: 0.1875rem;
  --pff-radius-pill: 999px;

  --pff-space-3xs: 0.25rem;
  --pff-space-2xs: 0.5rem;
  --pff-space-xs: 0.75rem;
  --pff-space-s: 1rem;
  --pff-space-m: 1.5rem;
  --pff-space-l: 2rem;
  --pff-space-xl: 3rem;
  --pff-space-2xl: 4rem;

  --pff-font-sans: system-ui, -apple-system, "Segoe UI", Roboto, Arial, sans-serif;
  --pff-font-display: system-ui, -apple-system, "Segoe UI", Roboto, Arial, sans-serif;
  --pff-font-base: 1rem;
  --pff-font-leading: 1.6;
  --pff-font-measure: 70ch;

  --pff-container-default-width: 75rem;
  --pff-container-narrow-width: 48rem;
  --pff-container-wide-width: 90rem;
  --pff-container-current-width: var(--pff-container-default-width);

  --pff-grid-columns: 12;
  --pff-grid-gap: var(--pff-space-m);

  --pff-z-offcanvas: 1000;
  --pff-z-skip: 1001;
  --pff-focus-ring: 0 0 0 3px var(--pff-color-focus);

  /* Shared motion contract (Fable 5 §8.2). Core owns the scale; each site
     overrides duration/easing/distance tokens to its own personality. All
     decorative motion is additionally gated by the global reduced-motion
     kill switch in accessibility.css. */
  --pff-motion-duration-instant: 100ms;  /* focus, active, validation */
  --pff-motion-duration-fast:    200ms;  /* hover, underline, fills */
  --pff-motion-duration-base:    300ms;  /* card/panel reveals, menus */
  --pff-motion-duration-slow:    500ms;  /* hero, image reveals */
  --pff-motion-ease-out:    cubic-bezier(0.2, 0, 0, 1);
  --pff-motion-ease-inout:  cubic-bezier(0.45, 0, 0.55, 1);
  --pff-motion-ease-settle: cubic-bezier(0.22, 1, 0.36, 1);
  --pff-motion-rise:    12px;   /* default reveal distance */
  --pff-motion-scale-img: 1.03; /* max image scale */
  /* T-MOT-2: how deep into viewport entry a scroll-driven reveal completes
     (base.css maps it onto animation-range: entry 0% → this). Lower = the
     reveal finishes earlier/snappier; higher = a longer, calmer entrance. */
  --pff-motion-reveal-range: 35%;
}
