/* GuessTheLean brand theme -- GENERATED by bin/factory-theme.py (issue #63)
 * =============================================================================
 * Do not hand-edit: regenerate from the same two anchors and this file comes back
 * byte-identical. It carries no timestamp and no run id on purpose; `generated_at`
 * lives in factory state, where a per-run value belongs.
 *
 *   primary anchor    #31bdec   lightness offset dL = -0.010
 *   secondary anchor  #e65f50   lightness offset dL = +0.000
 *
 * LOGICAL PATH IS THE BARE FILENAME -- "theme-guessthelean.css", NOT
 * "blog_themes/theme-guessthelean.css". Rails declares paths.add "lib/assets", glob: "*",
 * so lib/assets/blog_themes IS the Propshaft load-path root, not lib/assets.
 *
 * Linked by BlogThemingHelper#blog_theme_stylesheet_link_tag AFTER
 * stylesheet_link_tag :app, so this unlayered :root beats the bundle's unlayered
 * :root defaults on source order.
 *
 * WHY THE -950 STOP IS A COMPUTED oklch() LITERAL. The theme-file contract calls the
 * -950 "Tailwind v4's built-in, verbatim in oklch". Both shipped themes satisfied
 * that by choosing STOCK colour families -- but this ramp sits at an arbitrary hue,
 * where THERE IS NO TAILWIND BUILT-IN TO TAKE. The normative half of that clause is
 * the second one: an oklch() literal, never a hex approximation. That is what the two
 * -950 declarations below are, computed on the same ladder as every other stop.
 *
 * DELIBERATELY ABSENT, and each omission is load-bearing:
 *   - NO --interactive-*. The base derives all four from --brand-primary-* in BOTH
 *     modes (600/500 in :root, 400/500/300 in .dark). Declaring them here kills the
 *     dark-mode re-derivation silently.
 *   - NO .dark block. The base's neutral dark set applies unchanged.
 *   - NO --surface-*, --content-* or --border-*. Those are a TRAP: the base sets each
 *     TWICE, :root and .dark have EQUAL specificity, and this file loads last -- so a
 *     bare :root override here beats the bundle's .dark rule and ships LIGHT surfaces
 *     in dark mode, on every page, with no error and nothing in the console.
 *   - NO --font-*. The blog renders the base's three self-hosted faces.
 *
 * CONTRAST: every gated stop clears WCAG AA 4.5:1 against its mode's --surface-primary
 * -- light -600/-700 on #ffffff and dark -400/-500 on #1c1917 for the primary ramp,
 * light -700/-600 and dark -400 for the secondary. Re-check with:
 *     python3 bin/factory-theme.py check lib/assets/blog_themes/theme-guessthelean.css
 * ============================================================================= */

:root {
  /* Primary brand ramp -- derived from the anchor's hue and chroma */
  --brand-primary-50: #dce8ee;
  --brand-primary-100: #c6e3f0;
  --brand-primary-200: #9fd9f1;
  --brand-primary-300: #68c9ef;
  --brand-primary-400: #22b5e4;
  --brand-primary-500: #009dc8;
  --brand-primary-600: #007fa3;
  --brand-primary-700: #006480;
  --brand-primary-800: #005067;
  --brand-primary-900: #004154;
  --brand-primary-950: oklch(23.1% 0.044 226.105);

  /* Secondary brand ramp -- derived from the anchor's hue and chroma */
  --brand-secondary-50: #f6e5e2;
  --brand-secondary-100: #fed6cf;
  --brand-secondary-200: #ffc1b7;
  --brand-secondary-300: #ffa193;
  --brand-secondary-400: #ff7a6a;
  --brand-secondary-500: #eb5c4d;
  --brand-secondary-600: #c74236;
  --brand-secondary-700: #a02f26;
  --brand-secondary-800: #82261e;
  --brand-secondary-900: #6a1f18;
  --brand-secondary-950: oklch(24.1% 0.083 28.905);
}

/* -----------------------------------------------------------------------------
 * Poster Drop game skin (issue #751, epic #738) — HAND-ADDED, not factory output.
 * =============================================================================
 * The block ABOVE is factory-generated brand ramps (bin/factory-theme.py, #765).
 * The --game-* tokens BELOW are the poster-drop landing skin (consumed only by
 * .poster-drop). They are a DISTINCT namespace from --brand-primary-* / --brand-
 * secondary-* and must survive a factory-theme regeneration — re-append this block
 * if the ramps above are ever regenerated. Skin ownership is #754's (unmerged); the
 * eventual clean home for --game-* is that child. Layout/scrim/focus/responsive/
 * reduced-motion stay in application.css; only these semantic skin values live here.
 * Electric blue + sharp coral counter-endpoint; pale-ice deck. */
:root {
  --game-surface: #071722;
  --game-surface-raised: #dff4f8;
  --game-ink: #f5fcff;
  --game-deck-ink: #071a25;
  --game-ink-muted: #b8d3de;
  --game-deck-muted: #406271;
  --game-border: #5f91a5;
  --game-accent: #31bdec;
  --game-accent-strong: #075f80;
  --game-accent-ink: #04141d;
  --game-left: #307fb1;
  --game-right: #e65f50;
}
