/* THE ONE PALETTE, AND THE ONLY PLACE EITHER PRODUCT DECLARES IT.
 *
 * C1 step 3 of `packages/AGENTS.md`. Until today the
 * two products each kept their own `:root` — Fab 3D's sixteen tokens in
 * `app.css`, Fab 2D's forty-one in the one inline `<style>` of `page.html` —
 * and the same colour was written twice under two names, twice with two
 * spellings, and twice with the two names SWAPPED. The names below are Fab 2D's
 * (decision 2), because they were measured rather than chosen: see `--ink-mute`.
 *
 * THE TABLE IS GENERATED, NOT WRITTEN. Every value here was compared —
 * normalised, so that `rgba(226,216,192,.10)` and `rgb(226 216 192 / 0.10)` are
 * one value — against the `:root` Fab 3D carried into this step and against
 * every declaration in its seven stylesheets. The first proposal's hand-written
 * provenance column was wrong in five places; this one is a program's output.
 *
 *   (a) EXISTS VERBATIM IN FAB 3D — the charter of decision 10, value for value
 *   ────────────────────────────────────────────────────────────────────────────
 *   --ground        #060608                       was --void
 *   --panel-solid   #0d0d11                       was --panel
 *   --rule          rgb(226 216 192 / 0.10)       was --hair
 *   --line          rgb(226 216 192 / 0.16)       was --hair-strong
 *   --line-live     rgb(226 216 192 / 0.30)       app.css `.ghost:hover`, 2 hits
 *   --panel         rgb(13 13 17 / 0.94)          app.css `.plan-rows`, 1 hit
 *   --ink           #f3ebdb                       --ink
 *   --ink-2         #dcd7c9                       --ink-2
 *   --ink-soft      #c6c9bf                       app.css `.ghost`, 1 hit
 *   --ink-mute      #8f948c                       was --ink-soft   (THE SWAP)
 *   --ink-faint     rgb(222 213 194 / 0.38)       was --ink-mute   (THE SWAP)
 *   --accent        #d8ef62                       was --acid
 *   --accent-bright #e5f5a8                       app.css `.primary:hover`, 2
 *   --on-accent     #17332c                       was --on-acid
 *   --bad           #efaa98                       was --warm
 *   --flag-bg       rgb(239 170 152 / 0.10)       app.css `.danger:hover`, 1 hit
 *   --radius-xs     5px                           18 `border-radius:5px`
 *   --radius-sm     6px                           --radius-sm (and 6 literals)
 *   --radius        9px                           --radius (and 6 literals)
 *   --radius-lg     10px                          5 `border-radius:10px`
 *   --radius-pill   7px                           14 `border-radius:7px`
 *   --sans          "Instrument Sans", …          --sans
 *
 *   (b) NO FAB 3D SOURCE — a scale forces them, and they are an AMENDMENT to
 *       decision 10 rather than a line in its table
 *   ────────────────────────────────────────────────────────────────────────────
 *   the five triplets and --ink-faint-rgb   space-separated channels, so that
 *                                           `rgb(var(--x) / 0.22)` parses at all
 *   --accent-soft   rgb(216 239 98 / 0.38)  the ramp's third step
 *   --flag-bar      var(--bad)              named for what it is, not its colour
 *   --paper         #fff                    the sheet, and Fab 2D's five
 *                                           permanent lint exemptions turned to 0
 *   --shadow-sm/--shadow/--shadow-lift      one elevation scale, three depths
 *   --wake          180ms cubic-bezier(…)   one motion, so two products wake alike
 *
 *   (c) DELIBERATELY OVERRULES FAB 3D — visible only when the webfont fails,
 *       which is the one moment a fallback tail is the whole typography
 *   ────────────────────────────────────────────────────────────────────────────
 *   --serif   Fab 3D had `Newsreader,Georgia,serif`; Fab 2D's adds
 *             "Times New Roman" — Georgia is absent on a bare Windows box.
 *   --mono    Fab 3D had `"Geist Mono",ui-monospace,Consolas,monospace`; Fab
 *             2D's adds "Cascadia Mono", "Cascadia Code" and "DejaVu Sans
 *             Mono". Both tails are SUPERSETS: nothing is taken away.
 *
 * WHY THE `@font-face` ARE HERE AND THEIR URLS ARE RELATIVE. It is the single
 * best piece of prefix work in phase C. `url("fonts/…")` resolves against the
 * URL of THIS stylesheet: `/static/tokens.css` makes it `/static/fonts/…` for
 * Fab 3D today, `/tokens.css` makes it `/fonts/…` for Fab 2D at C2 step 2, and
 * `/fab2d/tokens.css` makes it `/fab2d/fonts/…` at D1 (decision 11) — with no
 * edit to this file, to either product, or to `serve.mount`'s whitelist.
 *
 * WHAT IS NOT HERE. Fab 2D's sheet colours (`--sheet-ink`, `--bal`, `--sel`)
 * and its report greys are a plan drawn on white paper, not the chrome; they
 * stay in that product's own sheet, which C2 step 3 reduces to exactly them.
 */
@font-face { font-family: "Instrument Sans";
  src: url("fonts/instrument-sans-400-600-latin.woff2") format("woff2");
  font-weight: 400 600; font-style: normal; font-display: swap; }
@font-face { font-family: "Geist Mono";
  src: url("fonts/geist-mono-latin.woff2") format("woff2");
  font-weight: 100 900; font-style: normal; font-display: swap; }
@font-face { font-family: Newsreader;
  src: url("fonts/newsreader-italic-300-latin.woff2") format("woff2");
  font-weight: 300; font-style: italic; font-display: swap; }

:root {
  /* SPACE-separated, and that is not cosmetic: `rgb(var(--ink-rgb) / 0.22)`
     needs space-separated channels or the whole declaration is rejected.
     It is the parchment, so every hairline and every hover wash is that one
     cream — on the void a pure white alpha is the one thing that would still
     read blue. */
  --ink-rgb:       226 216 192;
  --ink-faint-rgb: 222 213 194;   /* the faint ink's own cream, one tone off */
  --accent-rgb:    216 239 98;    /* #d8ef62 — the site's acid, and the only accent */
  --ground-rgb:    6 6 8;
  --panel-rgb:     13 13 17;
  --bad-rgb:       239 170 152;

  --ground:      #060608;
  --panel:       rgb(var(--panel-rgb) / 0.94);
  --panel-solid: #0d0d11;                      /* the same, where nothing may show through */
  --rule:        rgb(var(--ink-rgb) / 0.10);   /* a panel's contour */

  --ink:         #f3ebdb;   /* titles and live labels */
  --ink-2:       #dcd7c9;   /* the second ink, between the title and the ghost */
  --ink-soft:    #c6c9bf;   /* second rank — 11.6:1 on the ground, 10.4:1 on a panel */
  --ink-mute:    #8f948c;   /* a state, a date, a count — 5.9:1 on the ground */
  --ink-faint:   rgb(var(--ink-faint-rgb) / 0.38);  /* the mono eyebrow, and nothing that carries a fact */

  /* THE ONE PLACE THE TWO PRODUCTS DISAGREED, and it is measured rather than
     preferred (decision 2). Fab 3D spent its `--ink-mute` on 10 px uppercase
     micro labels alone; in Fab 2D the same token carries a plan's STATE, its
     date and a count, and 222 213 194 at 0.38 over the ground is 2.6:1 — a
     figure nobody can read at 11 px. So the quiet ink is #8f948c (5.9:1), and
     the 0.38 alpha lives on as `--ink-faint`. Fab 3D was renamed onto these
     names in ONE commit and in the order that avoids the swap. */

  /* Controls sit ON the ground, so their contour is ink-with-alpha: the rule
     at rest and the 0.30 it goes to under the pointer. */
  --line:        rgb(var(--ink-rgb) / 0.16);
  --line-live:   rgb(var(--ink-rgb) / 0.30);

  --accent:        #d8ef62;
  --accent-bright: #e5f5a8;                  /* the acid lifted towards paper: hover */
  --accent-soft:   rgb(var(--accent-rgb) / 0.38);
  --on-accent:     #17332c;                  /* the only colour type is set in on the acid */
  --acid:          var(--accent);            /* Fab 3D's 59 `var(--acid)`, unedited */

  /* The sheet: a plan is black line on white paper and it is printed that way.
     Named because a literal `#fff` in a declaration is what rule H exists to
     find, and five of them were permanent exemptions. IT HAS A SECOND USE
     SINCE G4, and it is the one exception to "and only the sheet": a numeric
     literal in Fab 3D's streaming script, which is the one thing in a script
     whose exact characters have to be read, and the only value in this file
     brighter than `--ink`. */
  --paper: #fff;

  /* GEOMETRY — 5 to 10 px and nothing more, and the names still mean different
     things rather than sizes of one thing: XS is a chip or a pin, SM a control
     inside a surface, the base a control that stands on its own, LG a SURFACE
     that holds others. A child stays at least one step inside its parent, or
     the corner looks wrong. `--radius-pill` is no longer a pill: every action
     is 7 px, and the token keeps its name only because a dozen selectors do. */
  --radius-xs:   5px;
  --radius-sm:   6px;
  --radius:      9px;
  --radius-lg:   10px;
  --radius-pill: 7px;

  /* Soft, single-source elevation — light from above, no offset block. It is
     what lets the hairlines be a whisper instead of a cut-out; a border and a
     shadow are two answers to the same question. Two depths: a menu at 30 px
     of blur, a sheet over the model at 62. */
  --shadow-sm:   0 1px 2px rgb(0 0 0 / 0.34);
  --shadow:      0 24px 62px rgb(0 0 0 / 0.55), 0 2px 10px rgb(0 0 0 / 0.32);
  --shadow-lift: 0 12px 30px rgb(0 0 0 / 0.5);

  /* The one other hue in the palette, and it says the same two things in both
     products: a run that stopped, and a deletion. */
  --bad:        #efaa98;
  /* THE CLAY GAINS THE STEP THE ACID HAS (G4, decision 20), at the value Fab
     3D already had on the one filled destructive control in either product:
     `#delete-confirm:hover`. A ramp with a lift on one hue and none on the
     other is why that hover was a literal, and nothing moves — this is the
     colour that was there. */
  --bad-bright: #f6c2b3;
  --flag-bg:    rgb(var(--bad-rgb) / 0.10);
  --flag-bar:   var(--bad);

  --sans:  "Instrument Sans", Arial, Helvetica, sans-serif;
  --serif: Newsreader, Georgia, "Times New Roman", serif;
  --mono:  "Geist Mono", ui-monospace, "Cascadia Mono", "Cascadia Code",
           Consolas, "DejaVu Sans Mono", monospace;

  --wake: 180ms cubic-bezier(0.2, 0.7, 0.3, 1);
}

/* WHAT WAS CONSIDERED AND TURNED DOWN — C2 step 6.
 *
 * The step that aligns the two appearances is one commit per visible change
 * Jules accepts, and a change he does not take has to leave a trace somewhere
 * or the next reader re-proposes it in six months. This is that somewhere: the
 * palette is the only file both products read, so the rejected rows of the
 * plan's decision table live here, beside the values they would have moved.
 *
 *   DECISION 1 — the FABER mark leaves the centre of Fab 2D's top band for a
 *   78 px left-aligned bar like Fab 3D's. YES (Jules, 2026-09-22): the two
 *   workspaces are one product and their common navigation must occupy the
 *   same coordinates. `fab_ui.chrome.lockup()` still emits a class and no
 *   size; each static page owns its loading order, while both stylesheets keep
 *   the agreed bar geometry and control order.
 *
 *   The neighbouring rows are NOT rejections and are not listed here: Fab 2D's
 *   two legal pages go dark in B3 step 7 (decision 4 — one re-signature of the
 *   served bytes rather than two), the shared favicon is C3 step 3 (decision
 *   14), and the switch's own appearance lands with the switch (decisions 10
 *   and 11). A row with an owner is debt, not a refusal.
 */
