/* ============================================================================
   Why AI Search Platforms Are Replacing Fragmented Retrieval Stacks
   — the per-build half of the stylesheet.

   `doc.css` is BYTE-IDENTICAL to the other three readers' (md5
   783cf85ef767d8d5a93ce584162b6bd7). It is the design system: grounds, grid,
   type scale, the reveal devices, the rail, the contents panel, the case rail
   and its scroll affordance. Editing it to get a result on this document would
   fork the system and the four editions would drift a rule at a time, so it is
   untouched and everything this document alone needs lives here, which is the
   second stylesheet the shell links. `doc.js` is byte-identical too.

   NOTHING HERE INVENTS A TOKEN. Every colour, measure, ramp and radius is one
   `doc.css` already declares.

   THE .js GUARD. Not one rule in this file hides anything, so there is nothing
   here for `check_readable_without_js` to object to. The three reveal devices
   are `doc.css`'s and are guarded there. A bare `opacity:0` written here would
   ship an invisible section to every crawler, because that gate reads this file
   too (lib.run concatenates STYLES).

   WHY EVERY LIGHT-GROUND MUTED ROLE BELOW IS `--ink-mute` AND NOT `--ink-54`
   or `--ink-38`: the table under `--ink-mute` in doc.css. .38 is 2.18:1 on
   white and .54 is 3.27:1; .71 is 5.35:1 and is the document's declared mute
   role. Every card in this file repaints its own ground to `--paper` without
   redeclaring the ground role tokens, so the token that names the pair
   ACTUALLY on screen is the honest one and `--on-ground-mute` is not.
   ========================================================================= */

/* ===================================================================== COVER
   The title is 65 characters. `--t-display` caps at 6.5rem, which sets it at
   104px, about ten characters to a 1024px line and therefore seven lines with
   an orphan on the last. Alignment law 6: type has to fit the column it is set
   in, and the cap has to come off the column rather than off a guess.
   Measured at DM Sans Display 500, which averages ~0.52em per character over
   this string: 4rem is 64px, ~33px per character, ~2,145px of title, three
   lines in the 1024px content column. At 390 the 2.1rem floor is 33.6px and it
   sets in four. NO `<br>` IS AUTHORED INTO IT, unlike the travel reader's:
   `check_fidelity` strips tags to nothing, so a `<br>` inside the title would
   close "Replacing Fragmented" up into one word and the one string on the page
   that must match `doc.title` would stop matching it. The rag is the
   stylesheet's problem, not the markup's. */
.cover .display{font-size:clamp(2.1rem, 1rem + 3.4vw, 4rem)}
/* The cover deck is this document's whole opening paragraph, 130 words, which
   is what a technical brief's abstract is. At `--t-deck`'s 1.9rem cap that is
   most of a phone screen, so the cover's deck alone steps down one rung of the
   existing ramp. Same token family, no new value. 52rem is ~70 characters at
   that size, which is the measure the rest of the document is set to. */
.cover .deck{font-size:var(--t-serif);max-width:52rem}

/* ==================================================================== LADDER
   The eight-stage retrieval workflow. This document's spine: the one passage
   everything else refers back to, and the only passage in it that is ordered.

   THE RUNGS INDENT, AND THAT IS THE READING. The Manager's Guide's ladder
   indents because its three maturity levels are a hierarchy a reader is
   somewhere inside. These eight are not a hierarchy either — they are a
   PIPELINE, and each stage consumes what the one above it produced: you cannot
   rank candidates you have not retrieved, or serve results you have not
   ranked. The step down and to the right is that dependency, made visible
   before a word is read, which is exactly what the source's numbered list
   means and what a flat register would throw away.

   THE STEP IS SMALLER THAN THE MANAGER'S GUIDE'S, because there are eight
   rungs and not three. 8u per step over seven steps would be 784px of indent
   in a 1024px column and the last rung would be a column of single words.
   2.6u over seven steps is 254px at the widest, so the last rung still holds
   770px and every step text sets on one line.

   Below the split breakpoint there is no indent at all: 390px has no room to
   spend on one, and a staircase in a 350px column is a stack of slivers. */
.flow{
  display:grid;
  grid-template-columns:1fr;
  gap:calc(var(--u) * 1.25);
}
.flow__step{
  display:grid;
  grid-template-columns:auto minmax(0, 1fr);
  gap:calc(var(--u) * 2.5);
  align-items:baseline;
  padding:calc(var(--u) * 2) calc(var(--u) * 3);
  background:var(--paper);
  border:1px solid var(--hair);
  border-left:3px solid var(--green);
}
@media (min-width:64rem){
  .flow{--flow-step:calc(var(--u) * 2.6)}
  .flow__step:nth-child(2){margin-left:calc(var(--flow-step) * 1)}
  .flow__step:nth-child(3){margin-left:calc(var(--flow-step) * 2)}
  .flow__step:nth-child(4){margin-left:calc(var(--flow-step) * 3)}
  .flow__step:nth-child(5){margin-left:calc(var(--flow-step) * 4)}
  .flow__step:nth-child(6){margin-left:calc(var(--flow-step) * 5)}
  .flow__step:nth-child(7){margin-left:calc(var(--flow-step) * 6)}
  .flow__step:nth-child(8){margin-left:calc(var(--flow-step) * 7)}
}
.flow__n{
  margin:0;
  font-family:var(--mono);
  font-size:var(--t-mono);
  letter-spacing:.1em;
  color:var(--ink-mute);
}
.flow__t{
  margin:0;
  font-family:var(--sans-display);
  font-weight:500;
  font-size:var(--t-deck);
  line-height:1.24;
  letter-spacing:-.012em;
  color:var(--ink);
}
@media print{
  .flow__step{break-inside:avoid;margin-left:0 !important}
}

/* ====================================================================== LIST
   "Vespa brings together:" and its eight capabilities, as a register: one
   hairline per entry, arriving in order. `.bullets` is doc.css's and is
   unchanged; the only thing this build adds is what sits in its first cell.

   A GLYPH, NOT A NUMERAL. `.bullets` is used on the travel reader with an
   `01..06` index in that 2.5rem cell. That is right for a register a reader
   scans; it is wrong here, one act after a ladder whose whole subject is an
   ORDER. Two numbered columns in consecutive acts would say the capabilities
   are a sequence too, and the source sets them as a bullet list precisely
   because they are not. The glyphs come from the shared sprite, one per idea,
   the same glyph the travel reader gives the same idea. */
.bullets .ic{
  width:1.4rem;height:1.4rem;
  color:var(--on-ground);
  margin-top:.1em;
}

/* ================================================================== GLOSSARY
   "What Vespa enables": six named benefits, each with one short paragraph
   under it. Label and definition, which is what a glossary is.

   NOT `sequence`. A sequence numbers its parts and gives each a sticky head
   because the reader needs to know which of N they are inside; these six are
   unnumbered peers and a reader is meant to find the one that is their problem
   and read that one. NOT `list` either — that mode is one line per entry and
   these carry 50 words each, which a hairline register cannot hold.

   The heading is a real `<h3>` rather than the Manager's Guide's bolded
   `<strong>` inside one string, because this contract carries the label and
   its definition as TWO strings. `lead_in()` exists there to keep one string
   whole; there is no string to keep whole here. */
.caps{
  list-style:none;margin:0;padding:0;
  display:grid;
  grid-template-columns:1fr;
  gap:1px;
  background:var(--hair);
  border:1px solid var(--hair);
}
/* TWO COLUMNS, AND IT STOPS THERE. The Manager's Guide's glossary goes to
   three at 72rem because its nine definitions are one line each. These six are
   fifty words each, and measured at three columns on the desktop sheet every
   cell was a 30-character column running fifteen lines deep: a wall of
   slivers. Two columns inside the 64rem container give each cell ~490px, which
   is ~48 characters at `--t-small` and about seven lines, and 6 divides by 2
   so the last row is full. */
@media (min-width:44rem){ .caps{grid-template-columns:1fr 1fr} }
.cap{
  background:var(--paper);
  padding:calc(var(--u) * 3) calc(var(--u) * 3.5) calc(var(--u) * 4);
  display:grid;
  grid-template-columns:auto minmax(0, 1fr);
  gap:calc(var(--u) * 1) calc(var(--u) * 1.5);
  align-content:start;
}
/* Inline with the heading, not on a row of its own. On its own row the glyph
   adds its height plus the gap to every cell and grid rows equalise to the
   tallest in the row, which is what cost the Manager's Guide ~150px of dead
   height across nine cells. */
.cap .ic{width:18px;height:18px;color:var(--ink);margin-top:.22em}
.cap__h{
  margin:0;
  font-family:var(--sans-display);
  font-weight:500;
  font-size:var(--t-body);
  line-height:1.24;
  letter-spacing:-.01em;
  color:var(--ink);
}
/* THE DEFINITION SPANS BOTH COLUMNS, the heading does not. Indented under the
   heading it gave up the glyph column and its gap — 39px of a 392px cell, a
   tenth of the measure — on every one of six fifty-word paragraphs. The
   Manager's Guide indents its own because its definitions are one line and the
   indent is what makes them read as entries under a label. */
.cap__b{
  grid-column:1 / -1;
  margin:0;
  font-size:var(--t-small);
  line-height:1.5;
  color:var(--ink-72);
}

/* ===================================================================== AUDIT
   "When should you consider Vespa?" — the section the contract itself marks
   `_directives: ["CALL OUT"]`. Eight conditions a reader scores themselves
   against, so it is a set of cards a reader works through rather than prose
   they read: the answer to the section's question is how many of the eight are
   true of them.

   EIGHT CELLS, TWO COLUMNS. The column count has to divide the item count or
   the last row has empty slots in it, which reads as a missing card and not as
   a grid (doc.css's `.fig__grid` note). 8 divides by 1 and by 2; a third
   breakpoint at four columns would give each card 256px of a 1024px container
   with 40px of that reserved for the numeral, and a 140px text column is a
   word ladder. So this grid stops at two.

   THE NUMERAL IS AN INDEX, NOT A RANK. The source sets these as a BULLET list,
   so nothing here may assert an order of importance. `decimal-leading-zero`
   in the mono face at the mute colour is the same wayfinding the contents
   panel and the ladder use — it tells a reader how far through eight they are.

   `--ink-mute`, 5.35:1 on the card's own white, NOT `--ink-38`. That token is
   2.18:1 and shipped on the Manager's Guide's nine numerals for the whole life
   of that edition, because `text-contrast` walked text NODES and a `::before`
   has none. It asks every element for its pseudos since 2026-09-18 and these
   eight are graded from this build's first run. NOT `--green-ink` either:
   green on the ladder two acts above means "the rung you are on", and eight
   green numerals here would read as eight lit states on a list that has
   none. */
.audit{
  list-style:none;margin:0;padding:0;
  counter-reset:q;
  display:grid;
  grid-template-columns:1fr;
  gap:1px;
  background:var(--hair);
  border:1px solid var(--hair);
}
@media (min-width:48rem){ .audit{grid-template-columns:1fr 1fr} }
/* ONE COLUMN, AND NO GLYPH. Every other card in this document carries an icon
   from the shared sprite because each one means a different thing. All eight
   of these mean the same thing — "this is true of you, or it is not" — so the
   only honest glyph would be eight identical check marks, which is eight boxes
   of decoration and a narrower text column to hold them. */
.q{
  counter-increment:q;
  background:var(--paper);
  padding:calc(var(--u) * 3) calc(var(--u) * 3.5) calc(var(--u) * 4);
  display:grid;
  grid-template-columns:minmax(0, 1fr);
  gap:calc(var(--u) * 1.5);
  align-content:start;
  position:relative;
}
.q::before{
  content:counter(q, decimal-leading-zero);
  position:absolute;
  top:calc(var(--u) * 3);right:calc(var(--u) * 3.5);
  font-family:var(--mono);
  font-size:var(--t-mono);
  color:var(--ink-mute);
}
.q__t{
  margin:0;
  font-size:var(--t-small);
  line-height:1.5;
  color:var(--ink-72);
  padding-right:2.5rem;
}
@media print{
  .audit,.caps{break-inside:auto}
  .q,.cap{break-inside:avoid}
}

/* ====================================================================== TURN
   The closing synthesis, and the one call to action the document makes.

   `.plate` is doc.css's full-width ink statement device and it is reused
   unchanged. The ONE declaration this build adds to it is the link colour, and
   it is the same decision doc.css already makes one selector along:
   `.act--ink .prose a,.act--ink .link{color:var(--green)}`. A `.plate` IS an
   ink surface — it sets `background:var(--ink);color:var(--paper)` — but it is
   not an `.act--ink`, so a link inside one falls through to the root `--link`
   #4A86E8, which is 3.67:1 on ink. No reader had ever put a link in a plate,
   so the hole was there and unlit rather than shipped. `--green` on ink is
   7.49:1, the same number the close act's companion link takes. */
.plate .link{color:var(--green)}
.plate__cta{
  margin:0;
  font-family:var(--sans-display);
  font-weight:500;
  font-size:var(--t-h2);
  line-height:1.16;
  letter-spacing:-.015em;
}

/* ====================================================================== RAIL
   More Reading: three cards, panning sideways below 52rem.

   THE CONTAINER IS `ul.cases`, WHICH IS DOC.CSS'S, AND THAT IS DELIBERATE.
   The lateral rail, its scroll-snap, its hidden scrollbar and — the part that
   matters — the self-hiding scroll shadow that advertises the travel are all
   declared there against that class. `shoot.mjs`'s `rail-affordance` row
   requires `background-attachment` to contain `local` on any overflowing rail
   and then requires the shadow to actually PAINT, measured against the same
   frame with the background suppressed. Building a second rail under a new
   class name would be shipping the defect that row exists to catch, on a page
   whose stylesheet already contains the fix.

   The cards keep `.cases`'s own bottom padding clear, because that band is
   where `rail-affordance` finds the rail's own background to sample: the row
   scans for the first height at which `elementFromPoint` returns the rail
   itself, and an `<li>` that filled the box at every height would make the
   measurement impossible and the row would FAIL rather than quietly pass.

   TWO OF THE THREE CARDS HAVE NO LINK, and they are not dressed as though they
   do. The source gives a title, a blurb and a label for each; only the first
   names a document this factory has actually built. Their labels are therefore
   `<p>`, not `<a>`: a label that looks like a link and goes nowhere is worse
   than a label. See doc_platform.LINKS for the two unknown targets. */
.read{
  background:var(--paper);
  border:1px solid var(--hair);
  padding:calc(var(--u) * 3) calc(var(--u) * 3);
  display:flex;flex-direction:column;
  gap:calc(var(--u) * 1.75);
  min-width:0;
}
.read__h{
  margin:0;
  font-family:var(--sans-display);
  font-weight:500;
  font-size:var(--t-section);
  line-height:1.18;
  letter-spacing:-.014em;
  color:var(--ink);
}
.read__b{
  margin:0;
  font-size:var(--t-small);
  line-height:1.55;
  color:var(--ink-72);
}
/* Pushed to the foot of the card so the three labels sit on one line however
   long the blurbs above them run. `margin-top:auto` needs the card to be a
   flex column with a height to give, which the rail's own stretch supplies. */
.read__cta{
  margin:auto 0 0;
  padding-top:calc(var(--u) * 2);
  border-top:1px solid var(--hair);
  font-family:var(--mono);
  font-size:var(--t-mono);
  letter-spacing:.1em;
  text-transform:uppercase;
  color:var(--ink-mute);
}

/* ===================================================================== CLOSE
   Ink, the ground the document opened on, and the colophon.

   It carries no section of its own because the document has none to give it:
   its last heading is More Reading. What it does carry is the three fields of
   `doc` — the title, the publisher and the kind — plus the derived read time,
   so the page ends by saying what it was rather than by running out. */
.close__mark{height:clamp(3.5rem, 8vw, 6rem);width:auto}
