/* ============================================================================
   TETHER — "MACHINED" for the WEB.

   The trademark look, ported from the phone app so the website and the product
   are visibly the same object. Three sources, and where they disagree the first
   one wins:

     1. Desktop/tetherdesign/app/proto/tether.css .... the material recipes
     2. Desktop/tetherdesign/app/MACHINED_SPEC.md .... the locked rules
     3. tether/phone/lib/theme_machined.dart ......... the shipped app's values

   WHAT IS COPIED VERBATIM, and must stay that way: every colour token, the
   brushed-metal gradient stack, the grain filter, the button bevels, the
   readout window, the lamp shapes, and the wordmark recipe. Those are not
   taste — they are the agreed design, and a website that re-eyeballs them is a
   second design wearing the first one's name.

   WHAT IS NEW HERE, and why it had to be: a phone screen is 412px wide, fixed,
   and never scrolls. A web page is 390px to 1440px+ and always scrolls. So this
   file ADDS a display type scale above the phone's 21px ceiling, a page shell,
   a nav, a footer, and the panel/chip/field components a marketing page needs
   and a phone app never had. Each addition is built from the SAME materials —
   nothing new was invented at the material level.

   NAMESPACE: every class is `mch-`. The live site has its own stylesheet; this
   one has to be droppable beside it without a single collision. The custom
   properties are `--mch-*` for the same reason.

   ORDER MATTERS: materials are declared before components, because components
   layer on top of them and several rely on losing a specificity tie.
   ========================================================================= */

/* ---------------------------------------------------------------------------
   0. FONTS — self-hosted, exactly two families.

   NO CDN, DELIBERATELY. The prototype opens with an @import from
   fonts.googleapis.com; that is fine for a design file on a laptop and wrong
   for this product's website. The privacy policy promises no trackers, and a
   webfont request hands the visitor's IP and user-agent to a third party
   before a single word is read. Same reasoning, same pattern, as
   assets/fonts/fonts.css, which is already self-hosted for exactly this.

   BOTH ARE VARIABLE FONTS — one file per family carrying a continuous weight
   axis, so 100..900 costs one request instead of five. They are the SAME FILES
   the phone app ships (phone/assets/fonts/*.ttf, converted to woff2), so the
   two products can never drift onto two different cuts of Archivo.

   AXIS RANGES ARE MEASURED, not assumed — read from each file's `fvar` table:
       Archivo ......  wght 100..900 (default 600), wdth  62..125   (default 100)
       Martian Mono .. wght 100..800 (default 400), wdth  75..112.5 (default 112.5)

   THE `font-stretch` DESCRIPTORS ARE LOAD-BEARING, NOT DECORATION. A variable
   font's `wdth` axis is driven by `font-stretch`, and an element that never
   sets one computes to `normal` = 100%. For Archivo that IS its default, so
   nothing moves. For Martian Mono the font's own default is 112.5% — so
   leaving it alone would silently render the web's mono NARROWER than the
   phone's, on every engraved label in the product. `.mch-mono` pins it back to
   112.5%. See section 3.

   LICENCE: both faces are SIL OFL 1.1 and the licence travels with them in
   fonts/OFL.txt, which carries BOTH copyright lines (Archivo Project Authors;
   Martian Mono Project Authors) as the OFL requires. Adding a third face means
   adding its copyright line to that file in the same edit.
   ------------------------------------------------------------------------ */
@font-face{
  font-family:'Archivo';
  src:url('fonts/archivo-var.woff2') format('woff2-variations'),
      url('fonts/archivo-var.woff2') format('woff2');
  font-weight:100 900;
  font-stretch:62% 125%;
  font-style:normal;
  font-display:swap;
}
@font-face{
  font-family:'Martian Mono';
  src:url('fonts/martian-mono-var.woff2') format('woff2-variations'),
      url('fonts/martian-mono-var.woff2') format('woff2');
  font-weight:100 800;
  font-stretch:75% 112.5%;
  font-style:normal;
  font-display:swap;
}

/* ---------------------------------------------------------------------------
   1. TOKENS — every colour has a ROLE. Nothing here is arbitrary.
   Values are the prototype's, verbatim. Do not "tidy" one into a near-neighbour.
   ------------------------------------------------------------------------ */
:root{
  /* ── METAL SURFACES — the body of the instrument ─────────────────────── */
  --mch-void:#0f1012;          /* behind everything; the unlit shell */
  --mch-metal-1:#3b3f47;
  --mch-metal-2:#34383f;
  --mch-metal-3:#2d3138;
  --mch-metal-4:#282c33;
  --mch-deck-1:#40454d;        /* the raised control deck */
  --mch-deck-2:#363a42;
  --mch-deck-3:#2e323a;
  --mch-body-1:#43464c;        /* phone-body metal, for device chrome */
  --mch-body-2:#232529;
  --mch-body-3:#16171a;
  --mch-ground:#26292f;        /* faceplate ground — the page background */
  --mch-stage-1:#35383e;       /* the stage a picture or hero element sits on */
  --mch-stage-2:#24262b;
  --mch-stage-3:#17181c;
  --mch-stage-4:#101114;

  /* ── MACHINED EDGES — a milled edge catches light on top, shade under ── */
  --mch-edge:#c7cbd0;
  --mch-etch:#e7ebef;
  --mch-edge-hi:rgba(233,238,242,.34);    /* the crisp top-edge highlight */
  --mch-edge-soft:rgba(199,203,208,.22);  /* hairlines, rules, faint chamfers */
  --mch-shade:rgba(0,0,0,.42);            /* the shadow under any raised lip */

  /* ── TEXT — one cool near-white, hierarchy by OPACITY only ────────────
     Never introduce a new hue for text. These four alphas are MEASURED against
     a 4.5:1 floor on the surfaces they actually sit on; the prototype raised
     --t3 from .46 after a review found facts printed at 3.9:1. --t1/--t2/--t3
     are the three inks a FACT may use. --t4 is for dead controls only and is
     deliberately below the floor: a control that is off is allowed to look off,
     and it may never carry a fact. */
  --mch-t1:rgba(238,242,245,.92);
  --mch-t2:rgba(231,235,239,.80);
  --mch-t3:rgba(231,235,239,.72);
  --mch-t4:rgba(231,235,239,.30);

  /* The pilot lamp's WORD has its own ink, and this is why it is not --t2.
     It is the second carrier of a state otherwise told in colour, so a
     colour-blind reader has nothing else. Measured at .78 on the three metals
     a lamp sits on: 10.5:1 / 8.2:1 / 6.5:1. The floor case is the brightest
     surface and still clears 4.5:1 with 45% to spare. */
  --mch-lamp-word:rgba(238,242,245,.78);

  /* ── THE ONE GREEN, AND THE CLOSED LIST OF PLACES IT MAY APPEAR ────────
     Green means ONE thing: a real, current, end-to-end link, right now. Not
     focus. Not hover. Not selection. Not readiness. Not progress. Not "this
     section is about connecting". Amber is the warning colour and is the only
     other hue in the system.

     THE LIST IS CLOSED. On the web it is four:

       .mch-lamp.is-live ........ the pilot lamp when a link is up
       .mch-channel--live ....... a readout window reporting a live line
       .mch-channel--live .mch-slot,
       .mch-slot--live .......... the characters inside that window
       .mch-dot ................. the pilot pip beside a live label

     Adding a fifth is a change to THIS list, made in THIS comment, in the same
     edit. That is enforceable because every one of them is an OPT-IN class
     setting custom properties on a material that is hueless by default: there
     is no green in any base component, so a page cannot inherit green by
     accident — it has to type one of those names, and typing one is a claim
     that the link is up.

     Audit it in one command, from this directory:
         grep -nE "green|57a07c|8fd6a8|2c5642|120,220,170|150,220,185|133,214,170|214,238,226" machined.css
     Every hit must be a token declaration in this block, one of the rules
     above, or prose explaining this law. Anything else is the defect. */
  --mch-green:#57a07c;
  --mch-green-bright:#8fd6a8;   /* glow highlight only, never neon */
  --mch-green-deep:#2c5642;

  /* Backlit readout — the lit characters inside a dark-glass window. */
  --mch-readout:#eaf1f4;
  --mch-readout-dim:#8b968f;

  /* Transient fault ONLY (a warning that will clear). Never decoration. */
  --mch-amber:#c69a55;
  /* Destructive LABEL only, never a fill — keeps "one accent" intact. */
  --mch-red:#c1705c;

  /* ── TYPE — exactly two families. Nothing else may be introduced. ────── */
  --mch-f-ui:'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
  --mch-f-mono:'Martian Mono', ui-monospace, 'SF Mono', Menlo, monospace;

  /* TYPE SCALE.
     The four sizes at the bottom are the phone's, verbatim, because they are
     read at the same distance on any device and the product has a 14px floor
     that is written down as never-below.

     The three at the top are NEW and are the honest part of this port: the
     phone's largest heading is 21px, which is a caption on a 1440px page. A
     website needs display type, so it gets its own steps — built on the same
     clamp() idiom so a 390px phone and a 1440px desktop are one continuous
     scale rather than two designs joined by a breakpoint. */
  --mch-fs-display:clamp(38px, 6.4vw, 76px);   /* the one hero line per page */
  --mch-fs-h1:clamp(27px, 3.6vw, 44px);        /* section heading */
  --mch-fs-h2:clamp(19px, 1.7vw, 24px);        /* sub-section title */
  --mch-fs-h3:17px;                            /* card title */
  --mch-fs-lead:clamp(16px, 1.25vw, 19px);     /* the sentence under a heading */
  --mch-fs-body:15px;                          /* body — never below 14px */
  --mch-fs-sub:14px;                           /* supporting line */
  /* THE READING SIZE, AND IT IS NOT --mch-fs-body. A UI label is SCANNED: the
     eye lands on it, takes one word, and leaves, so 15px is generous. A terms
     page is READ, line after line, for two thousand words, and at that length
     15/1.55 is measurably harder work — the line is too tight and the letters
     too small to fall into. The legal pages already ran at 17/1.72 before this
     port, so taking them to the UI body size would have been a legibility
     REGRESSION shipped under the word "restyle". Used only by .mch-prose. */
  --mch-fs-prose:17px;
  --mch-lh-prose:1.7;
  --mch-fs-btn:clamp(14px, 1.05vw, 15px);      /* button label, tracked caps */
  --mch-fs-readout:clamp(21px, 2.6vw, 34px);   /* lit characters */
  --mch-fs-micro:11.5px;                       /* engraved micro-label */
  --mch-fs-nano:11px;                          /* pilot-lamp label — A FLOOR,
                                                  NOT A SIZE. It is the only
                                                  reading of machine state a
                                                  colour-blind visitor gets, so
                                                  it never scales down. */
  --mch-wordmark:clamp(20px, 1.7vw, 26px);     /* scaled per use; recipe LOCKED */

  /* ── SPACING — a 4px rhythm, so nothing is eyeballed ─────────────────── */
  --mch-s1:4px;   --mch-s2:8px;   --mch-s3:12px;  --mch-s4:16px;  --mch-s5:20px;
  --mch-s6:24px;  --mch-s7:32px;  --mch-s8:40px;  --mch-s9:48px;  --mch-s10:64px;
  /* Two web-only steps. A page has section rhythm; a phone screen does not. */
  --mch-s11:96px; --mch-s12:128px;

  /* Page gutter and content measure. The phone's 6.8vw gutter is right for a
     412px screen and absurd at 1440 (98px of air before a word), so the web
     gutter is a clamp with a real ceiling and the CONTENT gets a max-width. */
  --mch-gutter:clamp(20px, 4vw, 48px);
  --mch-measure:1200px;         /* the widest a content column ever runs */
  --mch-measure-narrow:760px;   /* prose: a readable line, never 1200px of it */

  /* ── RADII — milled corners, consistent across every surface ─────────── */
  --mch-r1:6px; --mch-r2:10px; --mch-r3:14px; --mch-r4:18px;
  --mch-r-deck:26px; --mch-r-pill:999px;

  /* ── MOTION — the design's timings ──────────────────────────────────── */
  --mch-spring:cubic-bezier(.16,.84,.3,1);  /* fast start, settles, no overshoot */
  --mch-press:.09s;                          /* 2px of travel under a thumb */
  --mch-ink:.16s;                            /* a label's colour crossfade */

  /* ── SURFACE TUNING — the two knobs the web needs and the phone did not ─
     A phone surface is 412px wide. A web panel can be 1200. These expose the
     brush and the grain so a very large surface can hold the same APPARENT
     texture density as a small one; see the wide-viewport block in section 9,
     which is the only place they are retuned. */
  --mch-brush-alpha:.014;   /* the fine vertical streak's hairline */
  --mch-brush-period:11px;  /* its repeat */
  --mch-grain-opacity:.42;

  /* Minimum physical target. A control you can SEE at 40px and can only HIT at
     48px is a lie told to the eye — so the metal IS the target. */
  --mch-tap:48px;
}

/* ---------------------------------------------------------------------------
   2. BASE — a web page, not an app shell.

   DELIBERATELY MUCH LIGHTER THAN THE PROTOTYPE'S RESET. The phone file sets
   `user-select:none`, `overscroll-behavior:none` and `position:fixed` on the
   screen, because it is an app and text selection there is an accident. On a
   website, killing selection breaks copy-paste of a licence key, a price or an
   address, and killing overscroll breaks the scroll the whole page depends on.
   Porting that reset verbatim would have been the easy move and a real defect.
   ------------------------------------------------------------------------ */
.mch{
  background-color:var(--mch-ground);
  color:var(--mch-t1);
  font-family:var(--mch-f-ui);
  font-size:var(--mch-fs-body);
  line-height:1.5;
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
  text-rendering:optimizeLegibility;
  -webkit-tap-highlight-color:transparent;
}
.mch *,.mch *::before,.mch *::after{box-sizing:border-box}
.mch h1,.mch h2,.mch h3,.mch h4,.mch p,.mch figure,.mch blockquote{margin:0}
.mch ul,.mch ol{margin:0;padding:0;list-style:none}
.mch img,.mch svg{display:block;max-width:100%}
.mch button,.mch input,.mch textarea,.mch select{font:inherit;color:inherit}
.mch button{background:none;border:0;cursor:pointer}
/* THE ANCHOR RESET IS WRAPPED IN :where() SO IT CANNOT OUTRANK A COMPONENT.

   Written as `.mch a` it scores (0,1,1) — one class plus one type — while every
   link component in this file is a single class at (0,1,0). The reset therefore
   beat all of them, silently. Read back off a rendered page with
   getComputedStyle, before this change:

       .mch-nav__link ..... designed --t2 (.62) .... rendered --t1 (.92)
       .mch-footer__link .. designed --t2 (.62) .... rendered --t1 (.92)

   Both were pinned at full ink, so their `:hover{color:var(--mch-t1)}` rules
   could not brighten anything and were dead code on every page — the nav and
   the footer had no hover feedback at all. The same trap caught .mch-link,
   which is documented at length in section 7B.

   :where() has zero specificity, so this becomes (0,0,1): a bare type selector.
   It still only touches anchors inside .mch, and it still beats the browser's
   blue-and-underlined default, because an author rule outranks the UA sheet
   whatever its specificity. What changes is that a component no longer has to
   know this line exists in order to style a link. Fixed here once rather than
   per component, so the next link component added does not ship broken. */
:where(.mch) a{color:inherit;text-decoration:none}

/* FOCUS RING — a milled double-ring, deliberately HUELESS.
   It is an `outline`, and that is load-bearing: components in this file set
   box-shadow for their material, and a focus ring drawn as box-shadow loses
   the specificity fight and never paints. The prototype shipped exactly that
   bug once — an invisible focus ring on dark metal, a WCAG 2.4.11 failure,
   under a comment claiming it was unmistakable. Green is not used here either:
   green means a live link, not "where is my keyboard". */
.mch :focus-visible{
  outline:2px solid rgba(216,222,228,.88);
  outline-offset:3px;
  border-radius:4px;
}
.mch ::selection{background:rgba(199,203,208,.26)}

/* Skip link — invisible until tabbed to, then a real milled plate.

   IT IS CLIPPED, NOT PARKED AT left:-9999px. The old trick puts a real 189px
   box in the layout at a huge negative offset, which some engines count toward
   the scrollable area; measured here it was one of five elements reported
   outside the viewport at 390px. Clipping to a 1px box removes it from the
   layout's extents entirely while keeping it focusable and readable by a
   screen reader, which -9999px was only ever an approximation of. */
.mch-skip{
  position:absolute;top:0;left:0;z-index:100;
  width:1px;height:1px;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap;
  padding:var(--mch-s3) var(--mch-s5);border-radius:0 0 var(--mch-r2) 0;
  background-image:linear-gradient(180deg,#44484f,#303339);
  box-shadow:inset 0 1.5px 0 var(--mch-edge-hi),0 4px 12px -4px rgba(0,0,0,.6);
  font-family:var(--mch-f-mono);font-stretch:112.5%;font-size:var(--mch-fs-micro);
  letter-spacing:1.9px;text-transform:uppercase;color:var(--mch-t1);
}
.mch-skip:focus{width:auto;height:auto;overflow:visible;clip-path:none}

/* ---------------------------------------------------------------------------
   3. TYPE — the two faces, and the locked wordmark.
   ------------------------------------------------------------------------ */

/* GRAYSCALE ANTIALIASING FOR DISPLAY-SIZED TYPE — a Windows correction.

   THE PROBLEM. `-webkit-font-smoothing:antialiased` is a macOS-only property.
   Chrome on Windows renders through DirectWrite and ignores it, so that line
   does nothing at all for most of this product's visitors — Tether is a
   Windows PC app, so the platform where it has no effect is the platform
   nearly everyone reads this page on. Screenshotted at device scale, every
   letter of the 42px wordmark carried a cyan left edge and an orange right
   edge: LCD subpixel antialiasing, which on a large heavy weight over brushed
   metal reads as a printing misregistration — on the one element the owner has
   LOCKED.

   THE FIX IS `opacity`, AND THE OBVIOUS CANDIDATE DOES NOT WORK HERE. The
   usual remedy is `transform:translateZ(0)`, which promotes the text to its
   own layer and forces grayscale. It was tried first and it FAILED silently,
   because `transform` does not apply to non-replaced INLINE elements and every
   one of these classes is used on a `<span>` somewhere. The first test looked
   like it passed only because the specimens were flex children, and a flex
   child is blockified — so the test was measuring a situation the product does
   not have. Re-run with genuine inline spans in normal flow and compared at
   device scale: inline + translateZ still fringed, plain inline (the control)
   fringed, `inline-block` + translateZ was clean, and `opacity:.999` was clean.
       `opacity` is chosen over forcing `display:inline-block` because it works
   whatever the element's display is and changes no layout. A 0.1% alpha step
   is below one 8-bit quantisation level, so nothing dims. Note that computed
   style CANNOT be used to check this: Chrome reports `translateZ(0)` as the 2D
   identity `matrix(1,0,0,1,0,0)` whether it applied or not. Judge it by
   rendering, never by `getComputedStyle`.

   IT IS DELIBERATELY NOT APPLIED PAGE-WIDE. Subpixel antialiasing HELPS at
   reading sizes; stripping it from 14-15px body copy would trade a real
   legibility gain for a fringe nobody can see at that size. It belongs only on
   type big enough for the fringe to be visible. */
.mch-wordmark,.mch-display,.mch-h1,.mch-h2,.mch-price__num,.mch-slot{
  opacity:.999;
}

/* THE WORDMARK — LOCKED by the spec and by the owner (2026-07-25). Near-black
   letters pressed INTO the metal: light catches the lower lip of the groove,
   shadow sits on the upper. Scale it with --mch-wordmark; never restyle the
   family, weight, tracking, colour or engrave.

   It asks for the family through --mch-f-ui rather than naming 'Archivo'
   directly, so the product's NAME is the one element that still has a fallback
   on the day the webfont fails to load. */
.mch-wordmark{
  font-family:var(--mch-f-ui);font-weight:800;
  font-size:var(--mch-wordmark);letter-spacing:7px;text-transform:uppercase;
  color:#1a1c20;line-height:1;
  text-shadow:0 1.5px 0 rgba(255,255,255,.16), 0 -1px 1px rgba(0,0,0,.4);
}
/* Trailing letter-spacing shifts a centred wordmark right by one 7px step.
   Cancel it on the LEFT — padding the right doubles the error. */
.mch-wordmark--center{margin-right:-7px}

/* A wordmark on DARK stage metal cannot be near-black — engraving needs a
   surface bright enough to cut into. On the stage the letters are the light
   and the groove is the shadow: the same physical idea, inverted. */
.mch-wordmark--light{
  color:rgba(238,242,245,.94);
  text-shadow:0 1px 0 rgba(0,0,0,.55), 0 -1px 0 rgba(255,255,255,.10);
}

/* THE DISPLAY LINE — one per page. Archivo 700, tight, slightly negative
   tracking because at 76px the phone's +0.2 reads as a gap. */
.mch-display{
  font-family:var(--mch-f-ui);font-weight:700;
  font-size:var(--mch-fs-display);line-height:1.02;letter-spacing:-.02em;
  color:var(--mch-t1);
  text-wrap:balance;
}
.mch-h1{
  font-family:var(--mch-f-ui);font-weight:600;
  font-size:var(--mch-fs-h1);line-height:1.12;letter-spacing:-.01em;
  color:var(--mch-t1);text-wrap:balance;
}
.mch-h2{
  font-family:var(--mch-f-ui);font-weight:600;
  font-size:var(--mch-fs-h2);line-height:1.25;letter-spacing:.2px;
  color:var(--mch-t1);
}
.mch-h3{
  font-family:var(--mch-f-ui);font-weight:600;
  font-size:var(--mch-fs-h3);line-height:1.3;color:var(--mch-t1);
}
/* The sentence under a heading. Wider line-height than body: it is the one
   paragraph a visitor actually reads before deciding. */
.mch-lead{
  font-family:var(--mch-f-ui);font-weight:400;
  font-size:var(--mch-fs-lead);line-height:1.55;color:var(--mch-t2);
  max-width:var(--mch-measure-narrow);text-wrap:pretty;
}
.mch-body{font-size:var(--mch-fs-body);line-height:1.55;color:var(--mch-t2)}
.mch-sub{font-size:var(--mch-fs-sub);line-height:1.45;color:var(--mch-t3)}

/* THE MONO FACE. font-stretch is pinned to the font's own default width
   (112.5%) — see the note in section 0. Without it every engraved label on the
   website renders narrower than the same label in the app. */
.mch-mono{font-family:var(--mch-f-mono);font-stretch:112.5%}

/* ENGRAVED MICRO-LABEL — stamped into the faceplate; names a thing without
   ever competing with it. Tracked caps, mono, with a 1px dark drop that reads
   as the groove's shadow. */
.mch-micro{
  font-family:var(--mch-f-mono);font-stretch:112.5%;font-weight:400;
  font-size:var(--mch-fs-micro);letter-spacing:1.9px;text-transform:uppercase;
  color:var(--mch-t2);text-shadow:0 1px 0 rgba(0,0,0,.35);
}
.mch-micro--dim{color:var(--mch-t3)}
/* The model line under a wordmark. Same engraving, wider tracking. */
.mch-submark{
  font-family:var(--mch-f-mono);font-stretch:112.5%;font-weight:400;
  font-size:var(--mch-fs-micro);letter-spacing:2.2px;text-transform:uppercase;
  color:var(--mch-t2);text-shadow:0 1px 0 rgba(0,0,0,.35);
}

/* MICRO-SIZED PROSE, IN THE UI FACE — the small print that is a SENTENCE
   rather than a stamped label. A LABEL is engraved; a SENTENCE is set. The app
   learned this the expensive way: a two-line caution rendered in the mono face
   became a nine-line wall of typewriter text. No tracking either — tracking is
   what makes an engraved label read as engraved, and what makes a sentence
   read as a ransom note. */
.mch-fine{
  font-family:var(--mch-f-ui);font-weight:400;
  font-size:var(--mch-fs-micro);line-height:1.45;letter-spacing:0;
  color:var(--mch-t3);
}

/* ENGRAVED HAIRLINE — a groove with a lit lower lip, not a grey 1px line. */
.mch-rule{
  height:1px;width:100%;flex:1 1 auto;min-width:0;border:0;
  background:linear-gradient(90deg, transparent, rgba(0,0,0,.45) 12%, rgba(0,0,0,.45) 88%, transparent);
  box-shadow:0 1px 0 rgba(233,238,242,.06);
}

/* A SPEC RAIL — micro-label, groove, micro-label. The pattern that carries a
   fact across a surface without spending a headline on it. */
/* IT WRAPS, AND THAT IS NOT A MEDIA QUERY. Measured at a 375px viewport: the
   rail had 302.8px and its two labels alone needed 326.3px, with the groove
   already collapsed to 0 — so there was no slack left to find. The three ways
   out were shrink the type (§9 forbids it at the small end, on purpose),
   truncate a label (a clipped label is a different label — the same argument
   §9 makes about digits), or let the second label drop to its own line. Only
   the third keeps both labels whole.

   Keyed to the CONTAINER, not the viewport, because a rail inside a narrow
   plate or a two-column grid runs out of room at 1440px just as easily as at
   390px; a max-width media query would fix the phone and leave that broken.
   The groove is flex:1 1 auto with min-width:0, so it takes the slack on line
   one and the label below sits clear of it. */
.mch-rail{display:flex;align-items:center;flex-wrap:wrap;gap:var(--mch-s2) var(--mch-s3);width:100%}
.mch-rail > .mch-micro{flex:none;white-space:nowrap}
/* THE GROOVE'S BASIS MUST BE 0 INSIDE A RAIL, AND ENABLING THE WRAP ABOVE IS
   WHAT MADE THAT MANDATORY. .mch-rule is `width:100%; flex:1 1 auto` so it can
   also be used alone as a plain divider — but `auto` basis resolves to that
   100%, and the moment the rail was allowed to wrap the groove began demanding
   a full line of its own and pushing the trailing label onto a THIRD line.
   Measured right after the wrap went in: the rail stood 52px tall at 1440px and
   at 390px, where one line is ~18px. Basis 0 makes the groove take only the
   slack that is left, so it stays on line one and the label below it wraps only
   when the labels genuinely cannot share a line. min-width keeps it reading as
   a groove rather than vanishing to nothing. */
.mch-rail > .mch-rule{flex:1 1 0;width:auto;min-width:24px}

/* ---------------------------------------------------------------------------
   4. MATERIALS — the physical language. THE PART THAT MAKES IT MACHINED.

   Every recipe below is the prototype's, layer for layer. On the phone some of
   these cost real frames; on the web they are a few gradients and one inline
   SVG, so nothing had to be dropped. Where the app had to APPROXIMATE (Flutter
   has no inset shadow, so its lit lips are gradient stops), the web uses the
   real inset shadow the design was drawn with — the web is the medium these
   recipes were authored in.
   ------------------------------------------------------------------------ */

/* BRUSHED ANODISED ALUMINIUM — the body of the instrument. Six layers, and
   every one is doing a job:
       1. form vignette ...... light gathers where the surface faces you
       2. floor shade ........ the surface turns away at the bottom
       3. crown light ........ and catches at the top
       4. studio sheen ....... a diagonal band of light landing across it
       5. brush streak ....... the fine vertical grain of the machining
       6. metal gradient ..... the load-bearing colour
   Then five inset shadows put a milled edge on it: a crisp lit top lip, a soft
   bloom under it, a light left chamfer, a dark right one, and shade at the
   floor. Delete any of the six and it reads as a grey rectangle. */
.mch-metal{
  position:relative;
  background-color:var(--mch-metal-3);
  background-image:
    radial-gradient(150% 108% at 50% 42%, transparent 52%, rgba(0,0,0,.30) 100%),
    radial-gradient(120% 44% at 50% 110%, rgba(0,0,0,.40), rgba(0,0,0,0) 58%),
    radial-gradient(135% 56% at 50% -8%, rgba(255,255,255,.16), rgba(255,255,255,0) 48%),
    linear-gradient(122deg, transparent 4%, rgba(255,255,255,.03) 30%, rgba(255,255,255,.075) 50%, rgba(255,255,255,.03) 70%, transparent 96%),
    repeating-linear-gradient(90deg,
      transparent 0 calc(var(--mch-brush-period) - 7px),
      rgba(255,255,255,var(--mch-brush-alpha)) calc(var(--mch-brush-period) - 7px) calc(var(--mch-brush-period) - 6px),
      transparent calc(var(--mch-brush-period) - 6px) var(--mch-brush-period)),
    linear-gradient(180deg, var(--mch-metal-1) 0%, var(--mch-metal-2) 26%, var(--mch-metal-3) 58%, var(--mch-metal-4) 100%);
  box-shadow:
    inset 0 1.5px 0 var(--mch-edge-hi),
    inset 0 3px 1px -2px rgba(255,255,255,.10),
    inset 2px 0 0 rgba(199,203,208,.06),
    inset -2px 0 0 rgba(0,0,0,.30),
    inset 0 -4px 8px rgba(0,0,0,.42);
}

/* THE BRUSH ITSELF: anisotropic noise — wide in x, fine in y — in soft-light.
   Without this the metal reads as flat grey. The host must be positioned.

   THE FILTER REGION IS PINNED, AND THAT IS LOAD-BEARING. Do not remove
   x='0' y='0' width='100%25' height='100%25' from the <filter> tag.
   stitchTiles='stitch' makes feTurbulence wrap seamlessly across the FILTER
   REGION; CSS then wraps the IMAGE. With no region declared, SVG defaults it
   to -10%/-10%/120%/120% of the rect — so the noise stitches on one period
   while background-size repeats it on another, and a hard brightness step runs
   the full height of the surface. The prototype measured that seam at 5.6% of
   full scale before pinning it. A bigger mismatched region seams just as hard,
   only at a different pitch.

   THE feColorMatrix IS A WEB-ONLY CORRECTION, AND IT IS MEASURED. feTurbulence
   generates its R, G and B channels INDEPENDENTLY, so the raw filter output is
   COLOURED noise, not grey noise. Rasterised and sampled at the tile's native
   240x460: mean chroma 36.1 of 255, peak 146, and 75.1% of pixels above a
   chroma of 20. On a 412px phone under soft-light that is invisible; across a
   1200px plate on a monitor it is visible RGB speckle on a surface that is
   supposed to be neutral anodised aluminium. `saturate 0` takes chroma to
   exactly 0 while leaving the brush itself alone — re-measured after: mean
   luminance 186.0 -> 186.7, luminance range 114.8 -> 107.0. Same texture, no
   confetti. It is applied AFTER the turbulence and changes no frequency, so
   the stitch period is untouched and no seam can be introduced by it. */
.mch-grain{position:relative}
.mch-grain::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  opacity:var(--mch-grain-opacity);mix-blend-mode:soft-light;border-radius:inherit;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='460'%3E%3Cfilter id='n' x='0' y='0' width='100%25' height='100%25'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.009 0.92' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
  background-size:240px 460px;
}

/* THE STAGE — the dark ground a picture, a screenshot or a hero element sits
   on. Darker than the faceplate so the thing on it is the brightest object.

   IT IS STILL METAL, AND THE FIRST CUT OF THIS RULE FORGOT THAT. Rendered
   beside .mch-metal it read as a flat near-black box: it had the four stage
   stops and nothing else — no brush, no sheen, no side chamfers — so at 1440px
   the vertical gradient alone spread over 700px and became an invisible wash.
   Dark is the point; FLAT is the defect. It now carries the same brush streak
   and the same diagonal sheen as every other surface, at lower amplitude
   because a dark surface shows a highlight more readily than a light one, and
   the floor is lifted off pure black so there is something for the light to
   land on. */
.mch-stage{
  position:relative;
  background-image:
    radial-gradient(120% 86% at 50% -6%, rgba(255,255,255,.075), transparent 58%),
    radial-gradient(150% 110% at 50% 46%, transparent 46%, rgba(0,0,0,.40) 100%),
    linear-gradient(122deg, transparent 6%, rgba(255,255,255,.016) 32%, rgba(255,255,255,.042) 50%, rgba(255,255,255,.016) 68%, transparent 94%),
    repeating-linear-gradient(90deg,
      transparent 0 calc(var(--mch-brush-period) - 7px),
      rgba(255,255,255,calc(var(--mch-brush-alpha) * 1.6)) calc(var(--mch-brush-period) - 7px) calc(var(--mch-brush-period) - 6px),
      transparent calc(var(--mch-brush-period) - 6px) var(--mch-brush-period)),
    linear-gradient(180deg, var(--mch-stage-1) 0%, var(--mch-stage-2) 34%, var(--mch-stage-3) 74%, #14161a 100%);
  box-shadow:
    inset 0 1.5px 0 rgba(233,238,242,.16),
    inset 2px 0 0 rgba(199,203,208,.045),
    inset -2px 0 0 rgba(0,0,0,.34),
    inset 0 -1px 0 rgba(0,0,0,.5);
}

/* RAISED BOLTED DECK — where the controls live, lifted off the faceplate so
   the eye reads "this is the part I touch". Bolt it with .mch-screw, tab it
   with .mch-seam-tab. Round at the top, square where it meets the edge. */
.mch-deck{
  position:relative;z-index:2;
  padding:var(--mch-s7) var(--mch-gutter) var(--mch-s5);
  border-radius:var(--mch-r-deck) var(--mch-r-deck) 0 0;
  background-image:linear-gradient(180deg, var(--mch-deck-1) 0%, var(--mch-deck-2) 42%, var(--mch-deck-3) 100%);
  box-shadow:
    inset 0 2px 0 rgba(199,203,208,.42),
    inset 0 -1px 0 rgba(0,0,0,.5),
    0 -16px 26px -14px rgba(0,0,0,.6);
}

/* A PLATE — the web's workhorse surface, and the one component here with no
   phone ancestor. A marketing page is made of cards; the app had none, because
   an app screen IS the card. So a plate is milled from the same metal as
   everything else: a lifted panel with a lit top lip and a real cast shadow,
   one step brighter than the faceplate it sits on. Bolt it if it is a control
   surface; leave it plain if it is only holding words. */
.mch-plate{
  position:relative;
  padding:var(--mch-s7);
  border-radius:var(--mch-r4);
  background-image:
    radial-gradient(130% 90% at 50% -10%, rgba(255,255,255,.055), transparent 62%),
    linear-gradient(122deg, transparent 6%, rgba(255,255,255,.022) 34%, rgba(255,255,255,.05) 50%, rgba(255,255,255,.022) 68%, transparent 94%),
    repeating-linear-gradient(90deg,
      transparent 0 calc(var(--mch-brush-period) - 7px),
      rgba(255,255,255,var(--mch-brush-alpha)) calc(var(--mch-brush-period) - 7px) calc(var(--mch-brush-period) - 6px),
      transparent calc(var(--mch-brush-period) - 6px) var(--mch-brush-period)),
    linear-gradient(180deg, #3a3e46 0%, #32363d 46%, #2b2f36 100%);
  box-shadow:
    inset 0 1.5px 0 rgba(206,211,216,.26),
    inset 0 -2px 4px rgba(0,0,0,.34),
    inset 1px 0 0 rgba(199,203,208,.05),
    inset -1px 0 0 rgba(0,0,0,.24),
    0 10px 26px -14px rgba(0,0,0,.65),
    0 1px 2px rgba(0,0,0,.35);
}
/* A plate that is a LINK gets travel, like every other control on this metal.
   1px, not 2 — it is a surface being nudged, not a button being pressed. */
.mch-plate--link{transition:transform var(--mch-press) ease, box-shadow var(--mch-press) ease}
.mch-plate--link:hover{
  box-shadow:
    inset 0 1.5px 0 rgba(206,211,216,.36),
    inset 0 -2px 4px rgba(0,0,0,.34),
    inset 1px 0 0 rgba(199,203,208,.05),
    inset -1px 0 0 rgba(0,0,0,.24),
    0 14px 30px -14px rgba(0,0,0,.7),
    0 1px 2px rgba(0,0,0,.35);
}
.mch-plate--link:active{
  transform:translateY(1px);
  box-shadow:
    inset 0 1px 0 rgba(199,203,208,.18),
    inset 0 2px 5px rgba(0,0,0,.4),
    0 4px 12px -8px rgba(0,0,0,.6);
}
/* A RECESSED plate — for a thing that sits BELOW the surface: a quote, a note,
   a code block, a de-emphasised aside. The inverse lighting of .mch-plate. */
.mch-plate--sunk{
  background-image:linear-gradient(180deg,#24272c 0%, #1e2126 100%);
  box-shadow:
    inset 0 3px 8px rgba(0,0,0,.5),
    inset 0 -1px 0 rgba(233,238,242,.06),
    0 1px 0 rgba(233,238,242,.04);
}

/* HEX SOCKET SCREW — the detail that says "machined", not "drawn".
   Position is the HOST's business: retune with --mch-screw-inset-x/y rather
   than re-solving the geometry. The app shipped a bolt through a pilot lamp
   once because these insets were hard-coded. */
.mch-screw{
  position:absolute;width:15px;height:15px;border-radius:50%;pointer-events:none;
  background:radial-gradient(circle at 38% 32%, #4a4f57, #212328 72%);
  box-shadow:inset 0 1px 1px rgba(255,255,255,.28), inset 0 -1px 1px rgba(0,0,0,.6), 0 1px 1px rgba(0,0,0,.4);
}
.mch-screw::after{
  content:"";position:absolute;inset:3.5px;
  clip-path:polygon(50% 1%, 94% 26%, 94% 74%, 50% 99%, 6% 74%, 6% 26%);
  background:linear-gradient(155deg, #17191c, #3a3e45 54%, #191b1e);
  box-shadow:inset 0 0 2px rgba(0,0,0,.8);
}
.mch-screw--tl{top:var(--mch-screw-inset-y,13px);left:var(--mch-screw-inset-x,14px)}
.mch-screw--tr{top:var(--mch-screw-inset-y,13px);right:var(--mch-screw-inset-x,14px)}
.mch-screw--bl{bottom:var(--mch-screw-inset-y,13px);left:var(--mch-screw-inset-x,14px)}
.mch-screw--br{bottom:var(--mch-screw-inset-y,13px);right:var(--mch-screw-inset-x,14px)}

/* SEAM TAB — a small stamped plate straddling an edge; carries a label without
   spending a whole row on it. */
.mch-seam-tab{
  position:absolute;top:-13px;left:50%;transform:translateX(-50%);
  padding:5px 16px;border-radius:var(--mch-r-pill);white-space:nowrap;
  background:linear-gradient(180deg,#3f444c,#33373e);
  box-shadow:inset 0 1px 0 rgba(199,203,208,.28), inset 0 -1px 1px rgba(0,0,0,.5), 0 2px 4px rgba(0,0,0,.4);
  font-family:var(--mch-f-mono);font-stretch:112.5%;
  font-size:var(--mch-fs-micro);letter-spacing:1.9px;
  /* --t1, NOT --t2, AND THE DIFFERENCE WAS MEASURED RATHER THAN JUDGED. This
     tab is the one label in the system that sits on its OWN metal, and that
     metal is the brightest surface here (#3f444c→#33373e) — brighter than the
     faceplate every other micro-label sits on. Sampled off a rendered page,
     inside the tab's left padding where no glyph falls:

         painted tab metal ... rgb(60,65,72)
         --t2 (.62) .......... 4.41:1   FAILS 4.5 at 11.5px
         --t1 (.92) .......... 8.04:1

     The tab is also NAMING the panel it straddles, which is a job for full ink.
     A quieter label belongs on the faceplate, where t2 clears the floor with
     room to spare. */
  text-transform:uppercase;color:var(--mch-t1);
}

/* KNURLED GRIP — the milled cross-hatch on a thing meant to be gripped. Two
   opposed hairline gratings; the detail vocabulary the spec asks for. */
.mch-knurl{
  background-image:
    repeating-linear-gradient(62deg, rgba(255,255,255,.055) 0 1px, transparent 1px 4px),
    repeating-linear-gradient(-62deg, rgba(0,0,0,.30) 0 1px, transparent 1px 4px);
}

/* RECESSED DARK-GLASS WINDOW — the ONLY place characters are backlit.
   Inner vignette makes lit glyphs pop; a bleed of light comes from under the
   glass; a sheen lands on the cover, not on the digits; scanlines make it read
   as a real lit panel rather than a dark box.

   THE BLEED IS HUELESS BY DEFAULT, AND THAT IS THE LAW. It used to be green in
   every state on every screen, connected or not — signalling nothing at all
   while spending the one colour reserved for a real link. A text field existing
   is not a connection. Green returns only behind .mch-channel--live, which
   sets two custom properties and never restates the material. */
.mch-channel{
  --mch-channel-bleed:rgba(199,203,208,.13);
  --mch-channel-lip:rgba(199,203,208,.12);
  position:relative;overflow:hidden;
  min-height:clamp(62px, 8vw, 88px);
  display:flex;align-items:center;justify-content:center;gap:6px;
  padding:0 var(--mch-s4);border-radius:var(--mch-r3);
  background-image:
    radial-gradient(135% 150% at 50% 50%, transparent 52%, rgba(0,0,0,.5) 100%),
    radial-gradient(90% 130% at 50% 128%, var(--mch-channel-bleed), transparent 60%),
    linear-gradient(180deg, #090b0e 0%, #0d1114 52%, #0a0d10 100%);
  box-shadow:
    inset 0 5px 12px rgba(0,0,0,.85),
    inset 0 2px 2px rgba(0,0,0,.9),
    inset 0 -1.5px 1px var(--mch-channel-lip),
    0 1px 0 rgba(199,203,208,.16);
}
/* THE OPT-IN. Sets only custom properties, so it never competes on specificity
   with the material above. Values are the spine's former defaults, verbatim. */
.mch-channel--live{
  --mch-channel-bleed:rgba(87,160,124,.20);
  --mch-channel-lip:rgba(150,205,178,.14);
}
.mch-channel::before{ /* glass sheen — light on the cover, not the digits */
  content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(180deg, rgba(255,255,255,.07) 0%, rgba(255,255,255,0) 16%);
}
.mch-channel::after{ /* fine display scanlines */
  content:"";position:absolute;inset:0;pointer-events:none;opacity:.35;
  background:repeating-linear-gradient(0deg, rgba(0,0,0,.20) 0 1px, transparent 1px 3px);
}
/* A LIT CHARACTER. Its halo follows the same rule as the window it sits in:
   hueless until the line is live. */
.mch-slot{
  --mch-slot-bloom:rgba(226,236,242,.30);
  --mch-slot-halo:rgba(226,234,240,.55);
  position:relative;z-index:2;
  min-width:calc(var(--mch-fs-readout) * 1.06);text-align:center;
  font-family:var(--mch-f-mono);font-stretch:112.5%;font-weight:500;
  font-size:var(--mch-fs-readout);line-height:1;
  color:var(--mch-readout);
  text-shadow:0 0 12px var(--mch-slot-bloom), 0 0 3px var(--mch-slot-halo), 0 1px 1px rgba(0,0,0,.45);
}
/* An EMPTY slot never opts in, under any parent: a placeholder mark cannot be
   reporting a live line, so its halo is hueless in both modes by construction. */
.mch-slot.is-empty{
  color:rgba(150,164,156,.42);font-weight:400;
  text-shadow:0 0 4px rgba(199,203,208,.14);
}
.mch-channel--live .mch-slot,.mch-slot--live{
  --mch-slot-bloom:rgba(150,220,185,.32);
  --mch-slot-halo:rgba(214,238,226,.55);
}

/* A READOUT CARRYING A VARIABLE-LENGTH STRING, rather than a row of fixed slots.
   Added 2026-08-02 for the 404 page, which lights up the address the visitor
   actually asked for.

   The window above was built for a pairing code: a known count of characters,
   one line, centred. A URL is not that — it can be four characters or ninety —
   and .mch-channel is overflow:hidden because the scanlines and the vignette
   have to be painted to its edges. So an unmodified window would simply cut a
   long address off. §9 has already settled the principle for digits: a clipped
   digit is not a smaller number, it is a DIFFERENT number. A clipped address is
   a different address, and letting someone see their own typo is the entire job
   of this particular window, so the WINDOW gives and the string never does.

   The size drops from --mch-fs-readout to the lead size for the same reason a
   price is not set in body text: 34px is right for six characters and wrong for
   a path, which is a fact to be read rather than a number to be seen across a
   room. It stays in the lit face on dark glass, so it is still a readout. */
.mch-channel--text{
  min-height:0;
  padding:var(--mch-s4) var(--mch-s5);
}
.mch-slot--text{
  min-width:0;max-width:100%;
  font-size:var(--mch-fs-lead);letter-spacing:.4px;line-height:1.5;
  /* A URL has no spaces to break at, so `anywhere` is the only wrap rule that
     works on one. Without it a long path forces the window wider than its
     parent and the page grows a horizontal scrollbar. */
  overflow-wrap:anywhere;
}

/* ---------------------------------------------------------------------------
   5. CONTROLS — buttons, fields, and the pilot lamp.
   ------------------------------------------------------------------------ */

/* RAISED BEVEL BUTTON — metal with a milled top edge and 2px of real travel.
   Green NEVER fills it; at most it under-glows, and even then hueless. */
.mch-btn{
  --mch-btn-glow:0 0 0 0 rgba(0,0,0,0);        /* holds the slot, paints nothing */
  --mch-btn-glow-press:0 0 0 0 rgba(0,0,0,0);
  position:relative;display:inline-flex;align-items:center;justify-content:center;
  gap:10px;min-height:52px;padding:12px var(--mch-s6);
  border-radius:var(--mch-r3);
  font-family:var(--mch-f-ui);font-weight:600;font-size:var(--mch-fs-btn);
  letter-spacing:2.2px;text-transform:uppercase;color:var(--mch-t2);
  /* A LABEL THAT WRAPS MUST STILL LOOK DELIBERATE. Uppercase tracked caps at
     the default 1.5 line-height fall apart over two lines, and a narrow column
     WILL wrap them. line-height pulls the two lines into one block; `balance`
     splits them evenly instead of leaving one orphan word; and the padding is
     vertical rather than zero so the box grows with the label rather than
     letting it touch the bevel. The system's own advice still stands — if a
     label needs two lines, shorten the label — but the day someone doesn't,
     this fails tidily instead of looking broken. */
  line-height:1.25;text-align:center;text-wrap:balance;
  -webkit-appearance:none;appearance:none;
  background-image:linear-gradient(180deg, #44484f 0%, #383c43 52%, #303339 100%);
  box-shadow:
    inset 0 1.5px 0 rgba(206,211,216,.24),
    inset 0 -2px 3px rgba(0,0,0,.42),
    0 6px 14px -8px rgba(0,0,0,.55),
    0 1px 3px rgba(0,0,0,.38);
  transition:transform var(--mch-press) ease, box-shadow var(--mch-press) ease, color var(--mch-ink) ease;
}
/* DO NOT write `--mch-btn-glow:none` or leave it empty: an empty custom
   property is invalid at computed-value time and would wipe the ENTIRE bevel,
   not just the glow. A zero-spread transparent shadow is the correct no-op. */
.mch-btn:hover{color:var(--mch-t1)}
.mch-btn:active,.mch-btn.is-pressed{
  transform:translateY(2px);
  box-shadow:inset 0 1px 0 rgba(199,203,208,.2), inset 0 -1px 1px rgba(0,0,0,.5), 0 4px 8px -5px rgba(0,0,0,.6);
}
.mch-btn--block{display:flex;width:100%}

/* PRIMARY = the one action in view, so it is the only button milled from
   bright metal: taller, brighter lip, white label, a deeper cast shadow. A
   secondary sits visibly lower — hierarchy without a colour fill. */
.mch-btn--primary{
  min-height:56px;font-weight:700;letter-spacing:2.6px;color:#f2f5f7;
  background-image:linear-gradient(180deg, #4c515a 0%, #3b3f47 52%, #33373d 100%);
}
.mch-btn--primary:not(:disabled):not(.is-disabled):not([aria-disabled="true"]){
  box-shadow:
    inset 0 1.5px 0 rgba(206,211,216,.46),
    inset 0 -2px 3px rgba(0,0,0,.45),
    0 12px 22px -8px rgba(0,0,0,.6),
    var(--mch-btn-glow, 0 0 0 0 rgba(0,0,0,0)),
    0 2px 4px rgba(0,0,0,.4);
}
.mch-btn--primary:not(:disabled):not(.is-disabled):not([aria-disabled="true"]):active,
.mch-btn--primary:not(:disabled):not(.is-disabled):not([aria-disabled="true"]).is-pressed{
  transform:translateY(2px);
  box-shadow:
    inset 0 1.5px 0 rgba(206,211,216,.30),
    inset 0 -1px 2px rgba(0,0,0,.5),
    0 4px 10px -6px rgba(0,0,0,.7),
    var(--mch-btn-glow-press, 0 0 0 0 rgba(0,0,0,0));
}
/* THE UNDERGLOW IS HUELESS, AND THAT IS A CORRECTION, NOT A PREFERENCE. It
   used to be green. READY means "this action can be taken now" — on a
   marketing page a Download button is ready precisely BECAUSE nothing is
   connected yet, so lighting it green says LINKED underneath the word
   DOWNLOAD. The glow keeps its whole job (the button lifts off the plate when
   it becomes usable) in polished-aluminium light. */
.mch-btn.mch-btn--ready{
  --mch-btn-glow:0 6px 20px -10px rgba(199,203,208,.30);
  --mch-btn-glow-press:0 2px 8px -6px rgba(199,203,208,.22);
}
/* An engraved glyph inside a label. Never stretches, never competes with the
   word — it exists so the eye finds the control before it reads it. */
.mch-btn__ico{flex:none;opacity:.72;color:currentColor}
.mch-btn--primary .mch-btn__ico{opacity:.9}

/* GHOST = a real secondary. No metal, just an engraved outline: it cannot be
   mistaken for the primary and it costs no visual weight. */
.mch-btn--ghost{
  min-height:var(--mch-tap);background-image:none;color:var(--mch-t2);
  font-weight:600;letter-spacing:2px;
  box-shadow:inset 0 0 0 1px rgba(199,203,208,.18), inset 0 1px 0 rgba(233,238,242,.05), 0 1px 0 rgba(0,0,0,.35);
}
.mch-btn--ghost:hover{
  color:var(--mch-t1);
  box-shadow:inset 0 0 0 1px rgba(199,203,208,.30), inset 0 1px 0 rgba(233,238,242,.07), 0 1px 0 rgba(0,0,0,.35);
}
.mch-btn--ghost:active,.mch-btn--ghost.is-pressed{
  transform:translateY(1px);
  box-shadow:inset 0 0 0 1px rgba(199,203,208,.14), inset 0 2px 5px rgba(0,0,0,.4);
}
/* DANGER = recessed, not raised: a destructive action should feel like it sits
   BELOW the surface. Red is a label colour only, never a fill. */
.mch-btn--danger{
  color:var(--mch-red);background-image:linear-gradient(180deg,#2c2f35 0%, #26292e 100%);
  box-shadow:inset 0 2px 5px rgba(0,0,0,.55), inset 0 -1px 0 rgba(233,238,242,.07), 0 1px 0 rgba(233,238,242,.04);
}
.mch-btn--danger:active,.mch-btn--danger.is-pressed{
  transform:translateY(1px);box-shadow:inset 0 3px 7px rgba(0,0,0,.7);
}
/* COMPACT — an action that sits inside a row or beside a title. THE BOX
   SHRINKS AND THE TYPE DOES NOT: it inherits --mch-fs-btn untouched, whose
   floor IS the product's 14px floor. If a label will not fit, shorten the
   label. Height floor stays --mch-tap. */
.mch-btn--compact{
  min-width:var(--mch-tap);min-height:var(--mch-tap);
  padding:0 var(--mch-s4);gap:8px;border-radius:var(--mch-r2);
  font-size:var(--mch-fs-btn);letter-spacing:1.8px;
}
/* HONESTLY DISABLED: dead metal, dead label, no glow, no travel. Three
   selectors, one state — aria-disabled is included because a control retired
   WITH A REASON must stay focusable to be read, so it cannot use the disabled
   attribute and must still paint dead. */
.mch-btn:disabled,.mch-btn.is-disabled,.mch-btn[aria-disabled="true"]{
  color:var(--mch-t4);cursor:not-allowed;transform:none;
  background-image:linear-gradient(180deg, #3d4148 0%, #33373d 52%, #2e3138 100%);
  box-shadow:inset 0 1px 0 rgba(199,203,208,.14), inset 0 -1px 2px rgba(0,0,0,.4), 0 1px 2px rgba(0,0,0,.35);
}
/* WHY THIS CONTROL IS OFF — a second line inside the button, and the reason a
   disabled control is not simply a dead end. NOT uppercase: everything else on
   a button is a shouted verb, and the case change is what tells the eye this
   is an explanation. Deliberately BRIGHTER than the dead label above it —
   when a control is off, the reason is the part worth reading. */
.mch-btn:has(.mch-btn__why){flex-direction:column;gap:3px;padding-top:10px;padding-bottom:10px}
.mch-btn__why{
  display:block;max-width:100%;
  font-family:var(--mch-f-ui);font-weight:400;font-size:var(--mch-fs-sub);
  text-transform:none;letter-spacing:0;line-height:1.3;color:var(--mch-t3);
}

/* A CHIP — a stamped plate carrying one short engraved fact. This is how the
   spec's tracked-caps vocabulary lands on a page: END-TO-END ENCRYPTED ·
   PEER-TO-PEER · NO ACCOUNT. It is not a button and must never look tappable,
   so it has a lit lip and NO travel and NO hover. */
.mch-chip{
  display:inline-flex;align-items:center;gap:8px;
  padding:7px 14px;border-radius:var(--mch-r-pill);white-space:nowrap;
  background:linear-gradient(180deg,#3b4048,#2f333a);
  box-shadow:
    inset 0 1px 0 rgba(199,203,208,.22),
    inset 0 -1px 1px rgba(0,0,0,.45),
    0 1px 2px rgba(0,0,0,.35);
  font-family:var(--mch-f-mono);font-stretch:112.5%;font-weight:400;
  font-size:var(--mch-fs-micro);letter-spacing:1.9px;text-transform:uppercase;
  color:var(--mch-t2);
}
/* A chip milled INTO the surface rather than onto it — for a quieter fact. */
.mch-chip--sunk{
  background:linear-gradient(180deg,#25282d,#1f2226);
  box-shadow:inset 0 2px 4px rgba(0,0,0,.5), 0 1px 0 rgba(233,238,242,.05);
  color:var(--mch-t3);
}

/* A FIELD — a milled slot, not a web input. The recess is the same physics as
   the readout window: dark, sunk, with a lit lower lip where the light gets
   under the edge. The caret is HUELESS — a cursor blinking in a field means
   the field has focus, not that anything is connected. */
.mch-field{
  width:100%;min-height:var(--mch-tap);
  padding:0 var(--mch-s4);border-radius:var(--mch-r2);border:0;
  font-family:var(--mch-f-ui);font-size:var(--mch-fs-body);color:var(--mch-t1);
  caret-color:var(--mch-edge);
  background-image:linear-gradient(180deg, #1e2126 0%, #23262b 100%);
  box-shadow:
    inset 0 3px 7px rgba(0,0,0,.6),
    inset 0 1px 1px rgba(0,0,0,.7),
    inset 0 -1.5px 1px rgba(199,203,208,.10),
    0 1px 0 rgba(199,203,208,.12);
  transition:box-shadow var(--mch-ink) ease;
}
.mch-field::placeholder{color:var(--mch-t4)}
.mch-field:hover{
  box-shadow:
    inset 0 3px 7px rgba(0,0,0,.6),
    inset 0 1px 1px rgba(0,0,0,.7),
    inset 0 -1.5px 1px rgba(199,203,208,.16),
    0 1px 0 rgba(199,203,208,.18);
}
/* A field for a code or a key takes the mono face and real tracking, because
   the reader's job there is character-by-character, not word-by-word. */
.mch-field--code{
  font-family:var(--mch-f-mono);font-stretch:112.5%;
  letter-spacing:3px;text-transform:uppercase;text-align:center;
}
.mch-label{
  display:block;margin-bottom:var(--mch-s2);
  font-family:var(--mch-f-mono);font-stretch:112.5%;font-weight:400;
  font-size:var(--mch-fs-micro);letter-spacing:1.9px;text-transform:uppercase;
  color:var(--mch-t2);text-shadow:0 1px 0 rgba(0,0,0,.35);
}

/* PILOT LAMP — a recessed ring with a real bulb in it. The single element that
   says, at a glance, whether the machine is alive.

   SHAPE IS THE CHANNEL THAT SURVIVES EVERYTHING. Print the page in black and
   white, or hand it to a red-green colour-blind reader, and the states must
   still be distinct:
       LIVE     a SOLID DOT     · filled disc, green, breathing
       STANDBY  a HOLLOW RING   · open centre, hueless, idling
       FAULT    a DASH          · a bar, not a circle, amber, blinking
   Do not "simplify" these into three coloured circles — that is the exact
   defect the shapes replaced, and the third carrier, the WORD under the lamp,
   is not optional either. */
.mch-lamp{
  position:relative;width:26px;height:26px;border-radius:50%;flex:none;
  display:inline-flex;align-items:center;justify-content:center;
  background:radial-gradient(circle at 42% 34%, #3a3e45, #1d2025 78%);
  box-shadow:inset 0 1px 1px rgba(255,255,255,.22), inset 0 -1px 2px rgba(0,0,0,.6), 0 1px 1px rgba(0,0,0,.4);
}
.mch-lamp::after{
  content:"";width:13px;height:13px;border-radius:50%;
  background:radial-gradient(circle at 40% 34%, #4b5158, #1d2025 80%);
  box-shadow:inset 0 -1px 1px rgba(0,0,0,.5), 0 0 0 1px rgba(0,0,0,.5);
  transition:background .5s ease, box-shadow .5s ease;
}
.mch-lamp.is-standby::after{
  background:radial-gradient(circle at 40% 34%, #23272d, #16181c 80%);
  box-shadow:
    inset 0 0 0 3px #c3c9d0,
    inset 0 -1px 1px rgba(0,0,0,.5),
    0 0 0 1px rgba(0,0,0,.5),
    0 0 7px rgba(210,218,226,.28);
  animation:mch-lamp-idle 4.2s ease-in-out infinite;
}
.mch-lamp.is-live::after{
  background:radial-gradient(circle at 40% 34%, var(--mch-green-bright), var(--mch-green) 55%, var(--mch-green-deep) 100%);
  box-shadow:0 0 14px 3px rgba(120,220,170,.55), inset 0 0 2px rgba(255,255,255,.6);
  animation:mch-lamp-breathe 3.4s ease-in-out infinite;
}
.mch-lamp.is-fault::after{
  width:14px;height:4px;border-radius:2px;
  background:linear-gradient(180deg, #e3c096 0%, var(--mch-amber) 62%, #8a6533 100%);
  box-shadow:0 0 12px 2px rgba(198,154,85,.5), inset 0 0 2px rgba(255,255,255,.4);
  animation:mch-lamp-blink 1.1s steps(1) infinite;
}
/* THE WORD UNDER THE LAMP. Tiny by design — it is a legend, not a headline —
   but not optional: it is the only reading of machine state a colour-blind
   visitor gets. Floored at 11px so a page that retunes --mch-fs-nano for its
   own reasons still gets 11. */
.mch-lamp-label{
  font-family:var(--mch-f-mono);font-stretch:112.5%;font-weight:400;
  font-size:max(11px, var(--mch-fs-nano));letter-spacing:2.2px;
  text-transform:uppercase;color:var(--mch-lamp-word);
}
/* THE PILOT PIP — a discrete lit dot beside a label that is genuinely
   reporting a live line. This exists so a whole control never has to wear
   green to say one thing about itself. */
.mch-dot{
  width:9px;height:9px;border-radius:50%;flex:none;
  background:var(--mch-green-bright);
  box-shadow:0 0 10px rgba(133,214,170,.85);
}

/* ---------------------------------------------------------------------------
   6. NAVIGATION + FOOTER — web-only, built from the same metal.
   ------------------------------------------------------------------------ */

/* THE NAV IS A MILLED RAIL ACROSS THE TOP — a bolted strip of the instrument's
   own faceplate, not a translucent floating bar. It is opaque on purpose: a
   blurred glass bar over brushed metal turns the grain to mud, and the grain
   is the thing carrying the whole impression. */
.mch-nav{
  position:sticky;top:0;z-index:50;
  display:flex;align-items:center;gap:var(--mch-s6);
  min-height:68px;padding:0 var(--mch-gutter);
  background-image:
    linear-gradient(122deg, transparent 8%, rgba(255,255,255,.022) 40%, rgba(255,255,255,.045) 52%, transparent 92%),
    repeating-linear-gradient(90deg,
      transparent 0 calc(var(--mch-brush-period) - 7px),
      rgba(255,255,255,var(--mch-brush-alpha)) calc(var(--mch-brush-period) - 7px) calc(var(--mch-brush-period) - 6px),
      transparent calc(var(--mch-brush-period) - 6px) var(--mch-brush-period)),
    linear-gradient(180deg, #3f434b 0%, #34383f 60%, #2b2f35 100%);
  box-shadow:
    inset 0 1.5px 0 var(--mch-edge-hi),
    inset 0 -1px 0 rgba(0,0,0,.55),
    0 10px 24px -16px rgba(0,0,0,.8);
}
/* A BAR THAT SPANS THE WINDOW WHILE ITS CONTENTS LINE UP WITH THE COLUMN BELOW.
   The rail itself must stay full-bleed — it is a strip of the instrument's own
   faceplate, and a 760px-wide "bar" floating in the middle of a 1440px page is
   not a faceplate. But on a document page the brand has to sit directly above
   the first word of the prose, or the eye reads two unrelated objects. So the
   METAL keeps the window and only what sits ON it is measured.

   Deliberately built from .mch-wrap rather than a fresh max-width here:
   `<nav class="mch-nav mch-nav--flush"><div class="mch-wrap mch-wrap--narrow
   mch-nav__inner">`. Same construction as the page column means the two agree
   by definition. Re-deriving the number (max-width here, padding there) is how
   a 48px misalignment gets shipped and then argued about. --flush hands the
   gutter to the wrap so it is applied exactly once.

   BOTH MODIFIERS ARE DOUBLED-UP (`.mch-nav.mch-nav--flush`) AND THAT IS A BUG
   FIX. Written as a single class they score (0,1,0) — a tie with the base
   `.mch-nav` / `.mch-footer` they are meant to override — so the winner was
   decided by source order alone. The nav happened to be declared first and
   worked; the footer is declared AFTER this block and silently won, re-applying
   its gutter. Measured at 390px: every left edge on the page sat at 26px and
   the footer's sat at 44px, one gutter adrift, on a design whose whole claim is
   precision. Two classes makes both immune to where the blocks sit. */
.mch-nav.mch-nav--flush{padding-inline:0}
.mch-nav__inner{display:flex;align-items:center;gap:var(--mch-s6);min-width:0}
.mch-footer.mch-footer--flush{padding-inline:0}

/* THE BRAND IS USUALLY A LINK HOME, SO IT OWES THE TAP FLOOR LIKE ANY OTHER
   CONTROL. Measured at 390px before this line: the box was 22px tall — the
   height of the mark inside it — because nothing here set one, while every
   other control in the file floors at --mch-tap. It costs nothing visually:
   the rail is 60px tall, so a 48px hit area sits inside it unseen. */
.mch-nav__brand{display:flex;align-items:center;gap:var(--mch-s3);flex:none;min-height:var(--mch-tap)}

/* THE MARK — THE APP'S OWN ICON, NOT A DRAWING OF IT.
   /assets/mark.svg is a byte-for-byte copy of the master that desktop's icon
   generator writes from tools/lib/mark.js, so the plate in this bar and the
   plate on the user's taskbar are the same object: brushed metal, a T milled
   through it, the cut's shadowed upper lip and lit lower lip. Until now the
   site drew the T as one flat silhouette (fill:#cfd2d6) — a sticker of the
   icon, with none of the metal in it — and three pages still carried the
   PREVIOUS identity entirely, a cord mark retired when the T-slot landed.

   ONE FILE, REFERENCED, NOT INLINED. The full mark is 17.5KB of gradients,
   a grain pattern and two masks; inlining that into ten pages would be ten
   copies free to drift, and the homepage carries the mark twice, where the
   duplicated element ids (#metal, #onyx, #tile, #wall) would silently make
   the second copy render through the first one's defs. This build already
   learned that lesson once: the favicons were inline data: URIs pasted into
   every <head> until five different colours of one mark had drifted across
   the site. A file cannot drift from itself.

   VECTOR, NOT THE 192px PNG. At 28px the raster would be resampled at every
   device density; the engraving lives in bands 6-33 units wide on a 512 grid,
   which is exactly the detail resampling eats first.

   IT SITS PROUD OF THE RAIL, AND THE SHADOW IS WHY IT IS VISIBLE AT ALL.
   The mark's metal (#3B3F47 -> #282C33) is very nearly the rail's own
   (#3f434b -> #2b2f35) — the same material, correctly — so its top edge is
   lighter than the bar behind it and its bottom edge is not. Rendered without
   this shadow the lower half dissolves into the rail and the silhouette turns
   to mush. drop-shadow rather than box-shadow because it follows the
   squircle's alpha; a box-shadow would draw the halo of a SQUARE. Brightening
   the plate instead was rendered and rejected: it reads, but it makes the
   badge a different alloy from the icon it is meant to be.

   28px DESKTOP / 24px SMALL. The mark's own derivation sets stroke width so
   the cut clears 3:1 local edge contrast from 24px up, so 24 is the floor, not
   a taste. 28 is the desktop size because the rail is 68px and the wordmark
   beside it is 17px; below 26 the mark stopped reading as a machined plate and
   started reading as a bullet. It stays at 24 on small screens because the
   brand and the one nav link already need 347px of the 354 available at
   390px — there is no room to spend there. */
.mch-mark{width:28px;height:28px;flex:none;display:block;filter:drop-shadow(0 1px 1.5px rgba(0,0,0,.55))}
/* The footer's copy of the mark. 24px — the floor, not smaller — because the
   footer is a sign-off rather than the brand's entrance, and it sits beside a
   15-16px wordmark instead of the nav's 17px. The shadow is inherited and it
   matters MORE here: the footer plate is darker than the nav rail, so the
   mark's own lower half has even less to separate it from the surface. */
.mch-mark--sm{width:24px;height:24px}
/* min-width:0 IS LOAD-BEARING. Without it this flex item refuses to shrink
   below its content, so on a narrow screen it pushed the whole DOCUMENT wider
   than the viewport rather than giving way — measured at 375px: the row ran to
   568px and the page gained a horizontal scrollbar. A flex child's default
   min-width is auto, which is the single most common cause of exactly that. */
.mch-nav__links{display:flex;align-items:center;gap:var(--mch-s2);margin-left:auto;min-width:0}
/* A nav link is an ENGRAVED label that lights when the cursor is on it. No
   underline, no pill, no colour: the change is ink brightness and the groove's
   lit lip appearing beneath. */
.mch-nav__link{
  position:relative;display:inline-flex;align-items:center;
  min-height:var(--mch-tap);padding:0 var(--mch-s4);border-radius:var(--mch-r1);
  font-family:var(--mch-f-mono);font-stretch:112.5%;font-weight:400;
  font-size:var(--mch-fs-micro);letter-spacing:1.9px;text-transform:uppercase;
  color:var(--mch-t2);
  transition:color var(--mch-ink) ease;
}
.mch-nav__link::after{
  content:"";position:absolute;left:var(--mch-s4);right:var(--mch-s4);bottom:14px;
  height:1px;opacity:0;
  background:rgba(199,203,208,.5);box-shadow:0 1px 0 rgba(0,0,0,.5);
  transition:opacity var(--mch-ink) ease;
}
.mch-nav__link:hover,.mch-nav__link.is-current{color:var(--mch-t1)}
.mch-nav__link:hover::after,.mch-nav__link.is-current::after{opacity:1}

/* THE BACK LINK COLLAPSES TO ITS ARROW BEFORE IT CAN CLIP.
   It is the longest label in the bar, and it names a destination the brand
   beside it ALREADY names — both anchors point at "../" — so when the bar runs
   out of width it is the one item that can give without costing a route.

   MEASURED on the French legal pages, which carry the longest wording, before
   this rule existed:
     - at 390px the label ran 266px into a rail with 40px of room, so a visitor
       saw a bare arrow and one sliced letter. It read as broken, not as a link.
     - between 431px and ~570px it was WORSE and had been missed, because the
       scroll rail that absorbs the overflow only exists at <=430px: at a 500px
       viewport the label pushed the DOCUMENT to 532px and the whole page panned
       sideways.
   The cutover is 680px, and the first attempt at 600px was WRONG in a way worth
   recording. At 600px the label appeared to fit — measured 198px against a
   274px natural width — because it was quietly WRAPPING ONTO TWO LINES inside a
   48px bar. That is not a fit, it is a second defect standing in for the first,
   and it only became visible once `white-space:nowrap` below stopped the wrap
   and the document immediately went to 652px inside a 600px window. So the
   label is allowed back only at the width where it fits ON ONE LINE with the
   brand and the language pair beside it, which is 680px, not the rail's 430px
   and not 600px.

   The label is what hides; the MEANING never does. The accessible name lives on
   the anchor's own aria-label, so the link announces "Retour a pctether.com" at
   every width, and the arrow keeps a full 48px tap target instead of shrinking
   to the width of one glyph. */
.mch-nav__back-label{white-space:nowrap}
@media (max-width:679px){
  .mch-nav__back{min-width:var(--mch-tap);padding-inline:0;justify-content:center}
  .mch-nav__back .mch-nav__back-label{display:none}
}

/* THE FOOTER — the instrument's base plate. Darker than the page, bolted, with
   the spec-rail vocabulary carrying the legal small print. */
.mch-footer{
  position:relative;
  padding:var(--mch-s10) var(--mch-gutter) var(--mch-s8);
  background-image:
    linear-gradient(180deg, #1f2227 0%, #191c20 100%);
  box-shadow:inset 0 1px 0 rgba(233,238,242,.07);
}
.mch-footer__grid{
  display:grid;gap:var(--mch-s8);
  grid-template-columns:repeat(auto-fit, minmax(180px, 1fr));
  max-width:var(--mch-measure);margin:0 auto;
}
.mch-footer__col{display:flex;flex-direction:column;gap:var(--mch-s3)}
/* 32px UNDER A MOUSE, THE FULL TAP FLOOR UNDER A FINGER.
   This was the one interactive control in the file carrying a hard-coded
   height instead of --mch-tap — every other control (button, icon button,
   field, nav link) already floors at the token, and a measured sweep found the
   footer links at 32px against the spec's 48px minimum. A footer is a dense
   list of short links, so 48px everywhere would stretch it out on a desktop
   where the pointer is precise and the floor buys nothing; keying the floor to
   `pointer:coarse` puts it exactly where the finger is, including on a touch
   tablet at 900px that a width breakpoint would have missed. */
.mch-footer__link{
  display:inline-flex;align-items:center;min-height:32px;
  font-size:var(--mch-fs-sub);color:var(--mch-t2);
  transition:color var(--mch-ink) ease;
}
.mch-footer__link:hover{color:var(--mch-t1)}
/* YOU-ARE-HERE, KEYED TO THE ATTRIBUTE THAT ALREADY SAYS SO. The legal pages'
   old stylesheet had `a[aria-current="page"]{color:var(--ink)}` and the port
   dropped it, so a footer listing Privacy / Terms / Refunds gave no hint which
   of the three you were reading — measured: the marked link and its neighbours
   all computed to the same --t2. Driving it off aria-current rather than a
   hand-added class means the visual state cannot drift from the state a screen
   reader announces; they are the same fact, read twice. */
.mch-footer__link[aria-current]{color:var(--mch-t1)}
/* The nav does the same, so a page that marks up its language switcher
   correctly gets the current-language highlight without also remembering to
   add .is-current. */
.mch-nav__link[aria-current]{color:var(--mch-t1)}
.mch-nav__link[aria-current]::after{opacity:1}
@media (pointer:coarse){
  .mch-footer__link{min-height:var(--mch-tap)}
}
.mch-footer__base{
  display:flex;flex-wrap:wrap;align-items:center;gap:var(--mch-s4);
  max-width:var(--mch-measure);margin:var(--mch-s8) auto 0;
  padding-top:var(--mch-s6);
  border-top:1px solid rgba(0,0,0,.45);
  box-shadow:0 -1px 0 rgba(233,238,242,.05) inset;
}

/* ---------------------------------------------------------------------------
   7. LAYOUT — page shell, sections, grid, rows.
   ------------------------------------------------------------------------ */
/* THE PAGE IS THE FACEPLATE, AND THIS IS THE RULE THAT DECIDES WHETHER THE
   WHOLE SITE READS AS MACHINED.

   The first cut set `background-color:var(--mch-ground)` and stopped. Rendered
   at 1440px that is a flat dark rectangle with some nice metal parts sitting on
   it — which is a dark theme with good components, not a trademark look. The
   phone gets away with a flat ground because a 412px screen is almost entirely
   covered by its deck and its plates; a 1440px page is mostly ground, so the
   ground is the biggest surface the visitor sees and it was the only one not
   made of anything.

   So the page body is milled from the same aluminium as everything else, at the
   lowest amplitude in the system: the brush at half strength, one very broad
   sheen, and a form vignette that gathers light toward the top-centre and lets
   it fall away at the edges. It must stay quiet enough that a .mch-plate still
   reads as LIFTED off it — that is why the sheen is 0.02 rather than the 0.075
   a plate uses, and why the vignette is measured in whole viewports.

   The grain is attached here rather than asked for in markup, because a page
   that forgets the class is a page with a flat body, and this is exactly the
   surface nobody would remember to annotate. `background-attachment:fixed` on
   the sheen keeps the light still while the content scrolls past it — a
   highlight that scrolls with the page reads as wallpaper; one that stays put
   reads as light landing on an object. */
.mch-page{
  position:relative;
  min-height:100%;
  background-color:var(--mch-ground);
  background-image:
    radial-gradient(120% 60% at 50% 0%, rgba(255,255,255,.045), transparent 62%),
    linear-gradient(122deg, transparent 12%, rgba(255,255,255,.010) 38%, rgba(255,255,255,.020) 50%, rgba(255,255,255,.010) 62%, transparent 88%),
    repeating-linear-gradient(90deg,
      transparent 0 calc(var(--mch-brush-period) - 7px),
      rgba(255,255,255,calc(var(--mch-brush-alpha) * .55)) calc(var(--mch-brush-period) - 7px) calc(var(--mch-brush-period) - 6px),
      transparent calc(var(--mch-brush-period) - 6px) var(--mch-brush-period));
  background-attachment:fixed, fixed, scroll;
}
/* The faceplate's own grain. Fixed, so the texture belongs to the SURFACE and
   does not slide around underneath the words.

   z-index:-1 IS LOAD-BEARING AND WAS A REAL BUG AT z-index:0. A fixed-position
   pseudo-element is a POSITIONED box, and positioned boxes paint above static
   in-flow ones — so at 0 this grain laid a soft-light sheet over the footer
   and over every static section that came after it in the document, which is
   the opposite of a surface. At -1 it paints above the page's own background
   and below all content, which is what "the surface under everything" means.
   The parent must therefore NOT create a stacking context: .mch-page keeps
   z-index:auto for exactly this reason. */
.mch-page::before{
  content:"";position:fixed;inset:0;z-index:-1;pointer-events:none;
  opacity:calc(var(--mch-grain-opacity) * .62);mix-blend-mode:soft-light;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='460'%3E%3Cfilter id='n' x='0' y='0' width='100%25' height='100%25'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.009 0.92' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
  background-size:240px 460px;
}
.mch-wrap{
  width:100%;max-width:var(--mch-measure);
  margin-inline:auto;padding-inline:var(--mch-gutter);
}
.mch-wrap--narrow{max-width:var(--mch-measure-narrow)}
.mch-section{padding-block:clamp(56px, 7vw, 112px)}
.mch-section--tight{padding-block:clamp(36px, 4vw, 64px)}
/* A section header: engraved kicker, heading, one sentence. The rhythm the
   whole page repeats, so no section has to invent its own. */
.mch-sechead{display:flex;flex-direction:column;gap:var(--mch-s4);margin-bottom:var(--mch-s9)}
.mch-sechead > .mch-lead{margin-top:calc(var(--mch-s1) * -1)}

.mch-grid{display:grid;gap:var(--mch-s6)}
.mch-grid--2{grid-template-columns:repeat(auto-fit, minmax(280px, 1fr))}
.mch-grid--3{grid-template-columns:repeat(auto-fit, minmax(240px, 1fr))}
.mch-grid--4{grid-template-columns:repeat(auto-fit, minmax(190px, 1fr))}
.mch-stack{display:flex;flex-direction:column;gap:var(--mch-s4)}
.mch-cluster{display:flex;flex-wrap:wrap;align-items:center;gap:var(--mch-s3)}

/* LIST ROW — a 56px floor so a thumb never misses; the divider is ENGRAVED,
   which is why it is a groove with a lit lower lip rather than a grey line. */
.mch-row{
  position:relative;display:flex;align-items:center;gap:var(--mch-s4);
  width:100%;min-height:56px;padding:var(--mch-s3) 0;text-align:left;
}
.mch-row + .mch-row::before{
  content:"";position:absolute;left:0;right:0;top:0;height:1px;
  background:rgba(0,0,0,.38);box-shadow:0 1px 0 rgba(233,238,242,.055);
}
/* A recessed square holding an icon or an initial. */
.mch-row__slot{
  width:38px;height:38px;border-radius:var(--mch-r2);flex:none;
  display:flex;align-items:center;justify-content:center;
  font-family:var(--mch-f-mono);font-stretch:112.5%;font-size:12px;color:var(--mch-t2);
  background:linear-gradient(180deg,#25282d,#1c1f23);
  box-shadow:inset 0 2px 4px rgba(0,0,0,.6), 0 1px 0 rgba(233,238,242,.06);
}
.mch-row__text{flex:1;min-width:0}
/* THE TITLE STAYS ON ONE LINE — it is a name, and a name that wraps stops
   looking like one thing. THE SUB IS ALLOWED TWO: that is where the sentences
   go, and one clipped line lost the last third of every row that had anything
   to say. Two is enough for a sentence and cannot run away to five. */
.mch-row__title{
  display:block;font-family:var(--mch-f-ui);font-weight:600;
  font-size:var(--mch-fs-body);color:var(--mch-t1);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.mch-row__sub{
  display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;
  font-family:var(--mch-f-ui);font-weight:400;font-size:var(--mch-fs-sub);
  color:var(--mch-t2);margin-top:2px;line-height:1.35;
  overflow:hidden;overflow-wrap:anywhere;
}
.mch-row__chev{ /* a milled chevron, not an emoji arrow */
  width:8px;height:8px;flex:none;margin-right:2px;
  border-right:1.5px solid var(--mch-t3);border-top:1.5px solid var(--mch-t3);
  transform:rotate(45deg);
}

/* THE PRICE PLATE — the web's one genuinely new component with a job the app
   never had. A number this important is not body text: it is a READOUT, so it
   is set in the lit-character face and sits in the same recess as a pairing
   code. The currency and the term ride at micro size beside it, because "$99"
   and "one-time" are one fact and must not look like two. */
.mch-price{display:flex;align-items:baseline;gap:var(--mch-s2)}
.mch-price__cur{
  font-family:var(--mch-f-mono);font-stretch:112.5%;font-weight:400;
  font-size:var(--mch-fs-h2);color:var(--mch-t2);
}
.mch-price__num{
  font-family:var(--mch-f-mono);font-stretch:112.5%;font-weight:500;
  font-size:clamp(40px, 5vw, 64px);line-height:1;color:var(--mch-readout);
  text-shadow:0 0 14px rgba(226,236,242,.22), 0 1px 1px rgba(0,0,0,.5);
}
.mch-price__term{
  font-family:var(--mch-f-mono);font-stretch:112.5%;font-weight:400;
  font-size:var(--mch-fs-micro);letter-spacing:1.9px;text-transform:uppercase;
  color:var(--mch-t3);
}

/* SKELETON — a loading placeholder with the SHAPE of the real thing, so the
   page never jumps. A bare spinner tells the visitor nothing; this does. */
.mch-skeleton{
  position:relative;overflow:hidden;border-radius:var(--mch-r1);
  background:rgba(0,0,0,.26);
  box-shadow:inset 0 1px 3px rgba(0,0,0,.5), 0 1px 0 rgba(233,238,242,.05);
}
.mch-skeleton::after{
  content:"";position:absolute;inset:0;transform:translateX(-100%);
  background:linear-gradient(100deg, transparent 18%, rgba(231,235,239,.10) 48%, transparent 78%);
  animation:mch-shimmer 1.5s linear infinite;
}

/* ---------------------------------------------------------------------------
   7B. DOCUMENT — long-form prose, for the pages made of sentences.

   NUMBERED 7B RATHER THAN 8 ON PURPOSE. Inserting a whole section would have
   pushed MOTION to 9 and RESPONSIVE to 10, and five comments in this file
   point at "§9" meaning RESPONSIVE. Renumbering to look tidy would have
   silently aimed all five at the wrong section — the classic stale-reference
   bug, in a file whose whole value is that its comments are true. 7B costs one
   odd-looking heading and keeps every existing reference correct.

   WHY THIS SECTION HAD TO EXIST. Everything above builds a MARKETING page:
   headings with air around them, plates, a grid, short strings. A terms or
   privacy page is two thousand words of continuous prose with numbered
   clauses, nested lists and inline links, and the system had nothing for it.
   Worse, section 2 sets `list-style:none` on every ul and ol — right for a nav
   and a card deck, and a genuine defect on a legal page, where a list of
   obligations rendered without its markers stops looking like a list at all.
   The choice was a one-off <style> block on three pages or a component here;
   a one-off would have been a second design wearing this one's name.

   THE PROSE SITS ON THE FACEPLATE, NEVER INSIDE A PLATE, AND THAT IS A
   CONTRAST DECISION RATHER THAN A TASTE ONE. Computed against the surfaces
   these actually sit on, for --mch-t2 body copy:

       on the faceplate (--mch-ground, #26292f) ............ 5.6:1  PASS
       on the faceplate under its top sheen ................ 5.3:1  PASS
       on a .mch-plate (#3a3e46 top stop) .................. 4.6:1  marginal
       on a .mch-plate under its own radial highlight ...... 4.1:1  FAIL

   So a plate is used here only for SHORT text set in --mch-t1 (8.4:1 on the
   same surface) — the summary note and the contents list. Long prose stays on
   the ground where the ink has room. This is the trap the dark-metal theme
   sets: the plate looks like the premium place to put the words, and it is the
   one place the words go under the floor.

   TWO FACES, SAME LAW AS EVERYWHERE. The eyebrow and every stamped label are
   Martian Mono; every sentence is Archivo. Note that Archivo's variable file
   carries wght and wdth only — there is no italic axis — so <em> renders as a
   synthesised oblique. That is correct and expected; do not "fix" it by
   introducing a third font file.

   NO HUE. A legal page has no live link to report, so nothing here is green
   (section 1's list is closed and none of it applies), and the cyan the old
   pages used for links and rules is gone. An inline link is told by TWO
   hueless signals — brighter ink than the sentence around it, plus a real
   underline — so it survives greyscale and colour blindness without spending
   the accent the rest of the product needs.
   ------------------------------------------------------------------------ */
/* THE READING SIZE IS --mch-fs-prose (17px), NOT --mch-fs-body (15px), AND THAT
   IS A MEASURED CORRECTION. The legal pages shipped at 17px/1.72 before this
   port; taking them to the UI body size would have shrunk two thousand words of
   contract by 12% and called it a restyle. Measured on the rendered refund page
   at 1440px, in a 664px column:

       15px .... 90 characters per line
       17px .... 80 characters per line   (the pre-port page ran ~77)

   Both knobs moved the wrong way at 15px: smaller letters AND a longer line,
   which is the worst pairing for continuous reading. 17px puts the line back
   within a few characters of what already shipped, and section 9's rule that
   type never shrinks at the small end applies with more force here than
   anywhere — a phone is where a contract is least pleasant to read. */
.mch-doc{
  max-width:var(--mch-measure-narrow);
  font-family:var(--mch-f-ui);
  font-size:var(--mch-fs-prose);
  line-height:var(--mch-lh-prose);   /* prose, not UI: this is read, not scanned */
  color:var(--mch-t2);
}
/* The masthead: engraved kicker, the one heading, the date stamp. */
.mch-doc__head{display:flex;flex-direction:column;gap:var(--mch-s3)}
/* The date stamp. --t2 RATHER THAN --t3, AND THAT IS A MEASUREMENT.
   Sampled off the rendered page — the modal pixel of the masthead band, so it
   is the real surface including the faceplate's gradient and grain, not the
   raw token — the ground there is rgb(48,51,57). Against it:

       --mch-t3 (.56) .... 4.48:1   two hundredths UNDER the 4.5 floor
       --mch-t2 (.62) .... 5.07:1   clear

   At 11.5px this is normal-sized text, so 4.5 is the bar it has to clear and
   4.48 does not clear it. The line is also a FACT (the date the terms take
   effect), and section 1 reserves the sub-floor ink for dead controls that may
   never carry one. It still reads as secondary because it is small, tracked and
   set in the engraved face — hierarchy from FORM, which costs no contrast. */
.mch-doc__meta{
  font-family:var(--mch-f-mono);font-stretch:112.5%;font-weight:400;
  font-size:var(--mch-fs-micro);letter-spacing:1.3px;
  color:var(--mch-t2);
}
.mch-doc__lede{
  font-size:var(--mch-fs-lead);line-height:1.6;color:var(--mch-t1);
  text-wrap:pretty;margin-top:var(--mch-s4);
}

/* SECTION RHYTHM. A clause is a unit, so it gets a groove above it rather than
   only whitespace — the same engraved hairline the rest of the system uses to
   separate one milled area from another. `scroll-margin-top` clears the sticky
   nav (68px) plus a little air, so a jump from the contents list does not park
   the heading underneath the bar. */
.mch-doc__section{margin-top:var(--mch-s9);padding-top:var(--mch-s7);position:relative}
.mch-doc__section::before{
  content:"";position:absolute;left:0;right:0;top:0;height:1px;
  background:linear-gradient(90deg, rgba(0,0,0,.5), rgba(0,0,0,.5) 72%, transparent);
  box-shadow:0 1px 0 rgba(233,238,242,.06);
}
/* THE SCROLL MARGIN BELONGS ON WHATEVER CARRIES THE id, AND ON A LEGAL PAGE
   THAT IS THE SECTION, NOT THE HEADING. The h2 rule below was correct for
   markup that ids the heading; these documents id the <section> so the whole
   clause is the link target, which is right for a contract. Measured on the
   rendered terms page by following #unlock: the heading landed 32px from the
   top of a viewport with a 68px sticky nav over it — 36px of the clause title
   hidden behind the bar, on the one control whose entire job is to take you to
   that title. Both selectors are kept so either markup shape lands correctly.
   92px = the 68px rail plus enough air for the engraved groove above the
   heading to be visible, so the jump reads as arriving at a new clause. */
.mch-doc__section{scroll-margin-top:92px}
.mch-doc__section > h2{scroll-margin-top:92px}
.mch-doc h2{
  font-family:var(--mch-f-ui);font-weight:600;
  font-size:var(--mch-fs-h2);line-height:1.25;letter-spacing:.2px;
  color:var(--mch-t1);margin-bottom:var(--mch-s4);
}
.mch-doc h3{
  font-family:var(--mch-f-ui);font-weight:600;
  font-size:var(--mch-fs-h3);line-height:1.35;color:var(--mch-t1);
  margin:var(--mch-s6) 0 var(--mch-s2);
}
.mch-doc p{margin:var(--mch-s4) 0}
.mch-doc > .mch-doc__section > p:first-of-type{margin-top:0}
.mch-doc strong{font-weight:600;color:var(--mch-t1)}

/* THE CLAUSE NUMBER, STAMPED RATHER THAN SET. "1." in front of a heading is not
   part of the sentence — it is the label on the drawer — so it takes the
   engraved face, like every other label in this system, and the words take
   Archivo. Kept INSIDE the <h2> deliberately: a screen reader still announces
   "1. Our 7-day promise" as one heading, and a lawyer quoting "section 1"
   still finds a section 1. The digits are not renumbered or zero-padded; on a
   legal page the visible text is the contract, and 01 is a different string
   from 1. even if it means the same thing.

   `min-width` on a tabular-ish column so 1. and 16. start their words at the
   same x. An eye reads a ragged left edge on a numbered list as sloppiness
   before it can say why.

   NO TRACKING, WHICH IS THE ONE PLACE THIS SYSTEM'S ENGRAVED LABELS DO NOT GET
   IT. Tracking is added AFTER every glyph including the last, so "1." set at
   +1.4 renders as "1 ." with a visible gap before the full stop — it stops
   reading as a number and starts reading as a typo. Tracking earns its keep on
   a WORD; on two characters it only pulls them apart. The gap to the heading is
   bought with min-width instead, which also lines "1." and "16." up on the same
   left edge.

   INK IS --mch-t2, NOT --mch-t3, AND THAT CAME OFF A MEASUREMENT. At .72em of a
   24px heading the number is 17.3px regular — below WCAG's large-text threshold,
   so it owes the full 4.5:1. Sampled against the painted faceplate on the
   rendered page, t3 gave 4.56:1 on the mean background and 4.27:1 where the
   grain peaks; t2 gives 5.2:1. It is still a step quieter than the heading's t1
   beside it, so the hierarchy the number needs survives intact. */
.mch-doc__n{
  display:inline-block;min-width:2em;
  font-family:var(--mch-f-mono);font-stretch:112.5%;font-weight:400;
  font-size:.72em;letter-spacing:0;
  color:var(--mch-t2);vertical-align:.06em;
}

/* LISTS — the markers section 2 takes away, given back as something milled.
   The bullet is a short GROOVE (dark line, lit lower lip), which is the
   vocabulary this system already uses for every divider, rather than a dot
   borrowed from a text editor.

   SPECIFICITY IS DELIBERATE AND LOAD-BEARING: `.mch ul` in section 2 scores
   (0,1,1) and so does `.mch-doc ul`, which would leave the winner decided by
   source order alone — fine today, silently reversible the moment anyone moves
   a block. `.mch .mch-doc ul` scores (0,2,1) and wins regardless of order.

   MARKUP MUST CARRY role="list". Removing the marker also removes the list
   SEMANTICS in Safari + VoiceOver, so a reader is no longer told "list, six
   items" — on a page of legal obligations that is a real loss, and the role
   attribute is the documented way to put it back. */
.mch .mch-doc ul,.mch .mch-doc ol{list-style:none;margin:var(--mch-s4) 0;padding:0}
.mch-doc li{position:relative;padding-left:26px;margin:var(--mch-s3) 0}
.mch-doc ul > li::before{
  content:"";position:absolute;left:2px;top:.75em;width:11px;height:1px;
  background:rgba(0,0,0,.55);box-shadow:0 1px 0 rgba(233,238,242,.18);
}
/* A numbered clause counts in the ENGRAVED face, because a number that labels
   a thing is a stamp, not a sentence.

   SCOPED TO .mch-doc__section, AND THE UNSCOPED VERSION SHIPPED A VISIBLE BUG.
   Written as `.mch-doc ol` this also caught the contents list, whose entries
   already carry their own numbers inside the link text ("1. Qui nous sommes"),
   because those numbers are part of the clause's NAME and have to match the
   heading they point at. Rendered, every row read:

       1   1. Qui nous sommes et votre accord
       9   9. Notre propriété intellectuelle

   A counter belongs to a list that is being numbered, not to a list of things
   that are already numbered. Confining it to lists inside a clause is the
   distinction, and it is why the TOC's own rules no longer have to fight a
   more specific selector for their padding. */
.mch-doc__section ol{counter-reset:mch-clause}
.mch-doc__section ol > li{counter-increment:mch-clause;padding-left:32px}
.mch-doc__section ol > li::before{
  content:counter(mch-clause);position:absolute;left:0;top:0;
  font-family:var(--mch-f-mono);font-stretch:112.5%;font-size:var(--mch-fs-micro);
  color:var(--mch-t3);line-height:1.72;
}

/* AN INLINE LINK. Brighter ink than the sentence plus a hairline underline set
   below the baseline — two signals, no hue. The underline is what makes it
   legible as a link in greyscale and to a colour-blind reader; the ink lift is
   what makes it findable while skimming. */
/* WHY THIS ONE IS SCOPED WITH TWO CLASSES. Measured on the rendered refund page
   before the anchor reset in section 2 was wrapped in :where(), a bare
   `.mch-link` at (0,1,0) lost outright to that reset at (0,1,1):

       computed color ........... rgba(231,235,239,0.62)   identical to body
       computed text-decoration . none

   So every inline link on the legal pages — the support address, the cross-link
   to the Terms, Stripe's own privacy policy — was painted exactly like the
   sentence around it. Nothing marked it: not colour, not weight, not an
   underline. That is WCAG 2.2 1.4.1, and in plainer words a Terms link on a
   Refund page that no visitor could see was a link.

   Section 2's reset is now (0,0,1) and a single class would be enough, but the
   two-class form is kept: it costs nothing and it holds even if someone later
   re-specialises that reset. */
.mch .mch-link{
  color:var(--mch-t1);
  text-decoration:underline;
  text-decoration-color:rgba(199,203,208,.48);
  text-decoration-thickness:1px;
  text-underline-offset:3.5px;
  transition:text-decoration-color var(--mch-ink) ease, color var(--mch-ink) ease;
}
.mch .mch-link:hover{color:#f2f5f7;text-decoration-color:rgba(226,232,238,.95)}

/* THE SUMMARY NOTE — "the short version" at the top of a legal page. It is a
   lifted plate with a seam tab naming it, which is the same way the app labels
   a control deck. Short text only, and set in --mch-t1 for the contrast reason
   in this section's header. */
.mch-note{
  position:relative;
  margin:var(--mch-s8) 0 0;
  padding:var(--mch-s7);
  color:var(--mch-t1);
}
/* The tab sits over the LEFT edge rather than centred, so it lines up with the
   prose beneath it — on a page of left-aligned sentences a centred tab is the
   one element that agrees with nothing. `transform:none` is required, not
   cosmetic: .mch-seam-tab centres itself with left:50% AND a -50% translate,
   so overriding only `left` would shift the tab left by half its own width. */
.mch-note > .mch-seam-tab{
  left:var(--mch-s7);
  transform:none;
}
/* THE NOTE STRADDLING THE SEAM — opt-in, for a page whose masthead sits on dark
   .mch-stage metal and whose prose runs on the lighter faceplate. A plate
   lifted across that join is the move the app makes with its control deck, and
   it is what stops the two bands reading as two unrelated pages stacked up.
   z-index is not decoration: .mch-stage is position:relative, so without a lift
   the stage paints its own bottom edge over the plate's cast shadow and the
   plate looks pasted on rather than bolted through. */
.mch-note--seam{
  /* THE LIFT SCALES, AND A FIXED -48px DID NOT SURVIVE A PHONE. The room this
     plate rises into is the stage's own bottom padding, and .mch-section spends
     clamp(56px, 7vw, 112px) on that — so the space available at 390px is HALF
     what it is at 1440px, while a fixed offset asked for the same 48px at both.
     Measured at 390px before this: the seam tab's top sat 5px ABOVE the bottom
     of the lede, i.e. a stamped metal tab printed over the last line of the
     opening sentence. Tying the lift to the same viewport that sets the padding
     keeps the clearance roughly constant — re-measured after: 21px at 390px,
     55px at 1440px. The tab itself rides a further 11px above the plate, which
     is why the small end is deliberately well under half the padding. */
  margin-top:calc(clamp(24px, 3.2vw, 48px) * -1);
  z-index:3;
}
.mch-note p{margin:var(--mch-s3) 0;color:var(--mch-t1)}
.mch-note p:first-of-type{margin-top:0}
.mch-note .mch-doc__big{
  font-family:var(--mch-f-ui);font-weight:600;
  font-size:var(--mch-fs-lead);line-height:1.4;color:var(--mch-t1);
}
.mch .mch-note ul{list-style:none;margin:var(--mch-s3) 0 0;padding:0}
.mch-note li{position:relative;padding-left:26px;margin:var(--mch-s3) 0;color:var(--mch-t1)}
.mch-note li::before{
  content:"";position:absolute;left:2px;top:.75em;width:11px;height:1px;
  background:rgba(0,0,0,.55);box-shadow:0 1px 0 rgba(233,238,242,.18);
}

/* THE CONTENTS LIST — a recessed plate, because a table of contents is a thing
   you look INTO rather than a thing that stands proud of the page. Two columns
   where there is room; one where there is not, which is a container decision
   and so lives on the element, not in a viewport media query. */
.mch-toc{margin:var(--mch-s8) 0 0;padding:var(--mch-s6) var(--mch-s7)}
.mch .mch-toc ol{
  list-style:none;margin:var(--mch-s4) 0 0;padding:0;
  columns:2;column-gap:var(--mch-s8);
}
.mch-toc li{margin:0;padding:0;break-inside:avoid}
.mch-toc__link{
  display:block;padding:7px 0;
  font-size:var(--mch-fs-sub);line-height:1.4;color:var(--mch-t2);
  transition:color var(--mch-ink) ease;
}
.mch-toc__link:hover{color:var(--mch-t1)}
/* The clause number is reused here so the contents list and the headings it
   points at carry the same stamp. It does NOT inherit .mch-doc__n's relative
   .72em: against a 14px row that would compute to 10px, under the 11px floor
   this system holds every engraved label to. Pinned to --mch-fs-micro instead,
   and given room for two digits and a full stop so "16." does not shove its
   title out of line with "1."'s. */
.mch-toc .mch-doc__n{font-size:var(--mch-fs-micro);min-width:2.6em}
@media (max-width:640px){
  .mch .mch-toc ol{columns:1}
}
@media (pointer:coarse){
  .mch-toc__link{padding:11px 0}
}

/* ---------------------------------------------------------------------------
   8. MOTION — and the switch that stands it down.
   ------------------------------------------------------------------------ */
/* THESE THREE ARE THE PROTOTYPE'S NUMBERS, VERBATIM, AND THE FIRST CUT OF THIS
   FILE INVENTED ITS OWN — which was a real error on a locked design, because
   the numbers are DATA rather than taste. Standby's ceiling (1.16) is chosen to
   stay below live's floor (1.00) in absolute terms, since the standby bulb is
   grey and the live one is green: that is what stops a still photograph caught
   mid-cycle from confusing "waiting" with "working". The invented values
   (breathe to 1.35, idle from .88) narrowed exactly that gap.
       The blink's split is 54/55, not 50/50, and that asymmetry is also
   deliberate: a fault is LIT for more of its cycle than it is dim, so a
   screenshot — or a glance — is more likely to catch it on. */
@keyframes mch-lamp-breathe{0%,100%{filter:brightness(1)}50%{filter:brightness(1.22)}}
@keyframes mch-lamp-idle{0%,100%{filter:brightness(.82)}50%{filter:brightness(1.16)}}
@keyframes mch-lamp-blink{0%,54%{opacity:1}55%,100%{opacity:.32}}
@keyframes mch-shimmer{to{transform:translateX(100%)}}

/* THE STAND-DOWN IS SUBTRACTIVE ONLY: nothing hides, no state is dropped, no
   colour changes. The lamps keep their shape, their hue and their word and
   simply stop pulsing. A page that respects this does not need to test for it
   anywhere else. */
@media (prefers-reduced-motion:reduce){
  .mch-lamp.is-live::after,
  .mch-lamp.is-standby::after,
  .mch-lamp.is-fault::after,
  .mch-skeleton::after{animation:none}
  /* A fault must still be unmistakable with the blink taken away, so its
     stopped frame is the LIT one, never the dim one. */
  .mch-lamp.is-fault::after{opacity:1}
  .mch *,.mch *::before,.mch *::after{
    transition-duration:.01ms !important;
    scroll-behavior:auto !important;
  }
}

/* ---------------------------------------------------------------------------
   9. RESPONSIVE — it has to hold at 390px and at 1440px.

   THE TYPE DOES NOT SHRINK AT THE SMALL END, AND THAT IS THE WHOLE STRATEGY.
   The instinct on a narrow phone is smaller letters, which is how the device
   that needs legibility most ends up with the least of it. Width is bought
   back from the GUTTER, which is furniture, and from the padding inside
   surfaces. Nothing in the small block lowers a type size.
   ------------------------------------------------------------------------ */

/* WIDE — the retune the phone recipes genuinely need, and the reason the two
   surface knobs exist. A brushed streak drawn every 11px is right on a 412px
   phone held 30cm away; across a 1200px plate on a monitor at 60cm it reads as
   a flat wash, because the same period covers three times the visual angle. So
   the period opens up and the hairline is given back a little alpha. This is
   the ONLY place either is touched. */
@media (min-width:1000px){
  :root{
    --mch-brush-alpha:.020;
    --mch-brush-period:14px;
    --mch-grain-opacity:.36;
  }
  .mch-plate{padding:var(--mch-s8)}
}

/* SMALL — 390px and below. */
@media (max-width:430px){
  :root{
    --mch-gutter:18px;
    /* Section rhythm compresses; a 112px band of air on a 390px screen is a
       scroll the visitor pays for and gets nothing back from. */
    --mch-s11:64px;
    --mch-s12:80px;
  }
  .mch-plate{padding:var(--mch-s6)}
  .mch-btn{letter-spacing:2px}
  .mch-nav{min-height:60px;gap:var(--mch-s3)}
  /* 24px is the mark's own floor for a readable cut, and the brand row has no
     spare width here — see .mch-mark. */
  .mch-mark{width:24px;height:24px}
  /* THE LINKS BECOME A SCROLL RAIL, AND NOTHING IS HIDDEN.
     Four tracked-caps labels plus the wordmark do not fit in 375px, and the
     earlier attempt to squeeze them (gap:0 + tighter padding) still ran 193px
     past the edge — it treated a shortfall of two whole labels as a padding
     problem. The choices were: drop links (navigation you cannot reach), shrink
     the type (§9 forbids), wrap to a second row (a 104px sticky bar eating an
     844px phone), or let the rail scroll. Scrolling keeps every link reachable,
     holds the bar at 60px, and scales to a real site's longer menu.
     overflow-x on the rail — never on the page — is what stops the document
     itself from widening. */
  .mch-nav__links{
    gap:0;
    flex:1 1 auto;
    overflow-x:auto;
    overflow-y:hidden;
    /* flex-START, and this is the whole lesson of the first attempt. With
       flex-end the rail renders already scrolled to its far end, so the visitor
       opens the page to "…ERIALS  PARTS" — the first two links gone and a word
       chopped mid-syllable. (Under flex-end an overflowing flex line puts the
       overflow at the START, where it is also famously hard to scroll back to.)
       Reading order wins: the rail begins at the first link and scrolls right. */
    justify-content:flex-start;
    scrollbar-width:none;                 /* the bar is 60px; a scrollbar in it
                                             would be furniture, not a control */
    -webkit-overflow-scrolling:touch;
    overscroll-behavior-x:contain;        /* a swipe at the end of the rail must
                                             not turn into a page-level back
                                             gesture on iOS */
    scroll-snap-type:x proximity;
    /* THE TRAILING EDGE FADES, BECAUSE A HIDDEN CONTROL IS A MISSING CONTROL.
       Measured after the scroll fix: "Materials" and "Parts" sat entirely
       off-rail with nothing on screen suggesting they existed — a rail that
       scrolls but does not SAY it scrolls is the "why is this here / where did
       that go" failure the spec's §9 rules out. The fade is the cheapest honest
       affordance: the last label dissolves into the rail instead of ending at a
       hard edge, which reads as "this continues". It is static rather than
       scroll-linked on purpose — scroll-driven animation is not yet safe to
       depend on, and a fade that is always on is never WRONG, only redundant
       once you reach the end. */
    -webkit-mask-image:linear-gradient(90deg, #000 calc(100% - 28px), transparent);
    mask-image:linear-gradient(90deg, #000 calc(100% - 28px), transparent);
  }
  .mch-nav__links::-webkit-scrollbar{display:none}
  .mch-nav__link{padding:0 var(--mch-s3);flex:none;scroll-snap-align:end}
  .mch-row{min-height:52px}
  /* THE READOUT MAY NOT CLIP ITS OWN DIGITS. .mch-channel is overflow:hidden —
     it has to be, the scanlines and vignette are painted to its edges — and a
     flex child in an overflow:hidden box shrinks to nothing before the box
     does. So let the CHANNEL give instead. A clipped digit is not a smaller
     number; it is a different number. */
  .mch-channel{padding:0 var(--mch-s2)}
  .mch-channel > *{min-width:0}
}

/* VERY SMALL — 360px and below, the hardest width this is proved at. */
@media (max-width:360px){
  :root{--mch-gutter:16px}
  /* --mch-fs-nano is ABSENT ON PURPOSE and must stay absent: the lamp's word
     is the one legend that may never be missed, and .mch-lamp-label floors it
     at 11px anyway. Do not add it here "for consistency". */
}

/* PRINT — the metal is a screen material; on paper it is ink on white. Keeping
   a dark brushed background would burn a cartridge and read worse. */
@media print{
  .mch{background:#fff;color:#000}
  .mch-metal,.mch-plate,.mch-deck,.mch-nav,.mch-footer,.mch-stage{
    background:none !important;box-shadow:none !important;
    border:1px solid #999;
  }
  .mch-grain::after,.mch-screw{display:none}
  .mch-wordmark{color:#000;text-shadow:none}
}

/* ---------------------------------------------------------------------------
   7C. THE PURCHASE PATH — the parts /buy and /thanks needed and the system
   did not have.

   APPENDED AT THE END, NOT SLOTTED IN BESIDE 7B, and that is a working
   decision rather than an aesthetic one: three pages are being restyled
   against this file at the same time, and an insert in the middle moves every
   line number under it. Everything below is either a NEW class or a modifier
   of an existing one; nothing above is edited, with one deliberate exception
   noted at the placeholder rule.

   WHY EACH PART EXISTS. The marketing vocabulary above assumes short strings
   in plates and a grid of cards. A purchase page is a different animal: a
   term-and-what-it-means table that has to be scannable and legally exact, a
   numbered sequence of what happens after the money leaves, a single line
   that has to speak five different outcomes without moving focus, and a
   waiting state that must not be a spinner. None of those existed.

   THE CONTRAST RULE FROM 7B GOVERNS ALL OF IT. --mch-t2 measures 4.6:1 on a
   .mch-plate's brightest stop and 4.1:1 under its own highlight, so a plate is
   the wrong home for a paragraph. Every long string down here therefore sits
   either on the faceplate or inside .mch-plate--sunk, whose surface is dark
   enough to give the ink room. That is why the buy page is a metal FRAME
   around a recessed well rather than one flat panel: the composition is what
   makes the contrast legal, not a colour override.
   ------------------------------------------------------------------------ */

/* A FRAMED PLATE — a thin metal surround whose job is to hold a recessed well.
   The frame is deliberately narrow (8px): the well inside brings the system's
   own plate padding, and two full paddings stacked would eat 96px of a 354px
   phone. Frame + well = one visible object with two surfaces, which is how a
   real instrument's faceplate meets its milled-out recess. */
/* ONE NUMBER GOVERNS BOTH INSETS. The head band sits directly on the frame's
   metal and the well brings its own padding, so if the two are written
   separately they disagree — and they disagree by 20px at 1440px, which puts
   the price window and the first term on two different left edges. --mch-inset
   is declared on the frame and read by both, so they cannot drift.
   The well's radius is the frame's minus the frame's width (18 - 8 = 10 = r2),
   which is what makes the two corners concentric instead of nearly-matching. */
.mch-plate--framed{padding:var(--mch-s2);--mch-inset:var(--mch-s6)}
@media (min-width:1000px){
  .mch-plate--framed{--mch-inset:var(--mch-s7)}
}
.mch-plate--framed > .mch-plate--sunk{
  padding:var(--mch-inset);
  border-radius:var(--mch-r2);
}
/* The head band above the well: the readout and the label stamped beside it.
   Its top padding also buys the clearance a .mch-seam-tab needs, since the tab
   hangs 13px above the plate's own top edge. */
.mch-plate__head{
  display:flex;flex-wrap:wrap;align-items:center;
  gap:var(--mch-s3) var(--mch-s5);
  padding:var(--mch-s6) var(--mch-inset) var(--mch-s5);
}

/* THE SPEC LIST — term on the left, what it actually means on the right.
   A <dl>, because that is what this is; the rows are <div> wrappers, which
   HTML permits inside a dl and which give each pair something to draw a groove
   on. The divider is the engraved pair used everywhere else (a dark line with
   a lit lower lip), never a grey 1px border.

   THE COLUMN COLLAPSES AT 640px AND NOT AT A PHONE WIDTH, because this list
   lives inside a well inside a frame inside a column: it runs out of room well
   before the viewport does. 11.5rem holds the longest term used here ("Your
   card stays with Stripe") on two lines without hyphenating. */
/* THE dd RESET IS NOT COSMETIC. Section 2 resets p, ul and ol but never dl,
   so a <dd> keeps the UA's `margin-left:40px`. Rendered, that pushed every
   description 40px right of its own grid column at 1440px and gave the
   collapsed one-column layout at 390px a stray indent that read as a bug. */
.mch-spec,.mch-spec dt,.mch-spec dd{margin:0}
.mch-spec{display:block}
.mch-spec__row{
  position:relative;display:grid;align-items:baseline;
  grid-template-columns:minmax(0, 11.5rem) 1fr;gap:var(--mch-s2) var(--mch-s5);
  padding-block:var(--mch-s5);
}
.mch-spec__row + .mch-spec__row::before{
  content:"";position:absolute;left:0;right:0;top:0;height:1px;
  background:rgba(0,0,0,.42);box-shadow:0 1px 0 rgba(233,238,242,.05);
}
.mch-spec__row:first-child{padding-top:0}
.mch-spec__row:last-child{padding-bottom:0}
.mch-spec__term{
  font-family:var(--mch-f-ui);font-weight:600;
  font-size:var(--mch-fs-body);line-height:1.4;color:var(--mch-t1);
}
.mch-spec__def{
  font-family:var(--mch-f-ui);font-weight:400;
  font-size:var(--mch-fs-body);line-height:1.6;color:var(--mch-t2);
}
@media (max-width:640px){
  .mch-spec__row{grid-template-columns:1fr;gap:var(--mch-s1)}
}

/* NUMBERED STEPS — what happens next, in order. The number is engraved (mono,
   tracked, zero-padded) and sits in its own column so the sentences beside it
   all start on the same vertical line however long the numbers get.

   The groove is on ::after and the counter on ::before because both are needed
   at once; putting the divider on a border-top would give a flat grey line on
   a surface where every other divider is a milled groove. */
.mch-steps{counter-reset:mch-step}
.mch-steps > li{
  position:relative;counter-increment:mch-step;
  display:grid;grid-template-columns:auto 1fr;gap:var(--mch-s2) var(--mch-s5);
  padding-block:var(--mch-s5);
}
.mch-steps > li::before{
  content:counter(mch-step, decimal-leading-zero);
  font-family:var(--mch-f-mono);font-stretch:112.5%;font-weight:400;
  font-size:var(--mch-fs-micro);letter-spacing:1.9px;
  color:var(--mch-t3);text-shadow:0 1px 0 rgba(0,0,0,.35);
  padding-top:3px;
}
.mch-steps > li::after{
  content:"";position:absolute;left:0;right:0;top:0;height:1px;
  background:rgba(0,0,0,.38);box-shadow:0 1px 0 rgba(233,238,242,.055);
}
.mch-steps__title{
  display:block;font-family:var(--mch-f-ui);font-weight:600;
  font-size:var(--mch-fs-body);line-height:1.35;color:var(--mch-t1);
}
.mch-steps__body{
  display:block;font-size:var(--mch-fs-body);line-height:1.6;
  color:var(--mch-t2);margin-top:4px;
}
.mch-steps__act{display:block;margin-top:var(--mch-s4)}

/* THE STATUS LINE — one element that has to speak five outcomes without
   stealing focus. It reserves its own height so the layout never jumps when a
   message arrives, which is the whole reason it is a component and not a
   paragraph: a line that appears and pushes the button down is a line that
   gets misclicked.

   --warn USES AMBER BECAUSE EVERY STATE IT CARRIES IS A TRANSIENT FAULT that
   will clear on the next attempt — rate limits, an unreachable server, a
   provider wobble. That is the one job section 1 licenses amber for.

   IT USES THE LIT AMBER, NOT THE BASE ONE, AND THAT IS A MEASUREMENT. --mch-amber
   is right on dark glass and runs out on metal: composited onto the real
   rendered surface it gives 4.1:1 on a .mch-plate, which fails AA on the one
   line that tells somebody their payment attempt went wrong. --mch-amber-lit is
   not a new hue — it is the exact value the fault lamp already uses as amber's
   lit face — and it measures 6.2:1 on that same plate and 8.9:1 in a sunk well. */
.mch-status{
  min-height:1.5em;margin-top:var(--mch-s3);
  font-family:var(--mch-f-ui);font-size:var(--mch-fs-sub);line-height:1.45;
  color:var(--mch-t2);
}
:root{
  /* Naming a value the file already contains, rather than inventing a colour:
     this is the top stop of the fault lamp's own gradient. */
  --mch-amber-lit:#e3c096;
}
.mch-status--warn{color:var(--mch-amber-lit)}

/* A READOUT CARRYING A VALUE rather than a sentence. .mch-slot--text drops to
   the lead size so a long URL stays readable; a price and a licence key are
   the other case — few characters, and the number is the point. Declared here,
   after --text, so a slot carrying both classes takes this size. */
.mch-slot--value{
  /* THE SIZE IS A KNOB, and it has to be. A price is six characters and a
     licence key is nineteen or more, so one clamp cannot serve both: at the
     price's size the key wrapped mid-token ("TTHR-7K4M-9Q2R-" / "8T5V"), and a
     key broken across two lines is a key somebody retypes wrong. The host
     retunes --mch-slot-size rather than re-solving the type scale, which is the
     same pattern .mch-screw uses for its insets. */
  font-size:var(--mch-slot-size, clamp(24px, 3.2vw, 38px));
  letter-spacing:1.5px;line-height:1.2;
}
/* A RAIL WHOSE LABEL IS A SENTENCE. .mch-rail pins its labels to `nowrap` so a
   stamped two-word label ("Pairing code 8-char") never breaks mid-phrase. That
   is right for a label and wrong for a section heading: measured at 360px,
   "What happens when you press buy" is 326px of nowrap in a 328px column and
   took the whole DOCUMENT 5px sideways — the one failure section 9 says must
   never happen. A heading that wraps to two lines is worse-looking than one
   that does not, and far better than a page you can scroll off the edge of.

   `flex` is set as well as `white-space`, and leaving it out is why the first
   attempt at this changed nothing: .mch-rail pins its labels to `flex:none`,
   whose auto basis resolves to the label's MAX-content width, so the box stayed
   exactly as wide as the unwrapped sentence no matter what wrapping was
   permitted inside it. It must be allowed to shrink before it is allowed to
   wrap. `0 1 auto` rather than `1 1 auto`: it may give room back, never take
   room from the groove. */
.mch-rail--long > .mch-micro{white-space:normal;flex:0 1 auto;min-width:0}

/* AN ENGRAVED LABEL ON BRIGHT METAL. Measured from the render, compositing the
   declared ink onto the real surface: the same .mch-micro reads 5.3:1 on the
   faceplate and 3.8:1 on a lifted .mch-plate, because the plate is the
   brightest surface in the system and --mch-t2 runs out of room on it. Section
   7B already found this for paragraphs; a stamped label carrying a FACT
   ("one year · no auto-renewal", "1 PC and 2 phones") has the same problem and
   had no modifier for it. --dim goes the other way, for a label that is only
   naming a thing. */
.mch-micro--bright{color:var(--mch-t1)}

/* A SEAM TAB OVER THE LEFT EDGE. .mch-note already does this for a summary
   note; a page with two stacked plates needs the same option on a plain one, or
   the two tabs sit on different axes and the pair reads as an accident. The
   `transform:none` is required rather than cosmetic: .mch-seam-tab centres
   itself with left:50% AND a -50% translate, so overriding only `left` would
   shift the tab left by half its own width. */
.mch-seam-tab--left{left:var(--mch-s7);transform:none}

/* One click or one tap selects the WHOLE key. A licence code is copied far
   more often than it is read, and a partial selection of a bearer credential
   is worse than none. */
.mch-slot--code{-webkit-user-select:all;user-select:all}
/* The code window keeps its vertical padding at every width. The 430px block
   in section 9 flattens .mch-channel to `padding:0 var(--mch-s2)` so a pairing
   readout can give up side room; this window wraps instead of shrinking, so it
   needs the height back. */
.mch-channel--code{padding:var(--mch-s5) var(--mch-s4)}

/* THE CORD — the waiting state, and the reason it is not a spinner. A spinner
   says "something is happening somewhere"; this says "a line is open and
   something is travelling along it", which is both truer and the product's own
   metaphor. Two terminals, a track, one pulse crossing it.

   IT IS HUELESS, DELIBERATELY. Waiting for Stripe's webhook is not a live
   end-to-end link, and section 1's list is closed: a green pulse here would be
   the system's one colour telling a lie in the most expensive place on the
   site. Under reduced motion the pulse simply parks mid-track — nothing is
   hidden, the state is still legible. */
.mch-cord{position:relative;width:132px;height:14px;flex:none}
.mch-cord__end{
  position:absolute;top:50%;width:9px;height:9px;border-radius:50%;
  transform:translateY(-50%);
}
.mch-cord__end--a{left:0;box-shadow:inset 0 0 0 2px var(--mch-edge), 0 1px 1px rgba(0,0,0,.5)}
.mch-cord__end--b{right:0;background:var(--mch-edge);box-shadow:0 1px 1px rgba(0,0,0,.5)}
.mch-cord__track{
  position:absolute;left:13px;right:13px;top:50%;height:3px;
  transform:translateY(-50%);border-radius:2px;overflow:hidden;
  background:linear-gradient(180deg, rgba(0,0,0,.55), rgba(0,0,0,.35));
  box-shadow:inset 0 1px 2px rgba(0,0,0,.7), 0 1px 0 rgba(233,238,242,.07);
}
.mch-cord__pulse{
  position:absolute;top:0;bottom:0;width:38%;border-radius:2px;
  background:linear-gradient(90deg, transparent, rgba(226,236,242,.75), transparent);
  animation:mch-cordrun 1.7s var(--mch-spring) infinite;
}
@keyframes mch-cordrun{from{left:-42%}to{left:104%}}

/* A CAUTION NOTE — a .mch-note whose seam tab is the warning. Hueless on
   purpose: amber is reserved for a transient FAULT and nothing here has
   failed, so the alarm is carried by the stamped tab, the lifted edge and the
   words, which is the same way the system tells three lamp states apart
   without relying on colour. The tab's ink is lifted to --mch-t1 because a
   caution that whispers is decoration. */
.mch-note--caution{
  padding-top:var(--mch-s7);
}
.mch-note--caution > .mch-seam-tab{
  color:var(--mch-t1);
  box-shadow:
    inset 0 1px 0 rgba(216,222,228,.42),
    inset 0 -1px 1px rgba(0,0,0,.5),
    0 2px 4px rgba(0,0,0,.4);
}

/* THE PLACEHOLDER, AND THE ONE RULE DOWN HERE THAT CHANGES SOMETHING ABOVE.
   .mch-field::placeholder was --mch-t4, which section 1 states plainly is for
   dead controls and "may never carry a fact". A placeholder reading
   "you@example.com" is a fact — it is telling the visitor what shape of thing
   to type. Measured on the field's own surface (#1e2126 to #23262b): t4 gives
   2.4:1, t3 gives 5.1:1. This raises it to t3. It can only ever increase
   contrast, so no page that already uses .mch-field is harmed. */
.mch-field::placeholder{color:var(--mch-t3)}

/* ---------------------------------------------------------------------------
   THE `font:inherit` SHORTHAND WAS QUIETLY UNDOING EVERY BUTTON AND EVERY CODE
   FIELD IN THIS FILE. Measured, with a control, not reasoned:

     <button class="mch-btn mch-btn--primary">  computed font-weight  400
     <a      class="mch-btn mch-btn--primary">  computed font-weight  700   <- control
     <input  class="mch-field mch-field--code"> computed family Archivo, stretch 100%

   Section 2 sets `.mch button,.mch input,.mch textarea,.mch select{font:inherit}`
   so a form control does not fall back to the UA's font. That selector is
   (0,1,1); `.mch-btn` and `.mch-field` are (0,1,0), so the shorthand wins — and
   `font` is a SHORTHAND, so it resets family, size, weight, stretch AND
   line-height to the inherited values in one go. Every primary button on the
   site has therefore been rendering at 400 against a spec that says Archivo
   700, and .mch-field--code has been rendering a pairing code in the prose face
   at normal width instead of Martian Mono at 112.5%.

   It is fixed HERE, by raising specificity, rather than by editing section 2,
   for two reasons: three pages are being restyled against this file at the same
   time and an append cannot collide with them, and `font:inherit` is doing a
   real job for controls that carry no component class. Only elements that ASK
   for the component get their declared type back.
   ------------------------------------------------------------------------ */
.mch button.mch-btn,.mch a.mch-btn{
  font-family:var(--mch-f-ui);
  font-size:var(--mch-fs-btn);
  font-weight:600;
  line-height:1.25;
}
.mch button.mch-btn--primary,.mch a.mch-btn--primary{font-weight:700}
.mch input.mch-field,.mch textarea.mch-field{
  font-family:var(--mch-f-ui);
  font-size:var(--mch-fs-body);
}
.mch input.mch-field--code{font-family:var(--mch-f-mono);font-stretch:112.5%}

/* A HONEYPOT — a decoy field only a bot fills in. NOT display:none, which the
   better bots skip, and NOT left:-9999px, which parks a real box far outside
   the layout and counts toward the scrollable area (section 2 hit exactly that
   with the skip link). Clipped to 1px: no width for the document to inherit,
   still present and fillable for anything reading the DOM. aria-hidden and
   tabindex="-1" belong on the markup, not here. */
.mch-hp{
  position:absolute;width:1px;height:1px;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap;
}

@media (prefers-reduced-motion:reduce){
  .mch-cord__pulse{animation:none;left:31%}
}

@media print{
  .mch-plate__head,.mch-note--caution{padding:0}
  .mch-cord,.mch-seam-tab{display:none}
  .mch-spec__def,.mch-steps__body,.mch-status{color:#000}
  .mch-channel{background:none !important;box-shadow:none !important;border:1px solid #999}
  .mch-slot{color:#000;text-shadow:none}
}

/* ---------------------------------------------------------------------------
   7D. PRINT, FOR THE PAGES MADE OF SENTENCES — appended at the end for the
   same reason 7C is: several pages are being restyled against this file at
   once, and a block inserted mid-file moves every line under it.

   THIS FIXES A MEASURED, INVISIBLE-ON-PAPER BUG. The print block in section 9
   turns the page itself to ink on white with `.mch{background:#fff;color:#000}`
   — and that is all it does. Colour is inherited, so it only reaches elements
   that do not set their own; every text component here DOES set its own. Read
   back with the renderer's media emulated to `print`, before this block:

       body ............ rgb(0,0,0) on rgb(255,255,255)   correct
       .mch-doc ........ rgba(231,235,239,0.62)           near-white
       .mch-doc h2 ..... rgba(238,242,245,0.92)           near-white
       .mch-note ....... rgba(238,242,245,0.92)           near-white
       .mch-footer__link rgba(231,235,239,0.62)           near-white
       .mch-fine ....... rgba(231,235,239,0.56)           near-white

   Near-white on white is about 1.1:1 — a printed page with the furniture on it
   and none of the words. That matters most on exactly these pages: terms,
   privacy and refund are the pages a person prints or saves as a PDF, and a
   Quebec consumer may need a French copy on paper. It reached the 404 page too,
   since .mch-footer__link and .mch-fine are shared.

   The three things that DISAPPEAR are the ones the pages already dropped when
   they carried their own print styles: the sticky bar, the skip link and the
   contents list are all ways of MOVING around a document, and none of them can
   move anything once it is on paper. The words stay; the controls go.
   ------------------------------------------------------------------------ */
@media print{
  /* Every component that carries its own ink has to give it back on paper. */
  .mch-doc,.mch-doc p,.mch-doc li,.mch-doc strong,.mch-doc em,
  .mch-doc h2,.mch-doc h3,.mch-doc__lede,.mch-doc__meta,.mch-doc__big,
  /* .mch-doc__n was missing here and it matters more than it looks: measured
     under emulated print media it kept its screen ink, rgba(231,235,239,.62),
     which is very nearly white ON WHITE PAPER. Every clause number in a printed
     contract disappeared, and a contract is exactly the document people print
     and then refer to by number. */
  .mch-doc__n,
  /* .mch-seam-tab too, and it is here because of a change made in this same
     pass: the tab's label was moved to --t1 to clear 4.5:1 on its own bright
     metal, which on paper is near-white ink. Brightening something for the
     screen is exactly how a print stylesheet falls behind. */
  .mch-seam-tab,
  .mch-note,.mch-note p,.mch-note li,
  .mch-h1,.mch-h2,.mch-h3,.mch-lead,.mch-body,.mch-sub,.mch-fine,
  .mch-micro,.mch-submark,.mch-label,.mch-mono,
  .mch-footer__link,.mch-nav__link{
    color:#000;
    text-shadow:none;
  }
  /* TWO-CLASS SCREEN RULES NEED TWO-CLASS PRINT RULES. The list above is all
     single-class selectors, so anything declared with two beats it and keeps
     its screen ink. Caught by auditing every text node under emulated print
     media rather than spot-checking: `.mch-note .mch-doc__big` (0,2,0) held
     --t1 and printed the refund page's headline promise — "7 days to change
     your mind" — in near-white on white paper. */
  .mch .mch-note .mch-doc__big,
  .mch .mch-note p,
  .mch .mch-note li,
  /* The you-are-here footer link is the same trap one layer along: an attribute
     selector also scores a class, so `.mch-footer__link[aria-current]` outranks
     the plain list and printed the current page's own name in white. */
  .mch .mch-footer__link[aria-current],
  .mch .mch-link{color:#000}

  /* A link must stay identifiable once the ink is all one colour, so on paper
     the underline is the ONLY signal left and it has to be a firm one. */
  .mch .mch-link{color:#000;text-decoration:underline;text-decoration-color:#000}

  /* The engraved groove is a lit lip on dark metal — it is nothing on white.
     The bullet becomes a real printed dash, and the clause divider a hairline. */
  .mch-doc ul > li::before{background:#000;box-shadow:none;height:1px}
  .mch-note li::before{background:#000;box-shadow:none;height:1px}
  .mch-doc__section::before{background:#999;box-shadow:none}
  .mch-doc__section ol > li::before{color:#000}
  .mch-rule{background:#999;box-shadow:none}

  /* The summary note keeps its boundary so it still reads as an aside, but as
     a printed rule rather than a milled edge. */
  .mch-note{border:1px solid #999;background:none !important;box-shadow:none !important}

  /* Ways of MOVING around the document, which paper does not have. */
  .mch-nav,.mch-skip,.mch-toc{display:none}
}
