/* =========================================================================
   GRADE BIO — gradebio.com
   site.css — page composition only.

   ⛔ This file defines NO ink token. Every value below is composed from the
   seven inks locked in 00_SYSTEM/grade.css, the way a press builds a tint
   from a percentage of one ink. No third hue, no radius, no shadow, no
   gradient, no card.

   The one place this file OVERRIDES the reference sheets is contrast on the
   orange field. The reference small type on the field is mixed at
   black 55-62%, which measures 2.6:1 to 3.0:1 against #E2551A and fails
   WCAG AA for text under 18px. --field-quiet is the same ink at 90%, which
   measures 4.58:1 and passes. Same two inks, correct density.
   ========================================================================= */

:root {
  /* a screen of black on the orange field, at a density that passes AA */
  --field-quiet: color-mix(in srgb, var(--black) 90%, var(--orange));
  /* a lighter screen, only ever used on rules and hairlines, never on type */
  --field-hair:  color-mix(in srgb, var(--black) 26%, var(--orange));
}

/* ---- 0. GLOBAL SAFETY --------------------------------------------------
   Identifiers, addresses and long mono strings must never push a sheet
   wider than the viewport. A register that scrolls sideways inside its own
   block is correct; a page that scrolls sideways is a defect.            */
body { overflow-wrap: break-word; }
/* The system sets display on .btn, .state and .pcell, and a class-level
   display beats the user-agent [hidden] rule. Anything the page hides in JS
   has to actually disappear. */
[hidden] { display: none !important; }
.tblwrap { overflow-x: auto; min-width: 0; }
.tblwrap table.reg { margin: 0; }

/* the skip link is the first thing in the tab order on every sheet */
.skip {
  position: absolute; left: -9999px; top: 0;
  font-family: var(--data); font-size: 11px; font-weight: 600;
  letter-spacing: .13em; text-transform: uppercase;
}
.skip:focus {
  position: fixed; left: var(--s5); top: var(--s5); z-index: 60;
  background: var(--strong); color: var(--ground);
  padding: 11px 16px; outline: 2px solid var(--field-deep); outline-offset: 2px;
}

/* ---- 1. RUNNING HEAD ---------------------------------------------------
   The head carries the mark, four document routes and the sheet's own
   control block. It is a running head, not a navigation bar: the routes
   are set as document names, and the sheet number travels with them.     */
.rh-nav { display: flex; align-items: center; gap: var(--s5); margin-left: auto; }
.rh-nav a {
  font-family: var(--data); font-size: 11px; font-weight: 500;
  letter-spacing: .12em; text-transform: uppercase; color: var(--quiet);
  border-bottom: var(--w-hair) solid transparent; padding-bottom: 2px;
  white-space: nowrap;
  transition: color 120ms linear, border-color 120ms linear;
}
.rh-nav a:hover { color: var(--strong); border-bottom-color: var(--field-deep); }
.rh-nav a[aria-current="page"] { color: var(--strong); border-bottom-color: var(--strong); }
.runhead__doc { flex: none; }
@media (max-width: 1120px) { .rh-desc { display: none; } }
@media (max-width: 900px)  { .rh-nav { margin-left: 0; gap: var(--s4); } }
@media (max-width: 480px)  { .rh-nav { gap: 14px; } .rh-nav a { font-size: 10px; letter-spacing: .08em; } }
/* A printed running head does not follow the reader down the page, and on a
   narrow sheet the head wraps to two rows. Below 640 it releases the top. */
@media (max-width: 640px) { .runhead { position: static; } }

/* ---- 2. THE SHEET INDEX ------------------------------------------------
   This replaces the navigation bar. Fourteen numbered documents, listed the
   way the contents of a technical binder are listed, on the field.        */
.sheets { border-top: var(--w-slug) solid var(--strong); padding-top: var(--s4); }
.sheets__h {
  display: flex; justify-content: space-between; align-items: baseline; gap: var(--s4);
  font-family: var(--data); font-size: 10.5px; letter-spacing: .14em;
  text-transform: uppercase; color: var(--quiet); margin-bottom: var(--s3);
  flex-wrap: wrap;
}
.sheets__l { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0 var(--gut); }
.sheets a {
  display: grid; grid-template-columns: 52px minmax(0, 1fr); gap: 10px; align-items: baseline;
  padding: 8px 0; border-bottom: var(--w-hair) solid var(--hair-soft); color: var(--strong);
  transition: background 110ms linear;
}
.sheets a:hover { background: var(--ground-alt); }
.sheets a[aria-current="page"] { background: var(--ground-alt); }
.sheets a .n { font-family: var(--data); font-size: 10.5px; font-weight: 600; letter-spacing: .04em; color: var(--field-deep); }
.sheets a .t { font-size: 14.5px; line-height: 1.25; }

.on-field .sheets { border-top-color: var(--black); }
.on-field .sheets__h { color: var(--field-quiet); }
.on-field .sheets a { color: var(--black); border-bottom-color: var(--field-hair); }
.on-field .sheets a .n { color: var(--field-quiet); }
/* The tint that marks the current row has to run TOWARD the stock, not toward
   the black. Screening the orange down with 9% black put near black type on it
   at 4.33:1 and the folio number at 3.94:1. Screening it up with the stock
   lifts both over 4.5:1 and still reads as one ink on one ground. */
.on-field .sheets a:hover,
.on-field .sheets a[aria-current="page"] { background: color-mix(in srgb, var(--ground) 20%, var(--orange)); }
.on-field .sheets a[aria-current="page"] .n,
.on-field .sheets a:hover .n { color: var(--black); }

@media (max-width: 1000px) { .sheets__l { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px)  { .sheets__l { grid-template-columns: 1fr; } }

/* ---- 3. FIELD CONTRAST CORRECTIONS -------------------------------------
   Every small type role the reference sheets set at black 55-62% on the
   field is reset to --field-quiet. Same inks, AA density.                 */
.field .quiet,
.on-field .toc__h,
.on-field .toc a .n,
.on-field .toc a .p,
.crumb,
.legend div,
.idblock__ids span,
.mast__facts span,
.field .searchbar input.f::placeholder { color: var(--field-quiet); }
.crumb a:hover { color: var(--black); }

/* ---- 3b. MASTHEAD FOOTING ----------------------------------------------
   The deck and the three control figures, set as the footing of the plate.
   Not a stat row, not cards: a rule, three figures, three legends.        */
.mast__two { display: grid; grid-template-columns: minmax(0, 1fr) 420px; gap: var(--gut);
             margin-top: var(--s5); align-items: start; }
.mast__facts { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--s4);
               border-top: var(--w-bar) solid var(--black); padding-top: var(--s4); }
.mast__facts b { display: block; font-family: var(--disp); font-weight: 700;
                 font-size: clamp(27px, 3.2vw, 38px); line-height: .94;
                 letter-spacing: -.018em; color: var(--black); }
.mast__facts span { display: block; font-family: var(--data); font-size: 9.5px;
                    letter-spacing: .12em; text-transform: uppercase; line-height: 1.55;
                    margin-top: 8px; color: var(--field-quiet); }
@media (max-width: 1000px) { .mast__two { grid-template-columns: 1fr; } }
@media (max-width: 520px)  { .mast__facts { grid-template-columns: 1fr; gap: var(--s3); } }

/* ---- 4. PLATES ---------------------------------------------------------
   ⛔ THIS SECTION'S PREMISE WAS "photography is one black separation
   multiplied onto the orange field," and that premise is retired. The field is
   gone; see grade.css §12 for the measurement that retired it. A plate is a
   box with a ground, a hairline, a caption and a number, and the image inside
   it is a photograph.

   Every plate still reserves its own height, so a sheet holds its layout
   whether or not a given image has landed.                                 */
/* Until an image has landed, the plate still has to behave like a plate. The
   box holds its own height from aspect-ratio, and the alt text sets small
   inside it and is clipped by it, so a file that has not landed yet never
   disturbs the sheet around it.
   ⛔ The color was --field-quiet — 90% black, mixed for legibility ON the
   orange field. With the field gone that is near-black type on a near-black
   sheet in dark mode, i.e. invisible. It is --quiet now, which is the token
   that flips. */
.plate img {
  overflow: hidden;
  font-family: var(--data); font-size: 9.5px; line-height: 1.6;
  letter-spacing: .05em; text-transform: uppercase; color: var(--quiet);
}

/* ⛔ THE GUTTER IS --black, NOT --strong. --strong flips to the stock on the
   dark sheet, and the twelve specimen plates ARE stock-ground, so a --strong
   gutter would have gone cream between cream cells and the register would have
   lost every one of its rules in dark mode. The gutter is one fixed ink in
   both sheets: on stock it is unchanged (--strong resolves to --black there
   anyway), on the dark sheet it reads as the sheet showing between plates. */
.pgrid {
  display: grid; grid-template-columns: repeat(6, minmax(0, 1fr));
  gap: 2px; background: var(--black); border: var(--w-rule) solid var(--black);
}
/* A plate whose separation has not been made yet still has to behave like a
   plate. The entry sets in mono in the bottom of the box.                  */
.plate[data-plate]::before {
  content: attr(data-plate);
  position: absolute; inset: 0; display: flex; align-items: flex-end;
  padding: 12px; font-family: var(--data); font-size: 9.5px; line-height: 1.55;
  letter-spacing: .12em; text-transform: uppercase; color: var(--quiet);
}
/* This rule used to read "when the photograph lands it multiplies down on top
   of it and covers it," and that is the one thing multiply cannot do: it only
   darkens, so the caption survived wherever the separation was light. With the
   twelve vial plates landed, every cell in the register carried PLATE 01 ·
   SERMORELIN stamped across the glass. A placeholder is for an empty box, so
   it is withdrawn the moment the box is not empty. The [data-plate] is
   repeated rather than dropped: :has() takes the specificity of its argument,
   so a bare .plate:has(img)::before scores below the rule above it and loses
   silently — measured, the caption stayed on screen with the override loaded
   and matching.                                                            */
.plate[data-plate]:has(img)::before { content: none; }
.plate img { position: relative; z-index: 1; }

.pcell { background: var(--ground); min-width: 0; display: flex; flex-direction: column; }
.pcell[hidden] { display: none; }
.pcell .plate { aspect-ratio: 4 / 5; }
.pcell__c {
  padding: 9px 11px 12px; border-top: var(--w-hair) solid var(--hair-soft);
  font-family: var(--data); font-size: 10px; letter-spacing: .1em;
  text-transform: uppercase; color: var(--quiet); line-height: 1.6;
}
.pcell__c b { display: block; font-family: var(--disp); font-weight: 700; font-size: 15px;
  letter-spacing: 0; color: var(--strong); line-height: 1.1; margin-bottom: 5px; }
.pcell a.pcell__c:hover { background: var(--ground-alt); }
.pcell a.pcell__c { display: block; }
@media (max-width: 1180px) { .pgrid { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
@media (max-width: 820px)  { .pgrid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 560px)  { .pgrid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* an editorial band of plates, run to the full measure of the sheet */
.band { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 2px;
        background: var(--strong); border-top: var(--w-bar) solid var(--strong);
        border-bottom: var(--w-bar) solid var(--strong); }
.band .plate { aspect-ratio: 5 / 4; }
.band--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.band--2 .plate { aspect-ratio: 16 / 10; }
@media (max-width: 760px) { .band, .band--2 { grid-template-columns: 1fr; } }

/* a single subject plate beside its reading column */
.figcol { display: grid; grid-template-columns: minmax(0, 1fr) 380px; gap: var(--gut); align-items: start; }
.figcol--l { grid-template-columns: 380px minmax(0, 1fr); }
@media (max-width: 900px) { .figcol, .figcol--l { grid-template-columns: 1fr; } }

/* ⛔ THE LAST RULE IN THIS BLOCK IS DELETED, NOT MOVED, AND IT MUST NOT COME
   BACK. It read:

       :root[data-theme="dark"] .plate--inv img { filter: invert(1) hue-rotate(180deg); }

   Two things were wrong with it. It keyed on [data-theme="dark"], which
   nothing on this site ever writes, so it had never once rendered — a rule
   that cannot fire is indistinguishable from a rule that is correct. And when
   it was finally made to fire and measured, it did not do what its comment
   claimed: the paper inverted cleanly to rgb(20,15,6) but the orange label
   spine came out rgb(255,164,126), a pale salmon within a few points of the
   banned #fa673e, and every attempt to pull it back removed the spine from the
   frame entirely. The full table is in grade.css §12.

   The class name .plate--inv stays because 27 elements carry it and removing
   it would move markup. It now marks a stock-ground specimen plate and carries
   no styling of its own; the exposure step that the dark sheet DOES apply is
   --plate-exposure, and it lives on .plate img in grade.css §12 so that every
   plate is treated the same way. */

/* ---- 5. TWO-COLUMN READING SETTING ------------------------------------- */
.two { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--gut); }
.three { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--gut); }
@media (max-width: 900px) { .two, .three { grid-template-columns: 1fr; } }

/* ---- 6. A NUMBERED REGISTER OF QUESTIONS ------------------------------- */
.qa { border-top: var(--w-rule) solid var(--strong); }
.qa__i {
  display: grid; grid-template-columns: 62px minmax(0, 1fr); gap: var(--s5);
  padding: var(--s5) 0; border-bottom: var(--w-hair) solid var(--hair-soft);
}
.qa__n { font-family: var(--data); font-size: 11px; font-weight: 600; letter-spacing: .06em;
         color: var(--field-deep); padding-top: 6px; }
.qa h3 { font-size: 20px; line-height: 1.08; margin-bottom: 9px; }
.qa p { font-size: 15.5px; margin-bottom: var(--s4); }
.qa p:last-child { margin-bottom: 0; }
@media (max-width: 640px) { .qa__i { grid-template-columns: 44px minmax(0, 1fr); gap: var(--s4); } }
/* Stacked, the answer holds its 64ch measure and leaves the right third of the
   sheet empty for fourteen rows running. Set the question against the answer
   instead: the row then spans the page without the prose exceeding its measure,
   and it reads the way the .step rows on the other sheets do. */
@media (min-width: 1000px) {
  .qa__i > div:last-child {
    display: grid; grid-template-columns: 340px minmax(0, 1fr);
    gap: var(--s4) var(--gut); align-items: start;
  }
  .qa__i > div:last-child > h3 { grid-column: 1; margin-bottom: 0; }
  .qa__i > div:last-child > p  { grid-column: 2; }
}

/* ---- 7. NUMBERED CLAUSES (privacy, terms) ------------------------------ */
.leg > section {
  display: grid; grid-template-columns: 92px minmax(0, 1fr); gap: var(--s5);
  padding: var(--s5) 0; border-bottom: var(--w-hair) solid var(--hair-soft);
}
.leg > section:first-child { border-top: var(--w-rule) solid var(--strong); }
.leg .cl { font-family: var(--data); font-size: 11px; font-weight: 600; letter-spacing: .06em;
           color: var(--field-deep); padding-top: 6px; }
.leg h2 { font-size: 21px; line-height: 1.06; margin-bottom: 10px; }
.leg p { font-size: 15.5px; }
.leg ul { margin: 0 0 var(--s5); padding-left: 1.1em; max-width: 66ch; }
.leg li { font-size: 15.5px; line-height: 1.55; padding: 3px 0; }
@media (max-width: 640px) { .leg > section { grid-template-columns: 60px minmax(0, 1fr); gap: var(--s4); } }
/* Same correction as the question register: a stacked clause leaves most of the
   sheet blank for ten clauses running. The heading sits against its clause. */
@media (min-width: 1000px) {
  .leg > section > div:last-child {
    display: grid; grid-template-columns: 300px minmax(0, 1fr);
    gap: var(--s4) var(--gut); align-items: start;
  }
  .leg > section > div:last-child > h2 { grid-column: 1; margin-bottom: 0; }
  .leg > section > div:last-child > :is(p, ul, ol, div, table) { grid-column: 2; }
}

/* ---- 8. FORMS ----------------------------------------------------------
   Labels sit above inputs. Validation is shown on the field. Submit stays
   disabled while a field is unresolved and says which one.                */
label.f > span .req { color: var(--field-deep); }
textarea.f {
  width: 100%; font-family: var(--data); font-size: 14px; letter-spacing: .02em;
  padding: 9px 10px; color: var(--strong); background: var(--ground);
  border: var(--w-rule) solid var(--strong); outline-offset: 2px;
  line-height: 1.55; resize: vertical; min-height: 132px;
}
textarea.f::placeholder { color: var(--quiet); opacity: 1; }
textarea.f:focus-visible { outline: 2px solid var(--field-deep); outline-offset: 2px; }
textarea.f[aria-invalid="true"] { border-color: var(--field-deep); outline: var(--w-rule) solid var(--field-deep); outline-offset: -3px; }
select.f[aria-invalid="true"] { border-color: var(--field-deep); outline: var(--w-rule) solid var(--field-deep); outline-offset: -3px; }
input[type="file"].f { padding: 8px 10px; font-size: 12.5px; }
input[type="date"].f { min-height: 38px; }

.fset { border: 0; padding: 0; margin: 0 0 var(--s7); min-width: 0; }
.fset > legend {
  display: flex; align-items: baseline; gap: var(--s4); width: 100%;
  border-bottom: var(--w-bar) solid var(--strong); padding: 0 0 var(--s2); margin-bottom: var(--s5);
}
.fset > legend .n { font-family: var(--data); font-size: 12px; font-weight: 600;
                    letter-spacing: .06em; color: var(--field-deep); }
.fset > legend .t { font-family: var(--disp); font-weight: 700; text-transform: uppercase;
                    font-size: 26px; letter-spacing: -.008em; color: var(--strong); line-height: 1; }
.fset > legend .meta { margin-left: auto; font-family: var(--data); font-size: 10.5px;
                       letter-spacing: .12em; text-transform: uppercase; color: var(--quiet); }
@media (max-width: 620px) { .fset > legend { flex-wrap: wrap; } .fset > legend .meta { margin-left: 0; width: 100%; } }

.fg3 { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--s4) var(--s5); }
.fg3 .span2 { grid-column: span 2; }
.fg3 .span3 { grid-column: 1 / -1; }
@media (max-width: 820px) {
  .fg3 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .fg3 .span2, .fg3 .span3 { grid-column: 1 / -1; }
}
@media (max-width: 560px) { .fg3 { grid-template-columns: 1fr; } }
/* The system stylesheet styles input.f and select.f. A message field and a
   file field are neither, so they are brought onto the same footing here. */
textarea.f {
  width: 100%; font-family: var(--data); font-size: 14px; letter-spacing: .02em;
  line-height: 1.6; padding: 9px 10px; color: var(--strong); background: var(--ground);
  border: var(--w-rule) solid var(--strong); outline-offset: 2px;
  min-height: 168px; resize: vertical; display: block;
}
textarea.f::placeholder { color: var(--quiet); opacity: 1; }
textarea.f:focus-visible { outline: 2px solid var(--field-deep); outline-offset: 2px; }
input[type="file"].f { padding: 8px 10px; font-size: 12.5px; }
input[type="file"].f::file-selector-button {
  font-family: var(--data); font-size: 10.5px; letter-spacing: .11em; text-transform: uppercase;
  background: var(--strong); color: var(--ground); border: 0; padding: 6px 11px;
  margin-right: 11px; cursor: pointer;
}
label.f > span .req { color: var(--field-deep); }
label.f > span .opt { color: var(--quiet); }
input.f[aria-invalid="true"], select.f[aria-invalid="true"], textarea.f[aria-invalid="true"] {
  /* a doubled rule, drawn inside the box so nothing shifts. No shadow: the ink
     law allows none, and an outline is a rule rather than a glow. */
  border-color: var(--field-deep); outline: var(--w-rule) solid var(--field-deep); outline-offset: -3px;
}
/* The form runs full width and lets each fieldset own its own grid. The
   system's .fgrid splits into two columns, which halves every field on a
   twenty three field sheet. */
.gform { min-width: 0; }
.gform > * { min-width: 0; }

/* A disabled submit still has to be readable: it is the control the reason
   line underneath is talking about. The system's opacity of .42 takes the
   label under 2:1 against its own ground. */
.btn[disabled], .btn[disabled]:hover {
  opacity: 1; background: transparent; color: var(--quiet);
  border-color: var(--hair); cursor: not-allowed;
}

.fgrid { min-width: 0; }
.fgrid > * { min-width: 0; }

/* the honeypot. Present in the DOM, off the sheet, out of the tab order. */
.hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }

/* attestations: six separate affirmations, each stored with its own wording */
.att { border-top: var(--w-rule) solid var(--strong); }
.att__i {
  display: grid; grid-template-columns: 34px 16px minmax(0, 1fr); gap: 12px;
  align-items: start; padding: 14px 0; cursor: pointer;
  border-bottom: var(--w-hair) solid var(--hair-soft);
  transition: background 110ms linear;
}
.att__i:hover { background: var(--ground-alt); }
.att__i .n { font-family: var(--data); font-size: 11px; font-weight: 600; letter-spacing: .06em;
             color: var(--field-deep); padding-top: 3px; }
.att__i input { width: 16px; height: 16px; margin: 3px 0 0; accent-color: var(--orange);
                border: var(--w-rule) solid var(--strong); flex: none; }
.att__i input:focus-visible { outline: 2px solid var(--field-deep); outline-offset: 2px; }
.att__i .w { font-size: 15px; line-height: 1.5; color: var(--body); }
.att__i[data-invalid="true"] { background: var(--wash-12); }
@media (max-width: 560px) { .att__i { grid-template-columns: 26px 16px minmax(0, 1fr); gap: 9px; } }

/* the typed signature is the signature */
.sig { border: var(--w-rule) solid var(--strong); }
.sig__h { background: var(--strong); color: var(--ground); font-family: var(--data);
          font-size: 10.5px; letter-spacing: .14em; text-transform: uppercase; padding: 9px 16px; }
.sig__b { padding: var(--s5) 16px 16px; }
.sig__line { border-bottom: var(--w-bar) solid var(--strong); }
input.f.sig__in { border: 0; border-bottom: 0; font-family: var(--text); font-size: 26px;
                  letter-spacing: .01em; padding: 6px 0 8px; background: transparent; }
input.f.sig__in::placeholder { font-size: 17px; letter-spacing: .02em; }

/* the Turnstile mount. The box is drawn so the sheet holds its height
   whether or not the widget has been keyed yet. */
.turnstile-mount {
  border: var(--w-hair) dashed var(--hair); min-height: 68px;
  display: flex; align-items: center; padding: 0 16px;
  font-family: var(--data); font-size: 10.5px; letter-spacing: .12em;
  text-transform: uppercase; color: var(--quiet);
}
.turnstile-mount:not(:empty) { border-style: none; padding: 0; }

/* submit block: the button and the one line that says what is unresolved */
.subm { border-top: var(--w-bar) solid var(--strong); padding-top: var(--s5); margin-top: var(--s7);
        display: flex; align-items: center; gap: var(--s5); flex-wrap: wrap; }
.subm .btn { flex: none; }
.subm__why { font-family: var(--data); font-size: 11px; letter-spacing: .1em;
             text-transform: uppercase; color: var(--field-deep); line-height: 1.6; min-width: 0; }
.subm__why[data-ok="true"] { color: var(--quiet); }

/* ---- 9. FORM RESULT STATES --------------------------------------------- */
.state { border: var(--w-bar) solid var(--strong); }
.state__h { background: var(--strong); color: var(--ground); padding: 11px 18px;
            font-family: var(--data); font-size: 10.5px; letter-spacing: .14em;
            text-transform: uppercase; display: flex; justify-content: space-between;
            gap: var(--s4); flex-wrap: wrap; }
.state__b { padding: var(--s6) 18px var(--s6); }
.state__b h2 { font-size: 30px; margin-bottom: var(--s4); }
.state__b p { font-size: 16px; }
.state[hidden] { display: none; }

/* ---- 10. A KEY / VALUE CONTACT BLOCK ----------------------------------- */
.kv { border-top: var(--w-rule) solid var(--strong); }
.kv__r { display: grid; grid-template-columns: 168px minmax(0, 1fr); gap: var(--s5);
         padding: 11px 0; border-bottom: var(--w-hair) solid var(--hair-soft); }
.kv__k { font-family: var(--data); font-size: 10.5px; letter-spacing: .13em;
         text-transform: uppercase; color: var(--quiet); padding-top: 4px; }
.kv__v { font-size: 15.5px; line-height: 1.45; min-width: 0; }
.kv__v a { border-bottom: var(--w-hair) solid var(--hair); }
.kv__v a:hover { color: var(--field-deep); border-bottom-color: var(--field-deep); }
@media (max-width: 640px) { .kv__r { grid-template-columns: 1fr; gap: 2px; } }

/* ---- 11. THE 404 SHEET -------------------------------------------------- */
.nf { padding: var(--s9) 0 var(--s8); }
.nf__n { font-family: var(--disp); font-weight: 700; line-height: .82;
         font-size: clamp(96px, 26vw, 300px); letter-spacing: -.04em; color: var(--black); }

/* ---- 11b. THE SPECIFICATION SHEET --------------------------------------
   Lifted from the approved press-product.html, which carried these rules in a
   page-local <style> block rather than in the system stylesheets. Two sheets
   use them now, so they live here. The reference's .price rule is deliberately
   NOT carried across: no price appears anywhere on this site.              */
.prod { padding: var(--s6) 0; }
.crumb { font-family: var(--data); font-size: 11px; letter-spacing: .13em;
         text-transform: uppercase; }
.crumb a { color: inherit; text-decoration: none; border-bottom: 1px solid currentColor; }
.seq { font-family: var(--data); font-size: clamp(12px, 1.5vw, 15px); line-height: 2.05;
       letter-spacing: .18em; word-break: break-all; color: var(--black);
       border-top: var(--w-hair) solid var(--field-hair);
       border-bottom: var(--w-hair) solid var(--field-hair);
       padding: 12px 0; margin-top: var(--s5); }
.seq b { font-weight: 600; }
.prodgrid { display: grid; grid-template-columns: minmax(0, 1fr) 340px; gap: var(--gut);
            align-items: start; }
.sticky { position: sticky; top: 74px; }
.ordbox { border: var(--w-rule) solid var(--strong); }
.ordbox__h { background: var(--strong); color: var(--ground); font-family: var(--data);
             font-size: 10.5px; letter-spacing: .14em; text-transform: uppercase;
             padding: 9px 16px; }
.ordbox__b { padding: var(--s5) 16px 16px; }
.ordbox__b p { font-size: 14.5px; }
@media (max-width: 1000px) { .prodgrid { grid-template-columns: 1fr; } .sticky { position: static; } }

/* ---- 12. UTILITIES ------------------------------------------------------ */
.mt5 { margin-top: var(--s5); }
.mt4 { margin-top: var(--s4); }
.mt9 { margin-top: var(--s9); }
.wide { max-width: none; }
.measure { max-width: 66ch; }
.b-top { border-top: var(--w-bar) solid var(--strong); }
.stack-tight > * + * { margin-top: var(--s4); }
.colo__ix { columns: 2; column-gap: var(--gut); }
@media (max-width: 560px) { .colo__ix { columns: 1; } }

/* ---- 13. SECTION HEADER AIR --------------------------------------------
   The system puts a section's top spacing on .sec, which wraps only the home
   sheet's sections. Every other sheet sets its headers directly in the column,
   so a rule was landing flush against the table or panel above it. */
.sec > * + .sechead, .wrap > * + .sechead, main > * + .sechead { margin-top: var(--s8); }

/* ---- 14. THE ID BLOCK ON THE FIELD --------------------------------------
   .spec__k is set in --quiet, which is a screen of black tuned for the stock
   ground. On the orange field it measures 1.51:1 and the labels disappear.
   --field-quiet is the same role re-tuned for the field (4.58:1). */
.field .spec__k, .on-field .spec__k { color: var(--field-quiet); }

/* A block that scrolls has to be reachable from the keyboard, or its right hand
   columns are unreadable without a mouse. tabindex makes the wrapper focusable;
   this is the ring that says so. No gradient cue: the ink law allows none. */
.tblwrap:focus-visible { outline: var(--w-bar) solid var(--field-deep); outline-offset: 3px; }

/* A result panel is scrolled to as soon as it is drawn, and the running head is
   sticky, so without this the first line lands underneath it. */
.state { scroll-margin-top: 92px; }


/* =========================================================================
   15. THE SITE ENTRY GATE — moved to 00_SYSTEM/gate.css
   It is imported by grade.css so that it reaches the portal pages too, which
   do not link this sheet. Do not re-add gate rules here: a rule here covers
   14 pages, a rule there covers all 24.
   ========================================================================= */
