/* ══════════════════════════════════════════════════════════════════════════════
   RTM AUDIO v2 — THE PRODUCT PAGES.

   ⚠ READ THIS BEFORE CHANGING ANYTHING HERE.

   The six product bodies are 2,446 lines of HAND-WRITTEN markup — the only pages on this site
   that were written rather than generated, and the only ones that shipped with zero em dashes
   before any of my work touched them. Re-tagging them to fit a new stylesheet would throw that
   writing away and would be six separate chances to break a claim.

   So this file does NOT redefine forty components. It is a TOKEN BRIDGE: it loads after
   /site.css and re-points the values site.css already resolves — ground, ink, rules, face,
   accent — at the v2 palette, then removes the three pieces of furniture that are specifically
   old-site (the blueprint grid, the binding rail, the serif display face).

   The result: hand-written markup untouched, and the page reads in the same register as the
   room the visitor just came from.

   Load order on a product page:  /fonts.css → /site.css → /v2/base.css → /v2/product.css
   (base.css is loaded for `.bar`, `.ground`, `.room-light` and the [hidden] guard.)
   ══════════════════════════════════════════════════════════════════════════════ */

:root{
  /* the ground and the light, from base.css's palette */
  --void:#0b0b0d;
  --ink:#efece5;         /* --chalk   */
  --ink-2:#b9b5ac;       /* --chalk-2 */
  --ink-dim:#8e8b85;     /* --dust    */
  /* ⚠ MEASURED, NOT PICKED. site.css shipped --ink-faint at 3.02:1 and its own comment said so;
     my first v2 value was 3.54:1, still under AA. On these pages --ink-faint is not furniture —
     it sets the spec-table KEYS and the figure captions, which is content people read at 9-10px.
     #858179 measures 5.07:1 on #0b0b0d. The floor for it in contrast.mjs is 4.5, not 3.0. */
  --ink-faint:#858179;
  --line:rgba(239,236,229,.10);    /* --edge   */
  --line-2:rgba(239,236,229,.05);  /* --edge-2 */
  --grid:transparent;              /* the blueprint grid is not part of v2 */
  --green:#57c279;                 /* --lamp, unchanged: it is the house signal */
  --green-hi:#8fe7ab;

  /* THE FACE. site.css sets display type in Instrument Serif; v2 sets it in the expanded
     grotesk. Pointing --serif at the display face re-cuts every heading on all six pages in
     one line, without touching a single <h2>.
     ⚠ THIS TOKEN IS NAMED --serif AND IT HOLDS A SANS. That is a naming fault inherited from
     site.css's cascade, not a rendering one — product.css wins, so every heading on a product
     page is set in the display grotesk whatever the token is called. Renaming it means touching
     site.css, which serves the front door, and the front door is not in this run's scope.
     2026-09-08: repointed from Archivo Variable to our licensed Söhne Breit Kräftig, in step
     with --display in base.css. Keep the two in agreement or a product page and the store shelf
     it links from will be set in two different faces. */
  --serif:'Söhne Breit',system-ui,-apple-system,sans-serif;
  /* ⚠ 2026-09-08 — THIS TOKEN NOW HOLDS THE DISPLAY FACE TOO. OHAD: "Söhne everywhere ... by
     everywhere, I meant everywhere on the website." CASS ruled body copy in, on measurements:
     0 elements overflow, page heights move -1.9%..+4.2%, and Söhne's x-height is 0.5250 em against
     Outfit's 0.4700 (+11.7%) — it is MORE legible per glyph at the same size, not less.
     ⚠⚠ THE ONE REAL COST, MEASURED AND ACCEPTED: the body scale ran on THREE weights (300/400/500,
     26 rules) and this face has ONE. All three now render at 500. That does NOT destroy emphasis,
     because every one of the 12 emphasis rules on this site ALSO changes colour (--chalk over
     --chalk-2) — weight was the secondary cue, and it was checked rule by rule, not assumed.
     ⚠ NOTHING asks for 600+ anywhere in body copy, so there are no synthesised fake bolds.
     ⚠ THE font-weight:300/400 DECLARATIONS ARE DELIBERATELY LEFT IN PLACE, unlike the 18
     font-stretch rules which were deleted. The distinction is whether the rule can ever work
     again: there is no wdth axis in this file and never will be, but a second Söhne cut is
     purchasable, so those weights record a recoverable hierarchy rather than dead code.
     ⚠ Outfit stays declared in /fonts.css and on disk — OFL, fetched by nobody, part of rollback. */
  --sans:'Söhne Breit',system-ui,-apple-system,sans-serif;

  --bind:0rem;           /* no binding rail in v2 */
  --maxw:1180px;         /* the same measure as .sheet, so store and product line up */
  --ease:cubic-bezier(.16,1,.3,1);   /* --slow */
}

/* the blueprint grid, removed at the source rather than painted over */
body{background-image:none;background:var(--void)}

/* the binding rail and its page numbers belong to the datasheet, not to the room */
.bind{display:none!important}

/* Display headings: an expanded grotesk needs weight and width where a serif needed neither,
   and it needs its tracking pulled in rather than let out. */
.disp{font-weight:var(--display-weight);letter-spacing:-.03em;line-height:.92}
h1.disp,.hero h1{letter-spacing:-.038em;line-height:.88}
.nm,.p-name{font-weight:var(--display-weight);letter-spacing:-.028em}

/* site.css tracks the whole body out for a serif at small sizes. The grotesk does not want it. */
body{letter-spacing:.008em}
p,.sub,.p-tag,li{letter-spacing:.012em}

/* the room's light, so a product page sits in the same space as its room */
.room-light{z-index:0}
body > *:not(.room-light){position:relative;z-index:1}
