
@font-face{font-family:'Source Serif 4';src:url('/assets/fonts/source-serif-4-latin.woff2') format('woff2');font-weight:200 900;font-display:swap;unicode-range:U+0000-00FF,U+2000-206F,U+20AC,U+2212;}
@font-face{font-family:'Source Serif 4';src:url('/assets/fonts/source-serif-4-cyrillic.woff2') format('woff2');font-weight:200 900;font-display:swap;unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}
@font-face{font-family:'Inter';src:url('/assets/fonts/inter-latin.woff2') format('woff2');font-weight:100 900;font-display:swap;unicode-range:U+0000-00FF,U+2000-206F,U+20AC,U+2212;}
@font-face{font-family:'Inter';src:url('/assets/fonts/inter-cyrillic.woff2') format('woff2');font-weight:100 900;font-display:swap;unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}
@font-face{font-family:'JetBrains Mono';src:url('/assets/fonts/jetbrains-mono-latin.woff2') format('woff2');font-weight:100 800;font-display:swap;unicode-range:U+0000-00FF,U+2000-206F,U+20AC,U+2212;}
@font-face{font-family:'JetBrains Mono';src:url('/assets/fonts/jetbrains-mono-cyrillic.woff2') format('woff2');font-weight:100 800;font-display:swap;unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}

:root{--t-bg:#FAFAF7;--t-surface:#FFFFFF;--t-ink:#1B2421;--t-ink-2:#4C5551;--t-accent:#0B6B60;--t-on-accent:#FFFFFF;--t-ok:#1D7A38;--t-target:#8A5800;--t-pending:#54616C;--t-line:#DFE4E1;--t-code-bg:#F1F3F0;--t-shadow:0 1px 3px rgb(0 0 0 / 0.08);color-scheme:light;}
html.dark{--t-bg:#0F1513;--t-surface:#171F1C;--t-ink:#E9EDEB;--t-ink-2:#A3B1AB;--t-accent:#4FD6C5;--t-on-accent:#06211D;--t-ok:#6FD08C;--t-target:#E3B341;--t-pending:#9FB0BC;--t-line:#263230;--t-code-bg:#1C2622;--t-shadow:0 1px 3px rgb(0 0 0 / 0.4);color-scheme:dark;}
@media (prefers-color-scheme: dark){html:not(.js){--t-bg:#0F1513;--t-surface:#171F1C;--t-ink:#E9EDEB;--t-ink-2:#A3B1AB;--t-accent:#4FD6C5;--t-on-accent:#06211D;--t-ok:#6FD08C;--t-target:#E3B341;--t-pending:#9FB0BC;--t-line:#263230;--t-code-bg:#1C2622;--t-shadow:0 1px 3px rgb(0 0 0 / 0.4);color-scheme:dark;}}

*,*::before,*::after{box-sizing:border-box;}
html{-webkit-text-size-adjust:100%;}
body{margin:0;background:var(--t-bg);color:var(--t-ink);font-family:var(--font-body);font-size:1rem;line-height:1.6;min-height:100vh;}
h1,h2{font-family:var(--font-display);line-height:1.15;margin:0 0 var(--sp-4);overflow-wrap:break-word;}
h3,h4,h5,h6{font-family:var(--font-body);line-height:1.3;margin:0 0 var(--sp-3);overflow-wrap:break-word;}
/* TALO-0096 (trace issue #61): the ramp had four display steps and then an
   open field — the small end was set ad hoc at 0.75/0.8/0.8125/0.875/0.9/
   0.9375/0.95rem plus every em-derived size those produced, which is how a
   page reached fourteen distinct sizes. More than seven is not a hierarchy,
   it is a list of exceptions, and a reader cannot learn what a size means.
   The text end now has three named steps and nothing else may invent one.
   Nothing is deleted from any page to achieve this: the same content is set
   on fewer steps. */
:root{--fs-1:clamp(1.25rem,1.16rem + 0.45vw,1.563rem);--fs-2:clamp(1.44rem,1.29rem + 0.75vw,1.953rem);--fs-3:clamp(1.728rem,1.44rem + 1.44vw,2.441rem);--fs-4:clamp(2.074rem,1.63rem + 2.2vw,3.052rem);--fs-body:1rem;--fs-meta:0.875rem;--fs-micro:0.75rem;}
h1{font-size:var(--fs-4);font-weight:600;}
h2{font-size:var(--fs-3);font-weight:600;}
h3{font-size:var(--fs-2);font-weight:600;}
h4{font-size:var(--fs-1);font-weight:600;}
p{margin:0 0 var(--sp-4);}
ul,ol{margin:0 0 var(--sp-4);padding-left:1.4em;}
img,svg{max-width:100%;height:auto;}
/* 0.9em derived a NEW size from every context mono appeared in (18, 14.4,
   12.6, 11.5 all came from here). It inherits its context's step instead. */
code,kbd,.mono{font-family:var(--font-mono);font-size:inherit;line-height:1.45;}
code{background:var(--t-code-bg);padding:0.1em 0.35em;border-radius:4px;}
/* TALO-0079 (issue #51 R7-03): one canonical stack per declared face. Nine distinct stacks for three faces is how a three-face system becomes nine; the gate counts stacks.
   TALO-0099 (issue #63 R99-02): the @font-face descriptors above are LITERAL family names again, and must stay literal. TALO-0079 rewrote them to var(--font-*) so the gate would see one stack per face — but var() is not valid in an @font-face descriptor, so all six rules were dropped by every browser and NO webfont loaded on any surface from 6b63c90 until here. Measured on production: document.fonts.size === 0. The tokens below are the STACKS elements reference; the descriptors above are the FACES those stacks name, and the two are not interchangeable. */
:root{--font-display:'Source Serif 4',Georgia,serif;--font-body:'Inter',system-ui,-apple-system,sans-serif;--font-mono:'JetBrains Mono',ui-monospace,'SF Mono',monospace;--sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-5:24px;--sp-6:32px;--sp-7:48px;--sp-8:64px;--sp-9:96px;}
a{color:var(--t-accent);text-decoration:none;}
a:hover{text-decoration:underline;}
.prose a{text-decoration:underline;}
#repo-links li{min-width:0;}
#repo-links li>a:only-child{display:block;max-width:100%;overflow-wrap:anywhere;word-break:break-word;}
.basis-list li{overflow-wrap:anywhere;}
:focus-visible{outline:2px solid var(--t-accent);outline-offset:2px;border-radius:2px;}
::selection{background:var(--t-accent);color:var(--t-on-accent);}
/* motion-tier: occasional — the reader switches theme a few times per session at most; the swap is the one motion that carries orientation between two renderings of the same page. */
html.theme-anim body,html.theme-anim .card,html.theme-anim .site-header{transition:background-color 150ms ease-out,color 150ms ease-out;}
@media (prefers-reduced-motion:reduce){*,*::before,*::after{transition:none !important;animation:none !important;scroll-behavior:auto !important;}}
/* TALO-0079: the -9999px trick was the only spacing literal in the sheet that could not be traced to the grid; the clip pattern hides the link without inventing a distance. */
.skip-link{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;top:0;left:0;background:var(--t-surface);color:var(--t-ink);padding:var(--sp-3) var(--sp-4);z-index:100;border:1px solid var(--t-line);}
.skip-link:focus{width:auto;height:auto;overflow:visible;clip-path:none;white-space:normal;left:var(--sp-3);}
/* --- Deck presentation mode (TALO-0185) -----------------------------------
   motion-tier: HIGH. A reader advances a slide dozens of times in one sitting and
   the advance is keyboard-initiated. tal-constraint-motion-frequency-budget puts
   an ABSOLUTE PROHIBITION on animating keyboard-initiated actions and permits no
   motion at all at the highest tier, so this layer declares no transition, no
   scroll-behavior:smooth and no animation. There is nothing for
   prefers-reduced-motion to switch off, and that is the correct outcome rather
   than an omission. Off by default: without [data-present] the deck renders as
   the article it already was. */
.deck-slide{display:block;}
.deck[data-present]{scroll-snap-type:y mandatory;overflow-y:auto;max-height:100vh;scroll-behavior:auto;}
.deck[data-present] .deck-slide{position:relative;min-height:100vh;scroll-snap-align:start;scroll-snap-stop:always;display:flex;flex-direction:column;justify-content:center;padding:var(--sp-6) 0;box-sizing:border-box;}
.deck[data-present] .deck-slide > h2{font-size:clamp(1.9rem,4.2vw,3rem);line-height:1.12;margin-top:0;}
.deck[data-present] .deck-slide p,.deck[data-present] .deck-slide li{font-size:clamp(1.05rem,1.9vw,1.5rem);line-height:1.45;}
.deck[data-present] .breadcrumb{display:none;}
.deck[data-present] .deck-slide::after{content:attr(data-deck-slide);position:absolute;right:var(--sp-4);bottom:var(--sp-4);font-size:var(--fs-0);color:var(--t-ink-2);}
/* The printable path: one section per sheet, in either mode. */
@media print{.deck .deck-slide{break-after:page;page-break-after:always;}.deck .deck-slide:last-child{break-after:auto;page-break-after:auto;}.deck .breadcrumb,.deck [data-deck-present-toggle]{display:none;}}
.visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;}

/* TALO-0096 (trace issue #61) — WCAG 2.2 AA 2.5.8 Target Size (Minimum): 24x24
   CSS px. This is an accessibility floor, not a preference, and it was failing
   site-wide: the smallest interactive target measured 12-16px on every page.

   The criterion carries an INLINE exception — "the target is in a sentence or
   its size is otherwise constrained by the line-height of non-target text" — so
   a link inside running prose conforms as it stands and is deliberately NOT
   touched here: forcing a 24px box around a mid-sentence link would break the
   line box it sits in, and would be a worse page for no conformance gain.

   What was failing is the STANDALONE target: a link that is the entire content
   of a list item, table cell, heading or paragraph. Nothing in a sentence
   constrains it, so the exception does not reach it and the floor applies. Each
   selector below is :only-child (or a heading, where the link is the heading)
   precisely so it cannot catch an in-sentence link by accident.

   inline-flex rather than padding: padding on an inline box enlarges the hit
   region but lets adjacent rows' regions overlap, and two overlapping targets
   is the failure mode 2.5.8 exists to prevent. A flex box takes real space, so
   the row gap stays a real gap. */
li > a:only-child,
td > a:only-child,
th > a:only-child,
p > a:only-child,
dd > a:only-child{display:inline-flex;align-items:center;min-height:24px;max-width:100%;overflow-wrap:break-word;}
/* Headings keep their display. An inline-flex box cannot break across the line
   boxes of its parent, and a heading is the one place where the text is long
   enough for that to matter — RU headings especially. Vertical padding on an
   inline box enlarges the hit region the pointer actually tests against without
   changing how the text lays out. These measured 23px; --sp-1 is the smallest
   step on the declared 4px grid and takes them to 31px. An off-grid 2px would
   have cleared the floor by exactly one pixel and put a spacing literal in the
   sheet that traces to nothing — the design gate says so, and it is right. The
   overlap objection that rules padding out for stacked list items does not apply
   here: headings are not stacked 8px apart. */
h1 > a, h2 > a, h3 > a, h4 > a, h5 > a, h6 > a{padding-block:var(--sp-1);}


/* TALO-0161: ONE content width across the site, and it is the width of the
   navigation — the top edge a reader measures every other block against.
   Before this the page had three: .container at 1080, .wp-atlas-shell at 1080,
   and .container-prose at 720. Measured at 1920: the nav sat at left:420 w:1080
   while the Pitch Deck's body sat at left:600 w:720 — 180px narrower on each
   side than the menu directly above it, which is what reads as "the content
   floats". The reading measure is a separate control and stays: the main-p rule
   caps the LINE at 66ch so long prose does not lose its line return. Capping the
   line is typography; capping the container was an unintended second rule. */
:root{--content-max:1080px;}
.container{max-width:var(--content-max);margin:0 auto;padding:0 var(--sp-4);}
.container-prose{max-width:var(--content-max);margin:0 auto;padding:0 var(--sp-4);}
.section{padding:var(--sp-7) 0;}
@media (min-width:1080px){.section{padding:var(--sp-9) 0;}}
.section-lede{max-width:720px;color:var(--t-ink-2);font-size:var(--fs-1);line-height:1.5;overflow-wrap:anywhere;}
/* TALO-0096 (trace issue #61): running prose was measured at 131-164 characters
   per line against a 45-95 band. The container is 1080px and nothing narrowed
   the text inside it, so a paragraph ran the full band and the eye lost the
   line return. The cap is in ch so it tracks the type step rather than
   restating a pixel width, and it caps only the MEASURE — no paragraph is
   shortened and no content is removed to satisfy it.

   66ch, not 72ch. 72 measured 80 characters here and 96 on a CI runner — one
   over the band's upper bound — because ch is the advance of the digit zero while the
   rule estimates 0.5em, so the two track each other only as closely as the font
   in front of them does. A value tuned until it just passes on one renderer is
   not a fix, it is a coincidence with a short life. */
main p{max-width:66ch;}
/* Only where a component genuinely sets its own measure. The first version of
   this line also exempted .callout, which was wrong twice over: a callout is a
   full-width bordered block whose content is running prose, so it is exactly
   where the measure matters, and exempting it left four paragraphs at 124-166
   characters while the rule read green everywhere else. */
td p,th p,figure p{max-width:none;}
.hero + .section{padding-top:var(--sp-6);}
/* TALO-0088: four orderable examples read as four things you can order, not as an enum. */
.example-cards{margin-top:var(--sp-5);}
.example-cards li.card{padding:var(--sp-4) var(--sp-5);}
.example-cards li.card a{color:var(--t-ink);font-weight:600;display:block;}
.example-cards li.card:hover{border-color:var(--t-accent);}
/* TALO-0088: the case facts read as a record, not as a package manifest line. */
.case-facts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-4) var(--sp-6);margin:var(--sp-5) 0 0;padding:var(--sp-5);border:1px solid var(--t-line);border-left:4px solid var(--t-accent);border-radius:8px;background:var(--t-surface);max-width:720px;}
@media (min-width:768px){.case-facts{grid-template-columns:repeat(2,minmax(0,1fr));}}
.case-fact{display:flex;flex-direction:column;gap:var(--sp-1);min-width:0;}
.case-fact-label{font-size:var(--fs-micro);color:var(--t-ink-2);}
.case-fact-value{font-size:var(--fs-meta);color:var(--t-ink);display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center;}
.case-fact-tags{grid-column:1/-1;}
@media (min-width:768px){.case-fact-tags{grid-column:auto;}}
.evidence-signature-wrap{margin-top:var(--sp-6);}
.evidence-signature{border-top:2px solid var(--t-ink);border-bottom:1px solid var(--t-line);padding:var(--sp-4) 0 var(--sp-5);margin:0 0 var(--sp-6);}
.evidence-signature-title{font-family:var(--font-body);font-size:var(--fs-meta);font-weight:600;letter-spacing:.08em;text-transform:uppercase;margin:0 0 var(--sp-4);}
.evidence-signature-fields{display:grid;grid-template-columns:1fr;gap:var(--sp-4);margin:0;}
.evidence-signature-fields>div{min-width:0;border-top:1px solid var(--t-line);padding-top:var(--sp-3);}
.evidence-signature-fields dt{font-size:var(--fs-micro);color:var(--t-ink-2);margin:0 0 var(--sp-1);}
.evidence-signature-fields dd{font-size:var(--fs-meta);line-height:1.45;margin:0;overflow-wrap:anywhere;}
.evidence-signature-fields dd>a{display:inline-flex;align-items:center;min-height:44px;}
.evidence-source-links{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2) var(--sp-3);}
.evidence-source-links>a{display:inline-flex;align-items:center;min-height:44px;}
@media (min-width:768px){.evidence-signature-fields{grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-5);}}
@media (min-width:1080px){.evidence-signature-fields{grid-template-columns:minmax(0,5fr) minmax(0,3fr) minmax(0,2fr) minmax(0,2fr);gap:var(--sp-6);}}
.anchor-heading{position:relative;}
.anchor-heading .anchor-link{opacity:0;font-family:var(--font-mono);font-size:inherit;margin-left:var(--sp-2);}
.anchor-heading:hover .anchor-link,.anchor-link:focus{opacity:1;}
.breadcrumb{font-family:var(--font-body);font-size:var(--fs-micro);color:var(--t-ink-2);margin:var(--sp-5) 0 0;}
.breadcrumb a{color:var(--t-ink-2);}
.grid-cards{display:grid;grid-template-columns:1fr;gap:var(--sp-4);margin:var(--sp-5) 0;padding:0;list-style:none;}
@media (min-width:768px){.grid-cards{grid-template-columns:repeat(2,1fr);}}
@media (min-width:1080px){.grid-cards{grid-template-columns:repeat(3,1fr);}.grid-cards.cols-2{grid-template-columns:repeat(2,1fr);}.grid-cards.cols-4{grid-template-columns:repeat(2,1fr);}}
/* TALO-0001 SITE-DESIGN: the homepage's evidence cards are a signal rail,
   not three equal promotional tiles. The live metric stays the visual anchor;
   the hairline and quiet index make the order scanable in either theme. */
[data-section="home"] #evidence .grid-cards{counter-reset:evidence-card;position:relative;}
[data-section="home"] #evidence .grid-cards::before{content:"";position:absolute;left:0;right:0;top:-12px;height:1px;background:linear-gradient(90deg,var(--t-accent),transparent 72%);opacity:.65;}
[data-section="home"] #evidence .grid-cards .card{counter-increment:evidence-card;position:relative;overflow:hidden;}
[data-section="home"] #evidence .grid-cards .card::before{content:"0" counter(evidence-card);position:absolute;right:var(--sp-4);top:var(--sp-4);font:var(--fs-micro) var(--font-mono);letter-spacing:.08em;color:var(--t-ink-2);opacity:.7;}
[data-section="home"] #evidence .card-metric{display:block;font-family:var(--font-display);font-size:clamp(2.8rem,7vw,5rem);line-height:.95;letter-spacing:-.04em;color:var(--t-accent);margin:var(--sp-3) 0 var(--sp-4);}
[data-section="home"] #evidence .card-desc{max-width:28ch;color:var(--t-ink-2);}
@media (min-width:768px){[data-section="home"] #evidence .grid-cards{grid-template-columns:repeat(3,1fr);gap:var(--sp-5);}[data-section="home"] #evidence .grid-cards .card{min-height:220px;padding:var(--sp-5);}}
@media (prefers-reduced-motion:no-preference){/* motion-tier: frequent — a hover affordance on a card grid is met many times in one visit, so it is admissible only as feedback on the reader's own pointer, never as an entrance or reveal. */[data-section="home"] #evidence .grid-cards .card{transition:transform 150ms ease-out,border-color 150ms ease-out;}[data-section="home"] #evidence .grid-cards .card:hover{transform:translateY(-2px);border-color:var(--t-accent);}}


.site-header{position:sticky;top:0;z-index:50;background:var(--t-bg);border-bottom:1px solid var(--t-line);overflow-x:clip;}
.site-header .container{display:flex;align-items:center;gap:var(--sp-5);min-height:64px;}
/* TALO-0072 (issue #48 R4-05): three zones, not one row. Measured before the fix: the CTA sat 24px from the overflow control — the SAME gap as between nav items, so it read as one more link — while the language and theme controls floated 106px away from everything. The nav grows, the action and the utility cluster sit together at the end, and the action is separated by a larger step than the nav's own rhythm. */
.site-header .primary-nav{margin-right:auto;display:flex;align-items:center;gap:var(--sp-6);}
.nav-action{display:flex;align-items:center;margin-left:var(--sp-6);}
.nav-action .btn{white-space:nowrap;}
.early-access-note{max-width:60ch;color:var(--t-ink-2);}
.header-tools{padding-left:var(--sp-4);border-left:1px solid var(--t-line);}
.wordmark{font-family:var(--font-display);font-size:var(--fs-1);font-weight:700;color:var(--t-ink);letter-spacing:0.01em;display:inline-flex;align-items:center;gap:var(--sp-2);white-space:nowrap;}
.wordmark .brand-mark{flex:none;}
.wordmark:hover{text-decoration:none;}
/* TALO-0059 R3-01: child combinator — the descendant form (.primary-nav ul) also matched the NESTED ul.nav-more-menu and, at 0-1-1 specificity, defeated .nav-more-menu{display:none} (0-1-0): the dropdown rendered open at load. Measured via CDP getMatchedStylesForNode, trace issue #45. */
/* scoped to .nav-row — TALO-0072: as .primary-nav > ul (0-1-1) this rule also
   matched the drawer's group list and defeated .nav-drawer-groups{display:none}
   (0-1-0), putting the mobile groups on the desktop header as a second row.
   Same cascade shape as the R3-01 defect; caught by the rendered checks. */
.primary-nav > .nav-row{display:flex;flex-wrap:nowrap;gap:var(--sp-5);list-style:none;margin:0;padding:0;}
/* :not(.btn) — TALO-0072: the CTA moved inside the nav for zoning, and this rule (0-1-1) overrode .btn-primary's colour (0-1-0), rendering ink on accent at 2.49:1. Caught by scripts/design-audit.mjs, not by eye. */
/* TALO-0089 R8-01: scoped to DIRECT children of the row. This rule is written for
   a nav-row item — horizontal padding is 0 because the row's gap does the
   separating — and at 0-2-1 it outranked .nav-more-menu a (0-1-1), so the
   floating dropdown panel inherited row geometry and its text sat on the panel
   edge. The panel is a different component: it has no gap doing that job.
   Measured on the deployed build: panel links computed 12px 0px at >=1080px.
   The child path cannot reach the panel's links, which are nested one list deeper. */
.primary-nav > .nav-row > li > a:not(.btn){color:var(--t-ink);padding:var(--sp-3) 0;display:inline-block;white-space:nowrap;}
.primary-nav > .nav-row > li > a[aria-current="page"]{color:var(--t-accent);box-shadow:inset 0 -2px 0 var(--t-accent);}
.header-tools{display:flex;align-items:center;gap:var(--sp-2);}
.lang-switch{font-family:var(--font-body);font-size:var(--fs-micro);display:inline-flex;align-items:center;justify-content:center;min-width:44px;min-height:44px;color:var(--t-ink);}
.lang-switch:hover{color:var(--t-accent);}
.theme-toggle,.nav-burger{display:inline-flex;align-items:center;justify-content:center;min-width:44px;min-height:44px;background:none;border:none;cursor:pointer;color:var(--t-ink);border-radius:4px;}
.theme-toggle:hover,.nav-burger:hover{color:var(--t-accent);}
/* TALO-0089 R8-02: exactly one glyph per state, so the three states are
   distinguishable at a glance. Without JS no state attribute is set and the
   system glyph shows, which is the truthful default: the page is following the
   OS. Never more than one icon visible, so the button cannot flash two. */
.theme-toggle .theme-icon{display:none;}
.theme-toggle .theme-icon-system{display:block;}
/* Selected from the ROOT, not the button: the pre-paint script runs in <head>
   where the toggle does not exist yet, so a stamp on the button could only land
   after the deferred bundle ran — a flash of the wrong state, which the
   anti-FOUC gate forbids. documentElement exists in head; this is stamped there. */
html[data-theme-choice="light"] .theme-toggle .theme-icon-system,
html[data-theme-choice="dark"] .theme-toggle .theme-icon-system{display:none;}
html[data-theme-choice="light"] .theme-toggle .theme-icon-light{display:block;}
html[data-theme-choice="dark"] .theme-toggle .theme-icon-dark{display:block;}
.nav-burger{display:none;}
.nav-more{position:relative;}
.nav-more-btn{display:inline-flex;align-items:center;gap:var(--sp-1);background:none;border:none;cursor:pointer;font:inherit;color:var(--t-ink);padding:var(--sp-3) 0;min-height:44px;white-space:nowrap;}
.nav-more-btn:hover{color:var(--t-accent);}
.nav-more-btn[aria-current="true"]{color:var(--t-accent);box-shadow:inset 0 -2px 0 var(--t-accent);}
.nav-more-menu{position:absolute;top:100%;right:0;min-width:220px;background:var(--t-surface);border:1px solid var(--t-line);border-radius:8px;box-shadow:var(--t-shadow);list-style:none;margin:0;padding:var(--sp-2);display:none;flex-direction:column;gap:0;}
.nav-more-menu a{display:block;padding:var(--sp-2) var(--sp-3);border-radius:4px;}
.nav-more-menu a:hover{background:var(--t-code-bg);text-decoration:none;}
.nav-drawer-groups{display:none;}
.nav-group{margin:0;}
.nav-group-label{font-family:var(--font-body);font-size:var(--fs-micro);letter-spacing:0.06em;color:var(--t-ink-2);margin:0 0 var(--sp-2);}
.nav-more.open .nav-more-menu,.nav-more:focus-within .nav-more-menu,.nav-more:hover .nav-more-menu{display:flex;}
@media (max-width:1079.98px){
  .nav-burger{display:inline-flex;}
  .primary-nav{position:fixed;inset:64px 0 0 0;background:var(--t-bg);padding:var(--sp-5) var(--sp-4);transform:translateX(100%);/* motion-tier: occasional — the mobile menu is opened a handful of times per session and the slide carries where the panel came from. */transition:transform 150ms ease-out;overflow-y:auto;}
  .primary-nav.open{transform:none;}
  /* TALO-0072 (issue #48 R4-05): the drawer was eight identical 56px rows with
     12px of padding inside and an 8px gap outside — internal larger than
     external, which is exactly why the items fused into one block. The row set
     is replaced by named groups; padding stays 12px and the gap between items
     is 16px, so external now exceeds internal, with 32px between groups. */
  .site-header .primary-nav{display:block;margin-right:0;}
  .primary-nav > .nav-row{display:none;}
  .nav-drawer-groups{display:flex;flex-direction:column;gap:var(--sp-6);margin:0;padding:0;}
  .nav-group > ul{display:flex;flex-direction:column;gap:var(--sp-4);list-style:none;margin:0;padding:0;}
  .primary-nav a:not(.btn){font-size:var(--fs-1);padding:var(--sp-3) var(--sp-3);display:block;border-radius:4px;}
  /* the current page is a state, not a tint: background, weight and an accent
     edge, because colour alone at weight 400 was the whole marking before. */
  .primary-nav a:not(.btn)[aria-current="page"]{box-shadow:none;background:var(--t-code-bg);font-weight:600;border-left:3px solid var(--t-accent);}
  .nav-action{margin:var(--sp-6) 0 0;}
  /* 48dp, not the 44px desktop floor: the drawer is a touch surface and the
     invariant is explicit about it (measured 44px, red). */
  .nav-action .btn{width:100%;min-height:48px;}
  .nav-more-btn{display:none;}
  /* TALO-0089 R8-01: the panel overrides that used to live here were DEAD and
     actively misleading. Below this breakpoint .primary-nav > .nav-row is
     display:none, which hides .nav-more and its panel entirely; the drawer is a
     separate structure (.nav-drawer-groups / .nav-group > ul) that never used
     .nav-more-menu. Reading them, R8-01 looked like a mobile-drawer rule leaking
     upward — it was not. Removed so the panel has exactly one geometry, stated once. */
  body.nav-locked{overflow:hidden;}
}
.site-footer{border-top:1px solid var(--t-line);margin-top:var(--sp-8);padding:var(--sp-7) 0;color:var(--t-ink-2);font-size:var(--fs-meta);}
.site-footer nav ul{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--sp-2) var(--sp-5);list-style:none;margin:0 0 var(--sp-5);padding:0;}
@media (min-width:768px){.site-footer nav ul{grid-template-columns:repeat(4,1fr);}}
.site-footer a{color:var(--t-ink-2);}
.site-footer a:hover{color:var(--t-accent);}
.footer-status{border-top:1px solid var(--t-line);padding-top:var(--sp-4);margin-top:var(--sp-4);}
.legal-status{min-width:0;}
.legal-status-compact{margin:var(--sp-3) 0 0;}
.legal-status-compact > a:only-child{display:inline-flex;align-items:center;min-height:44px;gap:var(--sp-1);}
.legal-status-detail{border-block:1px solid var(--t-line);padding:var(--sp-5) 0;display:grid;grid-template-columns:minmax(180px,240px) minmax(0,1fr);gap:var(--sp-5) var(--sp-7);}
.legal-status-title{font-family:var(--font-display);font-size:var(--fs-1);font-weight:600;line-height:1.25;margin:0 0 var(--sp-2);}
.legal-status-marker{color:var(--t-target);font-size:var(--fs-micro);letter-spacing:.02em;}
.legal-status-heading .legal-status-marker{margin:0;}
.legal-status-copy{max-width:72ch;}
.legal-status-copy p{margin:0 0 var(--sp-3);}
.legal-status-copy p:last-child{margin-bottom:0;}
@media (max-width:767.98px){.legal-status-detail{grid-template-columns:1fr;gap:var(--sp-3);padding:var(--sp-4) 0;}}


/* TALO-0122 (ADR-0012): the consent banner. Fixed to the bottom rather than a modal
   overlay — it must not trap focus or block reading, because a visitor who ignores it
   is a visitor who has not consented, and that is a legitimate end state rather than
   something to badger them out of. Accept and decline are the same size and the same
   weight in .chip-row; the only visual difference is which is the primary button, and
   both are one click. */
.consent-banner{position:fixed;left:0;right:0;bottom:0;z-index:90;background:var(--t-surface);border-top:1px solid var(--t-line);padding:var(--sp-5) 0;box-shadow:0 -1px 0 var(--t-line);}
.consent-banner h2{font-size:var(--fs-1);margin:0 0 var(--sp-2);}
.consent-banner p{margin:0 0 var(--sp-4);color:var(--t-ink-2);max-width:72ch;}
.consent-banner .chip-row{margin:0;}
@media (max-width:767px){.consent-banner{padding:var(--sp-4) 0;}}
[data-consent-control][hidden],[data-consent-banner][hidden]{display:none;}

.btn{display:inline-flex;align-items:center;justify-content:center;min-height:44px;padding:0 var(--sp-5);border-radius:4px;font:inherit;font-weight:500;cursor:pointer;text-decoration:none;border:1px solid transparent;}
.btn:hover{text-decoration:none;}
.btn-primary{background:var(--t-accent);color:var(--t-on-accent);}
.btn-primary:hover{filter:brightness(0.96);}
.btn-secondary{border-color:var(--t-line);color:var(--t-ink);background:var(--t-surface);}
.btn-secondary:hover{border-color:var(--t-accent);color:var(--t-accent);}
.btn-quiet{color:var(--t-accent);background:none;border:none;padding:0 var(--sp-2);}
.btn[aria-disabled="true"],.btn:disabled{opacity:0.5;pointer-events:none;}
.chip{display:inline-flex;align-items:center;background:var(--t-code-bg);color:var(--t-ink-2);font-family:var(--font-body);font-size:var(--fs-micro);letter-spacing:0.01em;padding:var(--sp-1) var(--sp-2);border-radius:4px;border:1px solid transparent;}
a.chip:hover{color:var(--t-accent);text-decoration:none;}
button.chip{cursor:pointer;min-height:32px;font:inherit;font-family:var(--font-body);font-size:var(--fs-micro);}
.chip[aria-pressed="true"]{border-color:var(--t-accent);color:var(--t-accent);}
.chip-row{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin:var(--sp-4) 0;}
.stamp{display:inline-block;font-family:var(--font-body);font-size:var(--fs-micro);color:var(--t-ink-2);}
.stamp a{color:inherit;text-decoration:underline;}
.stamp.stamp-target{color:var(--t-target);}
.badge{display:inline-flex;align-items:center;gap:var(--sp-1);font-family:var(--font-body);font-size:var(--fs-micro);white-space:nowrap;}
.badge::before{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;flex:none;}
.badge-ok{color:var(--t-ok);}
.badge-target{color:var(--t-target);}
.badge-pending{color:var(--t-pending);}
.badge-outline{border:1px solid currentColor;border-radius:4px;padding:0 var(--sp-2);}
.callout{border:1px solid var(--t-line);border-left:4px solid var(--t-line);border-radius:8px;background:var(--t-surface);padding:var(--sp-5);margin:var(--sp-5) 0;}
.callout>h2,.callout>h3{margin-bottom:var(--sp-3);}
.callout p:last-child{margin-bottom:0;}
.callout-status{border-left-color:var(--t-accent);}
.callout-disclaimer{border-left-color:var(--t-target);}
.card{border:1px solid var(--t-line);border-radius:8px;background:var(--t-surface);padding:var(--sp-5);}
.card h3{margin-bottom:var(--sp-2);}
.card h3 a{color:var(--t-ink);}
.card h3 a::after{content:'';position:absolute;inset:0;}
li.card{position:relative;}
li.card:hover{border-color:var(--t-accent);}
.card-metric{font-family:var(--font-mono);font-size:var(--fs-1);color:var(--t-ink);display:block;margin:var(--sp-2) 0;}
.card-desc{color:var(--t-ink-2);margin-bottom:var(--sp-3);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
/* TALO-DESIGN-01 — the withheld count is the REMAINDER of the population its
   own figure counts (121 published + 115 withheld = 236 inventory), not a peer
   achievement figure. Two things make it unmistakably a different kind of
   number: it is subordinate in the same card rather than a sibling card, and it
   is set in the BODY face while .card-metric is mono — a headline count and a
   remainder must not share a register. --fs-micro is the step .table-note
   already puts on this page, so the type scale gains no eighth size (the rule
   type-scale-steps caps it at 7 and this page already measures exactly 7). */
.card-remainder{font-size:var(--fs-micro);color:var(--t-ink-2);margin:0;padding-top:var(--sp-2);border-top:1px solid var(--t-line);}
.card-remainder [data-proof-total],.card-remainder [data-proof-remainder]{color:var(--t-ink);}
/* TALO-0178 — the proportion figure. graphic-incident-interval found twelve of
   twenty audited page/viewport/language combinations carrying ZERO pictorial
   elements over their whole length; this is the reusable one that closes it on
   the evidence surfaces, and it is a figure rather than a decoration because
   every segment is a live count already stated on the page.
   The bar is 32px tall on purpose: the rule counts only an element showing at
   least 24px of its own height, so a hairline would satisfy the letter of that
   while giving the eye nothing — and 44px, the first value tried, read as a
   saturated progress banner rather than a measured strip on a 98/1/2 split. Type reuses --fs-meta and --fs-1, both already on these pages, so the
   scale gains no eighth step. */
.diagram-proportion{margin:var(--sp-6) 0;padding:0;}
.diagram svg.proportion-bar{display:block;width:100%;height:32px;border-radius:5px;overflow:hidden;border:1px solid var(--t-line);}
.diagram-proportion figcaption{margin-top:var(--sp-3);}
.diagram-proportion .figure-title{display:block;font-size:var(--fs-meta);color:var(--t-ink-2);margin-bottom:var(--sp-2);}
.proportion-legend{display:flex;flex-wrap:wrap;gap:var(--sp-3) var(--sp-6);margin:0;}
.proportion-legend > div{display:flex;flex-direction:column-reverse;gap:var(--sp-1);}
.proportion-legend dt{display:flex;align-items:center;gap:var(--sp-2);font-size:var(--fs-meta);color:var(--t-ink-2);margin:0;}
.proportion-legend dd{font-size:var(--fs-1);color:var(--t-ink);margin:0;}
.proportion-legend .swatch{width:12px;height:12px;border-radius:3px;flex:none;}
.proportion-legend .swatch[data-tone="accent"]{background:var(--t-accent);}
.proportion-legend .swatch[data-tone="ink-2"]{background:var(--t-ink-2);}
.proportion-legend .swatch[data-tone="ok"]{background:var(--t-ok);}
.proportion-legend .swatch[data-tone="pending"]{background:var(--t-pending);}
.proportion-legend .swatch[data-tone="line"]{background:var(--t-line);}
/* The sequence spine. 36px so it clears the 24px floor graphic-incident-interval
   measures — a hairline would satisfy the letter of the rule and give the eye
   nothing, which is the failure the rule exists to catch. */
.diagram-sequence{margin:var(--sp-6) 0;padding:0;}
.diagram svg.sequence-spine{display:block;width:100%;height:36px;}
.diagram-sequence figcaption{margin:var(--sp-2) 0 var(--sp-3);}
.diagram-sequence .figure-title{font-size:var(--fs-meta);color:var(--t-ink-2);}
.sequence-list{margin:0;padding-left:1.4em;}
/* TALO-0179 — the application meter, one per capability card. Fixed pixel size
   with a 1:1 viewBox, so nothing is scaled and the pips cannot distort the way
   the sequence spine's circles did. The type qualifier is required: the img,svg
   rule sets height:auto and would otherwise win over a single class. 24px is the
   floor graphic-incident-interval measures, and the meter is exactly that —
   any shorter and the rule would stop counting a graphic the reader can see. */
svg.application-meter{display:block;width:46px;height:24px;flex:none;}
.application{display:inline-flex;align-items:center;gap:var(--sp-2);}
.application-label{font-size:var(--fs-micro);color:var(--t-ink-2);}
/* TALO-0179 — the per-step magnitude bar. Fixed 120x24 with a matching viewBox,
   so it never scales and the rounded ends stay round. 24px is exactly the floor
   graphic-incident-interval counts; the visible track is 4px and the filled bar
   12px, so the FIGURE clears the floor while the ink stays quiet enough that 40
   of them down a timeline read as a column, not as 40 interruptions. */
svg.t-bar{display:block;width:120px;height:24px;margin-top:var(--sp-1);}
.timeline-measured li{padding-bottom:var(--sp-2);}
/* TALO-0180 — the evidence-binding badge, one per bound Glossary term. Fixed
   size, 1:1 viewBox, type-qualified so the img,svg height:auto rule cannot win.
   24px is the floor graphic-incident-interval counts. */
svg.evidence-binding-mark{display:block;width:26px;height:24px;flex:none;}
.evidence-binding{display:inline-flex;align-items:center;gap:var(--sp-2);margin-top:var(--sp-2);}
.evidence-binding-label{font-size:var(--fs-micro);color:var(--t-ink-2);}
.application[data-applied="0"] .application-label{color:var(--t-ink-2);}
/* .table-note carries margin-top:-12px so it tucks under a table. After a
   figure that negative margin OVERLAPS the figure's last line — measured at
   -12px on the inventory and gates figures, both breakpoints. Neutralised only
   for this adjacency, so the note's behaviour after a table is untouched. */
.diagram + .table-note{margin-top:var(--sp-4);}
.card-meta{display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center;font-size:var(--fs-micro);color:var(--t-ink-2);}
.card-meta a{position:relative;z-index:1;}
.table-frame{margin:var(--sp-5) 0;}
.table-scroll{overflow-x:auto;border:1px solid var(--t-line);border-radius:0;}
/* TALO-0091 (issue #57 R10-01). A table declares which geometry it is, and the
   two are genuinely different rules for genuinely different tables:

   .table-prose fills its container because at least one of its columns carries
   a sentence, and a sentence is meant to wrap.

   .table-token is sized by its own content, because every cell in it is a
   token, a number or an id — nothing in it is meant to wrap. 'width:100%' here
   is what broke the page: it compressed the table to the container, so the
   container was never overflowed, so 'overflow-x:auto' could never fire, and
   eight columns were squeezed until 'Wall, с' split from its unit. min-width
   keeps a short token table from sitting narrow in a wide container.

   Neither mode may let a HEADER wrap: the label and its unit are one token to
   the reader even when they contain a space. */
table{border-collapse:collapse;font-size:var(--fs-meta);}
.table-prose{width:100%;}
.table-token{width:max-content;min-width:100%;}
th{font-family:var(--font-body);font-size:var(--fs-micro);text-transform:uppercase;letter-spacing:0.05em;color:var(--t-ink-2);text-align:left;white-space:nowrap;}
th,td{padding:var(--sp-3) var(--sp-4);border-bottom:1px solid var(--t-line);vertical-align:top;}
tbody tr:last-child td{border-bottom:none;}
.table-scroll th:first-child,.table-scroll td:first-child{position:sticky;left:0;background:var(--t-surface);}
.table-scroll thead th{background:var(--t-surface);}
/* TALO-0139 / trace #61. On the narrow table viewport, a sticky first column
   can be wider than the viewport itself. It then becomes unrelated topmost
   content over every later header, so those associated labels are painted but
   cannot receive a pointer or touch action. Keep the desktop reading aid; at
   the mobile breakpoint a term-enabled table scrolls as one unobscured plane. */
@media (max-width:767.98px){.table-scroll:has(.term-ctl) th:first-child,.table-scroll:has(.term-ctl) td:first-child{position:static;}}
/* TALO-0096 (trace issue #61): one selector gave the machine face to both the
   numeric CELLS and the column HEADER above them, so "published" and "withheld"
   — human words naming what a column means — were set in the typeface of machine
   output. Monospace earns its place on the figures, where tabular alignment is
   the point; the header is language and is set as language. Alignment is shared,
   the face is not. */
td.num,th.num{text-align:right;}
td.num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
th.num{font-family:var(--font-body);}
td .mono{font-size:var(--fs-micro);}
tfoot td{font-weight:600;border-top:2px solid var(--t-line);}
.table-note{font-size:var(--fs-micro);color:var(--t-ink-2);margin-top:calc(-1 * var(--sp-3));}
.timeline{list-style:none;margin:var(--sp-5) 0;padding:0;position:relative;}
/* rail centred under the dot: (dot 16px - rail 2px) / 2, derived from the token rather than written as 7px */
.timeline::before{content:'';position:absolute;left:calc((var(--sp-4) - 2px) / 2);top:8px;bottom:8px;width:2px;background:var(--t-line);}
.timeline li{position:relative;padding:0 0 var(--sp-5) var(--sp-6);}
.timeline li::before{content:'';position:absolute;left:0;top:calc(var(--sp-2) - 2px);width:16px;height:16px;border-radius:50%;background:var(--t-bg);border:3px solid var(--t-accent);}
.timeline li.pending::before{border-color:var(--t-target);}
.timeline .t-date{font-family:var(--font-mono);font-size:var(--fs-micro);color:var(--t-ink-2);display:block;}
.timeline h3,.timeline h4{margin-bottom:var(--sp-1);}
.relation-list{margin:var(--sp-4) 0;}
.relation-list dt{font-family:var(--font-body);font-size:var(--fs-meta);letter-spacing:0.01em;font-weight:600;color:var(--t-ink-2);margin:var(--sp-3) 0 var(--sp-2);}
.relation-list dd{margin:0;display:flex;flex-wrap:wrap;gap:var(--sp-2);}
.glossary-entry{border-bottom:1px solid var(--t-line);padding:var(--sp-4) 0;}
.glossary-entry h3{margin-bottom:var(--sp-2);}
.glossary-note{color:var(--t-ink-2);font-size:var(--fs-meta);}
.deflist{display:grid;grid-template-columns:auto 1fr;gap:var(--sp-2) var(--sp-5);margin:var(--sp-5) 0;font-size:var(--fs-meta);}
.deflist dt{font-family:var(--font-body);font-weight:600;color:var(--t-ink-2);}
.deflist dd{margin:0;overflow-wrap:anywhere;}
/* TALO-0136 (R15-06): below 480px the two-column grid left the value column narrow enough
   that overflow-wrap:anywhere broke words mid-syllable — «Производствен / ный след
   самого сайта» on the case page. The sheet is mobile-first by contract, so this was a
   defect at the contract's own declared base. Stacked, the value has the full measure and
   needs no emergency break: break-word only breaks a word that genuinely cannot fit,
   where anywhere breaks whenever it helps the line. Nothing is removed from the list. */
@media (max-width:479px){
  .deflist{grid-template-columns:1fr;gap:var(--sp-1) 0;}
  .deflist dt{margin-top:var(--sp-3);}
  .deflist dd{margin-bottom:var(--sp-2);overflow-wrap:break-word;}
}
.pricing-card{display:flex;flex-direction:column;gap:var(--sp-3);}
.pricing-deposit{font-family:var(--font-mono);font-size:var(--fs-2);}
.pricing-credits{color:var(--t-ink-2);}
.pricing-card .btn{margin-top:auto;}
.form-field{margin-bottom:var(--sp-5);}
.form-field label{display:block;font-weight:500;margin-bottom:var(--sp-2);}
.form-field .hint{font-size:var(--fs-micro);color:var(--t-ink-2);margin-top:var(--sp-1);}
.form-field input,.form-field textarea,.form-field select{width:100%;min-height:44px;padding:var(--sp-2) var(--sp-3);border:1px solid var(--t-line);border-radius:4px;background:var(--t-surface);color:var(--t-ink);font:inherit;}
.form-field textarea{min-height:120px;resize:vertical;}
.form-field input:focus,.form-field textarea:focus,.form-field select:focus{outline:2px solid var(--t-accent);outline-offset:1px;border-color:var(--t-accent);}
.form-error{color:var(--t-target);font-size:var(--fs-meta);margin-top:var(--sp-1);}
/* TALO-0079: left at -9999px ON PURPOSE. The clip pattern was tried and reverted:
   test R2-27 requires the honeypot to be OUT OF THE LAYOUT and explicitly rejects a
   zero-sized element, because a bot fills what it can reach. The design gate's
   grid rule was the thing that over-reached — an off-screen offset is a removal
   technique, not rhythm — so the rule was scoped instead of the check weakened. */
.hp-field{position:absolute;left:-9999px;top:-9999px;}
.check-field{display:flex;gap:var(--sp-3);align-items:flex-start;}
.check-field input{width:20px;height:20px;min-height:20px;margin-top:4px;flex:none;}
details.accordion{border:1px solid var(--t-line);border-radius:8px;margin-bottom:var(--sp-3);background:var(--t-surface);}
details.accordion summary{cursor:pointer;padding:var(--sp-4) var(--sp-5);font-weight:500;min-height:44px;}
details.accordion[open] summary{border-bottom:1px solid var(--t-line);}
details.accordion .accordion-body{padding:var(--sp-4) var(--sp-5);}
/* TALO-0048: task-first editorial disclosure. The summary carries the
   customer question; the full deliverable/team/evidence layer remains native
   HTML and keyboard-operable instead of becoming another wall of cards. */
.work-category-list{list-style:none;margin:var(--sp-5) 0 0;padding:0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-4);align-items:start;}
.work-category-item{min-width:0;}
.work-category{border-top:2px solid var(--t-ink);border-bottom:1px solid var(--t-line);background:var(--t-surface);}
.work-category summary{cursor:pointer;min-height:44px;padding:var(--sp-5) var(--sp-4);display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--sp-2) var(--sp-4);align-items:start;}
.work-category summary::-webkit-details-marker{display:none;}
.work-category summary::marker{content:'';}
.work-category summary::after{content:'+';font-family:var(--font-mono);font-size:var(--fs-2);line-height:1;color:var(--t-accent);grid-column:2;grid-row:1;}
.work-category[open] summary::after{content:'−';}
.work-category-title{font-family:var(--font-display);font-size:var(--fs-1);font-weight:600;line-height:1.25;grid-column:1;margin:0;}
.work-category-task{color:var(--t-ink-2);font-size:var(--fs-meta);line-height:1.55;grid-column:1 / -1;}
.work-category-hint{color:var(--t-accent);font-size:var(--fs-micro);font-weight:600;grid-column:1 / -1;}
.work-category-detail{padding:0 var(--sp-4) var(--sp-5);border-top:1px solid var(--t-line);}
.work-category-detail h4{margin-top:var(--sp-5);}
.work-category summary:focus-visible,.evidence-disclosure>summary:focus-visible{outline:3px solid var(--t-accent);outline-offset:3px;}
@media (max-width:767.98px){.work-category-list{grid-template-columns:1fr;gap:var(--sp-3);}.work-category summary{padding:var(--sp-4);}}

/* The two-minute workflow answer stays in the normal reading flow. The raw
   tables, contracts and repository trail form one explicit evidence appendix. */
.evidence-disclosure-wrap{margin-block:var(--sp-7);}
.evidence-disclosure{border-block:2px solid var(--t-ink);background:var(--t-surface);}
.evidence-disclosure>summary{cursor:pointer;min-height:56px;padding:var(--sp-5) var(--sp-4);display:grid;grid-template-columns:minmax(220px,.45fr) minmax(0,1fr);gap:var(--sp-3) var(--sp-6);align-items:start;}
.evidence-disclosure>summary::marker{color:var(--t-accent);}
.evidence-disclosure-title{font-family:var(--font-display);font-size:var(--fs-2);font-weight:600;line-height:1.2;}
.evidence-disclosure-lede{color:var(--t-ink-2);font-size:var(--fs-meta);line-height:1.55;max-width:68ch;}
.evidence-disclosure-body{border-top:1px solid var(--t-line);padding-bottom:var(--sp-4);}
.evidence-disclosure-body>.section{padding-block:var(--sp-6);border-bottom:1px solid var(--t-line);}
.evidence-disclosure-body>.section:last-child{border-bottom:0;}
@media (max-width:767.98px){.evidence-disclosure-wrap{margin-block:var(--sp-6);}.evidence-disclosure>summary{grid-template-columns:1fr;gap:var(--sp-2);padding:var(--sp-4);}.evidence-disclosure-body>.section{padding-block:var(--sp-5);}}

.catalog-actions{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-3) var(--sp-5);margin-top:var(--sp-6);}
.catalog-actions [data-catalog-toggle][hidden]{display:none;}
.catalog-status{color:var(--t-ink-2);font-size:var(--fs-meta);margin:0;}
/* TALO-0053 (issue #44 R2-13): cost/time breakdown charts. The SVG scales to
   the container; on narrow viewports it stays readable because the bar rows are
   laid out in SVG user units and the whole graphic scales as one, rather than
   reflowing labels under bars. */
.chart{margin:var(--sp-5) 0 0;overflow-x:auto;}
.chart svg{width:100%;height:auto;max-width:720px;font-family:var(--font-body);display:block;}
/* The bar chart scrolls inside its own box rather than scaling down: below
   ~640px the whole graphic (labels included) shrank with the container and the
   rows became unreadable. Same contract as .table-scroll — the page never
   scrolls sideways, the wide thing does. */
.chart svg.chart-bars{max-width:820px;min-width:640px;}
.chart svg.chart-split{max-width:560px;min-width:0;}
/* Long mono terms squeeze the value column to nothing in the two-column
   deflist and 'overflow-wrap:anywhere' then breaks '1.00×' one glyph per line;
   below the tablet breakpoint the pair stacks instead. */
@media (max-width:767.98px){
.deflist-stack{grid-template-columns:1fr;gap:var(--sp-1) 0;}
.deflist-stack dd{margin-bottom:var(--sp-3);}
}
.chart-legend{list-style:none;margin:var(--sp-3) 0 0;padding:0;display:flex;flex-wrap:wrap;gap:var(--sp-2) var(--sp-5);font-size:var(--fs-meta);}
.chart-legend-item{display:flex;align-items:center;gap:var(--sp-2);}
.chart-swatch{width:12px;height:12px;border-radius:2px;flex:none;border:1px solid var(--t-line);}
.chart-swatch-a{background:var(--t-accent);}
.chart-swatch-b{background:var(--t-line);}
.chart-note{color:var(--t-ink-2);font-size:var(--fs-meta);margin:var(--sp-3) 0 0;}
.chart-heading{font-family:var(--font-body);font-size:var(--fs-meta);font-weight:600;color:var(--t-ink-2);margin:var(--sp-6) 0 0;text-transform:none;}
.diagram{margin:var(--sp-6) 0 0;}
.diagram-flow svg{margin-inline:auto;}
.card-desc-full{color:var(--t-ink-2);margin:0 0 var(--sp-3);}
.card-link{display:inline-block;margin-top:var(--sp-2);font-weight:600;}
.search-row{margin:0 0 var(--sp-4);}
.search-input{width:100%;max-width:420px;padding:var(--sp-2) var(--sp-3);border:1px solid var(--t-line);border-radius:8px;background:var(--t-surface);color:var(--t-ink);font:inherit;}
[data-search-miss]{display:none;}
[data-related-miss]{display:none;}
/* TALO-0072: the human-readable first layer over a dense table. It ADDS a
   claim and three computed numbers; the table keeps every row. */
.lead-layer{margin:0 0 var(--sp-6);}
.lead-claim{max-width:60ch;color:var(--t-ink);font-size:var(--fs-1);line-height:1.5;margin:0 0 var(--sp-5);}
/* TALO-0133: at 360 three figures with a 32px gap stack into a column tall enough to
   push text-block-density from 0.66 to 1.34 on the case page — the layer reached the
   first screen and then filled it. A compact grid at the mobile breakpoint keeps the
   figures side by side and the block short. The figures are unchanged; only their
   arrangement is. */
.lead-stats{display:flex;flex-wrap:wrap;gap:var(--sp-6);margin:0;}
@media (max-width:767px){
  .lead-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(96px,1fr));gap:var(--sp-3) var(--sp-4);}
  .lead-stats dd{font-size:var(--fs-2);}
  .lead-claim{font-size:var(--fs-body);margin-bottom:var(--sp-4);}
}
.lead-stats > div{display:flex;flex-direction:column-reverse;gap:var(--sp-1);}
.lead-stats dt{color:var(--t-ink-2);font-size:var(--fs-meta);margin:0;}
.lead-stats dd{font-family:var(--font-display);font-size:var(--fs-3);font-weight:600;line-height:1.1;margin:0;}
/* TALO-0215 — a figure's declared relation to a PEER in the same layer (5 showcase
   workflows account for 593 of the 620 ledger records beside them). It is the
   .card-remainder decision one layer up, and for the same reason: a number that
   frames another number must be unmistakably subordinate to it, or it becomes a
   fourth peer figure and adds a scale instead of removing one. Same two devices —
   the body face against the display face of .lead-stats dd, and --fs-micro, the step
   .table-note and .card-remainder already use, so the type scale gains no eighth
   size (type-scale-steps caps it at 7).
   order:-1 is what puts it LAST on the screen: the container is column-reverse, so
   the DOM order dt/dd/relation reads term, value, note to a screen reader while the
   eye gets number, label, note. Without it the note would sit above the figure it is
   subordinate to, which is the one arrangement that would undo the point. */
.lead-relation{order:-1;font-family:var(--font-body);font-size:var(--fs-micro);font-weight:400;line-height:1.4;color:var(--t-ink-2);margin:0;max-width:32ch;}
.lead-stats dd.lead-relation{font-family:var(--font-body);font-size:var(--fs-micro);font-weight:400;}
.lead-relation [data-relation-figure]{color:var(--t-ink);}
.filter-note{margin:0 0 var(--sp-3);color:var(--t-ink-2);font-size:var(--fs-meta);}
.diagram-neighbors{max-width:640px;}
/* TALO-0059 R3-02: .diagram svg{display:block} (0-1-1) used to defeat the single-class
   variant swap (.diagram-v{display:none}, 0-1-0), so BOTH orientations rendered at every
   viewport. The variant selectors now carry the type qualifier too, so they always win. */
.diagram svg{width:100%;height:auto;font-family:var(--font-body);}
.diagram svg.diagram-h{display:block;max-width:760px;}
.diagram svg.diagram-v{display:none;max-width:300px;}
@media (max-width:767.98px){.diagram svg.diagram-h{display:none;}.diagram svg.diagram-v{display:block;}}
/* TALO-0096: the first screen's rhythm at 375x812. above-fold-anchor passed on
   EN home with the anchor at y=754 in an 812px viewport — 58px of headroom,
   which held on this box and did not on a CI runner whose text metrics are a
   little larger. A pass with 58px of margin is not a pass, it is a coincidence
   about a font. The mobile hero gives back 40px of pure rhythm: no content is
   removed and no desktop composition changes. */
/* TALO-0129 / tal-policy-design-concept@r4. The home's actions live in their own
   band rather than inside the hero container, so that ONE copy of them can sit
   below the first content section at the mobile breakpoint. The hero's own rules
   are untouched — every other page that opens with a hero keeps exactly the
   padding it had; only inside .home-open does the bottom step move from the hero
   to the band, step for step, so the desktop composition is unchanged. */
.hero{padding:var(--sp-7) 0 var(--sp-6);}
@media (max-width:767px){
  .hero{padding:var(--sp-6) 0 var(--sp-5);}
  .hero-ctas{margin-top:var(--sp-5);}
  .hero + .section{padding-top:var(--sp-5);}
}
@media (min-width:1080px){.hero{padding:var(--sp-8) 0 var(--sp-7);}}
.hero .section-lede{margin-top:var(--sp-4);}
.hero-ctas{display:flex;flex-wrap:wrap;gap:var(--sp-4);margin-top:var(--sp-6);align-items:center;}
.home-open > .hero{padding-bottom:0;}
.hero-ctas-band{padding:0 0 var(--sp-6);}
.hero-ctas-band + .section{padding-top:var(--sp-6);}
@media (max-width:767px){
  .hero-ctas-band{padding:0 0 var(--sp-5);}
  .hero-ctas-band + .section{padding-top:var(--sp-5);}
  /* THE FIRST-SCREEN INSTRUCTION, measured by TALO-0096 and decided by
     tal-policy-design-concept@r4: the RU home needs ~157px for its example
     cards to reach the fold and rhythm tightening yields ~68px. The action band
     is 104px plus its margin; moving it below the first section frees ~136px and
     the cards clear the fold in BOTH languages. The buttons stay on the page, in
     the same order, one section later — no content removed, nothing duplicated
     in the DOM. */
  .home-open{display:flex;flex-direction:column;}
  .home-open > .hero{order:1;}
  .home-open > .section{order:2;}
  .home-open > .hero-ctas-band{order:3;padding:var(--sp-6) 0 0;}
  /* The band alone is not enough in RUSSIAN, and the measurement says so
     rather than a preference: at 360x780 the RU hero lede is 273px of 20px
     prose — seven lines — and the first example card still lands at y=821,
     41px below a 780px fold. Two changes close it, both inside .home-open so
     no other page moves:

     · the home opening's ledes are set at --fs-body here — the hero's AND the
       first section's, because a hero lede smaller than the section lede below
       it inverts the very hierarchy this task is about. 1.25rem in the shared
       rule is a literal that happens to equal --fs-1 at mobile and nothing at
       desktop;
       --fs-body is a declared step, TALO-0096 collapsed the small end of the
       ramp precisely because sizes had been set ad hoc, and seven lines of
       20px type at the declared floor is a wall rather than a lede.
     · the rhythm above the anchor gives back four steps of the 4px grid.

     Measured after both, RU 360: the card clears the fold with more than half
     its height visible, which is the difference between an object a reader
     lands on and the 28px edge the registry counts. */
  /* TALO-0178: this step-down was decided and measured for the home hero in
     TALO-0129 and then applied only there. Measured on /investors at 375px, the
     same --fs-1 lede in the same 343px column runs 23-25 characters per line in
     RU and 30-32 in EN, against a median of 32/37 for body prose in the same
     column and a practical mobile band of ~35-45. At 23 cpl the Russian lede
     breaks roughly every three words. This is the ONE place the operator's
     "текст может быть где-то чересчур крупный" is borne out by measurement —
     the h1 (34px, one line, 5% of the fold) and the body (16px/1.6, which is
     the floor, not an excess) are not — so it is the one place that changes.
     No new step: --fs-body is already on every one of these pages. */
  .section-lede{font-size:var(--fs-body);}
  .home-open > .hero{padding-top:var(--sp-5);}
  .home-open .hero .section-lede{margin-top:var(--sp-3);}
  .home-open > .section{padding-top:var(--sp-6);}
  .home-open .example-cards{margin-top:var(--sp-4);}
}
@media (min-width:1080px){.hero-ctas-band{padding:0 0 var(--sp-7);}.hero-ctas-band + .section{padding-top:var(--sp-7);}}
/* ONE filled action per screen (component library, policy P7 — no CTA
   carpet-bombing). On the home page the header action and the hero action are
   the SAME action, same intent and, in English, the same words: two accent pills
   350px apart, which is how a screen ends up with no hierarchy at all. The
   page's own action stays primary and the persistent one steps back — on the
   home page only, where the duplicate exists, and only where the desktop header
   is in use. The mobile drawer keeps its filled action: TALO-0072 measured that
   an outlined button there reads as a form field, and that invariant is still
   enforced at 375. */
@media (min-width:1080px){
  body[data-section="home"] .nav-action .btn{background:var(--t-surface);color:var(--t-ink);border-color:var(--t-line);}
  body[data-section="home"] .nav-action .btn:hover{border-color:var(--t-accent);color:var(--t-accent);filter:none;}
}
/* ONE filled action per screen (component library, policy P7 — no CTA
   carpet-bombing). On the home page the header action and the hero action are
   the SAME action, same intent and, in English, the same words: two accent
   pills 350px apart, which is how a screen ends up with no hierarchy at all.
   The page's own action stays primary and the persistent one steps back — on
   the home page only, where the duplicate exists, and only where the desktop
   header is in use. The mobile drawer keeps its filled action: TALO-0072
   measured that an outlined button in the drawer reads as a form field, and
   that invariant is still enforced at 375. */
@media (min-width:1080px){
  body[data-section="home"] .nav-action .btn{background:var(--t-surface);color:var(--t-ink);border-color:var(--t-line);}
  body[data-section="home"] .nav-action .btn:hover{border-color:var(--t-accent);color:var(--t-accent);filter:none;}
}
.doc-header{position:static;background:var(--t-bg);border-bottom:1px solid var(--t-line);padding:var(--sp-3) 0;font-family:var(--font-mono);font-size:var(--fs-micro);color:var(--t-ink-2);}
.doc-header h1{display:inline;font:inherit;color:inherit;letter-spacing:inherit;}
.doc-body{padding:var(--sp-6) 0;}
.doc-body h2{margin-top:var(--sp-7);}
.doc-body h3{margin-top:var(--sp-6);}

/* TALO-0144 visual rebuild: one calm editorial column, interrupted by
   source-backed figure plates that use the full canvas. Machine evidence is
   attached to the article and figures, never rendered as reader copy. */
/* TALO-0161: the shell tracks the site content width, so the White Paper's
   outer edge aligns with the navigation like every other page. --wp-prose-max
   stays 896px on purpose: TALO-0153 measured this document as a calm reading
   column interrupted by full-1080 figure plates, with captions and reading
   guides aligned to the column. Widening the text here would not fix the
   complaint (which is about the Pitch Deck and the other prose pages) and
   would break a typography contract that was measured rather than guessed. */
:root{--wp-shell-max:var(--content-max);--wp-reading-measure:70ch;--wp-prose-max:896px;--wp-gutter:clamp(16px,1.5vw,64px);--wp-body-size:clamp(18px,1vw + 14px,20px);--wp-body-leading:1.68;}
.wp-atlas{overflow-wrap:break-word;text-indent:0;padding:clamp(var(--sp-6),5vw,var(--sp-8)) 0 clamp(var(--sp-8),10vw,128px);}
.wp-atlas-shell{width:calc(100% - var(--wp-gutter) - var(--wp-gutter));max-width:var(--wp-shell-max);margin-inline:auto;min-width:0;}
.doc-header .wp-atlas-shell{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3);flex-wrap:wrap;}
.wp-atlas-prose{width:100%;max-width:var(--wp-prose-max);max-width:max(var(--wp-prose-max),var(--wp-reading-measure));margin-inline:auto;min-width:0;}
.wp-atlas-prose>p{max-width:none;}
.wp-atlas-prose p,.wp-atlas-prose li{font-size:var(--wp-body-size);line-height:var(--wp-body-leading);}
.wp-atlas-prose>h1{display:flex;flex-direction:column;gap:var(--sp-2);margin:clamp(24px,5vw,64px) 0 var(--sp-3);font-size:clamp(44px,7vw,80px);line-height:.98;letter-spacing:-.045em;}
.wp-title-brand{font-family:var(--font-display);font-weight:700;color:var(--t-ink);}
.wp-title-kind{font-family:var(--font-mono);font-size:clamp(12px,1.2vw,15px);font-weight:600;line-height:1.2;letter-spacing:.14em;text-transform:uppercase;color:var(--t-accent);}
.wp-edition-summary{margin:0 0 clamp(32px,5vw,64px);font-family:var(--font-mono);font-size:14px!important;line-height:1.5!important;letter-spacing:.03em;color:var(--t-ink-2);}
.wp-atlas-prose h2{margin-top:clamp(var(--sp-7),5vw,var(--sp-8));font-size:clamp(34px,4vw,52px);line-height:1.08;letter-spacing:-.03em;text-wrap:balance;}
.wp-atlas-prose h3{margin-top:clamp(var(--sp-6),5vw,var(--sp-8));font-size:clamp(23px,2.4vw,31px);line-height:1.2;text-wrap:balance;}
.wp-atlas-prose blockquote{margin:clamp(var(--sp-6),6vw,var(--sp-8)) 0;padding:var(--sp-4) 0 var(--sp-4) clamp(var(--sp-4),4vw,var(--sp-6));border-left:4px solid var(--t-accent);font-family:var(--font-display);font-size:clamp(22px,2.2vw,30px);line-height:1.4;color:var(--t-ink);}
.wp-atlas-prose blockquote p{font:inherit;margin:0;}
.wp-atlas .breadcrumb{font-size:14px;line-height:1.5;color:var(--t-ink-2);}
.wp-atlas-toc{margin:0 0 clamp(var(--sp-6),4vw,var(--sp-8));border-block:1px solid var(--t-line);}
.wp-atlas-toc summary{display:flex;align-items:center;min-height:52px;cursor:pointer;font-family:var(--font-mono);font-size:14px;font-weight:600;color:var(--t-ink);}
.wp-atlas-toc summary::marker{color:var(--t-accent);}
.wp-atlas-toc nav{padding:0 0 var(--sp-4);}
.wp-atlas-toc ol{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:var(--sp-2) var(--sp-4);list-style:none;margin:0;padding:0;counter-reset:wp-chapter;}
.wp-atlas-toc li{counter-increment:wp-chapter;min-width:0;font-size:15px;line-height:1.3;}
.wp-atlas-toc a{display:flex;align-items:center;gap:8px;min-height:44px;color:var(--t-ink-2);text-decoration:none;}
.wp-atlas-toc a::before{content:"0" counter(wp-chapter);font-family:var(--font-mono);font-size:11px;color:var(--t-accent);}
.wp-atlas-toc a[aria-current="location"]{color:var(--t-accent);font-weight:700;}
.wp-atlas-toc+ p{margin-top:0;font-family:var(--font-display);font-size:clamp(30px,4.2vw,52px);font-weight:650;line-height:1.08;letter-spacing:-.03em;text-wrap:balance;}
.wp-atlas-toc+ p+ p{font-size:clamp(20px,2.2vw,28px);line-height:1.4;color:var(--t-ink-2);}
.wp-figure-band{position:relative;width:min(var(--wp-shell-max),calc(100vw - var(--wp-gutter) - var(--wp-gutter)));margin:clamp(var(--sp-6),4vw,var(--sp-8)) 0 clamp(var(--sp-6),4vw,var(--sp-8)) 50%;padding:clamp(var(--sp-5),2vw,var(--sp-6)) 0;transform:translateX(-50%);scroll-margin-top:var(--sp-9);border-block:1px solid var(--t-line);background:transparent;min-width:0;}
.wp-figure-band figcaption,.figure-long-description,.figure-source-language-note,.figure-reading-guide,.figure-source-links{display:block;width:100%;max-width:var(--wp-prose-max);margin-inline:auto;}
.figure-canonical-plate{display:grid;justify-items:end;gap:var(--sp-3);width:100%;min-width:0;margin:0 auto clamp(var(--sp-5),3vw,var(--sp-6));}
.figure-canonical-plate picture{display:block;width:100%;min-width:0;overflow:hidden;border:1px solid var(--t-line);background:var(--t-surface);}
.figure-canonical-plate img{display:block;width:100%;height:auto;aspect-ratio:auto;object-fit:contain;}
.figure-zoom-open{display:inline-flex;align-items:center;justify-content:center;min-height:48px;padding:var(--sp-2) var(--sp-4);border:1px solid var(--t-accent);border-radius:4px;background:var(--t-surface);font-family:var(--font-mono);font-size:14px;font-weight:700;line-height:1.4;color:var(--t-accent);cursor:pointer;}
.figure-zoom-open:hover{background:color-mix(in srgb,var(--t-accent) 8%,var(--t-surface));}
.figure-zoom-open:focus-visible,.figure-zoom-dialog button:focus-visible,.figure-zoom-stage:focus-visible{outline:3px solid var(--t-accent);outline-offset:3px;}
.figure-dialog-open{overflow:hidden;}
.figure-zoom-dialog{width:100vw;max-width:none;height:100dvh;max-height:none;margin:0;padding:0;border:0;background:var(--t-bg);color:var(--t-ink);}
.figure-zoom-dialog::backdrop{background:rgba(7,10,18,.78);}
.figure-zoom-shell{display:grid;grid-template-rows:auto minmax(0,1fr);width:100%;height:100%;min-width:0;}
.figure-zoom-toolbar{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:var(--sp-4);align-items:center;padding:var(--sp-3) clamp(var(--sp-3),3vw,var(--sp-6));border-bottom:1px solid var(--t-line);background:var(--t-surface);}
.figure-zoom-toolbar h2{margin:0;font-family:var(--font-display);font-size:clamp(18px,2vw,25px);line-height:1.25;color:var(--t-ink);}
.figure-zoom-pan-cue{display:flex;align-items:center;gap:var(--sp-2);margin:0!important;font-family:var(--font-mono);font-size:13px!important;font-weight:600;line-height:1.4!important;color:var(--t-ink-2);}
.figure-zoom-pan-cue span{font-size:20px;color:var(--t-accent);}
.figure-zoom-controls{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--sp-2);}
.figure-zoom-controls button{display:inline-flex;align-items:center;justify-content:center;min-width:44px;min-height:44px;padding:var(--sp-2) var(--sp-3);border:1px solid var(--t-line);border-radius:4px;background:var(--t-bg);font-family:var(--font-mono);font-size:14px;font-weight:700;color:var(--t-ink);cursor:pointer;}
.figure-zoom-controls button[data-figure-zoom-close]{border-color:var(--t-accent);color:var(--t-accent);}
.figure-zoom-stage{min-width:0;min-height:0;overflow:auto;overscroll-behavior:contain;touch-action:pan-x pan-y pinch-zoom;padding:clamp(var(--sp-3),3vw,var(--sp-6));background:color-mix(in srgb,var(--t-bg) 94%,var(--t-ink));scrollbar-gutter:stable both-edges;}
.figure-zoom-image{display:block;width:auto;max-width:none;height:auto;margin:auto;background:var(--t-surface);box-shadow:0 12px 40px rgba(0,0,0,.2);}
.figure-web-composition{position:relative;width:100%;min-width:0;margin:0 auto clamp(var(--sp-5),3vw,var(--sp-6));padding:clamp(var(--sp-5),4vw,var(--sp-7));overflow:hidden;border:1px solid var(--t-line);background:linear-gradient(145deg,color-mix(in srgb,var(--t-surface) 96%,var(--t-accent)),var(--t-bg));color:var(--t-ink);}
.figure-web-composition *{min-width:0;overflow-wrap:break-word;}
.figure-composition-header{display:grid;grid-template-columns:minmax(150px,.34fr) minmax(0,1fr);gap:var(--sp-5);align-items:start;margin-bottom:clamp(var(--sp-5),4vw,var(--sp-7));padding-bottom:var(--sp-5);border-bottom:1px solid var(--t-line);}
.figure-composition-kicker,.figure-composition-thesis,.figure-composition-heading{margin:0!important;}
.figure-composition-kicker{font-family:var(--font-mono);font-size:16px!important;font-weight:700;line-height:1.4!important;letter-spacing:.05em;text-transform:uppercase;color:var(--t-accent);}
.figure-composition-thesis{font-family:var(--font-display);font-size:clamp(21px,2.2vw,30px)!important;font-weight:600;line-height:1.35!important;color:var(--t-ink);text-wrap:balance;}
.figure-node-index{display:block;font-family:var(--font-mono);font-size:16px;line-height:1;color:var(--t-accent);}
/* Native topology: every group and relationship is source-authored per figure. */
.figure-topology{display:grid;gap:clamp(var(--sp-5),4vw,var(--sp-7));min-width:0;}
.figure-topology-groups{min-width:0;}
.figure-topology-group{min-width:0;}
.figure-topology-node{margin:0!important;font-family:var(--font-display);font-size:clamp(18px,1.55vw,22px)!important;font-weight:620;line-height:1.4!important;color:var(--t-ink);overflow-wrap:break-word;word-break:normal;hyphens:none;}
.figure-topology-detail-count{margin:var(--sp-2) 0 0!important;font-family:var(--font-mono);font-size:13px!important;line-height:1.45!important;color:var(--t-ink-2);}
.figure-topology-edges{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 var(--sp-6);list-style:none;margin:0;padding:var(--sp-4) 0 0;border-top:1px solid var(--t-line);}
.figure-topology-edges li{display:grid;grid-template-columns:28px minmax(0,1fr);gap:var(--sp-2);align-items:start;padding:var(--sp-3) 0;border-bottom:1px solid var(--t-line);font-size:16px;line-height:1.55;}
.figure-topology-edge-mark{font-family:var(--font-mono);font-size:20px;line-height:1.25;color:var(--t-accent);}
.figure-web-composition--transformation-rail .figure-topology-groups{display:flex;align-items:stretch;}
.figure-web-composition--transformation-rail .figure-topology-group{position:relative;flex:1;padding:var(--sp-4) var(--sp-5);border-top:3px solid var(--t-accent);}
.figure-web-composition--transformation-rail .figure-topology-group+.figure-topology-group{border-left:1px solid var(--t-line);}
.figure-web-composition--transformation-rail .figure-topology-group:not(:last-child)::after{content:"→";position:absolute;right:-.6em;top:-.9em;z-index:1;padding-inline:var(--sp-1);background:var(--t-surface);font-size:22px;color:var(--t-accent);}
.figure-web-composition[data-topology-direction="bidirectional"] .figure-topology-group:not(:last-child)::after{content:"↔";}
.figure-web-composition--contrast-board .figure-topology-groups{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-5);}
.figure-web-composition--contrast-board .figure-topology-group{padding:var(--sp-4) 0;border-top:4px solid var(--t-ink-2);}
.figure-web-composition--contrast-board .figure-topology-group:nth-child(even){border-top-color:var(--t-accent);}
.figure-web-composition--semantic-explorer .figure-topology-groups{display:grid;grid-template-columns:minmax(320px,.95fr) repeat(2,minmax(0,1fr));gap:var(--sp-4);align-items:stretch;}
.figure-web-composition--semantic-explorer .figure-topology-group{padding:var(--sp-4);border-left:2px solid var(--t-line);}
.figure-web-composition--semantic-explorer .figure-topology-group:first-child{display:flex;flex-direction:column;justify-content:center;min-height:240px;padding:var(--sp-7) var(--sp-6);border:2px solid var(--t-accent);border-radius:50%;background:color-mix(in srgb,var(--t-accent) 8%,var(--t-surface));text-align:center;}
.figure-web-composition--cycle-loop .figure-topology-groups{display:flex;flex-wrap:wrap;gap:var(--sp-3);padding:var(--sp-4);border:2px solid var(--t-accent);border-radius:999px;}
.figure-web-composition--cycle-loop .figure-topology-group{flex:1 1 180px;padding:var(--sp-3) var(--sp-4);border-left:2px solid var(--t-accent);}
.figure-web-composition--layered-exchange .figure-topology-groups{display:flex;flex-direction:column-reverse;gap:var(--sp-2);}
.figure-web-composition--layered-exchange .figure-topology-group{display:grid;grid-template-columns:42px minmax(0,1fr);gap:var(--sp-3);align-items:start;padding:var(--sp-3) var(--sp-4);border-left:clamp(4px,1vw,12px) solid var(--t-accent);background:color-mix(in srgb,var(--t-surface) 90%,var(--t-accent));}
.figure-web-composition--layered-exchange .figure-topology-detail-count{grid-column:2;}
.figure-web-composition--evidence-roadmap .figure-topology-groups{position:relative;display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:var(--sp-3);padding-top:var(--sp-5);}
.figure-web-composition--evidence-roadmap .figure-topology-groups::before{content:"";position:absolute;inset:12px 0 auto;height:2px;background:linear-gradient(90deg,var(--t-ink-2),var(--t-accent));}
.figure-web-composition--evidence-roadmap .figure-topology-group{padding:var(--sp-4) var(--sp-3) 0;border-left:1px solid var(--t-line);}
/* Transformation rail: a directional argument, not a row of interchangeable cards. */
.figure-flow{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:0;list-style:none;margin:0;padding:0;counter-reset:figure-stage;}
.figure-flow li{position:relative;display:grid;align-content:start;gap:var(--sp-3);min-width:0;padding:var(--sp-4) var(--sp-5) var(--sp-4) var(--sp-4);border-top:3px solid var(--t-accent);font-size:16px;line-height:1.52;overflow-wrap:break-word;}
.figure-flow li+li{border-left:1px solid var(--t-line);}
.figure-flow li:not(:last-child)::after{content:"→";position:absolute;right:-.62em;top:-.9em;z-index:1;padding-inline:var(--sp-1);background:var(--t-surface);color:var(--t-accent);font-size:22px;line-height:1;}
/* Contrast board: two editorial columns with an explicit relationship in the seam. */
.figure-contrast{display:grid;grid-template-columns:minmax(0,1fr) minmax(180px,.45fr) minmax(0,1fr);gap:var(--sp-5);align-items:stretch;}
.figure-contrast-side{padding-top:var(--sp-3);border-top:4px solid var(--t-ink-2);}
.figure-contrast-side--result{border-top-color:var(--t-accent);}
.figure-composition-heading{font-family:var(--font-mono);font-size:16px!important;font-weight:700;line-height:1.4!important;color:var(--t-ink-2);}
.figure-contrast-side ul{list-style:none;margin:var(--sp-3) 0 0;padding:0;}
.figure-contrast-side li{padding:var(--sp-3) 0;border-bottom:1px solid var(--t-line);font-size:16px;line-height:1.5;}
.figure-contrast-bridge{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp-3);margin:0!important;padding:var(--sp-5) var(--sp-3);background:color-mix(in srgb,var(--t-accent) 9%,var(--t-surface));font-size:16px!important;line-height:1.5!important;text-align:center;color:var(--t-ink);}
.figure-contrast-bridge span{font-size:32px;line-height:1;color:var(--t-accent);}
/* Semantic explorer: one governing concept surrounded by a varied field of concerns. */
.figure-semantic-map{display:grid;grid-template-columns:minmax(220px,.72fr) minmax(0,1fr);gap:clamp(var(--sp-5),4vw,var(--sp-8));align-items:center;}
.figure-semantic-centre{display:flex;align-items:center;min-height:190px;margin:0!important;padding:var(--sp-6);border:2px solid var(--t-accent);border-radius:50%;background:color-mix(in srgb,var(--t-accent) 8%,var(--t-surface));font-family:var(--font-display);font-size:clamp(20px,2vw,27px)!important;font-weight:650;line-height:1.35!important;text-align:center;}
.figure-semantic-map ul{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 var(--sp-5);list-style:none;margin:0;padding:0;}
.figure-semantic-map li{position:relative;padding:var(--sp-4) 0 var(--sp-4) var(--sp-5);border-bottom:1px solid var(--t-line);font-size:16px;line-height:1.5;}
.figure-semantic-map li::before{content:"";position:absolute;left:0;top:1.55em;width:12px;height:2px;background:var(--t-accent);}
/* Cycle loop: a returning sequence whose conclusion feeds the next pass. */
.figure-cycle-shell{display:grid;grid-template-columns:minmax(0,1fr) minmax(190px,.34fr);gap:var(--sp-6);align-items:center;}
.figure-cycle{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-4);list-style:none;margin:0;padding:0;}
.figure-cycle li{position:relative;min-width:0;padding:var(--sp-5) var(--sp-4);border-left:3px solid var(--t-accent);background:color-mix(in srgb,var(--t-surface) 88%,var(--t-bg));font-size:16px;line-height:1.5;}
.figure-cycle li .figure-node-index{margin-bottom:var(--sp-3);}
.figure-cycle li:not(:last-child)::after{content:"↗";position:absolute;right:var(--sp-2);bottom:var(--sp-2);color:var(--t-accent);font-size:20px;}
.figure-cycle-return{display:flex;flex-direction:column;gap:var(--sp-3);margin:0!important;padding:var(--sp-5);border-block:1px solid var(--t-accent);font-size:16px!important;line-height:1.52!important;color:var(--t-ink-2);}
.figure-cycle-return span{font-size:42px;line-height:1;color:var(--t-accent);}
/* Layered exchange: unequal strata and a vertical value current. */
.figure-layered-exchange{display:grid;grid-template-columns:minmax(0,1fr) minmax(180px,.28fr);gap:var(--sp-6);align-items:center;}
.figure-layered-exchange ol{display:flex;flex-direction:column-reverse;gap:var(--sp-2);list-style:none;margin:0;padding:0;}
.figure-layered-exchange li{display:grid;grid-template-columns:90px minmax(0,1fr);gap:var(--sp-4);padding:var(--sp-3) var(--sp-4);border-left:clamp(4px,1vw,12px) solid var(--t-accent);background:color-mix(in srgb,var(--t-surface) 90%,var(--t-accent));font-size:16px;line-height:1.5;}
.figure-layered-exchange li>span{font-family:var(--font-mono);font-size:16px;font-weight:700;color:var(--t-accent);}
.figure-layered-exchange aside{display:flex;align-items:center;gap:var(--sp-4);padding:var(--sp-5) 0;border-block:1px solid var(--t-line);}
.figure-layered-exchange aside>span{font-size:40px;color:var(--t-accent);}
.figure-layered-exchange aside p{margin:0!important;font-size:16px!important;line-height:1.5!important;color:var(--t-ink-2);}
/* Evidence roadmap: milestones share one path, but each gate keeps its own weight. */
.figure-roadmap{position:relative;display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:var(--sp-3);list-style:none;margin:0;padding:var(--sp-5) 0 0;}
.figure-roadmap::before{content:"";position:absolute;left:0;right:0;top:12px;height:2px;background:linear-gradient(90deg,var(--t-ink-2),var(--t-accent));}
.figure-roadmap li{position:relative;min-width:0;padding:var(--sp-4) var(--sp-3) 0;border-left:1px solid var(--t-line);}
.figure-roadmap-gate{position:absolute;left:0;top:-32px;display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:2px solid var(--t-accent);border-radius:50%;background:var(--t-surface);font-family:var(--font-mono);font-size:12px;color:var(--t-accent);}
.figure-roadmap li p{margin:0!important;font-size:16px!important;line-height:1.5!important;}
.wp-figure-band figcaption{margin:0 auto clamp(var(--sp-5),3vw,var(--sp-6));font-family:var(--font-display);font-size:clamp(20px,2vw,27px);font-weight:650;line-height:1.3;color:var(--t-ink);}
.figure-long-description{margin-top:var(--sp-3);font-size:clamp(17px,1.2vw,19px);line-height:1.65;color:var(--t-ink-2);}
.figure-source-language-note{margin-top:var(--sp-3);font-size:15px;line-height:1.55;color:var(--t-ink-2);}
.figure-reading-guide{margin-top:var(--sp-4);border-block:1px solid var(--t-line);color:var(--t-ink);}
.figure-reading-guide summary{display:flex;align-items:center;min-height:48px;cursor:pointer;font-family:var(--font-body);font-size:17px;font-weight:700;line-height:1.4;color:var(--t-accent);}
.figure-reading-guide summary::marker{color:var(--t-accent);}
.figure-reading-guide-body{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-5);padding:0 0 var(--sp-5);}
.figure-reading-guide-body section{min-width:0;}
.figure-reading-guide-body h3{margin:var(--sp-3) 0 var(--sp-2);font-family:var(--font-mono);font-size:14px;line-height:1.4;letter-spacing:.04em;text-transform:uppercase;color:var(--t-ink-2);}
.figure-reading-guide-body ol{margin:0;padding-left:1.35em;}
.figure-reading-guide-body li{margin-bottom:var(--sp-2);font-size:17px;line-height:1.58;color:var(--t-ink);}
.figure-reading-guide summary:focus-visible,.figure-full-detail:focus-visible{outline-color:var(--t-accent);}
.figure-source-links{display:flex;flex-wrap:wrap;gap:var(--sp-2) var(--sp-5);margin-top:var(--sp-4);}
.figure-full-detail{display:inline-flex;align-items:center;width:max-content;max-width:100%;min-height:44px;font-family:var(--font-mono);font-size:13px;line-height:1.45;color:var(--t-accent);overflow-wrap:anywhere;}
@media (max-width:1100px){
  .figure-web-composition--semantic-explorer .figure-topology-groups{grid-template-columns:repeat(2,minmax(0,1fr));}
  .figure-web-composition--semantic-explorer .figure-topology-group:first-child{min-height:0;padding:var(--sp-5);border-radius:var(--sp-4);}
  .figure-web-composition--evidence-roadmap .figure-topology-groups{grid-template-columns:repeat(2,minmax(0,1fr));padding-top:0;}
  .figure-web-composition--evidence-roadmap .figure-topology-groups::before{display:none;}
  .figure-flow,.figure-cycle,.figure-roadmap{grid-template-columns:repeat(2,minmax(0,1fr));}
  .figure-contrast{grid-template-columns:1fr;}
  .figure-contrast-bridge{min-height:0;}
  .figure-semantic-map,.figure-cycle-shell,.figure-layered-exchange{grid-template-columns:1fr;}
  .figure-semantic-centre{min-height:0;border-radius:var(--sp-4);}
  .figure-cycle-return{flex-direction:row;align-items:center;}
  .figure-roadmap{gap:var(--sp-5) var(--sp-3);padding-top:0;}
  .figure-roadmap::before{display:none;}
  .figure-roadmap-gate{position:static;margin-bottom:var(--sp-3);}
}
@media (min-width:721px) and (max-width:900px){
  .figure-web-composition--transformation-rail .figure-topology-groups{display:grid;grid-template-columns:1fr;}
  .figure-web-composition--transformation-rail .figure-topology-group{padding:var(--sp-4);border-top:0;border-left:3px solid var(--t-accent);}
  .figure-web-composition--transformation-rail .figure-topology-group+.figure-topology-group{border-left:3px solid var(--t-accent);border-top:1px solid var(--t-line);}
  .figure-web-composition--transformation-rail .figure-topology-group:not(:last-child)::after{content:"↓";right:auto;left:-.55em;top:auto;bottom:-.48em;}
  .figure-web-composition[data-topology-direction="bidirectional"] .figure-topology-group:not(:last-child)::after{content:"↕";}
}
@media (max-width:720px){
  .figure-zoom-open{width:100%;}
  .figure-zoom-toolbar{grid-template-columns:1fr;gap:var(--sp-2);}
  .figure-zoom-toolbar h2{font-size:18px;}
  .figure-zoom-pan-cue{padding-block:var(--sp-1);}
  .figure-zoom-controls{justify-content:stretch;display:grid;grid-template-columns:repeat(3,minmax(44px,1fr));}
  .figure-zoom-controls button[data-figure-zoom-close]{grid-column:1/-1;}
  .figure-zoom-stage{padding:var(--sp-2);}
  .figure-topology-edges{grid-template-columns:1fr;}
  .figure-web-composition--transformation-rail .figure-topology-groups,.figure-web-composition--cycle-loop .figure-topology-groups{display:grid;grid-template-columns:1fr;border-radius:var(--sp-4);}
  .figure-web-composition--transformation-rail .figure-topology-group{padding:var(--sp-4);border-top:0;border-left:3px solid var(--t-accent);}
  .figure-web-composition--transformation-rail .figure-topology-group+.figure-topology-group{border-left:3px solid var(--t-accent);border-top:1px solid var(--t-line);}
  .figure-web-composition--transformation-rail .figure-topology-group:not(:last-child)::after{content:"↓";right:auto;left:-.55em;top:auto;bottom:-.48em;}
  .figure-web-composition[data-topology-direction="bidirectional"] .figure-topology-group:not(:last-child)::after{content:"↕";}
  .figure-web-composition--contrast-board .figure-topology-groups,.figure-web-composition--semantic-explorer .figure-topology-groups,.figure-web-composition--evidence-roadmap .figure-topology-groups{grid-template-columns:1fr;}
  .figure-web-composition--layered-exchange .figure-topology-groups{flex-direction:column;}
  .figure-web-composition{padding:var(--sp-5) var(--sp-4);}
  .figure-composition-header{grid-template-columns:1fr;gap:var(--sp-3);}
  .figure-flow,.figure-cycle,.figure-roadmap{grid-template-columns:1fr;}
  .figure-flow li{padding:var(--sp-4) var(--sp-3) var(--sp-5) var(--sp-4);border-top:0;border-left:3px solid var(--t-accent);}
  .figure-flow li+li{border-left:3px solid var(--t-accent);border-top:1px solid var(--t-line);}
  .figure-flow li:not(:last-child)::after{content:"↓";right:auto;left:-.55em;top:auto;bottom:-.48em;background:var(--t-surface);}
  .figure-semantic-map ul{grid-template-columns:1fr;}
  .figure-cycle li{padding:var(--sp-4);}
  .figure-cycle li:not(:last-child)::after{content:"↓";}
  .figure-cycle-return{align-items:flex-start;}
  .figure-layered-exchange li{grid-template-columns:1fr;gap:var(--sp-1);}
  .figure-roadmap{border-left:2px solid var(--t-accent);}
  .figure-roadmap li{display:grid;grid-template-columns:36px minmax(0,1fr);gap:var(--sp-3);padding:var(--sp-3) 0 var(--sp-3) var(--sp-3);border-left:0;border-bottom:1px solid var(--t-line);}
  .figure-roadmap-gate{margin:0;}
  .figure-reading-guide-body{grid-template-columns:1fr;gap:var(--sp-3);}
  .figure-reading-guide-body li{font-size:17px;line-height:1.62;}
  .figure-source-links{display:grid;grid-template-columns:1fr;}
  .figure-full-detail{width:100%;}
}
@media (max-width:560px){
  .doc-header .wp-atlas-shell{align-items:flex-start;}
  .wp-atlas-prose>h1{font-size:clamp(40px,13vw,52px);}
  .wp-atlas-toc ol{grid-template-columns:1fr 1fr;}
  .wp-figure-band{padding:var(--sp-5) 0;}
  .wp-figure-band figcaption,.figure-long-description,.figure-source-language-note,.figure-reading-guide,.figure-source-links{padding-inline:var(--sp-2);}
}
@media (prefers-reduced-motion:reduce){.wp-atlas *,.figure-zoom-dialog *{scroll-behavior:auto!important;transition:none!important;animation:none!important;}}

.document-shelf{position:static;padding-block:var(--sp-5);border-block:1px solid var(--t-line);background:var(--t-surface);}
.document-shelf-heading{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--sp-2);margin-bottom:var(--sp-4);}
.document-shelf-heading h2,.document-shelf-heading p{margin:0;}
.document-shelf-heading p{color:var(--t-ink-2);}
.document-shelf-list{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--sp-3);list-style:none;margin:0;padding:0;}
.document-shelf-list>li{display:grid;grid-template-columns:minmax(0,1fr);align-content:start;gap:var(--sp-3);padding-block:var(--sp-3);border-top:1px solid var(--t-line);min-width:0;}
.document-shelf-name{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--sp-2);min-width:0;}
.document-shelf-meta{font-family:var(--font-mono);font-size:var(--fs-micro);color:var(--t-ink-2);}
.document-shelf-note{margin:0;color:var(--t-ink-2);font-size:var(--fs-meta);line-height:1.45;}
.document-shelf-actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-2);min-width:0;}
.document-shelf-actions a{display:flex;align-items:center;justify-content:center;min-height:44px;padding:var(--sp-2) var(--sp-3);border:1px solid var(--t-line);border-radius:4px;background:var(--t-bg);color:var(--t-ink);text-align:center;overflow-wrap:anywhere;}
.document-shelf-actions a:hover{border-color:var(--t-accent);color:var(--t-accent);text-decoration:none;}
/* The pitch document has four actions where every other has two, and two of
   them are short file-format chips. On a single-column shelf the plain grid
   gives each chip a full half while the two sentence-length routes wrap, which
   is what pushed the narrow shelf past its height budget. Pairing the chips on
   one row keeps the card at three rows instead of four. Scoped to the
   single-column shelf: from 768px the card is wide enough for one flowing row
   (see the rule in that breakpoint), and this would override it. */
@media (max-width:767.98px){
  /* Three columns, not two: the two file-format chips are a word wide and the
     reading route is short enough to sit beside them, so the first row carries
     three actions and only the sentence-length workflow label spans. That is
     two rows for four actions — the same height the card had with two. */
  [data-document-kind="pitch-deck"] .document-shelf-actions{grid-template-columns:repeat(3,minmax(0,1fr));}
  [data-document-kind="pitch-deck"] .document-shelf-actions a[data-document-action$="-workflow"]{grid-column:1 / -1;}
}
.document-shelf .table-note{margin:var(--sp-2) 0 0;}
@media (min-width:768px){
  .document-shelf{padding-block:var(--sp-3);}
  .document-shelf-heading{grid-template-columns:220px minmax(0,1fr);align-items:start;gap:var(--sp-6);margin-bottom:var(--sp-3);}
  .document-shelf-list{grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-6);}
  .document-shelf-list>li{gap:var(--sp-2);padding-block:var(--sp-2);}
  /* The pitch row carries four actions: the HTML reading route, two release
     downloads and the production workflow. Equal columns forced a 2x2 block
     that pushed the shelf past its height budget, so the row flows instead —
     PDF and PPTX size to their short labels and the two labelled routes take
     the remaining width. */
  .document-shelf-list>[data-document-kind="pitch-deck"] .document-shelf-actions{grid-template-columns:repeat(auto-fit,minmax(min(100%,4rem),auto));justify-content:start;}
  .document-shelf-list>[data-document-kind="pitch-deck"] .document-shelf-actions a{padding-inline:var(--sp-2);}
}
@media (min-width:1100px){
  .document-shelf-list:has(>[data-document-kind="launch-validation"]){grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-5);}
  .document-shelf-list>[data-document-kind="launch-validation"] .document-shelf-note{display:none;}
}

/* TALO-0155 — current, source-backed launch validation. The report keeps the
   896px editorial measure established for the White Paper, but its verdict and
   criteria remain visibly operational rather than masquerading as narrative
   prose. Wide matrices scroll inside their own boundary on small screens; the
   document itself never creates horizontal page overflow. */
.launch-validation-report{padding:clamp(var(--sp-6),6vw,var(--sp-9)) 0 var(--sp-9);overflow-wrap:anywhere;}
.launch-validation-report>.container-prose{width:calc(100% - var(--sp-4) - var(--sp-4));max-width:896px;padding:0;}
.launch-validation-report .breadcrumb{margin-bottom:var(--sp-5);font-family:var(--font-mono);font-size:var(--fs-meta);color:var(--t-ink-2);}
.launch-validation-report .prose>p,.launch-validation-report .prose>ul,.launch-validation-report .prose>ol{font-size:clamp(18px,1vw + 14px,20px);line-height:1.68;}
.launch-validation-report .prose h1{max-width:16ch;margin-bottom:var(--sp-5);font-size:clamp(42px,6vw,72px);line-height:1;letter-spacing:-.04em;text-wrap:balance;}
.launch-validation-report .prose h2{margin-top:clamp(var(--sp-7),6vw,var(--sp-9));font-size:clamp(30px,3.8vw,46px);line-height:1.1;letter-spacing:-.025em;text-wrap:balance;}
.launch-validation-report .prose h3{margin-top:clamp(var(--sp-6),4vw,var(--sp-8));font-size:clamp(22px,2.3vw,29px);line-height:1.2;text-wrap:balance;}
.launch-validation-report .prose a{overflow-wrap:anywhere;}
.validation-summary{margin:var(--sp-6) 0 var(--sp-8);padding:clamp(var(--sp-5),4vw,var(--sp-7));border-block:1px solid var(--t-line);background:linear-gradient(135deg,color-mix(in srgb,var(--t-accent) 7%,var(--t-surface)),var(--t-surface));}
.validation-summary h2{margin-top:0!important;}
.validation-lede{max-width:58ch!important;font-family:var(--font-display);font-size:clamp(22px,2.4vw,30px)!important;line-height:1.42!important;color:var(--t-ink);}
.validation-verdict-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-3);margin:var(--sp-5) 0;}
.validation-verdict-grid>div{min-width:0;padding:var(--sp-4);border:1px solid var(--t-line);background:var(--t-bg);}
.validation-verdict-grid dt{font-family:var(--font-mono);font-size:var(--fs-meta);color:var(--t-ink-2);}
.validation-verdict-grid dd{margin:var(--sp-2) 0 0;font-family:var(--font-display);font-size:var(--fs-2);font-weight:700;line-height:1.15;}
.status-pass{color:var(--t-success);}
.status-fail{color:var(--t-danger);}
.validation-callout{margin:var(--sp-6) 0;padding:var(--sp-4) var(--sp-5);border-left:4px solid var(--t-accent);background:var(--t-surface);}
.validation-callout-fail{border-left-color:var(--t-danger);}
.validation-callout>p:last-child{margin-bottom:0;}
.launch-validation-report .validation-table{display:block;width:100%;max-width:100%;margin:var(--sp-5) 0 var(--sp-7);overflow-x:auto;overscroll-behavior-inline:contain;border-block:1px solid var(--t-line);font-size:clamp(14px,.6vw + 12px,16px);line-height:1.5;}
.launch-validation-report .validation-table caption{padding:var(--sp-3) 0;text-align:left;font-family:var(--font-display);font-size:var(--fs-1);font-weight:600;color:var(--t-ink);}
.launch-validation-report .validation-table th,.launch-validation-report .validation-table td{min-width:8rem;vertical-align:top;}
.launch-validation-report .validation-table th:first-child{min-width:6rem;}
.launch-validation-report .validation-table td:last-child{min-width:18rem;}
@media (max-width:560px){
  .launch-validation-report>.container-prose{width:calc(100% - var(--sp-4) - var(--sp-4));}
  .validation-verdict-grid{grid-template-columns:1fr;}
  .validation-summary{padding-inline:var(--sp-4);}
}
.why-us-layout{display:grid;gap:var(--sp-5);}
.why-us-layout>*{min-width:0;}
.why-us-system p{max-width:68ch;}
.why-us-proof{display:grid;gap:var(--sp-2);margin:var(--sp-4) 0 var(--sp-5);padding:0;}
.why-us-proof>div{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:baseline;gap:var(--sp-3);padding:var(--sp-3) 0;border-bottom:1px solid var(--t-line);}
.why-us-proof dt{color:var(--t-ink-2);}
.why-us-proof dd{margin:0;font-family:var(--font-mono);font-size:var(--fs-2);font-weight:600;color:var(--t-accent);}
.why-us-links{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-top:var(--sp-5);}
.why-us-links a{display:inline-flex;align-items:center;min-height:44px;padding:var(--sp-2) var(--sp-3);border:1px solid var(--t-line);border-radius:4px;background:var(--t-surface);}
.why-us-links a:hover{border-color:var(--t-accent);text-decoration:none;}
@media (min-width:768px){
  .why-us-layout{grid-template-columns:minmax(0,1.25fr) minmax(16rem,.75fr);align-items:start;gap:var(--sp-7);}
  .why-us-proof{margin-top:0;}
}
/* TALO-0160 — capability groups on the Investor Room. Two groups of cards need
   a labelled break between them; the cards themselves are the existing
   .grid-cards.cols-2, unchanged, so this adds separation and nothing else. */
.capability-tally{margin:var(--sp-3) 0 0;color:var(--t-ink-2);}
.capability-tally span{font-family:var(--font-mono);font-weight:600;color:var(--t-accent);}
.capability-group{margin-top:var(--sp-6);}
.capability-group:first-of-type{margin-top:var(--sp-5);}
.capability-group-title{margin:0 0 var(--sp-3);font-size:var(--fs-meta);font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--t-ink-2);}
.kc-grid{display:grid;grid-template-columns:1fr;gap:var(--sp-4);margin:var(--sp-5) 0;}
@media (min-width:768px){.kc-grid{grid-template-columns:repeat(2,1fr);}}
.pagination{display:flex;gap:var(--sp-2);justify-content:center;margin:var(--sp-6) 0;list-style:none;padding:0;font-family:var(--font-mono);}
.pagination a,.pagination span{display:inline-flex;min-width:44px;min-height:44px;align-items:center;justify-content:center;border:1px solid var(--t-line);border-radius:4px;}
.pagination [aria-current="page"]{border-color:var(--t-accent);color:var(--t-accent);}
/* TALO-0042 (R1-23): the per-page intent CTA. One rule, one component — the
   defect was every page sharing one generic waitlist button, and divergent
   per-page CTA markup would be the same defect wearing a different hat. */
.intent-cta{border:1px solid var(--t-line);border-left:4px solid var(--t-accent);border-radius:8px;background:var(--t-surface);padding:var(--sp-5);margin:var(--sp-7) 0 0;}
/* TALO-0096: this override set an h2 to the ramp's LOWEST display step while
   the same pages' h3s sat two steps above it, so every h3 on Workforce (63)
   and the Atlas (94) was measurably larger than a preceding h2 — the reader's
   document outline inverted at every card. The call-to-action is still a
   section heading; it is sized like one. */
.intent-cta h2{margin-bottom:var(--sp-3);}
.intent-cta p{color:var(--t-ink-2);max-width:60ch;}
.intent-banner{margin-bottom:var(--sp-5);}
.intent-banner .intent-name{font-weight:600;color:var(--t-ink);}
/* TALO-0055 (R2-23) — the ecosystem stack. The figure is capped narrower than
   the prose column so the four bands read as a stack, not a wall; the layer
   list below it carries the same data in text (TZ § 5.7). */
.diagram-stack{max-width:640px;margin-inline:auto;}
/* Same variant-swap contract as the process flow, and the same TALO-0059 trap:
   the type qualifier is required so .diagram svg{width:100%} cannot defeat a
   single-class display rule and paint both variants at once. */
.diagram svg.diagram-stack-w{display:block;max-width:640px;margin-inline:auto;}
.diagram svg.diagram-stack-n{display:none;max-width:340px;margin-inline:auto;}
@media (max-width:767.98px){.diagram svg.diagram-stack-w{display:none;}.diagram svg.diagram-stack-n{display:block;}}
.stack-list{list-style:none;margin:var(--sp-6) 0 0;padding:0;counter-reset:stack;}
.stack-list>li{border:1px solid var(--t-line);border-left:4px solid var(--t-line);border-radius:8px;background:var(--t-surface);padding:var(--sp-5);margin-bottom:var(--sp-4);}
.stack-list>li:first-child{border-left-color:var(--t-accent);}
.stack-list h3{margin-bottom:var(--sp-2);}
.stack-list .card-meta{margin-bottom:var(--sp-3);}
.stack-list p:last-child{margin-bottom:0;}
.deflist-wide{grid-template-columns:1fr;gap:var(--sp-1) 0;font-size:var(--fs-body);}
.deflist-wide dt{font-family:var(--font-body);font-weight:600;color:var(--t-ink);margin-top:var(--sp-4);}
.deflist-wide dd{margin:0 0 var(--sp-2);color:var(--t-ink-2);}
@media (min-width:768px){.deflist-wide{grid-template-columns:180px 1fr;gap:var(--sp-4) var(--sp-5);}.deflist-wide dt{margin-top:0;}.deflist-wide dd{margin-bottom:0;}}

/* TALO-0090 (issue #56 R9-02) — the LONG-FORM DOCUMENT type, per
   tal-blueprint-long-form-document. A 111KB argument is not the structural page
   blueprint-page-templates T7 describes, and the three things it needs that a
   short document does not are all here.

   1. MEASURE. The style guide sets the prose CONTAINER at 720px; that is the
      column, not the line. At the body size a 720px line runs past 90
      characters in Latin and further in Cyrillic, which is above the range a
      reader can return to reliably line after line — tolerable for four
      paragraphs, a real cost over 21 sections. The measure is therefore stated
      in CHARACTERS and nested INSIDE the declared container: it never widens
      it, so the two cannot contradict each other. Cyrillic runs 20-30% longer
      per word, and the ch unit is measured in the rendered face, so one rule serves
      both languages honestly.
   2. TABLE BREAKOUT. A thirteen-column comparison does not belong inside a
      reading measure. The style guide permits a full-bleed table to 1280px with
      inner scroll and no page-level overflow; this is that permission, taken
      only inside .longform and bounded by the viewport so 320px never scrolls
      the page.
   3. RETURN. A reader 60% into a long document needs the contents back, and
      every anchor must clear the sticky document header — otherwise following a
      link from the contents lands with the heading hidden under it. */
.longform .prose p{max-width:68ch;}
.longform .lf-section li{max-width:68ch;}
.longform .section-lede{max-width:62ch;}
.longform .evidence-signature{width:min(1080px,calc(100vw - var(--sp-6)));max-width:none;margin-left:50%;transform:translateX(-50%);}
.longform .lf-section{margin:0 0 var(--sp-7);}
.longform .lf-section>h2{margin-top:var(--sp-8);scroll-margin-top:var(--sp-9);}
.longform .lf-section:first-of-type>h2{margin-top:var(--sp-6);}
.longform .lf-backlink{font-family:var(--font-mono);font-size:0.8rem;margin-top:var(--sp-5);}
.longform .lf-backlink a{color:var(--t-ink-2);}
.longform .lf-manifest{word-break:break-word;}
.lf-contents{border:1px solid var(--t-line);border-left:4px solid var(--t-accent);border-radius:8px;background:var(--t-surface);padding:var(--sp-4) var(--sp-5);margin:var(--sp-6) 0;scroll-margin-top:var(--sp-9);}
.lf-contents summary{font-family:var(--font-body);font-weight:600;cursor:pointer;}
.lf-contents .lf-contents-hint{font-family:var(--font-mono);font-size:0.8rem;font-weight:400;color:var(--t-ink-2);}
.lf-contents ol{margin:var(--sp-4) 0 0;padding-left:1.6em;color:var(--t-ink-2);}
.lf-contents li{margin-bottom:var(--sp-2);}
.lf-contents a{color:var(--t-ink);}
@media (min-width:1080px){.lf-contents ol{columns:2;column-gap:var(--sp-6);}.lf-contents li{break-inside:avoid;}}
/* The table may leave the reading measure, never the page. Centring on the
   column with a percentage keeps this off the rhythm grid the design gate
   judges, because a breakout is sizing, not spacing. */
.longform .table-scroll{width:min(1080px,calc(100vw - var(--sp-6)));max-width:none;margin-left:50%;transform:translateX(-50%);}
@media (max-width:1079.98px){.longform .table-scroll,.longform .evidence-signature{width:100%;margin-left:0;transform:none;}}


/* --fs-meta, not a size of its own: TALO-0096 collapsed the small end of the
   ramp to three named steps and said nothing else may invent one. The strip is
   secondary explanatory text, which is what --fs-meta names. */
.term-strip{display:grid;border:1px solid var(--t-line);border-bottom:none;background:var(--t-surface);padding:var(--sp-3) var(--sp-4);font-size:var(--fs-meta);line-height:1.5;color:var(--t-ink-2);}
.term-strip>*{grid-area:1/1;margin:0;}
/* The open delay lives on the hover rules (400ms), so an incidental sweep
   across the header row explains nothing; the 150ms here is the close, and the
   duration is the contract's single micro-transition value. */
/* motion-tier: frequent — a glossary term is opened repeatedly while reading one table; feedback on the reader's own hover only. */
.term-def{visibility:hidden;height:0;overflow:hidden;transition:visibility 150ms ease-out;transition-delay:150ms;}
.term-name{color:var(--t-ink);font-weight:600;}
.term-hint{visibility:visible;font-style:italic;}
.table-frame:has(.term-ctl:focus) .term-hint,.table-frame:has(.term-ctl:checked) .term-hint{visibility:hidden;transition-delay:0ms;}
.table-frame:has(.term-ctl[data-term-col="1"]:focus) [data-term-def="1"]{visibility:visible;height:auto;transition-delay:0ms;}
.table-frame:has(.term-ctl[data-term-col="2"]:focus) [data-term-def="2"]{visibility:visible;height:auto;transition-delay:0ms;}
.table-frame:has(.term-ctl[data-term-col="3"]:focus) [data-term-def="3"]{visibility:visible;height:auto;transition-delay:0ms;}
.table-frame:has(.term-ctl[data-term-col="4"]:focus) [data-term-def="4"]{visibility:visible;height:auto;transition-delay:0ms;}
.table-frame:has(.term-ctl[data-term-col="5"]:focus) [data-term-def="5"]{visibility:visible;height:auto;transition-delay:0ms;}
.table-frame:has(.term-ctl[data-term-col="6"]:focus) [data-term-def="6"]{visibility:visible;height:auto;transition-delay:0ms;}
.table-frame:has(.term-ctl[data-term-col="7"]:focus) [data-term-def="7"]{visibility:visible;height:auto;transition-delay:0ms;}
.table-frame:has(.term-ctl[data-term-col="8"]:focus) [data-term-def="8"]{visibility:visible;height:auto;transition-delay:0ms;}
.table-frame:has(.term-ctl[data-term-col="9"]:focus) [data-term-def="9"]{visibility:visible;height:auto;transition-delay:0ms;}
.table-frame:has(.term-ctl[data-term-col="10"]:focus) [data-term-def="10"]{visibility:visible;height:auto;transition-delay:0ms;}
.table-frame:has(.term-ctl[data-term-col="11"]:focus) [data-term-def="11"]{visibility:visible;height:auto;transition-delay:0ms;}
.table-frame:has(.term-ctl[data-term-col="12"]:focus) [data-term-def="12"]{visibility:visible;height:auto;transition-delay:0ms;}
/* Touch and pen: the tap selects a column and the explanation stays selected.
   The strip is NOT height-reserved here — a tap cannot flicker, so the mobile
   reader keeps the vertical space until they ask for it. */
@media (hover:none){
.table-frame:has(.term-ctl[data-term-col="1"]:checked) [data-term-def="1"]{visibility:visible;height:auto;}
.table-frame:has(.term-ctl[data-term-col="2"]:checked) [data-term-def="2"]{visibility:visible;height:auto;}
.table-frame:has(.term-ctl[data-term-col="3"]:checked) [data-term-def="3"]{visibility:visible;height:auto;}
.table-frame:has(.term-ctl[data-term-col="4"]:checked) [data-term-def="4"]{visibility:visible;height:auto;}
.table-frame:has(.term-ctl[data-term-col="5"]:checked) [data-term-def="5"]{visibility:visible;height:auto;}
.table-frame:has(.term-ctl[data-term-col="6"]:checked) [data-term-def="6"]{visibility:visible;height:auto;}
.table-frame:has(.term-ctl[data-term-col="7"]:checked) [data-term-def="7"]{visibility:visible;height:auto;}
.table-frame:has(.term-ctl[data-term-col="8"]:checked) [data-term-def="8"]{visibility:visible;height:auto;}
.table-frame:has(.term-ctl[data-term-col="9"]:checked) [data-term-def="9"]{visibility:visible;height:auto;}
.table-frame:has(.term-ctl[data-term-col="10"]:checked) [data-term-def="10"]{visibility:visible;height:auto;}
.table-frame:has(.term-ctl[data-term-col="11"]:checked) [data-term-def="11"]{visibility:visible;height:auto;}
.table-frame:has(.term-ctl[data-term-col="12"]:checked) [data-term-def="12"]{visibility:visible;height:auto;}
}
/* Pointer devices: hovering explains, and the strip's height is reserved so
   that opening one cannot move the table under the pointer. */
@media (hover:hover){
.term-def{height:auto;}
/* motion-tier: frequent — same surface, same reader, same hover. */
.table-frame:has(.term-btn:hover) .term-hint{visibility:hidden;transition:visibility 150ms ease-out;transition-delay:400ms;}
.table-frame:has([data-term-def]:hover) .term-hint{visibility:hidden;transition-delay:0ms;}
/* Pointing at a column takes precedence over one a click left focused; the
   per-column rules below out-specify this, so only the pointed-at one shows. */
.table-frame:has(.term-btn:hover) [data-term-def]{visibility:hidden;}
.table-frame:has(.term-btn[data-term-col="1"]:hover) [data-term-def="1"],.table-frame:has([data-term-def="1"]:hover) [data-term-def="1"]{visibility:visible;height:auto;transition-delay:400ms;}
.table-frame:has(.term-btn[data-term-col="2"]:hover) [data-term-def="2"],.table-frame:has([data-term-def="2"]:hover) [data-term-def="2"]{visibility:visible;height:auto;transition-delay:400ms;}
.table-frame:has(.term-btn[data-term-col="3"]:hover) [data-term-def="3"],.table-frame:has([data-term-def="3"]:hover) [data-term-def="3"]{visibility:visible;height:auto;transition-delay:400ms;}
.table-frame:has(.term-btn[data-term-col="4"]:hover) [data-term-def="4"],.table-frame:has([data-term-def="4"]:hover) [data-term-def="4"]{visibility:visible;height:auto;transition-delay:400ms;}
.table-frame:has(.term-btn[data-term-col="5"]:hover) [data-term-def="5"],.table-frame:has([data-term-def="5"]:hover) [data-term-def="5"]{visibility:visible;height:auto;transition-delay:400ms;}
.table-frame:has(.term-btn[data-term-col="6"]:hover) [data-term-def="6"],.table-frame:has([data-term-def="6"]:hover) [data-term-def="6"]{visibility:visible;height:auto;transition-delay:400ms;}
.table-frame:has(.term-btn[data-term-col="7"]:hover) [data-term-def="7"],.table-frame:has([data-term-def="7"]:hover) [data-term-def="7"]{visibility:visible;height:auto;transition-delay:400ms;}
.table-frame:has(.term-btn[data-term-col="8"]:hover) [data-term-def="8"],.table-frame:has([data-term-def="8"]:hover) [data-term-def="8"]{visibility:visible;height:auto;transition-delay:400ms;}
.table-frame:has(.term-btn[data-term-col="9"]:hover) [data-term-def="9"],.table-frame:has([data-term-def="9"]:hover) [data-term-def="9"]{visibility:visible;height:auto;transition-delay:400ms;}
.table-frame:has(.term-btn[data-term-col="10"]:hover) [data-term-def="10"],.table-frame:has([data-term-def="10"]:hover) [data-term-def="10"]{visibility:visible;height:auto;transition-delay:400ms;}
.table-frame:has(.term-btn[data-term-col="11"]:hover) [data-term-def="11"],.table-frame:has([data-term-def="11"]:hover) [data-term-def="11"]{visibility:visible;height:auto;transition-delay:400ms;}
.table-frame:has(.term-btn[data-term-col="12"]:hover) [data-term-def="12"],.table-frame:has([data-term-def="12"]:hover) [data-term-def="12"]{visibility:visible;height:auto;transition-delay:400ms;}
}
/* The control is invisible but stays IN FLOW, one pixel wide inside its header
   cell. The shared .visually-hidden pattern is position:absolute, and an
   absolutely-positioned box keeps the static position it would have had — which
   for a cell of a table scrolled sideways is a point outside the viewport, so
   the PAGE grew a 650px horizontal scroll at 360px. Measured; the check that
   caught it is the one that says the page never scrolls sideways.
   It is not display:none and not visibility:hidden, so it stays focusable and
   stays in the accessibility tree. */
.term-ctl{position:static;width:1px;height:1px;margin:0;padding:0;border:0;opacity:0;-webkit-appearance:none;appearance:none;flex:none;}
/* The control is invisible, so the focus ring has to be drawn on the label the
   reader can actually see. */
.term-ctl:focus-visible + .term-btn{outline:2px solid var(--t-accent);outline-offset:2px;border-radius:2px;}
.term-ctl:checked + .term-btn .term-mark{border-color:var(--t-accent);color:var(--t-accent);}
/* The trigger is the column name itself — the thing the reader is asking
   about — plus a mark that says an explanation exists, since a definition
   nobody can see is not an explanation. */
.term-btn{display:inline-flex;align-items:center;gap:var(--sp-1);min-height:24px;min-width:24px;padding:0;border:0;background:none;color:inherit;font:inherit;letter-spacing:inherit;text-transform:inherit;white-space:nowrap;cursor:help;text-align:inherit;}
/* The mark inherits the header's size on purpose: a new font size on this page
   would spend one of the type scale's seven steps on a 14px glyph. */
.term-mark{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;border:1px solid var(--t-line);border-radius:50%;line-height:1;color:var(--t-ink-2);}
.term-btn:hover .term-mark{border-color:var(--t-accent);color:var(--t-accent);}
th.num .term-btn{justify-content:flex-end;width:100%;}
