/* ============================================================================
   ANIMUS — the whole language in one stylesheet.

   HOW TO APPLY IT. Add ONE link, AFTER engine/mc-ui.css:

       <link rel="stylesheet" href="../engine/mc-ui.css">
       <link rel="stylesheet" href="../brand/animus/animus.css">

   That is the entire integration. Order matters and it is the only thing that
   does: this file redefines the same custom properties mc-ui.css declares, on
   the same `:root` selector, so it wins on source order alone. No selector here
   is more specific than the rule it replaces, nothing uses `!important` outside
   the print block, and every legacy COLOUR alias mc-ui.css section 4 publishes
   is re-pointed rather than renamed. A page that already reads --bone, --panel,
   --canvas, --amber, --teal, --clay, --line, --grid or --disp keeps reading
   exactly those names and gets Animus values back. Renaming or dropping one of
   them re-breaks every page at once and no gate can see it.

   RE-POINTING IS FOR COLOUR. IT IS NOT FOR A SCALE OR A TYPEFACE, and that
   distinction was learned the expensive way. A colour has one job on a page and
   a theme may change it. A spacing step and a font advance are METRICS: rules
   were authored around the numbers they produce, so re-pointing one under the
   name its authors used does not restyle those rules, it MOVES them, silently,
   everywhere the link is present. Three properties in this file did exactly
   that and are now named apart:

     spacing   --as-0..10 here.  --sp-1..7 stays engine/mc-ui.css's 4px scale.
     monospace --as-mono here.   --mono stays mc-ui.css's Figtree + tabular-nums.
     easing    --as-ease-out here. --ease-out belongs to site/site-motion.css.

   There is no alias from either name to the other, deliberately: an alias is
   the same collision with a longer name. The remaining re-points in section 10
   are unchanged and are out of scope of that decision, not endorsed by it.

   WHAT THIS FILE IS NOT. It is not a layout. It sets colour, border, font,
   outline and shadow, and it deliberately does not set display, width, flex,
   grid or padding on any element mc-ui.css already lays out. Dropping a theme
   on top of 71 pages only works if the theme has no opinion about geometry.
   The two exceptions are `.animus-field` (a background host that must be fixed
   and behind everything) and the notch clip-path, which is a corner treatment
   rather than a box model.

   WHERE THE VALUES COME FROM. The base scales in section 2 are lifted verbatim
   from the Animus Design System's own tokens/colors.css. Nothing here is a new
   colour. Where the design system expresses a value as
   `color-mix(in oklab, X n%, transparent)` this file writes the identical thing
   as `rgba()` — mixing with transparent in oklab IS an alpha, exactly — because
   a resolved rgba can be composited and measured on paper, and color-mix cannot.
   That is not a style preference: every ratio in the comments below was computed
   over these literals, and a value nobody can compute is a value nobody checks.

   THE CONTRAST CONTRACT. Moving a light UI onto a near-black ground kills text
   silently. Nothing in this repo's toolchain computes a contrast RATIO --
   consistency.py counts colour literals, smoke.py asserts nothing threw. So
   every foreground/background pair this file defines carries its measured WCAG
   2.x ratio in the comment beside it, computed as sRGB relative luminance over
   the composited opaque result, not eyeballed. The floors are 4.5:1 for body
   text, 3:1 for large text and for any non-text thing that identifies a control
   or its state. Three values were REFUSED on measurement and the refusals are
   recorded where they happened, because a rejected value that leaves no trace
   gets re-proposed.

   NO EMOJI. NO CDN. Both typefaces are self-hosted under fonts/ with their OFL
   text; see fonts/README.md.
   ========================================================================= */


/* ---- 1. fonts ------------------------------------------------------------
   Paths are relative to THIS FILE, so one declaration resolves from the repo
   root (slipcurve-shell.html), from modules/*.html and from site/*.html
   alike. Do not rewrite them page-relative.

   Both faces ship a single weight. They are declared at exactly that weight and
   nothing in this file ever asks for another one: a synthesised bold on a
   monospace face inflates the advance width and breaks the tabular alignment
   that every number in this product leans on. Emphasis is colour and tracking.
   -------------------------------------------------------------------------- */
/* THE SWAP MUST NOT MOVE THE PAGE. src is local() only -- no request, so no
   bytes and nothing for the file:// origin to block (trap 11). system-ui is
   what renders before Figtree arrives and sets the same nav at 645px against
   Figtree's 508; Arial and its clone Liberation Sans set it at 545, so
   size-adjust is 508/545. The vertical overrides are Figtree's own hhea,
   950/-250/0 per 1000 em, DIVIDED BY that factor -- a percentage here is
   relative to the adjusted em, not the original. */
@font-face{font-family:'Figtree fallback';font-style:normal;font-weight:300 900;
  src:local('Arial'),local('Helvetica Neue'),local('Liberation Sans'),local('Nimbus Sans');
  size-adjust:93.26%;ascent-override:101.87%;descent-override:26.81%;line-gap-override:0%;}
@font-face{font-family:'Tektur';font-style:normal;font-weight:500;font-display:swap;
  src:url('fonts/Tektur-Medium.ttf') format('truetype');}
@font-face{font-family:'Geist Mono';font-style:normal;font-weight:400;font-display:swap;
  src:url('fonts/GeistMono-Regular.ttf') format('truetype');}


:root{
  color-scheme:dark;   /* native scrollbars, spinners and date pickers follow.
                          Free, and the one thing a dark theme cannot fake. */

  /* ---- 2. BASE SCALES — verbatim from the Animus Design System -----------
     tokens/colors.css. Do not invent a colour outside these ramps; if a new
     one is genuinely needed it belongs in the design system first.          */
  --void-0:#04060a; --void-1:#080b11; --void-2:#0c1017;
  --void-3:#121821; --void-4:#1a222e; --void-5:#243040;

  --pearl-0:#ffffff; --pearl-1:#f6f7fa; --pearl-2:#eaedf3;
  --pearl-3:#d8dee7; --pearl-4:#b6c0cd; --pearl-5:#8d99a8;

  /* the spectrum: hue as position, position as hue */
  --spec-cyan:#1fe3ff;  --spec-azure:#3f7cff; --spec-violet:#9a5cff; --spec-magenta:#ff45cf;
  --spec-rose:#ff5a72;  --spec-amber:#ffb02e; --spec-lime:#95ff4d;   --spec-mint:#25e6a6;

  --signal-red:#ff3b52; --signal-amber:#ffb02e; --signal-green:#25e6a6; --signal-blue:#3f7cff;

  /* THE GROUND. #06070A, not --void-0 #04060a, and the difference is load
     bearing: animus-field.js ends its vacuum gradient on this exact value, so
     the canvas edge disappears into the page. MAKERS NEST.html uses the same
     literal for the same reason. If you change one, change both. */
  --animus-ink:#06070A;

  /* ---- 3. SURFACES -------------------------------------------------------
     A stack of four, darkest at the back. Ratios below are for the three text
     inks in section 4 measured ON each surface.

       surface        hex        text-1   text-2   text-3   accent(cyan)
       ground     #06070A        18.80    8.63     6.96     12.94
       sunken     #080b11        18.38    8.43     6.80     12.65
       card       #0c1017        17.79    8.16     6.58     12.24
       raised     #121821        16.64    7.63     6.16     11.45
       lifted     #1a222e        14.94    6.85     5.53     10.28

     Every cell clears 4.5:1. The stack is deliberately shallow -- five steps
     inside 15 L* -- because depth in this language is built from LINE DENSITY,
     not from filling boxes with progressively lighter grey.                 */
  --surface-void:var(--animus-ink);
  --surface-sunken:var(--void-1);
  --surface-card:var(--void-2);
  --surface-raised:var(--void-3);
  --surface-lifted:var(--void-4);

  /* THE GLASS PANEL — opt in, do not make it the default.
     rgba(12,16,23,.90) is --void-2 at 90%, which is what
     `color-mix(in oklab, var(--void-2) 90%, transparent)` resolves to.

     A translucent panel over an ANIMATED field means the text behind it sits on
     a background that changes every frame, so its contrast is a range, not a
     number. Measured against the worst pixel the field can produce (a pure
     white anomaly meridian) and the best (the bare ground):

       ink              worst    best
       text-1           13.82    17.92    ok
       text-2            6.34     8.22    ok
       text-3            5.12     6.63    ok
       cyan              9.51    12.33    ok
       magenta           4.94     6.40    ok
       signal-red        4.23     5.48    FAILS 4.5 at worst
       azure             3.91     5.06    FAILS 4.5 at worst
       violet            3.77     4.89    FAILS 4.5 at worst

     So: the three neutral inks and cyan are safe on glass at any frame; the
     series and status inks are NOT. Anything that has to carry an arbitrary
     coloured ink gets --surface-card, which is opaque and where every ink in
     this file clears 4.5:1 unconditionally. That is why the default panel is
     opaque and this one has to be asked for by name.                        */
  --surface-glass:rgba(12,16,23,.90);
  --surface-scrim:rgba(6,7,10,.78);   /* modal dim. Over a white field pixel it
                                         resolves to #3d3e40 and still carries
                                         text-1 at 9.99:1. */

  /* ---- 4. TEXT INKS ------------------------------------------------------
     Three, and only three. Ratios are on --surface-card #0c1017, the tightest
     opaque surface a body of text actually lands on; every one is higher on
     the ground and lower only on --surface-lifted, which is still listed above
     and still clears.                                                       */
  --text-1:var(--pearl-1);   /* #f6f7fa  primary          17.79:1 on card  */
  --text-2:#9dabbd;          /*          secondary         8.16:1 on card  */
  --text-3:var(--pearl-5);   /* #8d99a8  tertiary, labels  6.58:1 on card  */
  /* REFUSED: the design system's own --text-3 is #5d6c7f. On this ground it
     measures 3.76:1 and on --surface-card 3.55:1 -- under the 4.5:1 floor for
     body text at every size this product sets. It is a console value tuned for
     a surface that is never text-bearing. --pearl-5 is the next rung of the
     SAME Animus scale, it measures 6.58:1, and it is what tertiary text uses
     here. Do not put #5d6c7f back; it will pass every gate in this repo and
     still be unreadable. */
  --text-invert:var(--void-0);  /* #04060a on a filled accent -- see section 6 */
  --text-disabled:rgba(141,153,168,.70);
  /* #646d79 composited. 3.84:1 on the ground, 3.79:1 on card, 3.26:1 on the
     glass worst case. WCAG 1.4.3 exempts inactive controls from contrast
     entirely; this clears 3:1 anyway, because "exempt" and "illegible" are not
     the same claim. Note this is an INK, not an opacity on the control: fading
     a whole control also fades its border, and the border is what says the
     control is there at all. */

  /* ---- 5. LINES ----------------------------------------------------------
     Two duties, and conflating them is the classic dark-theme failure.

     DECORATIVE hairlines separate content that is already separated by
     position. WCAG 1.4.11 does not apply to them and they are deliberately
     faint -- this language builds depth out of many quiet lines, not a few
     loud ones. Composited ratios recorded so nobody mistakes them for the
     other kind: --line-1 is 1.31:1 on the ground, --line-2 is 1.79:1.

     A CONTROL border is the only thing that says an input exists. It carries
     1.4.11 and must clear 3:1 against every surface it can sit on.          */
  --line-1:rgba(182,192,205,.16);   /* pearl-4 @16%  decorative  1.31:1      */
  --line-2:rgba(182,192,205,.28);   /* pearl-4 @28%  decorative  1.79:1      */
  --line-3:rgba(31,227,255,.45);    /* cyan    @45%  active edge 3.22:1 on
                                       ground, 3.28:1 on card -- clears 3:1  */
  --line-control:rgba(182,192,205,.60);
  /* pearl-4 @60%. Worst case across the whole surface stack is 4.06:1 (on
     --surface-lifted); on the ground it is 4.40:1. REFUSED at .50 (3.24:1
     worst) and at .46 (2.99:1 on the ground -- it fails 3:1 by 0.01 and would
     have shipped on a glance). */
  --grid-line:rgba(63,124,255,.12); /* azure @12%. The blueprint rule. 1.11:1,
                                       and that is correct: a background grid
                                       that reaches 3:1 competes with the text
                                       sitting on it. */

  /* ---- 6. ACCENT AND SIGNAL ----------------------------------------------
     Cyan is the accent. Magenta is the second, and it is the hover partner
     rather than a peer -- one centre of gravity, everything else defers.

       ink            on ground   as fill, with --text-invert on top
       cyan  #1fe3ff    12.94         13.03
       magenta #ff45cf   6.72          6.76
       red   #ff3b52     5.75          5.79
       amber #ffb02e    11.03         11.11
       green #25e6a6    12.42         12.50
       blue  #3f7cff     5.31          5.35                                  */
  --accent:var(--spec-cyan);
  --accent-2:var(--spec-magenta);
  --accent-ink:var(--text-invert);
  --accent-rest:#1cc8e2;   /* the resting primary fill: 88% cyan over --void-0,
                              resolved and rounded to this hex. --text-invert
                              on it is 10.05:1, and it is 9.98:1 against the
                              page ground, so the button reads as an object
                              before it is hovered. */
  --accent-wash:rgba(31,227,255,.14);  /* selected row / active tint on card.
                                          Resolves #0f2e37; cyan on it 9.20:1,
                                          text-1 13.37:1. */
  --focus:var(--spec-cyan);
  --danger:var(--signal-red); --warning:var(--signal-amber);
  --success:var(--signal-green); --info:var(--signal-blue);
  --danger-wash:rgba(255,59,82,.16);   /* #331720 · its ink 4.67 · text-1 15.27 */
  --warning-wash:rgba(255,176,46,.16); /* #332a1b · its ink 7.73 · text-1 13.18 */
  --success-wash:rgba(37,230,166,.16); /* #10322e · its ink 8.53 · text-1 12.92 */
  --info-wash:rgba(63,124,255,.16);

  /* ---- 7. SERIES RAMP — categorical, spectral, ORDERED BY MEASUREMENT -----
     For a legend that is not a status: float path, discipline, resource, risk
     band, scenario. These are the eight Animus spectrum hues. What is NOT
     arbitrary is the ORDER: it was chosen greedily to maximise the minimum
     CIEDE2000 separation of the first N, so that a chart using four series
     gets the best four and a chart using six gets the best six. Dichromacy
     simulated with the Machado/Oliveira/Fernandes (2009) linear-RGB matrices
     at severity 1.0, the same method mc-ui.css section 3b documents.

       n  name     hex      L*     on #06070A
       1  azure    #3f7cff  54.8      5.31
       2  amber    #ffb02e  77.6     11.03
       3  cyan     #1fe3ff  83.1     12.94
       4  rose     #ff5a72  61.5      6.67
       5  lime     #95ff4d  91.0     16.01
       6  magenta  #ff45cf  61.7      6.72
       7  mint     #25e6a6  81.7     12.42
       8  violet   #9a5cff  53.8      5.13

     All eight clear 4.5:1 as text on the ground and 3:1 as a 1px stroke.
     Lightness alternates high and low so the ramp survives after hue collapses.

     WORST PAIR, CIEDE2000, by how many you actually use:
       first 4   normal 36.2 · deuteranopia 16.9 · protanopia 26.2 · tritanopia 17.7
       first 6   normal 21.0 · deuteranopia  6.4 · protanopia  6.4 · tritanopia  7.3
       all 8     normal 17.2 · deuteranopia  1.4 · protanopia  3.7 · tritanopia  5.0

     READ THE LAST ROW. Azure and violet are 1.4 apart under deuteranopia --
     that is not a weak distinction, it is the same colour. No reordering fixes
     it; the pair itself is the problem and this palette has eight hues, not
     nine. So: four series is comfortable, six is usable, and BEYOND SIX YOU
     MUST ADD A SECOND CHANNEL -- dash pattern, marker shape, or a direct
     label. Eight bare swatches with no other cue is a defect at position 8,
     not a compromise. */
  --series-1:var(--spec-azure);   --series-2:var(--spec-amber);
  --series-3:var(--spec-cyan);    --series-4:var(--spec-rose);
  --series-5:var(--spec-lime);    --series-6:var(--spec-magenta);
  --series-7:var(--spec-mint);    --series-8:var(--spec-violet);

  /* ---- 8. GEOMETRY, MOTION, EFFECT — Animus values -----------------------
     The system is near-square. Corners are cut, not rounded.                */
  /* THE SPACING SCALE IS --as-*, AND IT WAS --sp-*. Eleven steps on a tighter
     base than engine/mc-ui.css's --sp-1..7 (4 8 12 16 24 32 48), because dense
     chrome and a document want different bases and both are wanted. Declared
     under --sp-* they were not a theme of that scale, they were a silent
     rewrite of it: this file loads last on every page in the tree, including
     all seven site/ pages, so every var(--sp-N) any author had ever written
     rendered at half to two-thirds of the number they wrote. Nothing threw and
     no gate could see it. Two scales, two prefixes; ask for the one you mean.
     Do not re-declare --sp-* here to "keep compatibility". */
  --as-0:0px; --as-1:2px; --as-2:4px; --as-3:8px; --as-4:12px; --as-5:16px;
  --as-6:20px; --as-7:24px; --as-8:32px; --as-9:40px; --as-10:56px;
  --r-0:0px; --r-1:1px; --r-2:2px; --r-3:4px; --r-4:8px; --r-pill:999px;
  --notch:10px; --notch-lg:18px;
  --clip-notch:polygon(var(--notch) 0,100% 0,100% calc(100% - var(--notch)),calc(100% - var(--notch)) 100%,0 100%,0 var(--notch));

  --dur-1:90ms; --dur-2:160ms; --dur-3:260ms; --dur-4:420ms; --dur-5:900ms;
  --dur-cycle:12s;
  --ease-animus:cubic-bezier(.2,.8,.2,1);
  /* --as-ease-out, NOT --ease-out. site/site-motion.css declares --ease-out as
     one of a documented triad -- --ease-out for things arriving, --ease-in-out
     for things moving between two states, --ease-spring for a control the
     reader pressed -- and is the only consumer of the name anywhere in the
     tree. Its siblings were never in dispute; this one only looked settled
     because nothing in this file reads it. Under the shared name, and with this
     file linked last, every arrival on the marketing site ran on this curve
     instead of the one its author wrote (and reused verbatim from mc-ui.css's
     --ease). The name goes to the file that consumes it. */
  --as-ease-out:cubic-bezier(.16,1,.3,1);
  --t-hover:color var(--dur-2) var(--ease-animus),
            background-color var(--dur-2) var(--ease-animus),
            border-color var(--dur-2) var(--ease-animus),
            box-shadow var(--dur-2) var(--ease-animus);

  --glow-accent:0 0 0 1px rgba(31,227,255,.55),0 0 24px rgba(31,227,255,.22);
  --glow-accent-strong:0 0 0 1px var(--accent),0 0 36px rgba(31,227,255,.38);
  --glow-danger:0 0 0 1px rgba(255,59,82,.60),0 0 24px rgba(255,59,82,.26);
  --inset-hairline:inset 0 0 0 1px var(--line-1);
  --shadow-lift:0 18px 48px -24px rgba(4,6,10,.90);
  --shadow-panel:inset 0 1px 0 0 var(--line-1),0 24px 64px -32px rgba(4,6,10,.92);
  /* THE FOCUS RING, and the two-ring shape is not decoration.
     A cyan ring drawn directly against a cyan button is 1.29:1 -- invisible.
     The ground-coloured spacer ring puts the cyan against #06070A wherever the
     control sits, which is 12.94:1, and 1.4.11 wants 3:1 against ADJACENT
     colour. Never collapse this to a single ring. */
  --ring-focus:0 0 0 2px var(--surface-void),0 0 0 4px var(--focus);
  --grad-spectrum:linear-gradient(90deg,var(--spec-cyan),var(--spec-azure),var(--spec-violet),var(--spec-magenta),var(--spec-amber),var(--spec-lime));

  /* ---- 9. TYPE -----------------------------------------------------------
     TWO DECISIONS THAT EACH MOVE HUNDREDS OF CALL SITES. Recorded here rather
     than made quietly.

     --mono WAS re-pointed here at --font-mono, AND THAT IS REVERSED. A theme
     may change a colour under its old name; it may not change a METRIC under
     one, because the rules were authored around the number and re-pointing it
     moves them rather than restyling them. The width note that argued for the
     re-point also had its sign backwards, asserted rather than measured: ten
     tabular digits at the 15px body size set 90.000px in Geist Mono against
     93.453px in Figtree, so it was a 3.7% SQUEEZE on every numeric column in
     the product, not a widening, and nothing in this toolchain could tell.
     So --mono stays mc-ui.css's Figtree, this file keeps the real monospace as
     --font-mono and aliases it --as-mono, and a rule that wants Geist Mono asks
     by that name -- as site/site.css already did, var(--font-mono,var(--mono)).

     --disp has 85 legacy usages and mc-ui.css points it at Figtree, NOT at the
     display face, because Caprasimo is a fat display serif that is unusable
     below about 24px. Tektur has no such problem -- it is a squarish technical
     face that is legible at label size and is exactly the Animus register --
     so --disp goes to Tektur here. This is the one place this file departs
     from mc-ui.css's stated reasoning, and it departs because the reason
     no longer holds once the face changes.                                  */
  /* BODY IS PROPORTIONAL. It was Geist Mono, i.e. the same monospace face as
     --font-mono, which set every paragraph on 71 dense working screens in a
     terminal face. The design system's own spec is a neutral proportional face
     for body and mono for data only; this had collapsed the two.

     The stated reason for the collapse was tabular alignment. It is not needed:
     body already sets font-variant-numeric:tabular-nums, which gives a
     proportional face fixed-advance digits. Monospacing the LETTERS buys
     nothing for a column of numbers and costs reading speed on every sentence.

     Figtree rather than the system's nominated Barlow because Figtree is
     already vendored, licensed and version-recorded in vendor/fonts/ (declared
     in engine/mc-ui.css, which every module links above this file). Swapping to
     Barlow is a one-line change here once that face is vendored to the same
     standard. */
  --font-display:'Tektur',ui-sans-serif,system-ui,sans-serif;
  --font-body:'Figtree','Figtree fallback',ui-sans-serif,system-ui,-apple-system,'Segoe UI',sans-serif;
  --font-mono:'Geist Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;

  --fs-mega:72px; --fs-display:52px; --fs-h1:38px; --fs-h2:28px; --fs-h3:21px;
  --fs-lg:18px; --fs-body:15px; --fs-sm:13px; --fs-xs:11px; --fs-micro:10px;
  --lh-tight:1.02; --lh-snug:1.18; --lh-body:1.55; --lh-loose:1.7;
  --tk-mega:-0.02em; --tk-display:-0.01em; --tk-body:0em;
  --tk-label:0.16em; --tk-label-wide:0.28em;


  /* ======================================================================
     10. SLIPCURVE LEGACY REMAP.

     This block is why the one <link> works. Every custom property below is
     declared by engine/mc-ui.css and read by pages across the tree; each is
     re-pointed at an Animus value above. Nothing here is renamed and nothing is
     deleted -- mc-ui.css's own header records that renaming one of these
     re-breaks every page at once with no gate able to see it.

     ONE PROPERTY LEFT THIS BLOCK: --mono. It is a metric, not a colour, and the
     file header says why re-pointing a metric under a shared name is a
     different act from re-pointing a colour. Its Animus value is still here,
     as --as-mono, immediately below --body.
     ====================================================================== */

  /* -- mc-ui.css section 2: the ramps ------------------------------------- */
  --color-bg:var(--animus-ink);
  --color-card:var(--surface-card);
  --color-text:var(--text-1);

  /* The accent ramp becomes CYAN. mc-ui.css's own note says the --amber
     aliases "land on the TERRACOTTA ramp, never on a yellow" -- meaning
     --amber was already the name of the ACCENT role, not of a hue. The role
     is preserved; the hue moves to where Animus puts the accent. Ramp steps
     run dark to light, which is the inversion the ground demands: on cream the
     high numbers were the readable inks, here the low numbers are the tints. */
  --color-accent-100:#062730; --color-accent-200:#0a3d4a; --color-accent-300:#0f5768;
  --color-accent-400:#1690a6; --color-accent-500:#1cc8e2; --color-accent:#1fe3ff;
  --color-accent-600:#4ae9ff; --color-accent-700:#7cf0ff; --color-accent-800:#a9f5ff;
  --color-accent-900:#d4faff;
  /* Steps 400 and up are INKS: 400 5.35:1 on the ground, 500 9.98, accent
     12.94, 600 13.80, 700 15.12, 800 16.49, 900 18.15. Steps 100..300 are
     1.29 / 1.71 / 2.48 and are TINTS -- they carry other people's ink, they
     are not ink themselves. That split is the same one the light theme had,
     read from the other end of the ramp. */

  /* accent-2 = mint, the "good / linked / official" hue */
  --color-accent-2-100:#052a20; --color-accent-2-200:#08402f; --color-accent-2-300:#0d5c44;
  --color-accent-2-400:#149971; --color-accent-2-500:#1cb583; --color-accent-2:#25e6a6;
  --color-accent-2-600:#4aebb7; --color-accent-2-700:#7cf1cb; --color-accent-2-800:#a9f6de;
  --color-accent-2-900:#d4fbee;

  --color-neutral-100:#121821; --color-neutral-200:#1a222e; --color-neutral-300:#243040;
  --color-neutral-400:#3a4a5e; --color-neutral-500:#5d6c7f; --color-neutral-600:#8d99a8;
  --color-neutral-700:#9dabbd; --color-neutral-800:#b6c0cd; --color-neutral-900:#eaedf3;
  /* Note the inversion: --color-neutral-600..900 are now the TEXT rungs, because
     section 4's legacy --bone-faint / --bone-dim map onto 600 / 700 and both have
     to be readable ink. On cream those were mid-greys; on #06070A a mid-grey is
     not ink, it is a border. Ratios on --surface-card: 600 6.58:1, 700 8.16:1,
     800 10.35:1, 900 15.5:1. 500 is 3.55:1 and is NOT a text rung -- it is the
     rung --line-control is built from. */

  --color-alarm-100:#2a0c11; --color-alarm-200:#3d1219; --color-alarm-300:#5c1a25;
  --color-alarm-500:#ff3b52; --color-alarm-600:#ff6478; --color-alarm-700:#ff8d9c;
  /* 100..300 are tints and carry --text-1 at 16.91 / 15.09 / 12.03:1.
     500..700 are inks: 5.75 / 7.05 / 9.15:1 on the ground. Used as a FILL they
     take --text-invert (5.79:1 on 500), never --text-1 -- light text on a hot
     red measures 3.27:1 and fails. */

  --radius-lg:var(--r-4); --radius-md:var(--r-3); --radius-sm:var(--r-2);
  --radius-pill:var(--r-pill);

  /* Shadows on a near-black ground. A dark drop shadow under a dark panel is
     nothing at all, which is the single most common way a light theme dies in
     conversion. These keep a DARK spread (there is still darker room below
     #06070A) and add an inset light hairline, which is what actually separates
     a panel from the ground here. */
  --shadow-sm:0 1px 3px rgba(4,6,10,.60),inset 0 0 0 1px var(--line-1);
  --shadow-md:0 4px 14px rgba(4,6,10,.70),inset 0 0 0 1px var(--line-1);
  --shadow-lg:0 12px 40px rgba(4,6,10,.80),inset 0 0 0 1px var(--line-2);
  --shadow-xl:0 18px 60px rgba(4,6,10,.90),inset 0 0 0 1px var(--line-2);
  --shadow-grab:0 0 0 1.5px rgba(31,227,255,.55),0 2px 6px rgba(4,6,10,.80);

  /* -- mc-ui.css section 2b: translucent surfaces -------------------------
     EVERY ONE OF THESE INVERTS. On cream they were --color-text (#201e1d, dark
     ink) at an alpha; a dark wash over a dark page is invisible and a dark
     scrim over a dark page dims nothing. They are re-authored as LIGHT-ink
     alphas -- except the scrims, which stay DARK because a scrim's job is to
     push the page back, and on this ground pushing back means going darker.

     KEEP THE CHANNELS IN STEP BY HAND -- nothing checks the correspondence:
       182,192,205 = --pearl-4        #b6c0cd
       31,227,255  = --spec-cyan      #1fe3ff
       255,69,207  = --spec-magenta   #ff45cf
       6,7,10      = --animus-ink     #06070A
       4,6,10      = --void-0         #04060a                                */
  --wash-accent:rgba(31,227,255,.10);
  --wash-accent-2:rgba(255,69,207,.10);
  --wash-faint:rgba(182,192,205,.045);  /* non-working band. #14181f on card,
                                           1.07:1 against it -- present, not
                                           competing with the ink on top. */
  --wash-soft:rgba(182,192,205,.14);    /* hover tint on an unfilled control */
  --rule-ink:rgba(182,192,205,.35);     /* hairline over an UNKNOWN fill */
  --scrim-soft:rgba(6,7,10,.42);
  --scrim:rgba(6,7,10,.62);
  --scrim-deep:rgba(6,7,10,.80);
  --scrim-media:rgba(6,7,10,.90);
  --scrim-veil:rgba(6,7,10,.94);
  --paper:#fff;                          /* the print sheet -- see section 22 */

  --ease:var(--ease-animus);
  --on-accent:var(--text-invert);        /* 13.03:1 on cyan, 10.05:1 on the
                                            resting fill */

  /* -- mc-ui.css section 3: semantic status layer -------------------------
     Ink / tint pairs, ink measured on --surface-card and on its own tint.   */
  --st-critical-ink:#ff3b52;   --st-critical-tint:#331720;  /* 5.44 · 4.67 */
  --st-near-ink:#ffb02e;       --st-near-tint:#332a1b;      /*10.44 · 7.73 */
  --st-healthy-ink:#25e6a6;    --st-healthy-tint:#10322e;   /*11.75 · 8.53 */
  --st-overdue-ink:#ff5a72;    --st-overdue-tint:#331a20;   /* 6.31 · 5.31 */
  --st-blocked-ink:#9dabbd;    --st-blocked-tint:#1a222e;   /* 8.16 · 6.85 */
  --st-approved-ink:#95ff4d;   --st-approved-tint:#16290f;  /*15.14 ·12.29 */
  --st-superseded-ink:#8d99a8; --st-superseded-tint:#121821;/* 6.58 · 6.16 */
  --st-nodata-ink:#ff3b52;     --st-nodata-tint:#331720;
  /* ROW tints are weaker than chip tints for the reason mc-ui.css records: a
     chip carries only its own ink, a tinted ROW carries every ink that can
     land in it including --bone-faint, the weakest text token shipped. All
     five clear 4.5:1 for --bone-faint (#8d99a8) and for every status ink. */
  --st-critical-row:#1a0e12; --st-overdue-row:#1a1013; --st-near-row:#1a1610;
  --st-healthy-row:#0b1c19;  --st-blocked-row:#141a22;
  /* Measured floor across all eight inks that can land in a row -- text-1,
     text-2, --bone-faint and the five status inks -- is 5.38 / 5.32 / 5.14 /
     5.02 / 5.00 respectively. */

  /* -- mc-ui.css section 3b: series inks and fills ------------------------
     Inks are section 7 above. FILLS are the same hue at 22% over the card, so
     a filled area and its stroke read as one series -- the inverse of the light
     theme, where fills had to be LIGHTER than inks to carry dark text.

       n  fill over card   --color-text on it   its own ink on it
       1  #17284a               13.62                 3.85
       2  #41331c               11.43                 6.71
       3  #103e4a               10.83                 7.45
       4  #41202b               13.37                 4.75
       5  #2a4523                9.93                 8.45
       6  #411c3f               13.40                 4.79
       7  #123f36               10.95                 7.23
       8  #2b214a               13.81                 3.77

     A value printed inside a filled bar uses --color-text and is 9.93:1 at
     worst. Printing a label in the series' OWN ink on its own fill is 3.77:1
     for series 8 and 3.85:1 for series 1 -- fine as a 1px stroke over the
     fill, NOT fine as text. Stroke with the ink, letter with --color-text. */
  --series-1-fill:rgba(63,124,255,.22);  --series-2-fill:rgba(255,176,46,.22);
  --series-3-fill:rgba(31,227,255,.22);  --series-4-fill:rgba(255,90,114,.22);
  --series-5-fill:rgba(149,255,77,.22);  --series-6-fill:rgba(255,69,207,.22);
  --series-7-fill:rgba(37,230,166,.22);  --series-8-fill:rgba(154,92,255,.22);

  /* -- mc-ui.css section 4: the legacy aliases ---------------------------- */
  --canvas:var(--animus-ink);
  --void:var(--animus-ink);
  --base:var(--surface-sunken);
  --panel:var(--surface-card);
  --panel2:var(--surface-raised);
  --panel-2:var(--surface-raised);
  --line:var(--line-2);
  --line-soft:var(--line-1);
  --grid:var(--grid-line);

  --bone:var(--text-1);         /* primary text     17.79:1 on card */
  --bone-dim:var(--text-2);     /* secondary text    8.16:1 on card */
  --bone-faint:var(--text-3);   /* tertiary text     6.58:1 on card */

  --amber:var(--accent);            /* the accent role. 12.94:1 on ground   */
  --amber-bright:var(--color-accent-700);
  --amber-fill:var(--accent-rest);  /* bars, diamonds, decorative fills     */
  --teal:var(--spec-mint);          /* good / linked / official  12.42:1    */
  --clay:var(--signal-red);         /* bad / critical / late      5.75:1    */

  --disp:var(--font-display);
  --body:var(--font-body);
  /* --mono is deliberately ABSENT from this remap: engine/mc-ui.css owns it and
     it stays Figtree with tabular-nums. See section 9. --as-mono is the same
     Animus face under a name that moves nothing that was authored against the
     old advance. */
  --as-mono:var(--font-mono);
}


/* ---- 11. THE GROUND ------------------------------------------------------
   Only colour is set here. Layout, margins and the two atmospheric
   pseudo-elements the shell already paints are left alone.                  */
html{background:var(--animus-ink);}
body{
  background:var(--animus-ink);
  color:var(--text-1);
  font-family:var(--font-body);
  font-size:var(--fs-body);
  line-height:var(--lh-body);
  font-variant-numeric:tabular-nums;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
}
::selection{background:rgba(31,227,255,.30);color:var(--text-1);}
hr{border:0;border-top:1px solid var(--line-1);}


/* ---- 12. TYPOGRAPHY ------------------------------------------------------
   Tektur for display, tracked out; Geist Mono for everything else. Sizes are
   set only where mc-ui.css would otherwise leave a heading in the body face.  */
h1,h2,h3,h4,h5,h6,.display{
  font-family:var(--font-display);
  font-weight:500;
  color:var(--text-1);            /* 17.79:1 on card, 18.80:1 on the ground */
  letter-spacing:var(--tk-display);
  line-height:var(--lh-snug);
}
h1,.display{font-size:var(--fs-h1);letter-spacing:var(--tk-mega);}
h2{font-size:var(--fs-h2);}
h3{font-size:var(--fs-h3);}
h4,h5,h6{font-size:var(--fs-lg);letter-spacing:var(--tk-body);}

small,.muted,.dim{color:var(--text-2);}   /* 8.16:1 on card */
.animus-label,label,legend,caption,figcaption,th{
  /* Mono, per the design system: a label is machine language, body is prose.
     This read --font-body when body WAS mono, so the split had to be made
     explicit here or every label silently became proportional with it. */
  font-family:var(--font-mono);
  font-size:var(--fs-xs);
  letter-spacing:var(--tk-label);
  text-transform:uppercase;
  color:var(--text-3);            /* 6.58:1 on card -- a label is TEXT and is
                                     held to 4.5:1, not to 3:1 */
}
code,kbd,samp,pre{
  font-family:var(--font-mono);
  color:var(--spec-mint);         /* 11.75:1 on card */
  background:var(--surface-sunken);
  border:1px solid var(--line-1);
}
mark{background:var(--accent-wash);color:var(--text-1);}  /* 13.37:1 */
/* width and margin-inline are set because the UA gives <hr> `margin-inline:auto`
   with an auto width -- which collapses it to ZERO width the moment it is a
   flex or grid item, and it renders as nothing at all with no warning. This is
   the element's own correctness, not page layout. */
.animus-rule,.animus-rule-spectrum,.animus-spectrum{
  width:100%;margin-inline:0;border:0;
}
.animus-rule{height:1px;background:var(--line-1);}
.animus-rule-spectrum{height:1px;background:var(--grad-spectrum);}


/* ---- 13. LINKS -----------------------------------------------------------
   The underline is not decoration. WCAG 1.4.1 forbids colour as the only way
   to tell a link from its surrounding text, and cyan-on-near-black reads as
   emphasis to plenty of people who will not read it as a link.              */
a{
  color:var(--accent);                                  /* 12.94:1 on ground */
  text-decoration:none;
  border-bottom:1px solid rgba(31,227,255,.40);
  transition:var(--t-hover);
}
a:hover{
  color:var(--accent-2);                                /*  6.72:1 on ground */
  border-bottom-color:rgba(255,69,207,.60);
}
a:visited{color:var(--spec-violet);}                    /*  5.13:1 on ground,
                                                            4.89:1 on glass --
                                                            opaque surfaces only */


/* ---- 14. FOCUS -----------------------------------------------------------
   One rule, applied to everything, and it is the accessibility feature this
   theme is most likely to lose. :focus-visible only, so a mouse click does not
   ring the control, but keyboard focus always does.                          */
:focus-visible{
  outline:2px solid var(--focus);
  outline-offset:2px;
  border-radius:var(--r-1);
}
/* Controls that already have a background of their own get the two-ring shadow
   instead, so the cyan never lands against cyan. See --ring-focus. */
button:focus-visible,
[type=button]:focus-visible,[type=submit]:focus-visible,[type=reset]:focus-visible,
input:focus-visible,select:focus-visible,textarea:focus-visible,
[role=button]:focus-visible,[role=tab]:focus-visible{
  outline:none;
  box-shadow:var(--ring-focus);
}

/* ...AND THE CONTROLS § 15 NOTCHES GET THAT RING **INSET**, BECAUSE clip-path
   CLIPS THE ELEMENT'S WHOLE PAINTED OUTPUT -- the outline above and --ring-focus
   with it. Both are drawn OUTSIDE the border box; the notch polygon is defined
   ON the border box; so every pixel of the indicator fell in the clipped-away
   region and the rule above painted nothing at all.

   MEASURED IN CHROMIUM, by screenshotting each control focused and blurred and
   counting differing pixels in the 12px band outside its border box:
     .mnav nav a      (no clip-path)  580 px changed, ground rgb(12,16,23)
                                      -> rgb(29,214,241): the cyan ring, visible.
     .hero .cta a.btn (clipped)       837 px "changed" -- every one of them by a
                                      single unit in one channel, e.g.
                                      rgb(21,24,27) -> rgb(21,24,26). That is the
                                      field canvas animating between the two
                                      frames, not a ring. No ring was painted.
     .seq-steps button (clipped)      same signature: 137 px, all +/-1.
   An INSET shadow paints inside the border box and therefore survives the clip.
   The selector list is exactly the one § 15 applies clip-path to -- input,
   select, textarea, [role=button] and [role=tab] are NOT notched, so their outer
   ring still paints and is deliberately left alone. The outline above is left
   declared too: where the notch is off, it is still the right indicator.

   ONE CONTROL IN THE TREE TURNS THE NOTCH OFF and therefore must keep the outer
   ring: MCINFO's "i" button, at modules/animus-modules.css. Its own rule puts the
   ring back, beside the rule that removes the notch, because a 4px inset ring
   inside a 19px .info-btn.sm would close over the glyph. If you ever add a second
   `clip-path:none`, restore --ring-focus there too. */
button:focus-visible,
[type=button]:focus-visible,[type=submit]:focus-visible,[type=reset]:focus-visible,
.btn:focus-visible{
  box-shadow:inset 0 0 0 2px var(--surface-void),inset 0 0 0 4px var(--focus);
}


/* ---- 15. BUTTONS ---------------------------------------------------------
   Colour, border and corner only. Height and padding stay wherever the page
   put them.                                                                 */
button,[type=button],[type=submit],[type=reset],.btn{
  font-family:var(--font-body);
  font-size:var(--fs-sm);
  letter-spacing:var(--tk-label);
  text-transform:uppercase;
  color:var(--text-1);                       /* 17.79:1 on card */
  background:var(--surface-raised);
  border:1px solid var(--line-control);      /* 4.06:1 worst case */
  border-radius:var(--r-0);
  clip-path:var(--clip-notch);
  cursor:pointer;
  transition:var(--t-hover),transform var(--dur-1) var(--ease-animus);
}
button:hover,[type=button]:hover,[type=submit]:hover,[type=reset]:hover,.btn:hover{
  color:var(--accent);                       /* 12.24:1 on card */
  border-color:var(--line-3);                /*  3.28:1 -- clears 3:1 */
  background:var(--surface-lifted);
}
button:active,.btn:active{transform:translateY(1px);}

.btn-primary,button.primary,[type=submit].primary{
  color:var(--accent-ink);
  background:var(--accent-rest);             /* 10.05:1 ink on fill,
                                                 9.98:1 fill against ground */
  border-color:var(--accent-rest);
  box-shadow:var(--glow-accent);
}
.btn-primary:hover,button.primary:hover,[type=submit].primary:hover{
  color:var(--accent-ink);
  background:var(--accent);                  /* 13.03:1 ink on fill */
  border-color:var(--accent);
  box-shadow:var(--glow-accent-strong);
}
.btn-danger,button.danger{
  color:var(--danger);                       /*  5.44:1 on card */
  background:var(--danger-wash);             /*  4.67:1 ink on its own tint */
  border-color:rgba(255,59,82,.55);
}
.btn-danger:hover,button.danger:hover{
  color:var(--accent-ink);
  background:var(--danger);                  /*  5.79:1 ink on fill */
  border-color:var(--danger);
  box-shadow:var(--glow-danger);
}
.btn-ghost,button.ghost{background:transparent;border-color:var(--line-2);color:var(--text-2);}
.btn-ghost:hover,button.ghost:hover{background:var(--wash-soft);color:var(--text-1);border-color:var(--line-control);}

button:disabled,[type=button]:disabled,[type=submit]:disabled,
[type=reset]:disabled,.btn:disabled,.btn.is-disabled{
  color:var(--text-disabled);                /* 3.84:1 on ground, 3.79:1 on card */
  background:var(--surface-sunken);
  border-color:var(--line-2);
  box-shadow:none;
  cursor:not-allowed;
  /* No `opacity` here on purpose. Fading the whole control also fades its
     border, and the border is the only thing that says the control exists. */
}


/* ---- 16. INPUTS ----------------------------------------------------------
   The field is SUNKEN, one step below the panel it sits in. That is the only
   affordance a near-square dark input has, so its border carries 1.4.11 and
   uses --line-control (4.06:1 worst case), never a decorative hairline.     */
input,select,textarea{
  font-family:var(--font-body);
  font-size:var(--fs-sm);
  color:var(--text-1);                       /* 18.38:1 on the sunken field */
  background:var(--surface-sunken);
  border:1px solid var(--line-control);
  border-radius:var(--r-0);
  transition:var(--t-hover);
}
input::placeholder,textarea::placeholder{
  color:var(--text-3);                       /* 6.80:1 on the sunken field.
                                                A placeholder is text and is
                                                held to 4.5:1 like any other. */
  opacity:1;                                 /* Firefox defaults it to .54,
                                                which would silently drop the
                                                6.80 to about 3.4. */
}
input:hover,select:hover,textarea:hover{border-color:var(--pearl-5);}  /* 6.80:1 */
input:focus,select:focus,textarea:focus{border-color:var(--accent);}
input:disabled,select:disabled,textarea:disabled{
  color:var(--text-disabled);
  background:var(--void-0);
  border-color:var(--line-2);
  cursor:not-allowed;
}
input[aria-invalid=true],input.invalid,textarea.invalid,select.invalid{
  border-color:var(--danger);                /* 5.75:1 against the ground */
  background:var(--danger-wash);
}
[type=checkbox],[type=radio],[type=range],progress,meter{
  accent-color:var(--accent);                /* the UA draws the glyph and
                                                picks its own contrast against
                                                #1fe3ff; measured 13.03:1 for
                                                a --void-0 glyph. */
}
fieldset{border:1px solid var(--line-1);border-radius:var(--r-0);}


/* ---- 17. TABLES ----------------------------------------------------------
   Rulings, not boxes. A dark table gains nothing from a border on every cell
   and loses the quiet the language depends on.                              */
table{border-color:var(--line-1);}
thead th{
  background:var(--surface-raised);          /* text-3 on it: 6.16:1 */
  color:var(--text-3);
  border-bottom:1px solid var(--line-control);
}
td,th{border-bottom:1px solid var(--line-1);}
tbody tr:nth-child(even) td{background:var(--wash-faint);}
/* #14181f composited. text-1 16.61 · text-2 7.62 · text-3 6.15 -- every ink
   still clears on the zebra band, which is the thing a dark theme gets wrong
   by making the band too strong. */
tbody tr:hover td{background:rgba(31,227,255,.10);}
/* #0e252e. text-1 14.82 · text-2 6.80 · text-3 5.48 */
tbody tr[aria-selected=true] td,tbody tr.is-selected td{
  background:var(--accent-wash);             /* text-1 13.37 · cyan 9.20 */
}
tbody tr[aria-selected=true] td:first-child,tbody tr.is-selected td:first-child{
  box-shadow:inset 2px 0 0 0 var(--accent);
  /* The inset bar is the second channel: selection is not signalled by tint
     alone, because a 1.33:1 tint difference is not a signal.
     :first-child, NOT every td -- an inset shadow on each cell draws the bar
     down every column boundary and the row reads as a set of boxes. */
}
tfoot td{border-top:1px solid var(--line-control);color:var(--text-2);}


/* ---- 18. SURFACES IN MARKUP ---------------------------------------------- */
.animus-panel,.panel,.card{
  background:var(--surface-card);
  border:1px solid var(--line-1);
  border-radius:var(--r-0);
  box-shadow:var(--shadow-panel);
}
.animus-panel-glass{
  background:var(--surface-glass);
  border:1px solid var(--line-1);
  /* Opt-in only. See section 3: signal-red, azure and violet all drop under
     4.5:1 on this surface at the field's brightest frame. Neutral inks and
     cyan only. */
}
.animus-grid{
  background-image:
    repeating-linear-gradient(0deg,var(--grid-line) 0 1px,transparent 1px 32px),
    repeating-linear-gradient(90deg,var(--grid-line) 0 1px,transparent 1px 32px);
  background-position:center;
}
.animus-chip,.chip,.st{
  font-family:var(--font-body);
  font-size:var(--fs-xs);
  letter-spacing:var(--tk-label);
  text-transform:uppercase;
  border:1px solid var(--line-2);
  border-radius:var(--r-0);
}


/* ---- 19. THE FIELD HOST --------------------------------------------------
   animus-field.js creates its own canvas and appends it to <body>. It is
   fixed, behind everything, and inert to the pointer. This is the one
   geometric thing the stylesheet does, because a background that participates
   in layout is not a background.                                             */
.animus-field,canvas.animus-field-canvas{
  position:fixed;
  inset:0;
  width:100%;
  height:100%;
  z-index:-1;
  pointer-events:none;
  display:block;
  background:var(--animus-ink);
}
/* A z-index:-1 child of <body> paints in the ROOT stacking context, which is
   BEFORE body's own background box -- so an opaque body would cover the canvas
   completely and the field would appear not to work at all. The ground moves
   to <html> for as long as the field is mounted. animus-field.js sets this
   class on <html> itself; do not set it by hand, or a page with no canvas gets
   its ground from the root only and any body-level background is lost. */
html.animus-field-on body{background:transparent;}


/* ---- 20. SPECTRUM RULE ---------------------------------------------------
   The one ornament that is the design rather than a caption about it: hue
   running the full circuit, the same fact the field states in three
   dimensions. It carries no information and needs no contrast ratio.        */
.animus-spectrum{
  height:8px;
  border:0;
  background:linear-gradient(90deg,#f00,#ff0,#0f0,#0ff,#00f,#f0f,#f00);
}


/* ---- 21. MOTION, AND IT FAILS OPEN --------------------------------------
   mc-ui.css section 22 kills animation with a blanket
   `*{animation-duration:.001ms!important}`. That is motion failing CLOSED: it
   stops movement but promises nothing about what is left on screen. Animus
   requires the rested state to be the finished state, so nothing here is only
   legible while it moves, and the reduced-motion block only shortens
   transitions. animus-field.js implements the same rule by rendering one still
   frame and never starting its loop.                                        */
@media (prefers-reduced-motion:reduce){
  :root{--dur-3:0ms;--dur-4:0ms;--dur-5:0ms;}
  a,button,input,select,textarea,.btn{transition-duration:.001ms;}
}


/* ---- 22. PRINT -----------------------------------------------------------
   A NEAR-BLACK THEME BREAKS PRINT, AND THIS BLOCK IS THE WHOLE REASON.

   Every ink above is LIGHT. Sent to a printer unchanged they come out white on
   white and the deliverable is a blank sheet -- and no gate in this repo sees
   a printed page. mc-ui.css section 22 could get away with one declaration
   (`--paper:#fff`) because dark ink on cream already printed. That is no
   longer true, so the ink is inverted here for print only.

   THIS IS A POLICY CHANGE, NOT A TIDY-UP: docs/UI-CONVERSION.md section 6b
   closed the print exemption question. Re-opening it is the owner's call. What
   is below is the minimum that stops a blank page; treat it as a proposal and
   generate an actual PDF and look at it before believing it.                */
@media print{
  :root{
    --animus-ink:#fff;
    --surface-void:#fff; --surface-sunken:#fff; --surface-card:#fff;
    --surface-raised:#fff; --surface-lifted:#fff;
    --surface-glass:#fff; --surface-scrim:transparent;
    --text-1:#000; --text-2:#333; --text-3:#555; --text-disabled:#767676;
    --text-invert:#fff;
    --line-1:#ccc; --line-2:#999; --line-3:#666; --line-control:#666;
    --grid-line:transparent;
    --accent:#005f73; --accent-2:#8a1c6b; --accent-rest:#005f73;
    --accent-wash:transparent; --danger-wash:transparent;
    --warning-wash:transparent; --success-wash:transparent;
    --wash-faint:transparent; --wash-soft:transparent; --wash-accent:transparent;
    --danger:#a5281c; --warning:#7a4b00; --success:#1d5c3f;
    /* on white paper: text-1 21:1 · text-2 12.6:1 · text-3 7.5:1 ·
       accent #005f73 7.0:1 · danger #a5281c 7.0:1 · success #1d5c3f 7.7:1 ·
       warning #7a4b00 7.4:1 -- all well clear of 4.5:1 in reflective ink. */
    --shadow-sm:none; --shadow-md:none; --shadow-lg:none; --shadow-xl:none;
    --shadow-panel:none; --shadow-lift:none; --glow-accent:none;
    --glow-accent-strong:none; --glow-danger:none;
  }
  html,body{background:var(--paper)!important;color:#000!important;}
  .animus-field,canvas.animus-field-canvas,.animus-spectrum{display:none!important;}
  .animus-panel,.panel,.card{box-shadow:none;border-color:#999;}
  a{color:#005f73;border-bottom-color:#005f73;}
  button,.btn{clip-path:none;}
  /* Correctness banners stay visible in ink. Trap 10: a data-date warning, an
     MCWX basis:"none" notice or an MCDCMA blocked banner must survive to
     paper. If you are about to hide one to tidy a print layout, stop. */
  .banner,.notice,.warn,[role=alert]{
    border:1px solid #000!important;
    color:#000!important;
    background:#fff!important;
  }
}
