/*
 * Pratimāna Matrix — the record's own rules.
 *
 * Loaded on every Matrix page immediately after pratimana.css, before
 * shell.css and workbench.css. pratimana.css is the kit the four Pratimāna
 * properties share byte for byte (assets/README.md, rule 1), so nothing in
 * it changes here; this file is where Matrix diverges from the kit, in the
 * way shell.css and workbench.css already do (rule 2: what only one
 * property renders lives in that property's own file).
 *
 * The direction it carries is the one the design review named Docket:
 * Matrix is the register where findings are numbered, dated, rated and
 * paid, so the page should read as a record, not a launch. Rules instead
 * of boxes; hue only where it means severity, report state or the sign
 * of money; ink for everything else; nothing decorative moves. Each
 * section below says which kit rule it overrides and why.
 */

/* ============================================================
   1. TOKENS
   The kit's anchors (--void, --text, --hairline and the semantic
   colours) stay exactly as they are, and so do the kit's type stacks:
   Matrix draws in the reader's system fonts like every other property,
   so no font is downloaded. --font-body is an alias for the kit's
   --font-display, which Matrix uses for headings and running text alike.
   ============================================================ */
:root{
  /* The focus ring: a 2px ground gap, then a 2px ink ring. It is a
     box-shadow so it follows the radius and keeps its gap on an ink-filled
     button — and that has a price. box-shadow is one property, so anything
     else that draws a box-shadow on the same element (a "you are here"
     mark, the kit's frost, a hover reset to none) REPLACES the ring rather
     than sitting beside it. Such an element must draw its own shadow and
     then this one in its :focus-visible rule, or it has no focus indicator
     at all. ci/css-states.mjs fails the build when one does not. */
  --ring:0 0 0 2px var(--void), 0 0 0 4px var(--text);
  --font-body:var(--font-display);
  /* --rule-strong — the head rule of a register and the edge of anything
     you can type into or press, the one rule that has to clear WCAG
     1.4.11's 3:1 against its ground (#616161 on black is 3.4:1; #8A8A8A
     on white 3.5:1) — and color-scheme now come from the kit
     (pratimana.css), with the values Matrix used to set here. The kit's
     --hairline (.14 / .12) is for the lines between rows, where it is a
     separator and not an edge. */
  /* The only fill on a page apart from the ground: under an input, a
     code block, held money or a destructive action. --panel is invisible
     against white, so the light theme maps it to the raised tone. */
  --well:var(--panel);
}
[data-theme="light"]{
  --well:var(--panel-raised);
}


/* ============================================================
   2. TYPE
   The kit sets h1-h3 at 800 with -0.02em of tracking, a launch-page
   weight. A record's title is 500 and untracked; the size carries the
   hierarchy. The scale on Matrix is 12 · 13 · 14 · 16 · 18 · 21 · 26 · 34,
   whole pixels only, as the kit's own comment asks.
   ============================================================ */
body{ font-family:var(--font-body); }
h1, h2, h3{ font-weight:500; letter-spacing:0; }
/* Tabular figures wherever a number might sit above another one: the
   system stacks Matrix draws in are proportional by default. Identifiers
   get the slashed zero only at 12px and up, where the slash still has
   room inside the counter on black. */
.mx-num, .mx-id, .mx-th, .mx-register td{ font-variant-numeric:tabular-nums; }
.mx-id{ font-family:var(--font-mono); font-feature-settings:"zero"; }
/* The kit's marketing rhythm is 96px above and below every section,
   which leaves the right half of a 1180px page empty above every block.
   A record breathes at 48px. */
section{ padding:48px 0; }
/* The kit's masthead is wider than its content column so seven
   languages' worth of holding-company links would fit. The product bar
   that replaces them sits on the same 1180px as everything else. */
nav.wrap{ max-width:1180px; }
/* The [MATRIX] mark's field is calculated to be exactly six cells wide,
   and a mono face's advances can round a hair past it, which dropped
   the last cell onto a second line. Nothing inside the mark may wrap. */
.brand-sub, .brand-sub .mx-field, .brand-sub .mx-text{ white-space:nowrap; }

/* ============================================================
   3. INK, NOT BLUE
   The kit paints selection and focus in --blue; on Matrix blue means
   the NEW report state and nothing else. Focus is a 2px ink ring outside
   a 2px ground gap, so it stays visible on the ink-filled primary button
   as well as on the ground. The outline is kept transparent rather than
   none so forced-colours mode still draws one.
   ============================================================ */
::selection{ background:rgba(var(--ink-rgb),.18); }
:focus-visible, .btn:focus-visible, .wb-chip:focus-visible{
  outline:2px solid transparent; outline-offset:0;
  box-shadow:var(--ring);
}
/* The first thing Tab reaches on every page: a way past the masthead, the
   mega-menu and (signed in) the rail, to the page's <main id="main">.
   Off screen until it has focus, then an ink control in the corner. */
.skip-link{
  position:absolute; top:12px; inset-inline-start:16px; z-index:1000;
  display:inline-flex; align-items:center; min-height:44px; padding:0 16px;
  background:var(--text); color:var(--void); border-radius:4px;
  font-family:var(--font-body); font-size:14px; font-weight:500; text-decoration:none;
  transform:translateY(-200%);
}
.skip-link:focus{ transform:none; }
/* Text for assistive technology only: a register's caption, a heading a
   page needs for its outline but draws no other way. */
.sr-only{
  position:absolute !important; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden;
  clip:rect(0 0 0 0); clip-path:inset(50%); white-space:nowrap; border:0;
}

/* ============================================================
   4. CONTROLS
   The kit's buttons lift and cast a shadow on hover, the light theme
   frosts every unfilled button into glass, and the pages grew one
   999px mono pill that plays filter, toggle, pager and Delete. Three
   shapes replace it: a text-toggle, a button, and a field. All at 4px,
   none moving. (The kit's frost rule is matched at equal specificity
   and out-ranked by source order.)
   ============================================================ */
/* The masthead's current section. It was a two-line <style> copied into
   each page that marks a link .active, and five pages marked one without
   the copy — /docs, the API reference, a disclosure, an advisory and a
   writeup all named their section and drew it exactly like the others.
   One rule here, for every page that loads this file. */
.nav-links a.active{ color:var(--text); }
.nav-links a.active::after{ right:0; }

.btn{ border-radius:4px; transition:background-color .12s ease, border-color .12s ease, color .12s ease; }
.btn-primary:hover, .btn-danger:hover, .btn-grad:hover, .btn-ghost:hover,
[data-theme="light"] .btn:hover,
[data-theme="light"] .btn-primary:hover,
[data-theme="light"] .btn-grad:hover,
[data-theme="light"] header .btn:not(.btn-primary):not(.btn-grad):not(.btn-danger):hover{
  transform:none; box-shadow:none; filter:none; animation:none;
}
/* A ghost button rests on the strong rule (the kit's own edge since it
   took --rule-strong) and the pointer takes it to ink, as the light
   theme's unfilled button below does: the hover must be a visible step
   up from the resting edge, not the same line. */
.btn-ghost:hover{ border-color:var(--text); }
[data-theme="light"] .btn:not(.btn-primary):not(.btn-grad):not(.btn-danger){
  background:transparent;
  backdrop-filter:none; -webkit-backdrop-filter:none;
  border:1px solid var(--rule-strong);
  box-shadow:none;
  color:var(--text);
}
[data-theme="light"] .btn:not(.btn-primary):not(.btn-grad):not(.btn-danger):hover{
  background:transparent; border-color:var(--text);
}
/* Both rules above set box-shadow, and the ring is a box-shadow. The
   hover reset took the ring off any focused button the pointer rested on,
   and the light theme's unfilled button (0,5,0) took it off every ghost
   button outright — tab to one in the light theme and nothing showed
   where you were. Each is given back one step above the rule that took
   it: (0,3,0) and (0,4,0) over the hover resets, (0,6,0) over the light
   button, (0,7,1) over the masthead's light hover at (0,6,1). */
.btn:focus-visible:hover,
[data-theme="light"] .btn:focus-visible:hover,
[data-theme="light"] .btn:not(.btn-primary):not(.btn-grad):not(.btn-danger):focus-visible,
[data-theme="light"] header .btn:not(.btn-primary):not(.btn-grad):not(.btn-danger):focus-visible:hover{
  box-shadow:var(--ring);
}
/* Every use of the gradient button reads as the primary. The kit keeps
   .btn-grad for the other properties. */
.btn-grad{ background:var(--text); color:var(--void); }
[data-theme="light"] .btn-grad{ background:rgba(var(--ink-rgb),.88); border-color:rgba(var(--ink-rgb),.9); color:#fff; }

/* A text-toggle: a filter, a window, a view. Pressed is ink with ground
   text, the rule shell.css already had for its .pill, promoted. */
.mx-toggle{
  display:inline-flex; align-items:center; gap:6px; min-height:32px; padding:0 12px;
  border:1px solid var(--rule-strong); border-radius:4px; background:transparent; color:var(--text-dim);
  font-family:var(--font-body); font-size:13px; line-height:1; cursor:pointer;
  transition:background-color .12s ease, border-color .12s ease, color .12s ease;
}
/* Unpressed only, as .pill and .wb-chip are: a toggle that is already
   ink must not have its label repainted ink when the pointer rests on
   it. Correct here today by source order alone; the :not() makes it
   correct by construction. */
.mx-toggle:not([aria-pressed="true"]):not(.is-on):hover{ color:var(--text); border-color:var(--text-dim); }
.mx-toggle[aria-pressed="true"], .mx-toggle.is-on{ background:var(--text); color:var(--void); border-color:var(--text); }
.mx-toggle .n{ font-family:var(--font-mono); font-size:12px; }

/* A field. The well is the fill, the strong rule the edge; the native
   select keeps its honesty but loses the operating system's box, and
   color-scheme lets its dropdown follow the theme. */
.mx-input, .mx-select, .mx-textarea{
  width:100%; min-height:40px; padding:8px 12px;
  background:var(--well); color:var(--text);
  border:1px solid var(--rule-strong); border-radius:4px;
  font-family:var(--font-body); font-size:14px; line-height:1.4;
  transition:border-color .12s ease;
}
.mx-input::placeholder, .mx-textarea::placeholder{ color:var(--text-faint); }
.mx-input:focus, .mx-select:focus, .mx-textarea:focus{ border-color:var(--text); }
.mx-select{
  appearance:none; -webkit-appearance:none; padding-right:34px; cursor:pointer;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23FFFFFF' stroke-width='1.5' stroke-linecap='square'><path d='m6 9 6 6 6-6'/></svg>");
  background-repeat:no-repeat; background-position:right 10px center; background-size:16px;
}
[data-theme="light"] .mx-select{
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23000000' stroke-width='1.5' stroke-linecap='square'><path d='m6 9 6 6 6-6'/></svg>");
}
.mx-textarea{ min-height:120px; resize:vertical; }
.mx-register .mx-input, .mx-register .mx-select{ min-height:32px; padding:4px 10px; font-size:13px; }
input[type="checkbox"], input[type="radio"]{ accent-color:var(--text); }

/* Nothing on Matrix is a 999px pill: chips, badges and tags share the
   controls' 4px. Written with html in front so it outranks the page and
   workbench rules that still say 999px until their surfaces are rebuilt. */
html .chip, html .pill, html .badge, html .program-badge, html .program-tag, html .lb-badge,
html .eng-kind, html .wb-chip, html .sort-btn, html .lb-sev span, html .tag, html .acct-btn{ border-radius:4px; }

/* ============================================================
   5. REGISTERS
   A table of records: one strong rule at the head, a hairline between
   rows, no side borders, no radius, no fill, no shadow. The row's hover
   is the well. Column heads are the one place mono is tracked and
   capitalised, because there it is a label and not a voice.
   ============================================================ */
.mx-register{ width:100%; border-collapse:collapse; border-top:1px solid var(--rule-strong); font-size:13px; }
.mx-register th, .mx-th{
  text-align:left; padding:10px 12px; border-bottom:1px solid var(--rule-strong);
  font-family:var(--font-mono); font-size:11px; font-weight:500; letter-spacing:.06em; text-transform:uppercase; color:var(--text-faint);
  white-space:nowrap;
}
.mx-register td{ padding:12px; border-bottom:1px solid var(--hairline); vertical-align:middle; }
.mx-register tbody tr{ min-height:44px; transition:background-color .12s ease; }
.mx-register tbody tr:hover{ background:var(--well); }
.mx-register th.num, .mx-register td.num{ text-align:right; }
.mx-register .mono{ font-family:var(--font-mono); font-size:12px; }
.wb .mx-register td{ padding:10px 12px; }
/* A ruled list: the same register without the table. */
.mx-rows{ border-top:1px solid var(--rule-strong); }
.mx-row{ display:flex; align-items:center; gap:16px; min-height:44px; padding:10px 0; border-bottom:1px solid var(--hairline); }
.mx-row:hover{ background:var(--well); }

/* ============================================================
   6. NOTHING DECORATIVE MOVES
   The kit's scroll-reveal, hover lifts, feed rise, hero glow and the
   shimmer on headline words are switched off by the kit's own
   selectors. The [MATRIX] mark keeps its typed reveal and its cycle;
   it is the one animation on the site.
   ============================================================ */
.reveal{ opacity:1; transform:none; transition:none; }
.panel-box:hover, .triad-item:hover, .stat:hover{ transform:none; box-shadow:var(--shadow-sm); border-color:var(--hairline); }
.panel-box, .triad-item{ transition:none; }
.stat:hover .num{ animation:none; background:none; -webkit-text-fill-color:inherit; color:inherit; }
.hero-glow{ display:none; }
.feed-item{ opacity:1; animation:none; transform:none; }
.feed-dot.live{ animation:none; box-shadow:none; }
/* The nine-stop spectrum was the headline's dress. The words it sat on
   are the product's actual claim, so they are set in ink like the rest
   of the sentence. The spectrum still paints the mark on the other
   properties; here it is not referenced. */
.grad-text{ background:none; -webkit-background-clip:initial; background-clip:initial; -webkit-text-fill-color:inherit; color:inherit; animation:none; }
.cta-band::after{ display:none; }

/* ============================================================
   7. THE DOCK
   The account chip floats bottom-left on every page (assets/acct-dock.js,
   a kit file). Until the kit learns to stay clear of controls, the last
   control on a phone page scrolls up out from under it.
   ============================================================ */
@media (max-width:560px){
  body{ padding-bottom:72px; }
}

@media (prefers-reduced-motion: reduce){
  .btn, .mx-toggle, .mx-input, .mx-select, .mx-textarea, .mx-register tbody tr{ transition:none; }
}

/* ============================================================
   8. THE RECORD'S VOICE
   Built by Matrix.ui in assets/api.js: the severity scale, an amount
   with its sign, and the identifiers. The scale is four cells of the
   [MATRIX] block's proportion filled to the level; the hue lives in the
   cells and the word, the weight in the word, so the four levels are
   tellable apart by colour (blue, yellow, orange, red) and, without
   colour, by the count of lit cells and the word's weight. Every lit
   cell takes the level's one colour. Low is blue: green means verified,
   paid or resolved and nothing else.
   ============================================================ */
.mx-sev{ display:inline-flex; align-items:center; gap:6px; white-space:nowrap; vertical-align:middle; }
.mx-sev .mx-cells{ display:inline-block; width:24px; height:12px; flex-shrink:0; }
.mx-sev[data-size="14"] .mx-cells{ width:28px; height:14px; }
.mx-sev[data-size="20"] .mx-cells{ width:40px; height:20px; }
/* The unlit cells keep the full four-cell frame visible (3.4:1), so the
   count of lit cells reads without colour. */
.mx-sev .mx-cells rect.off{ fill:none; stroke:var(--rule-strong); stroke-width:1; }
.mx-sev .mx-cells rect.dash{ fill:none; stroke:var(--text-faint); stroke-width:1; stroke-dasharray:2 2; }
.mx-sev-critical .mx-cells rect.on{ fill:var(--sev-critical); }
.mx-sev-high .mx-cells rect.on{ fill:var(--sev-high); }
.mx-sev-medium .mx-cells rect.on{ fill:var(--sev-medium); }
.mx-sev-low .mx-cells rect.on{ fill:var(--sev-low); }
.mx-sev-word{ font-weight:400; color:var(--text); }
.mx-sev-critical .mx-sev-word{ font-weight:600; color:var(--sev-critical); }
.mx-sev-high .mx-sev-word{ font-weight:600; color:var(--sev-high); }
.mx-sev-medium .mx-sev-word{ font-weight:500; color:var(--sev-medium); }
.mx-sev-low .mx-sev-word{ color:var(--sev-low); }
.mx-sev-none .mx-sev-word{ color:var(--text-faint); }
.mx-sev-score{ font-family:var(--font-mono); font-variant-numeric:tabular-nums; color:var(--text-dim); }
.mx-sev[data-size="20"]{ font-size:16px; gap:10px; }
.mx-sev[data-size="20"] .mx-sev-score{ font-size:15px; }

.mx-money{ font-family:var(--font-mono); font-variant-numeric:tabular-nums; white-space:nowrap; }
.mx-money-sign.plus{ color:var(--ok); }
.mx-money-sign.minus{ color:var(--danger); }
.mx-money-code{ color:var(--text-faint); font-size:.85em; }
/* Tabular figures wherever the class is used; the right edge only in a
   register's cells and rows, so the class does not reach into the
   signed-in stat cards and right-align a figure under a left-aligned
   label. */
.num{ font-variant-numeric:tabular-nums; }
th.num, td.num, .mx-row .num, .dir-row .num{ text-align:end; }

/* ============================================================
   9. THE FOOTER
   Three columns of links that all go somewhere, beside the lockup
   and the colophon; the kit's fourth column is not needed. The
   safe-harbor page's own rules live in safe-harbor.html.
   ============================================================ */
.footer-grid{ grid-template-columns:1.6fr repeat(3,1fr); }
@media (max-width:820px){ .footer-grid{ grid-template-columns:repeat(2,1fr); } }
.footer-blurb{ max-width:300px; }
/* The column titles are h2s, not the kit's h4s, so the outline does not
   skip from the page's h1 or h2 to h4. Drawn exactly as the kit draws
   .footer-grid h4 (pratimana.css section 12), the UA's 1.33em top
   margin on an h4 included. */
.footer-grid h2{ font-family:var(--font-mono); font-size:11px; text-transform:uppercase; letter-spacing:.08em; color:var(--text-faint); margin:1.33em 0 16px; font-weight:600; hyphens:manual; }

/* ============================================================
   10. A LIST PAGE
   The programs directory and the Radar: the title and the count on the
   left, the search on the right; one row of text-toggles with counts;
   one register whose rows are the links; a ruled line at the foot.
   ============================================================ */
/* A list page: the title and the count on the left, the search on the
   right; one row of text-toggles with counts; one register whose rows
   are the links, sorted from its column heads; a ruled line at the foot. */
.dir{ padding:56px 0 96px; }
.dir-head{ display:flex; align-items:flex-end; justify-content:space-between; gap:24px; flex-wrap:wrap; margin-bottom:20px; }
.dir-head h1, .dir-h2{ font-size:26px; font-weight:500; letter-spacing:0; margin:0 0 6px; }
.dir-count{ font-family:var(--font-mono); font-size:13px; color:var(--text-dim); margin:0; min-height:18px; }
.dir-search{ flex:0 1 320px; min-width:200px; }
.dir-toggles{ display:flex; flex-wrap:wrap; gap:8px; margin:0 0 24px; }
/* A list page puts its filters and its column heads away when there is
   nothing to filter or head. The UA's [hidden]{display:none} loses to
   the display declarations above, so the two say it for themselves. */
.dir-toggles[hidden], .dir-row-head[hidden]{ display:none; }
.dir-toggles .chips{ display:flex; flex-wrap:wrap; gap:8px; }
.dir-toggles .mx-toggle[disabled]{ opacity:.45; cursor:default; }
.dir-sep{ width:1px; align-self:stretch; background:var(--hairline); margin:0 6px; }
.dir-register{ border-top:1px solid var(--rule-strong); }
.dir-row, .dir-row-head{ display:flex; align-items:center; gap:16px; min-height:56px; padding:10px 0; border-bottom:1px solid var(--hairline); }
.dir-row{ text-decoration:none; color:inherit; font-size:14px; }
.dir-row:hover{ background:var(--well); }
.dir-row-head{ min-height:36px; padding:6px 0; border-bottom:1px solid var(--rule-strong); font-family:var(--font-mono); font-size:11px; font-weight:500; letter-spacing:.06em; text-transform:uppercase; color:var(--text-faint); }
.dir-row-head > div{ font-family:var(--font-mono); font-size:11px; color:var(--text-faint); }
/* A column head that sorts is a control, so it clears the 24px floor
   WCAG 2.5.8 sets. At 11px with no padding it measured 17px tall and a
   thumb missed it; the head's own 36px leaves room. */
.dir-row-head button{ font:inherit; letter-spacing:inherit; text-transform:inherit; color:inherit; background:none; border:0; padding:0; cursor:pointer; text-align:inherit;
  display:inline-flex; align-items:center; min-height:24px; }
.dir-row-head button[aria-sort="descending"], .dir-row-head button[aria-sort="ascending"]{ color:var(--text); text-decoration:underline; text-underline-offset:4px; }
/* The columns of a programme row, shared by the public directory and a
   researcher's own list of what they may test. Unscoped on purpose: a
   page that wants a different width (the Radar's) sets it in its own
   style block, which the cascade reaches after this file. */
.c-program{ flex:1 1 280px; min-width:0; }
.program-name{ font-weight:500; font-size:14px; margin:0; }
.program-desc{ font-size:13px; color:var(--text-dim); margin:2px 0 0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.c-kinds{ flex:0 0 150px; font-family:var(--font-mono); font-size:12px; color:var(--text-dim); }
.c-reward{ flex:0 0 170px; font-family:var(--font-mono); font-variant-numeric:tabular-nums; text-align:end; white-space:nowrap; }
.c-reward b{ font-weight:600; }
.c-response{ flex:0 0 120px; font-family:var(--font-mono); font-size:13px; color:var(--text-dim); white-space:nowrap; }
/* What this account has filed against a programme; blank where it has
   filed nothing, because zero is not a fact about the programme. */
.c-mine{ flex:0 0 96px; font-family:var(--font-mono); font-variant-numeric:tabular-nums; font-size:13px; color:var(--text-dim); text-align:end; }
.c-type{ flex:0 0 72px; font-size:13px; text-align:end; }
.dir-state{ padding:22px 0; font-size:14px; color:var(--text-faint); display:none; }
.dir-foot{ margin-top:32px; padding-top:16px; border-top:1px solid var(--hairline); font-size:14px; color:var(--text-dim); display:flex; justify-content:space-between; gap:16px; flex-wrap:wrap; }
/* The foot is a flex row, so its link is blockified and the "a link
   inside a sentence" exemption does not apply to it: it is a target in
   its own right and measured as one. */
.dir-foot a{ color:var(--text); text-decoration:underline; text-underline-offset:3px; text-decoration-color:var(--hairline); white-space:nowrap;
  display:inline-flex; align-items:center; min-height:24px; }
.dir-foot a:hover{ text-decoration-color:var(--text); }
@media (max-width:760px){
  .dir{ padding:40px 0 64px; }
  .dir-head h1, .dir-h2{ font-size:22px; }
  .dir-search{ flex:1 1 100%; }
  .dir-row-head{ display:none; }
  .dir-row{ flex-wrap:wrap; gap:4px 16px; padding:12px 0; }
  .c-program{ flex:1 1 100%; }
  .c-kinds{ flex:1 1 100%; }
  .c-reward, .c-response, .c-mine, .c-type{ flex:0 0 auto; text-align:start; }
  .c-reward::before, .c-response::before, .c-mine::before{ content:attr(data-label) ": "; color:var(--text-faint); font-size:12px; }
  .c-mine:empty{ display:none; }
}

/* ============================================================
   11. A RECORD
   The ledger node — a label and its date — that the home page's case
   file and the disclosure page draw on one rule.
   ============================================================ */
.mx-node{ display:inline-flex; align-items:baseline; gap:8px; }
.mx-node b{ font-weight:500; color:var(--text); }
.mx-node span{ font-family:var(--font-mono); color:var(--text-dim); font-variant-numeric:tabular-nums; }
/* The facts row: a person's or a record's figures on one rule, the
   figure in mono at 16px over its label. */
.mx-facts{ display:flex; flex-wrap:wrap; gap:14px 40px; margin:0; padding:16px 0; border-top:1px solid var(--rule-strong); border-bottom:1px solid var(--hairline); }
.mx-fact{ display:flex; flex-direction:column-reverse; gap:4px; min-width:0; }
.mx-fact dt{ font-size:12px; color:var(--text-dim); }
.mx-fact dd{ margin:0; font-family:var(--font-mono); font-size:16px; color:var(--text); font-variant-numeric:tabular-nums; white-space:nowrap; }
@media (max-width:600px){ .mx-facts{ gap:12px 24px; } }

/* ============================================================
   12. THE BLANK STATE
   The empty cell, one sentence, and at most one thing to do about it.
   No box, no dashed frame, no fill: a page with nothing in it says so
   in the same voice it uses when it has something. `.is-ruled` closes
   the section off where the blank state stands in for a row.
   ============================================================ */
.mx-blank{ display:flex; align-items:baseline; gap:14px; padding:28px 0; }
.mx-blank-mark{ font-family:var(--font-mono); font-size:26px; line-height:1; color:var(--text-faint); }
.mx-blank p{ font-size:16px; color:var(--text-dim); margin:0; }
.mx-blank a{ color:var(--text); text-decoration:underline; text-underline-offset:3px; text-decoration-color:var(--hairline); }
.mx-blank a:hover{ text-decoration-color:var(--text); }
.mx-blank.is-ruled{ padding:24px 0; border-bottom:1px solid var(--hairline); }

/* ============================================================
   13. LAYOUT UTILITIES
   What the pages used to say in style="" attributes, said once here:
   the lockups, the redirect stubs' note, a separator, a fit grid, then
   one class per declaration (u-<property>-<value>: w width, minw/maxw
   min/max-width, minh min-height, m/mt/mb/ml margin, p/pt/pb padding,
   ta text-align, d display, ai/as align-items/-self, fw flex-wrap,
   fs font-size, td text-decoration; px dropped, % written p). A
   utility is !important because it stands in for an inline declaration,
   which out-ranked every author rule — the workbench's and the shell's
   load after this file — and none of these elements has its style
   written by a script (checked when they moved). Kept short of a
   framework on purpose: a new layout belongs in the page's or the
   surface's own rules.
   ============================================================ */
.brand.mx-brand{ display:flex; align-items:center; gap:12px; margin-left:8px; min-height:24px; }
.mx-lockup{ display:flex; align-items:center; gap:12px; }
main.mx-stub{ text-align:center; padding-top:80px; }
.mx-vsep{ width:1px; height:22px; background:var(--hairline); }
.mx-fit-grid{ display:grid; grid-template-columns:repeat(auto-fit, minmax(200px, 1fr)); gap:14px; margin-bottom:14px; }
.u-ai-end{ align-items:flex-end !important; }
.u-ai-start{ align-items:flex-start !important; }
.u-as-end{ align-self:flex-end !important; }
.u-basis-100p{ flex-basis:100% !important; }
.u-flex-0-1-28ch{ flex:0 1 28ch !important; }
.u-flex-0-1-40ch{ flex:0 1 40ch !important; }
.u-flex-0-1-140{ flex:0 1 140px !important; }
.u-flex-0-1-200{ flex:0 1 200px !important; }
.u-flex-1{ flex:1 !important; }
.u-flex-1-1-100p{ flex:1 1 100% !important; }
.u-flex-1-1-130{ flex:1 1 130px !important; }
.u-flex-1-1-160{ flex:1 1 160px !important; }
.u-flex-1-1-180{ flex:1 1 180px !important; }
.u-flex-1-1-200{ flex:1 1 200px !important; }
.u-flex-1-1-220{ flex:1 1 220px !important; }
.u-flex-1-1-240{ flex:1 1 240px !important; }
.u-flex-1-1-300{ flex:1 1 300px !important; }
.u-flex-2{ flex:2 !important; }
.u-flex-2-1-220{ flex:2 1 220px !important; }
.u-flex-2-1-240{ flex:2 1 240px !important; }
.u-flex-2-1-260{ flex:2 1 260px !important; }
.u-flex-2-1-320{ flex:2 1 320px !important; }
.u-fs-12{ font-size:12px !important; }
.u-fs-13{ font-size:13px !important; }
.u-fs-14{ font-size:14px !important; }
.u-fw-wrap{ flex-wrap:wrap !important; }
.u-gap-12{ gap:12px !important; }
.u-gap-16{ gap:16px !important; }
.u-m-0{ margin:0 !important; }
.u-m-0-0-8{ margin:0 0 8px !important; }
.u-m-0-0-10{ margin:0 0 10px !important; }
.u-m-0-0-11{ margin:0 0 11px !important; }
.u-m-0-0-12{ margin:0 0 12px !important; }
.u-m-8-0-0{ margin:8px 0 0 !important; }
.u-m-14-0-0{ margin:14px 0 0 !important; }
.u-maxw-120{ max-width:120px !important; }
.u-maxw-130{ max-width:130px !important; }
.u-maxw-150{ max-width:150px !important; }
.u-maxw-170{ max-width:170px !important; }
.u-maxw-180{ max-width:180px !important; }
.u-maxw-240{ max-width:240px !important; }
.u-maxw-260{ max-width:260px !important; }
.u-maxw-300{ max-width:300px !important; }
.u-mb-7{ margin-bottom:7px !important; }
.u-mb-14{ margin-bottom:14px !important; }
.u-mb-16{ margin-bottom:16px !important; }
.u-minh-64{ min-height:64px !important; }
.u-minh-70{ min-height:70px !important; }
.u-minh-80{ min-height:80px !important; }
.u-minh-90{ min-height:90px !important; }
.u-minh-100{ min-height:100px !important; }
.u-minh-120{ min-height:120px !important; }
.u-minh-200{ min-height:200px !important; }
.u-minh-220{ min-height:220px !important; }
.u-minh-420{ min-height:420px !important; }
.u-minw-0{ min-width:0 !important; }
.u-minw-160{ min-width:160px !important; }
.u-minw-220{ min-width:220px !important; }
.u-minw-240{ min-width:240px !important; }
.u-minw-260{ min-width:260px !important; }
.u-ml-auto{ margin-left:auto !important; }
.u-mt-7{ margin-top:7px !important; }
.u-mt-8{ margin-top:8px !important; }
.u-mt-10{ margin-top:10px !important; }
.u-mt-12{ margin-top:12px !important; }
.u-mt-14{ margin-top:14px !important; }
.u-mt-16{ margin-top:16px !important; }
.u-mt-18{ margin-top:18px !important; }
.u-p-12-18-0{ padding:12px 18px 0 !important; }
.u-p-60-0{ padding:60px 0 !important; }
.u-p-70-0{ padding:70px 0 !important; }
.u-pb-12{ padding-bottom:12px !important; }
.u-pt-0{ padding-top:0 !important; }
.u-ta-left{ text-align:left !important; }
.u-ta-right{ text-align:right !important; }
.u-td-none{ text-decoration:none !important; }
.u-w-70{ width:70px !important; }
.u-w-78{ width:78px !important; }
.u-w-80{ width:80px !important; }
.u-w-90{ width:90px !important; }
.u-w-100{ width:100px !important; }
.u-w-110{ width:110px !important; }
.u-w-120{ width:120px !important; }
.u-w-130{ width:130px !important; }
.u-w-150{ width:150px !important; }
.u-w-160{ width:160px !important; }
.u-w-170{ width:170px !important; }
.u-w-180{ width:180px !important; }
.u-w-190{ width:190px !important; }
.u-w-200{ width:200px !important; }
.u-w-220{ width:220px !important; }
.u-w-230{ width:230px !important; }
.u-w-250{ width:250px !important; }
.u-w-300{ width:300px !important; }
.u-w-320{ width:320px !important; }
.u-w-340{ width:340px !important; }
