/* 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's sixteen tokens in
 * `app.css`, the drawing side'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 the drawing side'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 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 — 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          Manrope, …                    --sans (Instrument Sans until
 *                                                 2026-10-01: see TWO TYPEFACES)
 *
 *   (b) NO FAB 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 the drawing side'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 — visible only when the webfont fails,
 *       which is the one moment a fallback tail is the whole typography
 *   ────────────────────────────────────────────────────────────────────────────
 *   --mono    Fab 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.
 *
 * TWO TYPEFACES, AND NO THIRD (Jules, 2026-10-01, the canvas « Fab — polices,
 * avant et après », column « Choisi »). MANROPE is the whole interface — the
 * chrome, the titles and Fab's own voice, the thought lines included — and
 * GEIST MONO stays for every label and every value. Newsreader went, and with
 * it `--serif`: the agent's italic voice and the italic titles are Manrope,
 * UPRIGHT, at their old sizes. Manrope has no italic and Geist Mono none either,
 * so nothing is ever slanted by the browser (`font-synthesis-style` below): an
 * italic asked for anywhere, the legal pages' accent included — their bytes are
 * hashed and are not edited for a typeface — is drawn upright rather than
 * faked. Instrument Sans went with it. The Manrope file is the variable latin
 * subset of `@fontsource-variable/manrope@5.3.0`, 200–800, declared 400–800 so
 * that a weight of 300 written for the old faces still lands on the 400 it
 * always drew (`src/fab/ui/NOTICE.md`, `vendor/provenance.json`).
 *
 * 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
 * The CAD side today, `/tokens.css` makes it `/fonts/…` for the drawing side at C2 step 2, and
 * `/<prefix>/tokens.css` makes it `/<prefix>/fonts/…` at D1 (decision 11) — with no
 * edit to this file, to either product, or to `serve.mount`'s whitelist.
 *
 * WHAT IS NOT HERE. The drawing side'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: Manrope;
  src: url("fonts/manrope-latin.woff2") format("woff2");
  font-weight: 400 800; 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; }

: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;
  --caution-rgb:   238 178 95;
  --on-accent-rgb: 23 51 44;      /* #17332c — the ink ON the acid; the Projects count's wash */

  --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 spent its `--ink-mute` on 10 px uppercase
     micro labels alone; in the drawing side 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 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);
  /* THE BAND OF A ROW THAT IS CHOSEN (the model's tree, Jules, 2026-10-01):
     the lime laid thin under a selected line. On the void .12 is enough; on
     the cream the lime and the ground are one lightness, so by day it is .30
     (the day block). */
  --accent-wash:   rgb(var(--accent-rgb) / 0.12);
  --on-accent:     #17332c;                  /* the only colour type is set in on the acid */
  --acid:          var(--accent);            /* Fab's 59 `var(--acid)`, unedited */
  /* THE ACID AS TYPE, which is not the same question as the acid as a FILL
     (the drawing side's, 2026-09-22, ported with the day room). On the void
     they are one colour and these tokens ARE that colour; on parchment they
     cannot be — #d8ef62 on a light ground is 1.3:1, a word nobody can read —
     so the day room darkens these and leaves the fill alone, and the one acid
     button stays the acid button it is in both rooms. Every `color:` in the
     accent goes through here; every `background:`, border and outline still
     goes through `--accent`. */
  --accent-ink-rgb:    var(--accent-rgb);
  --accent-ink:        var(--accent);
  --accent-ink-bright: var(--accent-bright);
  /* THE EDGE OF A FILLED LIME SURFACE (Jules, 2026-10-01): nothing on the
     void, where the lime stands off the ground by itself, and one pixel of
     its own ink by day, where it does not (the day block). Every surface
     FILLED with the accent draws it, inset or as its border, so the layout
     does not move by a pixel between the rooms. */
  --accent-edge:       transparent;

  /* 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 had a second use
     from G4, the numeric literal in Fab's streaming script, and lost it to the
     day room: the paper has no mode and that number must, so it reads
     `--ink-lit` below, which is this value at night. */
  --paper: #fff;
  /* The sheet's own lettering (osifont, ISO 3098), served by each drawing
     (`font.ttf`): a text rewritten by hand on a drafted drawing reads as the
     sheet writes it. The drawing's ink, not the chrome's third face. */
  --sheet-letters: FabSheet, monospace;
  /* A 2D drawing in `viewer2d` (`viewer2d.css`): black at night, as a CAD
     program's model space, and the paper by day (Jules, 2026-10-12). It is a
     machine's file on screen, never printed, so it has a mode. */
  --sheet-2d: #000;
  /* A 2D drawing's inks (`viewer2d`), as a cut file's plotted on a board:
     the knife red, the pen blue, the fold grey, and the reference — a layer
     no case names, the source laid under a file — amber. Ink on a machine's
     file, the same in both rooms, like the paper's. */
  --ink-cut: #e0452f;
  --ink-pen: #3b8bea;
  --ink-fold: #8a948f;
  --ink-ref: #d08a1a;
  /* A drafted drawing's dimensions, drawn by its pane over the page picture
     (`drawing.js`, live dimensions): the kit's own ink, ACI 5, the blue the
     PDF prints them in — the same colour on screen whether the page or the
     pane draws them. */
  --dimension-ink: #00f;
  /* Drawing evidence categories (Jules, 1 October 2026). These mark the
     drawing's content, like dimension ink, rather than application controls.
     Keep enough contrast on white paper and use the same keys in the report. */
  --analysis-info: #397fc3;
  --analysis-ok: #268457;
  --analysis-warning: #b56d13;
  --analysis-error: #c34d42;
  --analysis-question: #8962c0;
  /* THE STREAMING SCRIPT'S NUMBER, which was `--paper` since G4 — the one value
     brighter than `--ink`. The paper has no mode and the number must: over
     parchment the brightest ink is the DARKEST one, so it is a token of its
     own, the paper at night. */
  --ink-lit: var(--paper);

  /* 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;

  /* THE TOP BAR, ONE GEOMETRY FOR BOTH WORKBENCHES (Jules, 2026-09-24): a
     78 px bar and every control in it exactly 40 px tall — the workspace
     selector, Projects, the plus, the credits button, Activity, the account.
     Named here rather than in either product's sheet so the two bars cannot
     drift apart by one pixel: `base.css` sizes the shared controls from these,
     and each product's sheet reads the bar height rather than restating it.
     At phone width `base.css` lowers the control to 34 px, because a 78 px
     bar holds two rows of 34 and not two of 40. */
  --bar-h:     78px;
  --control-h: 40px;
  /* AND TIGHTER INSIDE A PROJECT (Jules, 2026-09-26, the desk's second pass:
     the desk needs the height): a 60 px bar and 34 px controls, the tool
     plate's squares included. A project's page puts these into `--bar-h` and
     `--control-h`; the home and the projects wall keep the pair above. */
  --bar-h-desk:     60px;
  --control-h-desk: 34px;

  /* 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;
  /* « À vérifier » (Jules, 2026-10-08, the G-code verdict: red refused, orange to check,
     green ready): an amber between --bad and the acid, never a fill. */
  --caution:    #eeb25f;
  /* 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);

  /* A WINDOW OF THE DESK, HEAD AND BODY ONE COLOUR (Jules, 2026-10-02). At
     night the kinds differ by a breath that reads as one: the panel at .6, a
     drawing, a workbook or a file on the ground, the model at .55 over the
     sky. By day they are one grey, exactly the panel, whatever the kind. */
  --window:       rgb(var(--panel-rgb) / 0.6);
  --window-paper: var(--ground);
  --window-model: rgb(var(--ground-rgb) / 0.55);
  /* Its contour and its fall: the rule and no shadow at night; by day the
     control's line and a short soft shadow, so a grey window stands off the
     grey ground. */
  --window-edge:   var(--rule);
  --window-shadow: none;
  /* THE PROMPT BAR (« Ask Fab »), shut and open: the panel at night; white
     by day, the one white thing on the desk besides the sheet. */
  --entry:         rgb(var(--panel-rgb) / 0.90);
  --entry-open:    var(--panel);
  --entry-line:    var(--line);

  /* THE TWO SIGN-IN DOORS' FACE (`front/static/app.css`, Jules,
     2026-09-30): a control a step off the ground, and its hover a step
     further. They were the night's two literals, so by day the doors stayed
     dark on the cream (2026-10-01): they are the day's panel and paper there. */
  --door:      rgb(16 18 24);
  --door-live: rgb(22 25 33);

  --sans:  Manrope, Arial, Helvetica, sans-serif;
  /* Neither face has an italic, and a slant the browser fakes is a third
     typeface nobody chose: an italic asked for is drawn upright. */
  font-synthesis-style: none;
  --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);

  /* THE SKY: its one nebula and how much of the star field shows. A name
     since the day room, because a literal does not turn — the nebula was the
     last colour literal in `app.css`, a blue-grey lift in the middle of a dark
     room, and the drawing side named the same stop `--lift`. Named `--nebula`
     here because `.composer` already spends `--lift` on a length. */
  --nebula: rgb(114 122 148 / 0.10);
  --stars:  0.35;
  /* THE COMPASS, the one loading state, is a file with its own ink — the
     chrome's white and the acid spark — so it cannot read a token. By day it
     is inverted in lightness and kept in hue: dark ink over parchment, the
     spark the acid taken down, exactly the treatment the accent gets as type. */
  --mark-filter: none;
  /* A BRAND MARK THAT MAY NOT BE RECOLOURED (OpenAI's white Blossom, NOTICE.md)
     cannot follow the room the way the compass does. At night it sits on the
     dark as it is; by day it gets a disc of the charcoal ink behind it, so the
     same unaltered white mark is drawn on a ground it was made for. */
  --mark-plate:     transparent;
  --mark-plate-pad: 0px;
}

/* ------------------------------------------------------------------ THE DAY
 * A SECOND PALETTE AND NOTHING ELSE (a client,
 * 2026-09-22: « est-il possible d'avoir un mode jour sur le site ? »), ported
 * from the drawing side's page where it shipped that week. Every colour the
 * product draws is a token, so the day is ONE block and not a second
 * stylesheet — which is also the only way it stays true: a rule written in a
 * colour rather than in a token simply does not turn.
 *
 * WHEN IT APPLIES. `ui/theme.js` sets `data-theme` on `<html>` in the `<head>`,
 * before the first paint, from the browser's choice (`fab.theme`) or, with
 * nothing chosen, from the machine's `prefers-color-scheme`. The block below
 * the first is that same room for a page on which nothing set the attribute
 * yet; the two are one list, and `tests/charter/test_tokens.py` holds that
 * they say exactly the same thing.
 *
 * THE PAPER HAS NO MODE. `--paper`, `--dimension-ink` and `--on-accent` (the
 * ink the sheet's selection and zones are drawn in) are not in this block, and
 * the balloons' inspection red is not a token at all (`drawing.js`,
 * `DEFAULT_BAL`): they are ink on a drawing somebody prints, and a drawing
 * that changed colour with somebody's eyes would be a different drawing.
 *
 * SLATE ON WHITE (Jules, 2026-10-02, option « B · Ardoise » of the canvas
 * « Fab — mode jour »). The ground is a cool grey, #eef0f3, and the top bar
 * is that ground; every window, its head and body alike and whatever its
 * kind, is one light grey, #f7f8fa, the panel; the sheet of a drawing is the
 * white on it; every ink is slate, 28 36 51, from the title
 * #1c2433 down to the quiet ink #5f6878 and the faint #949cab; a panel's
 * rule is #e9ecf0 and a control's line #dfe3e8, the canvas's own values. A chosen row is a slate wash, not the
 * lime. THE BRAND LIME IS THE FILL IN BOTH ROOMS, #d8ef62 as at night
 * (`--accent` is not in this block), darkened only as TYPE (`--accent-ink`),
 * and a filled lime surface wears a 1 px edge of its own ink by day
 * (`--accent-edge`, transparent at night). Shadows are neutral and short.
 * (It replaces « G · Lime d'origine », 2026-10-01: the banner's cream
 * #f3efe3 under #fbf9f3 panels and the logo's charcoal ink.)
 *
 * AND THERE ARE NO STARS AND NO LAMP: stars over a light ground are either
 * invisible or grubby, so that layer goes, and the nebula under it is
 * transparent — the ground is flat. The sky keeps its gradient's shape so
 * the night's stays one token away. */
:root[data-theme="light"] {
  color-scheme: light;
  --ink-rgb:       28 36 51;
  --ink-faint-rgb: 148 156 171;
  --ground-rgb:    238 240 243;
  --panel-rgb:     247 248 250;
  --bad-rgb:       176 65 42;
  --caution-rgb:   154 90 6;
  --accent-ink-rgb: 77 97 7;
  --ground:        #eef0f3;
  --sheet-2d: var(--paper);
  --panel-solid:   #f7f8fa;
  --rule:          #e9ecf0;
  --ink:           #1c2433;
  --ink-2:         #3b4557;
  --ink-soft:      #3b4557;
  --ink-mute:      #5f6878;
  --ink-lit:       #0b1019;
  --ink-faint:     #949cab;
  --line:          #dfe3e8;
  --line-live:     rgb(var(--ink-rgb) / 0.32);
  /* The fill is the brand's and does not move; its hover DARKENS here, where
     on the void it lifted towards paper — a hover goes away from the ground
     it sits on, and the ground has changed sides. */
  --accent-bright:     #cbe44a;
  --accent-soft:       rgb(var(--accent-rgb) / 0.55);
  /* A chosen row is slate by day: #eef1f5. */
  --accent-wash:       #eef1f5;
  --accent-ink:        #4d6107;
  --accent-ink-bright: #3d4d05;
  /* On white the lime is told from the room by its hue alone, so by day it
     wears one pixel of its own ink, drawn inside it so that nothing moves. */
  --accent-edge:       rgb(var(--on-accent-rgb) / 0.18);
  /* Light from above still, neutral and short over white. */
  --shadow-sm:   0 1px 2px rgb(16 18 22 / 0.06);
  --shadow:      0 14px 36px rgb(16 18 22 / 0.10), 0 2px 6px rgb(16 18 22 / 0.06);
  --shadow-lift: 0 6px 20px rgb(16 18 22 / 0.05), 0 1px 2px rgb(16 18 22 / 0.04);
  /* The clay that says « a run stopped », taken down to where it reads. */
  --bad:         #b0412a;
  --caution:     #9a5a06;
  --bad-bright:  #96351f;
  /* No lamp: the ground is flat. */
  --nebula:      transparent;
  --stars:       0;
  --mark-filter: invert(1) hue-rotate(180deg);
  /* The doors are grey cards on the grey ground, and their hover is white. */
  --door:        var(--panel-solid);
  --door-live:   #ffffff;
  /* Every window is the panel's grey, its head included. */
  --window:       var(--panel-solid);
  --window-paper: var(--panel-solid);
  --window-model: var(--panel-solid);
  --window-edge:   var(--line);
  --window-shadow: 0 1px 2px rgb(16 18 22 / 0.04), 0 6px 20px rgb(16 18 22 / 0.05);
  --entry:         #ffffff;
  --entry-open:    #ffffff;
  --entry-line:    #d9dde3;
  --mark-plate:     var(--ink);
  --mark-plate-pad: 3px;
}
@media (prefers-color-scheme: light) {
  :root:not([data-theme="dark"]) {
    color-scheme: light;
    --ink-rgb:       28 36 51;
    --ink-faint-rgb: 148 156 171;
    --ground-rgb:    238 240 243;
    --panel-rgb:     247 248 250;
    --bad-rgb:       176 65 42;
  --caution-rgb:   154 90 6;
    --accent-ink-rgb: 77 97 7;
    --ground:        #eef0f3;
    --sheet-2d: var(--paper);
    --panel-solid:   #f7f8fa;
    --rule:          #e9ecf0;
    --ink:           #1c2433;
    --ink-2:         #3b4557;
    --ink-soft:      #3b4557;
    --ink-mute:      #5f6878;
    --ink-lit:       #0b1019;
    --ink-faint:     #949cab;
    --line:          #dfe3e8;
    --line-live:     rgb(var(--ink-rgb) / 0.32);
    --accent-bright:     #cbe44a;
    --accent-soft:       rgb(var(--accent-rgb) / 0.55);
    --accent-wash:       #eef1f5;
    --accent-ink:        #4d6107;
    --accent-ink-bright: #3d4d05;
    --accent-edge:       rgb(var(--on-accent-rgb) / 0.18);
    --shadow-sm:   0 1px 2px rgb(16 18 22 / 0.06);
    --shadow:      0 14px 36px rgb(16 18 22 / 0.10), 0 2px 6px rgb(16 18 22 / 0.06);
    --shadow-lift: 0 6px 20px rgb(16 18 22 / 0.05), 0 1px 2px rgb(16 18 22 / 0.04);
    --bad:         #b0412a;
  --caution:     #9a5a06;
    --bad-bright:  #96351f;
    --nebula:      transparent;
    --stars:       0;
    --mark-filter: invert(1) hue-rotate(180deg);
    --door:        var(--panel-solid);
    --door-live:   #ffffff;
    --window:       var(--panel-solid);
    --window-paper: var(--panel-solid);
    --window-model: var(--panel-solid);
    --window-edge:   var(--line);
    --window-shadow: 0 1px 2px rgb(16 18 22 / 0.04), 0 6px 20px rgb(16 18 22 / 0.05);
    --entry:         #ffffff;
    --entry-open:    #ffffff;
    --entry-line:    #d9dde3;
    --mark-plate:     var(--ink);
    --mark-plate-pad: 3px;
  }
}

/* ------------------------------------------------- THE WORKSHOP ROOM
 * A PALETTE A WINDOW MAY BE DRAWN IN (`registerPane`'s `room: "workshop"`, which
 * sets `data-room` on its frame; `.room-workshop` on what it draws outside it):
 * a workshop program's own night, and a day version of it (root `AGENTS.md`,
 * « The core names capabilities »: the palette is the charter's, the window that
 * is drawn in it a skill's).
 *
 * AT NIGHT the window is that night, value for value (Jules, 2026-10-12: « change
 * pas »): every token the day redeclares, and every token made of one of them, is
 * said again below with the night's value, on the window's frame
 * (`.desk-pane[data-room="workshop"]`) and on everything of the window's that is
 * not inside it (`.room-workshop`: its layer of menus, the navigation it puts in the
 * bar, its print and DXF areas) — `tests/charter/test_tokens.py` holds it to the night.
 *
 * BY DAY IT IS A DAY VERSION OF THE SAME PAGE (Jules, later the same evening: « si
 * tu es en mode jour, fais en sorte que le mode jour il fonctionne quand même »).
 * Until then the window kept the night by day. Now the second block turns it, under
 * the same two selectors as Fab's day — the attribute, and the machine's light with
 * no attribute, one list said twice word for word: the same layout, marks and colour
 * coding on the day's slate inks, the page a light grey (#f7f8fa, a window's grey by
 * day) and its panels white (raised, as the night's panels are raised over its
 * ground). The acid FILL stays the brand's; the acid as type, line and edge is
 * `--accent-ink`, which the night keeps equal to the acid, so a window drawn here
 * writes it everywhere the acid is read rather than laid. The data hues are taken
 * down to ink, and the operations' hues drawn darker (`--op-l`). Every token the
 * night block declares has a day value here but the paper's three, and the test
 * holds that too.
 *
 * THE PAPER HAS NO MODE: a sheet is a drawing somebody prints, inked in the night's
 * ground in both rooms (the third block, on the sheets themselves). */
.desk-pane[data-room="workshop"], .room-workshop {
  color-scheme: dark;
  --ink-rgb:       226 216 192;
  --ink-faint-rgb: 222 213 194;
  --ground-rgb:    6 6 8;
  --panel-rgb:     13 13 17;
  --bad-rgb:       239 170 152;
  --caution-rgb:   238 178 95;
  --accent-ink-rgb: 216 239 98;
  --ground:        #060608;
  --panel:         rgb(13 13 17 / 0.94);
  --panel-solid:   #0d0d11;
  --rule:          rgb(226 216 192 / 0.10);
  --ink:           #f3ebdb;
  --ink-2:         #dcd7c9;
  --ink-soft:      #c6c9bf;
  --ink-mute:      #8f948c;
  --ink-faint:     rgb(222 213 194 / 0.38);
  --ink-lit:       #fff;
  --line:          rgb(226 216 192 / 0.16);
  --line-live:     rgb(226 216 192 / 0.30);
  --accent-bright:     #e5f5a8;
  --accent-soft:       rgb(216 239 98 / 0.38);
  --accent-wash:       rgb(216 239 98 / 0.12);
  --accent-ink:        #d8ef62;
  --accent-ink-bright: #e5f5a8;
  --accent-edge:       transparent;
  --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);
  --bad:         #efaa98;
  --caution:     #eeb25f;
  --bad-bright:  #f6c2b3;
  --flag-bg:     rgb(239 170 152 / 0.10);
  --flag-bar:    #efaa98;
  --window:       #0d0d11;
  --window-paper: #060608;
  --window-model: #060608;
  --window-edge:   rgb(226 216 192 / 0.10);
  --mark-filter: none;
  /* the page's own data hues (the workshop program's own): the references and their sides, what is
     to check, the verdicts, and the lightness the operations' hues are drawn at */
  --ref-a:   hsl(4 72% 66%);
  --ref-b:   hsl(42 86% 62%);
  --ref-c:   hsl(146 48% 58%);
  --ref-d:   hsl(208 78% 68%);
  --warn:    hsl(38 88% 64%);
  --warn-bg: hsl(38 88% 64% / .10);
  --crit:    var(--bad);
  --crit-bg: var(--flag-bg);
  --v-ok:    hsl(140 58% 52%);
  --v-tight: hsl(26 95% 58%);
  --v-ko:    hsl(0 82% 62%);
  --op-l:    66%;
  /* the paper's: drawn on a dépliant sheet, the same in both rooms */
  --ref-d-ink: hsl(208 70% 38%);
  --ref-b-ink: hsl(36 85% 38%);
  --cut-ink:   hsl(2 78% 46%);
  /* a 2D drawing's sheet (`viewer2d.css`): the night's, as the day turns it */
  --sheet-2d: #000;
  /* the posage, one colour per function (machining skill's AGENTS.md, « The posage's symbols »):
     the appui, the centrage, the serrage — and their inks on a dépliant sheet */
  --pos-ap:     hsl(208 82% 66%);
  --pos-ce:     hsl(150 55% 55%);
  --pos-se:     hsl(24 92% 62%);
  --pos-ap-ink: hsl(208 70% 38%);
  --pos-ce-ink: hsl(150 60% 27%);
  --pos-se-ink: hsl(20 85% 40%);
}

:root[data-theme="light"] :is(.desk-pane[data-room="workshop"], .room-workshop) {
  --sheet-2d: var(--paper);
  color-scheme: light;
  --ink-rgb:       28 36 51;
  --ink-faint-rgb: 148 156 171;
  --ground-rgb:    247 248 250;
  --panel-rgb:     255 255 255;
  --bad-rgb:       176 65 42;
  --caution-rgb:   154 90 6;
  --accent-ink-rgb: 77 97 7;
  --ground:        #f7f8fa;
  --panel:         rgb(255 255 255 / 0.96);
  --panel-solid:   #ffffff;
  --rule:          #e6e9ee;
  --ink:           #1c2433;
  --ink-2:         #2b3445;
  --ink-soft:      #3b4557;
  --ink-mute:      #5f6878;
  --ink-faint:     #8a93a3;
  --ink-lit:       #0b1019;
  --line:          #d9dee5;
  --line-live:     rgb(28 36 51 / 0.32);
  --accent-bright:     #cbe44a;
  --accent-soft:       rgb(77 97 7 / 0.42);
  --accent-wash:       #eef1f5;
  --accent-ink:        #4d6107;
  --accent-ink-bright: #3d4d05;
  --accent-edge:       rgb(23 51 44 / 0.18);
  --shadow-sm:   0 1px 2px rgb(16 18 22 / 0.06);
  --shadow:      0 14px 36px rgb(16 18 22 / 0.12), 0 2px 6px rgb(16 18 22 / 0.07);
  --shadow-lift: 0 8px 24px rgb(16 18 22 / 0.10), 0 1px 3px rgb(16 18 22 / 0.06);
  --bad:         #b0412a;
  --caution:     #9a5a06;
  --bad-bright:  #96351f;
  --flag-bg:     rgb(176 65 42 / 0.08);
  --flag-bar:    #b0412a;
  --window:       #f7f8fa;
  --window-paper: #f7f8fa;
  --window-model: #f7f8fa;
  --window-edge:   #d9dee5;
  --mark-filter: invert(1) hue-rotate(180deg);
  --ref-a:   hsl(4 65% 45%);
  --ref-b:   hsl(36 85% 38%);
  --ref-c:   hsl(146 50% 32%);
  --ref-d:   hsl(208 70% 42%);
  --warn:    hsl(30 85% 40%);
  --warn-bg: hsl(30 85% 40% / .10);
  --crit:    var(--bad);
  --crit-bg: var(--flag-bg);
  --v-ok:    hsl(140 60% 32%);
  --v-tight: hsl(26 90% 42%);
  --v-ko:    hsl(0 75% 45%);
  --op-l:    44%;
  --pos-ap:  hsl(208 75% 40%);
  --pos-ce:  hsl(150 60% 28%);
  --pos-se:  hsl(20 85% 42%);
}
@media (prefers-color-scheme: light) {
  :root:not([data-theme="dark"]) :is(.desk-pane[data-room="workshop"], .room-workshop) {
    --sheet-2d: var(--paper);
    color-scheme: light;
    --ink-rgb:       28 36 51;
    --ink-faint-rgb: 148 156 171;
    --ground-rgb:    247 248 250;
    --panel-rgb:     255 255 255;
    --bad-rgb:       176 65 42;
    --caution-rgb:   154 90 6;
    --accent-ink-rgb: 77 97 7;
    --ground:        #f7f8fa;
    --panel:         rgb(255 255 255 / 0.96);
    --panel-solid:   #ffffff;
    --rule:          #e6e9ee;
    --ink:           #1c2433;
    --ink-2:         #2b3445;
    --ink-soft:      #3b4557;
    --ink-mute:      #5f6878;
    --ink-faint:     #8a93a3;
    --ink-lit:       #0b1019;
    --line:          #d9dee5;
    --line-live:     rgb(28 36 51 / 0.32);
    --accent-bright:     #cbe44a;
    --accent-soft:       rgb(77 97 7 / 0.42);
    --accent-wash:       #eef1f5;
    --accent-ink:        #4d6107;
    --accent-ink-bright: #3d4d05;
    --accent-edge:       rgb(23 51 44 / 0.18);
    --shadow-sm:   0 1px 2px rgb(16 18 22 / 0.06);
    --shadow:      0 14px 36px rgb(16 18 22 / 0.12), 0 2px 6px rgb(16 18 22 / 0.07);
    --shadow-lift: 0 8px 24px rgb(16 18 22 / 0.10), 0 1px 3px rgb(16 18 22 / 0.06);
    --bad:         #b0412a;
    --caution:     #9a5a06;
    --bad-bright:  #96351f;
    --flag-bg:     rgb(176 65 42 / 0.08);
    --flag-bar:    #b0412a;
    --window:       #f7f8fa;
    --window-paper: #f7f8fa;
    --window-model: #f7f8fa;
    --window-edge:   #d9dee5;
    --mark-filter: invert(1) hue-rotate(180deg);
    --ref-a:   hsl(4 65% 45%);
    --ref-b:   hsl(36 85% 38%);
    --ref-c:   hsl(146 50% 32%);
    --ref-d:   hsl(208 70% 42%);
    --warn:    hsl(30 85% 40%);
    --warn-bg: hsl(30 85% 40% / .10);
    --crit:    var(--bad);
    --crit-bg: var(--flag-bg);
    --v-ok:    hsl(140 60% 32%);
    --v-tight: hsl(26 90% 42%);
    --v-ko:    hsl(0 75% 45%);
    --op-l:    44%;
    --pos-ap:  hsl(208 75% 40%);
    --pos-ce:  hsl(150 60% 28%);
    --pos-se:  hsl(20 85% 42%);
  }
}
.room-workshop :is(.sheet, .sheet-big, .dsheet, .dep-th) {
  --ground:     #060608;
  --ground-rgb: 6 6 8;
}

/* 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 the drawing side's top band for a
 *   78 px left-aligned bar like Fab'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 mark came BACK to the
 *   centre on 2026-09-24 (Jules, the « A3 » bar) — on the bar's centre line,
 *   in both workbenches and on every surface — with the navigation on the
 *   left and the account's controls on the right (`--bar-h`, `--control-h`).
 *
 *   The neighbouring rows are NOT rejections and are not listed here: The drawing side'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.
 */
