/* ============================================================================
   MOKI - fx-type.css  (W2-T1)
   Owns, per SITE-BUILD-SPEC §4: numeral discipline (tabular figures for data,
   oldstyle in prose), the eyebrow/label utility classes, and the .text-* scale
   utilities consuming §2's tokens.

   Property family: TYPE ONLY. font-*, letter-spacing, text-transform,
   line-height, font-variant-numeric, overflow-wrap. Zero animated properties,
   zero transitions, zero keyframes (fx-motion.css is the sole motion owner).
   No selector styles.css declares is re-styled here except where styles.css
   itself delegates ("Numeral feature settings ... are fx-type.css's job"),
   and those rules touch numeral features only, wrapped in :where() so they
   can never win a specificity fight against another layer.

   Deleting this stylesheet leaves the page fully usable, only less finished:
   nothing here sets opacity, display or visibility on content.
   ========================================================================= */

/* ----------------------------------------------------------------------------
   1. NUMERAL DISCIPLINE (§3)

   Prose side of the split: running prose is Georgia (styles.css §4), whose
   figures are natively oldstyle text figures. The declaration below is the
   explicit contract, not a repair: it documents the intent and keeps the
   split if the prose face ever changes. :where() keeps specificity at zero
   so any class-level data rule below outranks it (e.g. .kit__combos is a <p>
   but is a data cell, not prose).
--------------------------------------------------------------------------- */
:where(p, li, dd, blockquote) {
  font-variant-numeric: oldstyle-nums proportional-nums;
}

/* Data side of the split: every mono context gets lining + tabular figures
   so ledger/market columns align without a single <table> (§3), plus the
   slashed zero. The element list mirrors styles.css's mono family list
   (code, kbd, samp, figcaption, dt, time) by that file's own delegation
   note; the class list covers the mono-classed chrome and every JS-filled
   data target (#market rail cells, Field Kit readouts, game scores).

   Both declarations request the same OpenType feature for the zero:
   font-variant-numeric's slashed-zero is the high-level form, and the
   font-feature-settings line is the belt-and-suspenders low-level form the
   spec names. Redundant on purpose, never contradictory. */
:where(code, kbd, samp, figcaption, dt, time, output,
       .curtain__stamp, .tape__group span, .stand__stamp,
       .nav__rail a, .nav__toggle,
       .label, .archive__label,
       .kit__load, .kit__combos, .kit__current,
       .toy__status, .toy__best,
       .verify__pending, .market__rail) {
  font-variant-numeric: lining-nums tabular-nums slashed-zero;
  font-feature-settings: "zero" 1;
}

/* ----------------------------------------------------------------------------
   2. THE EYEBROW (§3, §5)
   "EXHIBIT 01", "FIELD NOTE": Fraunces Light Italic, the exact reason the
   second Fraunces instance ships at all. Set large per §2's own token
   comment ("--text-lg: eyebrows set large"). The markup carries literal
   caps; text-transform makes the register hold even if future copy does not.
   lining-nums beats the :where(p) prose rule above, because eyebrows are
   <p class="eyebrow"> and "EXHIBIT 01" must not render with a hanging
   oldstyle zero. The block-end margin is the eyebrow's own rhythm gap to
   the h2 beneath it (h2 carries no margin-top anywhere), following the
   styles.css precedent that heading margins live with their type rules.
--------------------------------------------------------------------------- */
.eyebrow {
  font-family: "Fraunces", "Fraunces Fallback", Georgia, "Times New Roman", serif;
  font-weight: 300;
  font-style: italic;
  font-size: var(--text-lg);
  line-height: 1.1;
  letter-spacing: 0.06em; /* light italic serif caps need air or they clot */
  text-transform: uppercase;
  font-variant-numeric: lining-nums;
  margin-block-end: var(--space-3);
}

/* ----------------------------------------------------------------------------
   3. LABELS AND DATA CELLS (§3: "every number, label, caption, and data cell"
   is Plex Mono)
   styles.css assigned the family to its own chrome (tape, nav, stamps) and
   to the bare data elements. These are the remaining label/data surfaces the
   markup actually ships, plus .label as the reusable class for anything a
   later wave adds. Family + size + tracking only: their surfaces belong to
   fx-surfaces.css, their colour to styles.css.
--------------------------------------------------------------------------- */
.label,
.archive__label,
.kit__row legend,
.toy__meter label,
.kit__load,
.kit__combos,
.kit__current,
.toy__status,
.toy__best,
.verify__pending,
.market__rail {
  font-family: "IBM Plex Mono", "Plex Mono Fallback", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
  font-size: var(--text-sm);
}

/* Micro-labels: the small uppercase tags that sit above content. Tracking
   matches the tape's 0.08em so every micro-label on the page reads as one
   voice. */
.label,
.archive__label,
.kit__row legend,
.toy__meter label {
  font-size: var(--text-xs);
  letter-spacing: 0.08em;
  text-transform: uppercase;
}

/* Field Kit and game controls are procedural equipment, so their labels are
   mono too (Prev / Next / Lock / Randomize / Start the watch). Type only;
   the tactile press affordance is fx-motion's, the surface fx-surfaces'. */
.kit__controls button,
.toy__start,
.toy__share {
  font-family: "IBM Plex Mono", "Plex Mono Fallback", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
  font-size: var(--text-sm);
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

/* The contract address is a 44-character base58 string inside <code>. Allow
   it to break anywhere or it forces horizontal scroll at 320px, the exact
   §11.10 failure. */
.receipts__ca {
  overflow-wrap: anywhere;
  letter-spacing: 0.02em; /* slight air so 0/O and 1/l stay tellable-apart at a glance */
}

/* Exhibit captions are sentences, not stamps: undo the uppercase they
   inherit from .stand__stamp (styles.css sets the transform on the stamp;
   this refines the child only, so no owned selector is redeclared). */
.stand__caption {
  text-transform: none;
  letter-spacing: 0.02em;
}

/* Sub-lines that must read smaller than their parent claim. Size only:
   the muted colour on .verify__caveat is styles.css/#verify territory. */
.verify__caveat,
.kit__ios-note {
  font-size: var(--text-sm);
}

/* ----------------------------------------------------------------------------
   4. TYPE-SCALE UTILITIES (§2, §4)
   One class per §2 token. These are the utility contract later waves build
   against (live.js's stat rail numerals are --text-2xl by §2's own comment);
   markup adopts them as needed, so several are intentionally unused today.
--------------------------------------------------------------------------- */
.text-xs   { font-size: var(--text-xs); }
.text-sm   { font-size: var(--text-sm); }
.text-base { font-size: var(--text-base); }
.text-md   { font-size: var(--text-md); }
.text-lg   { font-size: var(--text-lg); }
.text-xl   { font-size: var(--text-xl); }
.text-2xl  { font-size: var(--text-2xl); }
.text-3xl  { font-size: var(--text-3xl); }
