/* ============================================================
   The Living Arkham — app styles
   Rincón Miskatonic · rinconmiskatonic.org
   Full-height app shell · six themes · WCAG 2.1 AA
   ============================================================ */

/* ---------- game fonts, only for the rendered Ultimatum/Boon cards ----------
   Subset to Latin + typographic punctuation and served as woff2; a browser loads
   them only when a card that uses them is on screen, so no other page pays for it.
   'ubtitle' is the blackletter card title; 'ubbody' is Arno Pro, the game's body
   face, declared across weight/style so <strong>/<em> in a rule pick the right cut. */
@font-face{font-family:'ubtitle';src:url(../assets/fonts/ub/ub-title.woff2) format('woff2');font-display:swap}
@font-face{font-family:'ubbody';src:url(../assets/fonts/ub/ub-body.woff2) format('woff2');font-weight:400;font-style:normal;font-display:swap}
@font-face{font-family:'ubbody';src:url(../assets/fonts/ub/ub-body-i.woff2) format('woff2');font-weight:400;font-style:italic;font-display:swap}
@font-face{font-family:'ubbody';src:url(../assets/fonts/ub/ub-body-b.woff2) format('woff2');font-weight:700;font-style:normal;font-display:swap}
@font-face{font-family:'ubbody';src:url(../assets/fonts/ub/ub-body-bi.woff2) format('woff2');font-weight:700;font-style:italic;font-display:swap}
/* The site's heading face (--ff-head). Same blackletter master as 'ubtitle' (Teutonic) but
   shipped WHOLE — only ~221 glyphs, so the full face is tiny (~30 KB) — and self-hosted here so
   EVERY visitor sees the headings in Teutonic, not only those who happen to have it installed
   (it looked right locally purely because the font was on the machine). Latin only: --ff-head
   falls the rest — Cyrillic, CJK, the Polish extras it lacks — through to a serif, which is
   correct, there is no blackletter for those scripts. Regenerate with tools/ub_fonts.py. */
@font-face{font-family:'teutonic';src:url(../assets/fonts/teutonic.woff2) format('woff2');font-display:swap}
/* The site's body face (--ff-body): Arno Pro, the game's own book serif — the same master the
   cards use, self-hosted here in four styles (cut by tools/ub_fonts.py) so the running text reads
   in Arno for EVERY visitor, not in whatever serif they happen to have (it was Georgia, absent on
   stock Android/Linux, so the body silently changed face there). Latin + Cyrillic are in the cut;
   CJK (ko/zh) has no Arno glyph and falls through --ff-body's stack to a system serif. */
@font-face{font-family:'arno';src:url(../assets/fonts/arno.woff2) format('woff2');font-weight:400;font-style:normal;font-display:swap}
@font-face{font-family:'arno';src:url(../assets/fonts/arno-b.woff2) format('woff2');font-weight:700;font-style:normal;font-display:swap}
@font-face{font-family:'arno';src:url(../assets/fonts/arno-i.woff2) format('woff2');font-weight:400;font-style:italic;font-display:swap}
@font-face{font-family:'arno';src:url(../assets/fonts/arno-bi.woff2) format('woff2');font-weight:700;font-style:italic;font-display:swap}
/* The Drowned City's alien alphabet. The characters underneath are ordinary letters — the face
   is what makes them alien — so the text stays real text: selectable, searchable, and read out
   correctly by a screen reader. `swap` matters more than usual here: until it loads the reader
   sees the Latin letters, which is the honest fallback rather than a row of tofu. */
@font-face{font-family:'alienglyphs';src:url(../assets/fonts/alien-glyphs.woff2) format('woff2');font-display:swap}

/* ---------- page reset ---------- */
*,*::before,*::after{box-sizing:border-box}
html,body{margin:0;height:100%}
body{background:var(--page,#1a1f26);font-family:Georgia,'Iowan Old Style',serif}
/* body paints --page, which shows only if the shell (#tla-root) is ever shorter than
   the viewport — a transient during a mobile URL-bar move. The palette blocks below set
   --page on #tla-root, but body is an ANCESTOR of #tla-root and cannot inherit from it,
   so we mirror each theme's page colour onto <html> here (body then inherits it). Keeps
   any seam theme-correct instead of a hardcoded dark stripe on the light themes. */
html[data-theme="slate"]{--page:#1a1f26}
html[data-theme="moss"]{--page:#121711}
html[data-theme="midnight"]{--page:#232936}
html[data-theme="plum"]{--page:#0f0a10}
html[data-theme="neon"]{--page:#0d0a0c}
html[data-theme="parchment"]{--page:#e9e1cf}
html[data-theme="fog"]{--page:#e3e8ee}

.tla-skip{position:absolute;left:8px;top:-48px;z-index:300;background:var(--gold);color:var(--on-gold);
  font-family:var(--ff-ui);font-weight:700;padding:10px 16px;border-radius:8px;text-decoration:none;transition:top .15s}
.tla-skip:focus{top:8px}

/* ---------- themes ----------
   Every colour the app uses is a token here, and NOTHING outside this block is
   keyed on a theme's name — a rule like `[data-theme=light] .tla-nav{…}` only
   ever describes one theme, and there are six. Add a theme by adding a block.

   Each block is listed twice: once for the page, once as `.tla-pal-<id>`, which
   is what the picker's swatches wear. So a swatch is *derived from* the theme it
   offers and cannot drift away from it.

   House rules, from what makes palettes read as crafted rather than generated:
     · tinted near-blacks, never #000, and no gradient between accents
     · accents kept low-chroma — pigment, not backlight
     · greys never share their hue with the accent (slate greys + indigo accents
       are the same hue, which is half of why that pairing reads as "AI")
*/
#tla-root,
html[data-theme="slate"] #tla-root, .tla-pal-slate{
  /* SLATE — tinted deep slate, tarnished brass, eldritch teal. The house colours. */
  --bg:#1a1f26; --bg2:#1f252d; --panel:#252d36; --panel2:#2f3945;
  --edge:rgba(200,214,222,.09); --edge2:rgba(200,214,222,.15);
  --ink:#d7dde2; --ink2:#abb5bd; --muted:#8b97a0;
  --gold:#b89a5f; --gold2:#cbae74; --teal:#6ba295; --green:#6fa86e; --teal2:#8fc2b6; --icon:#c6ad78;
  --on-gold:#17130a;
  --mark:rgba(184,154,95,.24); --mark-ink:#d6bd85;
  --new:#db9385; --new-bg:rgba(206,105,86,.16); --new-edge:rgba(206,105,86,.55);
  --shadow:0 14px 34px rgba(0,0,0,.42);
  --figbg:#121820; --bggrad:#222a34;
  --on-accent:#121820; --page:#1a1f26; --scrim:rgba(8,10,14,.55); --navtint:rgba(0,0,0,.10);
  --stickyshadow:0 10px 26px -12px rgba(0,0,0,.6);
  color-scheme:dark;
}
html[data-theme="moss"] #tla-root, .tla-pal-moss{
  /* MOSS — charcoal and lichen. Green at low chroma reads as a substance; the
     same hue at high chroma reads as a terminal, which is the thing to avoid. */
  --bg:#121711; --bg2:#171d16; --panel:#1c231a; --panel2:#262e24;
  --edge:rgba(197,201,197,.09); --edge2:rgba(197,201,197,.16);
  --ink:#ccd0cb; --ink2:#a6ada3; --muted:#8d958a;
  --gold:#8fb28f; --gold2:#abc9ab; --teal:#7fada4; --green:#86b07a; --teal2:#a4cabf; --icon:#a3c1a3;
  --on-gold:#0d110d;
  --mark:rgba(143,178,143,.20); --mark-ink:#bcd6bc;
  --new:#d08a84; --new-bg:rgba(196,116,110,.15); --new-edge:rgba(196,116,110,.5);
  --shadow:0 14px 34px rgba(0,0,0,.5);
  --figbg:#0d110c; --bggrad:#1a2118;
  --on-accent:#0d110c; --page:#121711; --scrim:rgba(7,9,7,.6); --navtint:rgba(0,0,0,.16);
  --stickyshadow:0 10px 26px -12px rgba(0,0,0,.7);
  color-scheme:dark;
}
html[data-theme="midnight"] #tla-root, .tla-pal-midnight{
  /* MIDNIGHT — arctic blue-grey. One axis, nothing raising its voice. */
  --bg:#232936; --bg2:#2a313f; --panel:#333b4c; --panel2:#3e4759;
  --edge:rgba(216,222,233,.10); --edge2:rgba(216,222,233,.17);
  --ink:#e2e7f0; --ink2:#bac3d3; --muted:#9aa5b8;
  --gold:#9fb6cc; --gold2:#c3d2e2; --teal:#7fb4cc; --green:#7ec185; --teal2:#a7d3e6; --icon:#aec4d8;
  --on-gold:#12161d;
  --mark:rgba(159,182,204,.20); --mark-ink:#d3e0ee;
  --new:#e59aa1; --new-bg:rgba(191,97,106,.18); --new-edge:rgba(191,97,106,.6);
  --shadow:0 14px 34px rgba(0,0,0,.45);
  --figbg:#1c212c; --bggrad:#2f3746;
  --on-accent:#12161d; --page:#232936; --scrim:rgba(9,12,18,.6); --navtint:rgba(0,0,0,.14);
  --stickyshadow:0 10px 26px -12px rgba(0,0,0,.6);
  color-scheme:dark;
}
html[data-theme="plum"] #tla-root, .tla-pal-plum{
  /* PLUM — near-black with a plum tint, orchid accents, WARM greys.
     The purples sit at hue ~325: on the far side of purple from the indigo
     everything else is made of. Historical purple was red-leaning (Tyrian was
     nearer crimson); the blue-violet one is a modern dye-and-gamut accident. */
  --bg:#0f0a10; --bg2:#150f16; --panel:#1c141d; --panel2:#271e28;
  --edge:rgba(205,202,198,.10); --edge2:rgba(205,202,198,.17);
  --ink:#e4e0dd; --ink2:#b3aeaa; --muted:#98928d;
  --gold:#a572a0; --gold2:#cbabc9; --teal:#a87ba2; --green:#8bb37f; --teal2:#c9a1c2; --icon:#bb93b5;
  --on-gold:#120a11;
  --mark:rgba(165,114,160,.22); --mark-ink:#dcbdd8;
  --new:#cf7f78; --new-bg:rgba(196,116,110,.16); --new-edge:rgba(196,116,110,.52);
  --shadow:0 14px 34px rgba(0,0,0,.55);
  --figbg:#0a060b; --bggrad:#1a121c;
  --on-accent:#0a060b; --page:#0f0a10; --scrim:rgba(5,3,6,.62); --navtint:rgba(0,0,0,.18);
  --stickyshadow:0 10px 26px -12px rgba(0,0,0,.75);
  color-scheme:dark;
}
html[data-theme="neon"] #tla-root, .tla-pal-neon{
  /* NEON — black, hot pink and a tan spot. Loud on purpose; the text underneath
     still has to be legible, so the shouting is done by the accents only. */
  --bg:#0d0a0c; --bg2:#141013; --panel:#1c161a; --panel2:#282027;
  --edge:rgba(242,233,238,.10); --edge2:rgba(242,233,238,.18);
  --ink:#f2e9ee; --ink2:#c9bcc4; --muted:#a89aa4;
  --gold:#ff4da3; --gold2:#ff8cc2; --teal:#d9b46a; --green:#5fe08a; --teal2:#efcf90; --icon:#ff6fb0;
  --on-gold:#16000c;
  --mark:rgba(255,77,163,.20); --mark-ink:#ffaed5;
  --new:#ff9a6b; --new-bg:rgba(255,120,70,.15); --new-edge:rgba(255,120,70,.5);
  --shadow:0 14px 34px rgba(0,0,0,.6);
  --figbg:#0a0709; --bggrad:#1d1219;
  --on-accent:#16000c; --page:#0d0a0c; --scrim:rgba(6,3,5,.62); --navtint:rgba(0,0,0,.2);
  --stickyshadow:0 10px 26px -12px rgba(0,0,0,.75);
  color-scheme:dark;
}
html[data-theme="parchment"] #tla-root, .tla-pal-parchment{
  /* PARCHMENT — warm paper, oak gall ink. The only light one. */
  --bg:#efe8d8; --bg2:#f5efe1; --panel:#f7f2e7; --panel2:#e9e0cd;
  --edge:rgba(60,44,18,.16); --edge2:rgba(60,44,18,.26);
  --ink:#241f16; --ink2:#43392a; --muted:#5f5540;
  --gold:#8a6c1c; --gold2:#6a5310; --teal:#3c7a6f; --green:#3f7a3c; --teal2:#215a50; --icon:#6f5714;
  --on-gold:#fff8ea;
  /* the wash under the open chapter: it used to be strong enough to take the
     gold text on it below 4.5:1, which axe cannot see through a gradient */
  --mark:rgba(160,120,20,.18); --mark-ink:#4f3c0a;
  --new:#a43c28; --new-bg:rgba(164,60,40,.12); --new-edge:rgba(164,60,40,.45);
  --shadow:0 10px 28px rgba(70,52,20,.18);
  --figbg:#e5dcc6; --bggrad:#f8f2e6;
  --on-accent:#fff8ea; --page:#e9e1cf; --scrim:rgba(44,34,14,.34); --navtint:rgba(90,68,20,.05);
  --stickyshadow:0 12px 28px -14px rgba(70,52,20,.4);
  color-scheme:light;
}
html[data-theme="fog"] #tla-root, .tla-pal-fog{
  /* FOG — a cool overcast light: haze off a New England coast, slate ink, tarnished
     brass. The counterweight to Parchment's warm paper, and the light echo of Midnight. */
  --bg:#e6eaef; --bg2:#eef1f5; --panel:#f4f6f9; --panel2:#dde3e9;
  --edge:rgba(28,38,52,.13); --edge2:rgba(28,38,52,.22);
  --ink:#1c2330; --ink2:#39434f; --muted:#586372;
  --gold:#6f6a2a; --gold2:#514c14; --teal:#2f6d70; --green:#2f7442; --teal2:#1c5257; --icon:#5b6470;
  --on-gold:#f4f6f9;
  --mark:rgba(111,106,42,.18); --mark-ink:#4a4512;
  --new:#b23c2e; --new-bg:rgba(178,60,46,.12); --new-edge:rgba(178,60,46,.45);
  --shadow:0 10px 28px rgba(30,42,58,.16);
  --figbg:#dbe1e7; --bggrad:#f1f4f7;
  --on-accent:#f4f6f9; --page:#e3e8ee; --scrim:rgba(20,28,40,.34); --navtint:rgba(30,48,72,.05);
  --stickyshadow:0 12px 28px -14px rgba(30,44,64,.4);
  color-scheme:light;
}

#tla-root{
  --ff-head:'teutonic','Cinzel',Georgia,'Times New Roman',serif;
  --ff-body:'arno',Georgia,'Iowan Old Style','Palatino Linotype',serif;
  --ff-ui:'Segoe UI',system-ui,-apple-system,Roboto,Helvetica,Arial,sans-serif;
  /* Type scale. One small set of sizes for the whole interface -- body at 18, labels a step down,
     headings up -- consolidated from ~37 ad-hoc values so the page reads at a consistent rhythm.
     This is the UI ONLY: the card faces (.tla-ubc*, and .tbc* in taboo.css) size their text in
     cqw off the plate and are deliberately left alone. Change a size here, not on a rule. */
  --fs-micro:13px;   /* the smallest: numeric badges, kbd, counts */
  --fs-eyebrow:14px; /* uppercase eyebrows/labels, captions, meta */
  --fs-small:16px;   /* secondary controls: nav items, buttons, tabs */
  --fs-body:18px;    /* body reading text, inputs, primary controls */
  --fs-lead:21px;    /* lead paragraphs, emphasis, the smallest headings */
  --fs-h3:25px;      /* sub-section and section headings */
  --fs-h2:31px;      /* callout and the largest in-flow headings */
  /* Icons are drawn at their true font size. On paper that is right; on a screen
     a touch larger reads better, without disturbing their proportions. */
  --icon-scale:1.15;
  /* Symbol brand colours. The game's class/skill/token identity — Guardian blue, Mystic
     purple — which the book prints as small colour badges on its Quick Reference page.
     tools/quick_reference.py rips a starting point off those badges (see it for why the
     exact values want a human eye: the badges are tiny and edition-noisy, so the hue is
     trustworthy but the precise hex is not). They are game identity, not language, so
     they live here, once. Fixed, not theme-adapted: each symbol shows on a light chip
     whose background never changes, exactly as the book prints a badge on a light
     shield, so the colour reads the same on every theme.
     seeker/skull/elder-thing were the three the badge rip read badly (a highlight or a
     shadow, not the mark's colour); they are set here from the printed badges instead —
     amber, maroon, navy-purple. The glyph contour (.tla-symchip .ico) keeps any fill,
     pale or not, legible against the chip regardless. */
  --sym-chip:#ece3cb;
  --sym-guardian:#0465aa; --sym-seeker:#9c7015; --sym-mystic:#3a2058;
  --sym-rogue:#0a7e5e; --sym-survivor:#ad2731;
  --sym-willpower:#004a73; --sym-intellect:#4b1848; --sym-combat:#6d2613;
  --sym-agility:#005439; --sym-wild:#725b07;
  --sym-eldersign:#348792; --sym-autofail:#64070f; --sym-skull:#7c2b26;
  --sym-cultist:#004a17; --sym-tablet:#0f2f4b; --sym-elderthing:#37335f;
  font-size:var(--fs-body); color:var(--ink); font-family:var(--ff-body); line-height:1.65;
  -webkit-font-smoothing:antialiased;
  /* height:var(--app-h) locks the shell to the LIVE viewport; a small head-time
     script keeps --app-h = window.innerHeight. The bare 100dvh stays as the no-JS
     fallback. Why not 100dvh alone: this root is overflow:hidden and the scroller
     is an inner rail (.tla-main), so the document never scrolls — and on Android
     Chrome a 100dvh that was resolved while the URL bar was shown can then fail to
     re-resolve when the bar retracts (no root-scroll signal), leaving the shell
     short and the dark body showing below the footer until a manual refresh. */
  height:100dvh; height:var(--app-h,100dvh); display:flex; flex-direction:column; position:relative; overflow:hidden;
  background:radial-gradient(135% 92% at 50% -18%, var(--bggrad) 0%, var(--bg) 55%);
}
#tla-root a{color:var(--teal2); text-decoration:none}
#tla-root a:hover{text-decoration:underline}
#tla-root :focus-visible{outline:3px solid var(--gold); outline-offset:2px; border-radius:4px}
.tla-sr{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* ---------- header ---------- */
.tla-head{
  flex:0 0 auto; display:flex; align-items:center; gap:14px; flex-wrap:wrap;
  padding:12px 18px; background:linear-gradient(180deg,rgba(0,0,0,.14),transparent),var(--bg2);
  border-bottom:1px solid var(--edge); z-index:40;
}
.tla-brand{display:flex; align-items:center; gap:12px; min-width:0; color:inherit; text-decoration:none}
.tla-brand:hover{text-decoration:none}
.tla-sigil{width:40px;height:40px;flex:0 0 auto;color:var(--gold);filter:drop-shadow(0 1px 3px rgba(0,0,0,.45))}
.tla-titles{min-width:0; display:flex; flex-direction:column}
.tla-title{font-family:var(--ff-head); font-size:var(--fs-h3); line-height:1; letter-spacing:.5px; color:var(--gold2); white-space:nowrap; display:flex; align-items:center}
.tla-sub{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); color:var(--muted); letter-spacing:.3px; margin-top:4px}
.tla-spacer{flex:1 1 auto}
/* search trigger (opens the overlay) — icon + "/" shortcut hint */
.tla-searchbtn{flex:0 0 auto; height:44px; padding:0 10px 0 12px; border-radius:10px; cursor:pointer;
  display:inline-flex; align-items:center; gap:8px;
  background:var(--panel); border:1px solid var(--edge2); color:var(--gold2)}
.tla-searchbtn:hover{background:var(--panel2); border-color:var(--gold)}
.tla-searchbtn > svg{width:19px;height:19px}
.tla-searchbtn-kbd{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); color:var(--muted); line-height:1.5;
  border:1px solid var(--edge2); border-radius:5px; padding:1px 7px; background:var(--bg)}
.tla-theme{flex:0 0 auto; width:44px; height:44px; border-radius:10px; border:1px solid var(--edge2);
  background:var(--panel); color:var(--gold2); cursor:pointer; display:inline-flex; align-items:center; justify-content:center}
.tla-theme:hover{background:var(--panel2)}
.tla-theme svg{width:20px;height:20px}
.tla-theme[aria-expanded=true]{background:var(--panel2); border-color:var(--gold)}
/* ---------- theme picker ---------- */
.tla-themewrap{position:relative; flex:0 0 auto}
.tla-thememenu{position:absolute; top:calc(100% + 8px); right:0; z-index:60; min-width:220px;
  background:var(--panel); border:1px solid var(--edge2); border-radius:12px;
  box-shadow:var(--shadow); padding:10px}
.tla-thememenu[hidden]{display:none}
/* The first-visit nudge at the palette button. Anchored to .tla-themewrap, which is
   already position:relative. right:0 so it can never push the header wide, and
   max-width so a long translation wraps instead of leaving the screen. */
.tla-themetip{position:absolute; top:calc(100% + 8px); right:0; z-index:59;
  display:flex; align-items:center; gap:8px; width:max-content; max-width:min(74vw,260px);
  background:var(--gold); color:var(--on-gold); border-radius:10px; padding:8px 6px 8px 11px;
  box-shadow:var(--shadow); font-family:var(--ff-ui); font-size:var(--fs-eyebrow); line-height:1.3;
  animation:tlatip .5s ease both}
/* the notch, pointing back at the button it is about */
.tla-themetip::before{content:''; position:absolute; top:-5px; right:15px; width:10px; height:10px;
  background:var(--gold); transform:rotate(45deg)}
.tla-themetip-t{position:relative}
.tla-themetip-x{flex:0 0 auto; width:26px; height:26px; border:0; border-radius:6px; cursor:pointer;
  background:transparent; color:var(--on-gold); font-size:var(--fs-body); line-height:1;
  display:inline-flex; align-items:center; justify-content:center}
.tla-themetip-x:hover{background:rgba(0,0,0,.14)}
@keyframes tlatip{from{opacity:0; transform:translateY(-5px)}to{opacity:1; transform:none}}
@media (prefers-reduced-motion:reduce){ .tla-themetip{animation:none} }

.tla-themeset{border:0; margin:0; padding:0}
.tla-themeset-h{font-family:var(--ff-ui); font-size:var(--fs-micro); text-transform:uppercase;
  letter-spacing:1px; color:var(--muted); padding:0 6px 8px}
.tla-themeopt{display:flex; align-items:center; gap:10px; padding:7px 8px; border-radius:8px;
  cursor:pointer; font-family:var(--ff-ui); font-size:var(--fs-small); color:var(--ink2); min-height:36px}
.tla-themeopt:hover{background:var(--panel2); color:var(--ink)}
/* the radio itself stays real and focusable — it is only moved out of sight, so
   the whole row is the label and the keyboard model is the browser's own */
.tla-themeopt input{position:absolute; width:1px; height:1px; opacity:0; margin:0}
.tla-themeopt:has(input:focus-visible){outline:3px solid var(--gold); outline-offset:2px}
.tla-themeopt:has(input:checked){background:var(--mark); color:var(--ink)}
.tla-themeopt-n{flex:1 1 auto}
/* selection is not signalled by colour alone: the chosen row gets a tick */
.tla-themeopt::after{content:''; flex:0 0 auto; width:16px; height:16px; opacity:0;
  background:var(--gold2); clip-path:polygon(41% 84%, 9% 52%, 19% 42%, 41% 64%, 81% 24%, 91% 34%)}
.tla-themeopt:has(input:checked)::after{opacity:1}
/* Each swatch wears the palette it offers (.tla-pal-<id>), so it shows that
   theme's real colours rather than a copy of them that can rot. */
.tla-swatch{flex:0 0 auto; display:flex; gap:3px; padding:4px; border-radius:6px;
  background:var(--bg); box-shadow:inset 0 0 0 1px var(--edge2)}
.tla-swatch i{width:9px; height:14px; border-radius:2px; display:block}
/* One button per language, built at runtime from data/languages.json.
   The [hidden] rule must be spelled out: `display:flex` would otherwise beat the
   browser's own [hidden] rule and a single-language site would show an empty box. */
/* position: the menu hangs off this box, so it must be the containing block. Not `overflow:
   hidden` any more — that clipped the menu it now holds. */
.tla-lang{position:relative; display:flex; border:1px solid var(--edge2); border-radius:10px;
  font-family:var(--ff-ui)}
.tla-lang[hidden]{display:none}
.tla-lang button{display:flex; align-items:center; gap:7px; min-height:44px;
  background:transparent; color:var(--ink2); border:0; padding:0 12px; font-size:var(--fs-small);
  font-weight:700; cursor:pointer; letter-spacing:.4px}
.tla-lang button:hover{background:var(--panel)}
.tla-lang button[aria-pressed=true]{background:var(--gold); color:var(--on-gold)}
.tla-lang-cur{border-radius:9px}
.tla-lang-cur[aria-expanded=true]{background:var(--panel)}
.tla-lang-caret{width:10px; height:6px; opacity:.7; flex:none}
.tla-lang-cur[aria-expanded=true] .tla-lang-caret{transform:rotate(180deg)}
/* The menu of the other languages. Same shelf as the theme picker so the header behaves one
   way, and scrollable: eleven languages is taller than a short viewport. */
.tla-langmenu{position:absolute; top:calc(100% + 8px); right:0; z-index:60; min-width:210px;
  max-height:min(60vh,420px); overflow-y:auto; display:flex; flex-direction:column;
  background:var(--panel2); border:1px solid var(--edge2); border-radius:12px; padding:6px;
  box-shadow:0 14px 34px rgba(0,0,0,.34)}
.tla-langmenu[hidden]{display:none}
.tla-langmenu button{width:100%; justify-content:flex-start; border-radius:8px; padding:0 10px}
.tla-lang-nm{font-weight:500; letter-spacing:0; color:var(--ink2); white-space:nowrap}
.tla-langmenu button:hover .tla-lang-nm{color:var(--ink)}
/* The flag is a small chip: held back to the palette's muted register until its
   language is the live one, so it reads as part of the brass, not a sticker. */
.tla-flag{display:block; width:20px; height:14px; border-radius:2px; object-fit:cover;
  box-shadow:0 0 0 1px rgba(0,0,0,.28) inset, 0 0 0 1px var(--edge) ;
  filter:saturate(.55) brightness(.9); opacity:.75; transition:filter .15s, opacity .15s}
.tla-lang button:hover .tla-flag{filter:saturate(.85); opacity:.95}
.tla-lang button[aria-pressed=true] .tla-flag{filter:none; opacity:1;
  box-shadow:0 0 0 1px rgba(0,0,0,.4) inset, 0 0 0 1px rgba(0,0,0,.28)}
.tla-burger{display:none; background:var(--panel); border:1px solid var(--edge2); color:var(--ink);
  width:44px;height:44px; border-radius:10px; cursor:pointer; font-size:var(--fs-lead); align-items:center; justify-content:center}

/* ---------- search overlay (modal) ---------- */
.tla-searchmodal{position:fixed; inset:0; z-index:120; display:flex; align-items:flex-start; justify-content:center;
  padding:clamp(56px,11vh,132px) 16px 24px; background:var(--scrim); backdrop-filter:blur(3px)}
.tla-searchmodal[hidden]{display:none}
.tla-searchmodal-box{width:min(940px,100%); max-height:80vh; display:flex; flex-direction:column; overflow:hidden;
  background:var(--panel); border:1px solid var(--edge2); border-radius:14px; box-shadow:var(--shadow)}
.tla-searchmodal-bar{display:flex; align-items:center; gap:10px; padding:13px 14px; border-bottom:1px solid var(--edge); flex:0 0 auto}
.tla-searchmodal-bar > svg{width:20px;height:20px;color:var(--muted);flex:0 0 auto}
.tla-searchmodal-bar input{flex:1 1 auto; min-width:0; background:transparent; border:0; outline:none;
  font-family:var(--ff-ui); font-size:var(--fs-body); color:var(--ink)}
.tla-searchmodal-bar input::placeholder{color:var(--muted)}
.tla-searchmodal-cancel{flex:0 0 auto; background:var(--bg); border:1px solid var(--edge2); color:var(--ink2);
  font-family:var(--ff-ui); font-size:var(--fs-eyebrow); font-weight:600; padding:8px 12px; border-radius:8px; cursor:pointer}
.tla-searchmodal-cancel:hover{background:var(--panel2); color:var(--ink)}
.tla-searchhint{display:flex; gap:16px; flex-wrap:wrap; padding:10px 15px; border-top:1px solid var(--edge); flex:0 0 auto;
  font-family:var(--ff-ui); font-size:var(--fs-eyebrow); color:var(--muted)}
.tla-searchhint kbd{border:1px solid var(--edge2); border-radius:4px; padding:0 5px; margin-right:3px; background:var(--bg); font-size:var(--fs-micro)}

/* ---------- search results ---------- */
.tla-results{flex:1 1 auto; min-height:0; overflow:auto; display:none}
.tla-results.on{display:block}
.tla-res{padding:11px 14px; border-bottom:1px solid var(--edge); cursor:pointer; font-family:var(--ff-ui)}
.tla-res:last-child{border-bottom:0}
.tla-res:hover,.tla-res.sel{background:var(--panel2)}
.tla-res .rt{font-weight:600; color:var(--ink); font-size:var(--fs-small)}
/* Two selectors, not one. They were welded into ".tla-res .rt .tla-res .rs", which asks
   for a .rs inside a .tla-res inside a .rt inside a .tla-res — nothing on the page is
   that, so this was the only .rs rule in the file and it never matched. The chapter then
   rendered in the title's own size and weight with no gap: "Mazo de EncuentrosI · Glosario". */
.tla-res .rs{font-size:var(--fs-eyebrow); color:var(--gold2); margin-left:8px; font-weight:600}
.tla-res .rt .ico{--icon:var(--gold2)}
.tla-res .rx{font-size:var(--fs-eyebrow); color:var(--muted); margin-top:3px; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden}
.tla-res mark{background:var(--mark); color:var(--mark-ink); border-radius:2px; padding:0 1px}
.tla-res-empty{padding:18px; color:var(--muted); font-family:var(--ff-ui); font-size:var(--fs-small); text-align:center}
/* The corpus divider in split search results (Grimoire / FAQ chapter 1). A label, not an
   option: sticky so the reader always knows which document the rows below belong to. */
.tla-res-grp{position:sticky; top:0; z-index:1; padding:7px 14px; font-family:var(--ff-ui);
  font-size:var(--fs-micro); font-weight:700; letter-spacing:.06em; text-transform:uppercase;
  color:var(--gold2); background:var(--panel2); border-bottom:1px solid var(--edge)}
.tla-res-grpn{color:var(--muted); font-weight:600}
/* Two corpora side by side: the Grimoire on the left, the FAQ chapter 1 on the right, split
   by a rule. Stacks to one column on a narrow screen. Each corpus keeps its own sticky
   heading; the shared scroll is the results container. */
.tla-res-cols{display:grid; grid-template-columns:1fr 1fr}
.tla-res-col{min-width:0; border-left:1px solid var(--edge)}
.tla-res-col:first-child{border-left:0}
@media (max-width:640px){
  .tla-res-cols{grid-template-columns:1fr}
  .tla-res-col{border-left:0; border-top:1px solid var(--edge2)}
  .tla-res-col:first-child{border-top:0}
}
.tla-faqlink svg{transform:none}
/* Set/campaign/scenario icons recovered from the FAQ's vector art. Sized like a small
   square glyph sitting in a line of text; recoloured through the mask like every game icon
   (the .ico base sets background-color:var(--icon) and the mask props). */
.tla-seticon{width:calc(1.02em*var(--icon-scale)); height:calc(1.02em*var(--icon-scale)); vertical-align:-.16em}
/* Cross-corpus confirm: a FAQ chapter 1 link that leads into the Grimoire names where it
   goes before following it. Above the lightbox (300) so it is never hidden. */
.tla-confirm{position:fixed; inset:0; z-index:320; display:flex; align-items:center; justify-content:center;
  padding:20px; background:var(--scrim); backdrop-filter:blur(3px)}
.tla-confirm-box{width:min(460px,100%); background:var(--panel); border:1px solid var(--edge2);
  border-radius:14px; box-shadow:var(--shadow); padding:20px}
.tla-confirm-t{font-family:var(--ff-head); font-size:var(--fs-lead); color:var(--ink); margin:0 0 10px}
.tla-confirm-d{font-family:var(--ff-ui); font-size:var(--fs-small); color:var(--ink2); line-height:1.55; margin:0 0 14px}
.tla-confirm-d b{color:var(--ink)}
.tla-confirm-rm{display:flex; align-items:center; gap:9px; font-family:var(--ff-ui); font-size:var(--fs-eyebrow);
  color:var(--muted); margin-bottom:16px; cursor:pointer}
/* Our own checkbox, so the "remember" toggle matches the book's ink and gold rather than the
   browser's default blue box. appearance:none removes the native control; the tick is a rotated
   border. Keyboard focus and the checked state stay clearly visible for WCAG. */
.tla-confirm-rm-cb{appearance:none; -webkit-appearance:none; flex:0 0 auto; width:18px; height:18px;
  margin:0; border:1.5px solid var(--edge2); border-radius:5px; background:var(--bg); cursor:pointer;
  position:relative; transition:background .12s, border-color .12s}
.tla-confirm-rm-cb:hover{border-color:var(--gold)}
.tla-confirm-rm-cb:checked{background:var(--gold); border-color:transparent}
.tla-confirm-rm-cb:checked::after{content:''; position:absolute; left:6px; top:2px; width:4px; height:9px;
  border:solid var(--on-gold); border-width:0 2px 2px 0; transform:rotate(45deg)}
.tla-confirm-rm-cb:focus-visible{outline:2px solid var(--teal2); outline-offset:2px}
.tla-confirm-btns{display:flex; gap:10px; justify-content:flex-end; flex-wrap:wrap}
.tla-confirm-cancel,.tla-confirm-ok{font-family:var(--ff-ui); font-size:var(--fs-small); font-weight:600;
  padding:9px 16px; border-radius:9px; cursor:pointer; border:1px solid var(--edge2)}
.tla-confirm-cancel{background:var(--bg); color:var(--ink2)}
.tla-confirm-cancel:hover{background:var(--panel2); color:var(--ink)}
.tla-confirm-ok{background:var(--gold); color:var(--on-gold); border-color:transparent}
.tla-confirm-ok:hover{filter:brightness(1.06)}

/* ---------- app-shell layout (full height) ---------- */
.tla-body{flex:1 1 auto; min-height:0; display:grid; grid-template-columns:308px minmax(0,1fr) 264px}
/* The taboo card gallery reclaims the right-hand rail so two large cards fit side by side — but only
   on desktop widths, where that third column exists. Below 1181px the responsive rules further down
   already collapse the grid (280px|1fr, then 1fr); this rule is scoped so its higher specificity (two
   classes) can't override them and strand the section in a 308px strip on phones. */
@media(min-width:1181px){
  .tla-body.is-wide{grid-template-columns:308px minmax(0,1fr) 0}
  .tla-body.is-wide .tla-toc{display:none}
}
.tla-nav,.tla-main,.tla-toc{height:100%; min-height:0; overflow-y:auto; overscroll-behavior:contain}
.tla-nav{border-right:1px solid var(--edge); padding:18px 12px 40px; background:var(--navtint)}
.tla-toc{border-left:1px solid var(--edge); padding:22px 18px 40px}
.tla-main{padding:0 clamp(20px,3.6vw,56px) 90px}
.tla-doc{max-width:1040px; margin:0 auto; padding-top:30px}
/* …and the gallery's own doc breaks past the prose reading measure to use that reclaimed width. */
.tla-doc.tla-doc--wide{max-width:1360px}
.tla-nav::-webkit-scrollbar,.tla-toc::-webkit-scrollbar,.tla-main::-webkit-scrollbar,.tla-results::-webkit-scrollbar,.tla-rel-body::-webkit-scrollbar{width:10px}
.tla-nav::-webkit-scrollbar-thumb,.tla-toc::-webkit-scrollbar-thumb,.tla-main::-webkit-scrollbar-thumb,.tla-results::-webkit-scrollbar-thumb,.tla-rel-body::-webkit-scrollbar-thumb{background:var(--edge2); border-radius:6px}

/* nav */
/* The shelf headings in the side menu. A rule above each one rather than a box around
   it: the menu is already a column of bordered things, and another border would read as
   one more item rather than as what separates them. */
/* A collapsible shelf. The summary is the whole clickable row; the h2 inside keeps the
   heading in the outline. The rule/spacing that used to live on the h2 moves to the
   summary so the fold line sits above the whole shelf, not just its label. */
.tla-navgrp{margin:0}
.tla-nav-grp-s{display:flex; align-items:center; gap:8px; cursor:pointer; list-style:none;
  margin:14px 0 4px; padding:12px 10px 2px; border-top:1px solid var(--edge)}
.tla-navgrp:first-of-type .tla-nav-grp-s{margin-top:2px; padding-top:0; border-top:0}
.tla-nav-grp-s::-webkit-details-marker{display:none}
.tla-nav-grp-s::before{content:''; flex:0 0 auto; width:6px; height:6px; margin-right:1px;
  border-right:2px solid var(--muted); border-bottom:2px solid var(--muted);
  transform:rotate(-45deg); transition:transform .15s ease}
.tla-navgrp[open] > .tla-nav-grp-s::before{transform:rotate(45deg)}
.tla-nav-grp-s:hover{color:var(--ink)}
.tla-nav-grp-s:focus-visible{outline:3px solid var(--gold); outline-offset:2px; border-radius:6px}
.tla-nav-grp{font-family:var(--ff-ui); font-size:var(--fs-micro); font-weight:700; letter-spacing:1.2px;
  text-transform:uppercase; color:var(--muted); margin:0}
.tla-nav-sec{margin-bottom:2px}
/* Announced, not written: dimmer than a chapter, but never so dim it fails contrast —
   the word "Próximamente" is the whole content of the row. */
.tla-nav-cnt.is-soon{font-size:var(--fs-micro); letter-spacing:.4px; text-transform:uppercase;
  color:var(--teal2); border-color:var(--edge2); background:var(--panel)}
.tla-nav-btn{display:flex; align-items:center; gap:10px; width:100%; text-align:left; cursor:pointer;
  background:transparent; border:0; color:var(--ink2); font-family:var(--ff-ui); font-size:var(--fs-body);
  padding:11px 11px; border-radius:9px; line-height:1.35; min-height:44px}
.tla-nav-btn:hover{background:var(--panel); color:var(--ink)}
.tla-nav-btn.active{background:linear-gradient(90deg,var(--mark),transparent); color:var(--gold2); box-shadow:inset 3px 0 0 var(--gold)}
.tla-nav-num{font-family:var(--ff-head); font-size:var(--fs-small); color:var(--gold); min-width:28px; opacity:.9}
.tla-nav-btn.active .tla-nav-num{opacity:1}
.tla-nav-cnt{margin-left:auto; font-size:var(--fs-eyebrow); color:var(--muted); background:var(--bg); border:1px solid var(--edge); border-radius:11px; padding:1px 8px; font-family:var(--ff-ui)}
.tla-sublist{margin:2px 0 10px 14px; padding-left:10px; border-left:1px solid var(--edge); display:none}
.tla-nav-sec.open .tla-sublist{display:block}
.tla-sublink{display:block; padding:8px 9px; font-family:var(--ff-ui); font-size:var(--fs-small); color:var(--muted); border-radius:7px; cursor:pointer;
  line-height:1.3; border:0; background:transparent; width:100%; text-align:left; min-height:36px}
.tla-sublink:hover{background:var(--panel); color:var(--ink2)}
.tla-sublink.active{color:var(--gold2)}
/* A nav sublink is a label, not prose: entry titles that are set bold or italic in the text
   (the FAQ's "(1.1) …" rulings, its wholly-bold definition terms) must read as plain menu
   items here, not shout. */
#tla-root .tla-sublink strong,#tla-root .tla-sublink b{font-weight:400; color:inherit}
#tla-root .tla-sublink em,#tla-root .tla-sublink i{font-style:normal}

/* ---------- content ---------- */
.tla-crumb{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); color:var(--muted); letter-spacing:.4px; margin-bottom:8px; text-transform:uppercase}
.tla-h1{font-family:var(--ff-head); font-size:clamp(33px,4vw,46px); line-height:1.08; color:var(--gold2); margin:0 0 8px; letter-spacing:.4px; text-wrap:balance}
.tla-h1 .tla-rn{color:var(--gold); opacity:.78; margin-right:.35em}
.tla-rule{height:1px; background:linear-gradient(90deg,var(--gold),transparent); margin:16px 0 24px; opacity:.6}
.tla-lead{font-size:var(--fs-lead); color:var(--ink2); margin:0 0 22px}

/* ---------- landing ---------- */
.tla-landing{max-width:1040px}
/* hero banner — artwork at assets/general_banner_01.webp (2000×700, 20:7).
   Layered scrims (centre vignette + bottom gradient) keep the white title legible over the busy art.
   If the file is missing, the fallback gradient shows automatically (no broken image). */
/* max-width:100% is load-bearing: with an aspect-ratio and a min-height that
   wins, the browser derives the WIDTH from the ratio (216 x 20/7 = 617px) and the
   banner pushes the whole landing sideways on a phone. */
.tla-hero{position:relative; margin:0 0 26px; border-radius:16px; overflow:hidden;
  aspect-ratio:20/7; max-height:400px; min-height:216px; max-width:100%;
  border:1px solid var(--edge2);
  background-color:var(--panel2);
  background-image:
    radial-gradient(78% 96% at 50% 52%, rgba(6,8,12,.64) 0%, rgba(6,8,12,.16) 60%, rgba(6,8,12,0) 82%),
    linear-gradient(180deg, rgba(6,8,12,.24) 0%, rgba(6,8,12,.10) 42%, rgba(6,8,12,.70) 100%),
    url(../assets/general_banner_01.webp),
    radial-gradient(120% 150% at 50% -20%, var(--bggrad), var(--bg));
  background-size:cover, cover, cover, cover; background-position:center; background-repeat:no-repeat}
.tla-hero-inner{position:absolute; inset:0; display:flex; flex-direction:column; align-items:center; justify-content:center;
  text-align:center; gap:10px; padding:24px}
.tla-hero-title{font-family:var(--ff-head); font-size:clamp(38px,6.4vw,64px); line-height:1; margin:0;
  color:#fff; letter-spacing:1px; text-shadow:0 2px 22px rgba(0,0,0,.6); display:flex; align-items:center; gap:12px; flex-wrap:wrap; justify-content:center}
.tla-hero-sub{font-family:var(--ff-ui); font-size:clamp(16px,2.3vw,21px); margin:0;
  color:rgba(255,255,255,.92); text-shadow:0 1px 10px rgba(0,0,0,.6)}
.tla-cards-h{font-family:var(--ff-head); font-size:var(--fs-h2); color:var(--gold2); margin:24px 0 4px; letter-spacing:.3px}
/* ---------- pennants ----------
   Two of these, explained once above the grid and then flown on the chapters
   they point at. A swallowtail cut and a slow wave: they should read as cloth on
   a pole, which is why the tail is notched rather than merely rounded. */
.tla-pennant{--flag:var(--gold); --flag-ink:var(--on-gold);
  position:relative; display:inline-block; flex:0 0 auto;
  font-family:var(--ff-ui); font-size:var(--fs-eyebrow); font-weight:700; letter-spacing:.7px;
  text-transform:uppercase; white-space:nowrap;
  /* The box is 5px taller than the cloth top and bottom. That gap is headroom:
     a clip-path cannot draw outside its own box, so without it the fly could
     only ever pinch inwards — it could never wave UP. The right padding is the
     fly's length, keeping the text clear of the notch. */
  padding:10px 40px 10px 11px; color:var(--flag-ink); background:var(--flag);
  /* Everything is in px, not %, because calc() interpolates in a clip-path (the
     midpoint of 34px and 26px really does compute to 30px). So the notch is the
     same length and the ripple the same depth whether the label is one word or
     four — with percentages both would stretch with the text. */
  clip-path:polygon(
    0 5px, calc(100% - 56px) 5px, calc(100% - 28px) 5px, 100% 5px,
    calc(100% - 34px) 50%,
    100% calc(100% - 5px), calc(100% - 28px) calc(100% - 5px),
    calc(100% - 56px) calc(100% - 5px), 0 calc(100% - 5px));
  animation:tlafly 3.8s ease-in-out infinite}
.tla-pennant.is-relevant{--flag:var(--new); --flag-ink:var(--on-accent)}
.tla-pennant.is-recommended{--flag:var(--teal); --flag-ink:var(--on-accent)}
.tla-pennant.is-extra{--flag:var(--green); --flag-ink:var(--on-accent)}
/* Landing notice: English-leads-translation, and how to help fill a gap. */
.tla-notice{display:flex; gap:12px; align-items:flex-start; margin:18px 0 2px; padding:14px 18px;
  border:1px solid var(--edge2); border-left:3px solid var(--teal); border-radius:12px; background:var(--bg2)}
.tla-notice svg{width:20px; height:20px; flex:0 0 auto; color:var(--teal2); margin-top:2px}
/* The machine-translation notice. Warmer than the teal one beside it, because it is about
   how much to trust this page's words rather than which edition it is built from. It sits
   directly above the "a project by" panel, which the shared 2px bottom margin left it
   touching, so it keeps a gap of its own. */
.tla-notice-mt{border-left-color:var(--gold); margin:18px 0 26px}
.tla-notice-mt svg{color:var(--gold2)}
.tla-notice p{margin:0; font-family:var(--ff-body); font-size:var(--fs-small); line-height:1.6; color:var(--ink2)}
.tla-notice b{color:var(--gold2)}
#tla-root .tla-notice a{color:var(--gold2); text-decoration:underline; text-underline-offset:2px}
#tla-root .tla-notice a:hover{color:var(--ink)}
/* the pole it hangs from */
.tla-pennant::before{content:''; position:absolute; left:0; top:3px; bottom:3px; width:2px;
  background:var(--flag); opacity:.55; border-radius:2px}
/* Only the fly moves. The four points at the hoist and at `100% - 56px` are the
   same in every keyframe, so the body is a rectangle that cannot budge and the
   text keeps a straight edge to sit against. Past that, the cloth is loose.
   The fly FLAPS rather than pinches: top and bottom shift together, so the cloth
   keeps its thickness instead of squeezing — a flag bends, it does not deflate.
   The two loose points are out of phase (when the middle is up the tip is still
   coming down), so a wave travels out along the fly rather than the whole tip
   bobbing as one lump. That phase lag is the whole difference between cloth and
   a windscreen wiper, which is also why none of these numbers form a sine. */
@keyframes tlafly{
  0%,100%{clip-path:polygon(0 5px, calc(100% - 56px) 5px, calc(100% - 28px) 5px,  100% 5px,
           calc(100% - 34px) 50%,
           100% calc(100% - 5px),  calc(100% - 28px) calc(100% - 5px), calc(100% - 56px) calc(100% - 5px), 0 calc(100% - 5px))}
  22%    {clip-path:polygon(0 5px, calc(100% - 56px) 5px, calc(100% - 28px) 1px,  100% 7px,
           calc(100% - 31px) 50%,
           100% calc(100% - 3px),  calc(100% - 28px) calc(100% - 9px), calc(100% - 56px) calc(100% - 5px), 0 calc(100% - 5px))}
  44%    {clip-path:polygon(0 5px, calc(100% - 56px) 5px, calc(100% - 28px) 6px,  100% 1px,
           calc(100% - 37px) 50%,
           100% calc(100% - 9px),  calc(100% - 28px) calc(100% - 4px), calc(100% - 56px) calc(100% - 5px), 0 calc(100% - 5px))}
  66%    {clip-path:polygon(0 5px, calc(100% - 56px) 5px, calc(100% - 28px) 9px,  100% 5px,
           calc(100% - 32px) 50%,
           100% calc(100% - 5px),  calc(100% - 28px) calc(100% - 1px), calc(100% - 56px) calc(100% - 5px), 0 calc(100% - 5px))}
  84%    {clip-path:polygon(0 5px, calc(100% - 56px) 5px, calc(100% - 28px) 4px,  100% 8px,
           calc(100% - 35px) 50%,
           100% calc(100% - 2px),  calc(100% - 28px) calc(100% - 6px), calc(100% - 56px) calc(100% - 5px), 0 calc(100% - 5px))}
}
.tla-pennantkey{list-style:none; display:flex; flex-wrap:wrap; gap:8px 24px; margin:14px 0 0; padding:0}
.tla-pennantkey-i{display:flex; align-items:center; gap:6px; min-width:0}
.tla-pennant-d{font-family:var(--ff-ui); font-size:var(--fs-small); color:var(--muted)}
/* on a card the pennant flies from the top-left corner, over the border */
.tla-cardpennant{position:absolute; top:8px; left:-5px; z-index:1; font-size:var(--fs-micro);
  padding:9px 38px 9px 9px; animation-duration:4.6s}
.tla-card.has-pennant{padding-top:44px}
/* Cloth does not flap for someone who asked the page to hold still. */
@media (prefers-reduced-motion:reduce){ .tla-pennant{animation:none} }

.tla-cards{display:grid; grid-template-columns:repeat(auto-fill,minmax(240px,1fr)); gap:14px; margin:24px 0 8px}
/* A shelf heading over its own grid. h3 under the "Explorar" h2, so the outline runs
   h1 > h2 > h3 with nothing skipped. */
.tla-cards-grp{font-family:var(--ff-head); font-size:var(--fs-h2); color:var(--gold2);
  margin:26px 0 -10px; letter-spacing:.3px}
.tla-card.is-soon{border-style:dashed}
.tla-card.is-soon .tla-card-meta{color:var(--teal2)}
/* The placeholder's own page: the promise, repeated, so a card that opens is not a
   card that opens onto nothing. */
.tla-soon{margin:18px 0 0; padding:22px 20px; text-align:center;
  border:1px dashed var(--edge2); border-radius:12px; background:var(--panel)}
.tla-soon-h{font-family:var(--ff-head); font-size:var(--fs-lead); color:var(--teal2); margin:0 0 6px; letter-spacing:.3px}
.tla-soon-d{font-family:var(--ff-body); font-size:var(--fs-small); color:var(--muted); margin:0}
.tla-card{position:relative; display:flex; flex-direction:column; gap:7px; width:100%; text-align:left; cursor:pointer;
  padding:18px 20px; border-radius:12px; border:1px solid var(--edge2); background:var(--panel); color:inherit;
  transition:transform .12s ease, border-color .12s, background .12s}
.tla-card:hover{transform:translateY(-2px); border-color:var(--gold); background:var(--panel2)}
.tla-card-top{display:flex; align-items:baseline; gap:11px}
/* --gold2 not --gold: at 15px on the light panel, --gold measures 4.43:1 — just
   under the 4.5:1 minimum for body-size text. */
.tla-card-num{font-family:var(--ff-head); font-size:var(--fs-small); color:var(--gold2); min-width:22px; flex:0 0 auto}
.tla-card-title{font-family:var(--ff-head); font-size:var(--fs-lead); line-height:1.15; color:var(--gold2)}
.tla-card-meta{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); color:var(--muted)}
.tla-card.news{border-color:var(--new-edge); background:linear-gradient(120deg,var(--new-bg),transparent 68%),var(--panel)}
.tla-card.news:hover{border-color:var(--new)}
.tla-card.news .tla-card-num,.tla-card.news .tla-card-title{color:var(--new)}
.tla-landing-about{margin-top:34px; padding-top:20px; border-top:1px solid var(--edge)}
.tla-landing-about h2{font-family:var(--ff-head); font-size:var(--fs-lead); color:var(--gold2); margin:0 0 12px; letter-spacing:.3px}

/* Rincón Miskatonic intro panel */
.tla-rm{display:flex; gap:24px; align-items:center; margin:0 0 6px; padding:22px 26px;
  border:1px solid var(--edge2); border-radius:14px;
  background:linear-gradient(115deg, var(--mark), transparent 62%), var(--panel)}
.tla-rm-body{flex:1 1 auto; min-width:0}
.tla-rm-title{font-family:var(--ff-head); font-size:var(--fs-h3); color:var(--gold2); margin:0 0 9px; letter-spacing:.3px}
/* No measure cap here. The panel is a two-column band — prose, then the sigil — and capping
   the prose at 66ch inside a column that takes all the remaining width opened a dead gap
   between the two. The column itself is what sets the measure now. */
.tla-rm-body p{font-size:var(--fs-body); color:var(--ink2); margin:0 0 15px; line-height:1.7}
.tla-rm-body p b{color:var(--gold2)} .tla-rm-body p i{color:var(--ink)}
/* #tla-root prefix so these win over the ID-specific `#tla-root a` link colour */
#tla-root .tla-rm-cta{display:inline-flex; align-items:center; gap:8px; font-family:var(--ff-ui); font-weight:700; font-size:var(--fs-small);
  padding:11px 18px; border-radius:9px; background:var(--gold); color:var(--on-gold); border:1px solid var(--gold)}
#tla-root .tla-rm-cta:hover{background:var(--gold2); color:var(--on-gold); text-decoration:none}
/* The project name set in italics, in the CTA and the title (see rmName). It must take its
   context's colour — dark on the gold CTA, gold in the title — not the site-wide `em` ink2,
   which would drop it below contrast on the gold button. #tla-root beats that em rule. */
#tla-root .tla-rm-name{font-style:italic; color:inherit}
.tla-rm-mark{flex:0 0 auto; margin-left:auto; width:124px; height:124px; color:var(--gold); opacity:.92; filter:drop-shadow(0 3px 8px rgba(0,0,0,.28))}
.tla-rm-mark .tla-sigil{width:100%; height:100%}
@media(max-width:680px){.tla-rm{gap:0} .tla-rm-mark{display:none}}

/* external link chip (e.g. retired-FAQ document that the PDF shows as a QR) */
#tla-root .tla-extlink{display:inline-flex; align-items:center; gap:7px; margin:2px 0 16px;
  font-family:var(--ff-ui); font-weight:600; font-size:var(--fs-small); padding:9px 15px; border-radius:9px;
  border:1px solid var(--teal); color:var(--teal2); background:transparent}
#tla-root .tla-extlink:hover{background:var(--mark); color:var(--teal2); text-decoration:none}
.tla-extlink svg{width:15px; height:15px; flex:0 0 auto}

/* A-Z filter bar (glossary) — an opaque toolbar pinned to the top of the reading
   pane. It must hide everything that scrolls under it, so it bleeds out to the
   edges of the pane: a new entry's accent line hangs 19px further left than the
   text, and it used to show through at the top corners.
   Square at the top, where content scrolls up behind it and would leak through a
   rounded corner; rounded at the bottom, where nothing passes and it reads as a
   panel hanging from the top rather than a band across the page. */
.tla-azfilter{position:sticky; top:0; z-index:8;
  margin:0 calc(-1*clamp(20px,3.6vw,56px)) 22px; padding:13px clamp(20px,3.6vw,56px);
  background:var(--panel); border:0; border-bottom:1px solid var(--edge2);
  border-radius:0 0 12px 12px;
  box-shadow:var(--stickyshadow)}
/* The whole header row is the toggle: a 27-letter bar is worth folding on a
   phone (five rows, a third of the screen) and worth folding on a desktop too
   once you know your letter. */
.tla-aztoggle{display:flex; align-items:center; gap:10px; width:100%; cursor:pointer;
  background:transparent; border:0; padding:0; min-height:34px; text-align:left; color:inherit}
.tla-azfilter .tla-azlabel{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); text-transform:uppercase;
  letter-spacing:1px; color:var(--muted); flex:0 0 auto}
.tla-azchev{width:18px; height:18px; flex:0 0 auto; color:var(--muted); transition:transform .18s ease}
.tla-azfilter.is-folded .tla-azchev{transform:rotate(-90deg)}
.tla-aztoggle:hover .tla-azlabel,.tla-aztoggle:hover .tla-azchev{color:var(--ink2)}
.tla-azpanel{padding-top:10px}
.tla-azpanel[hidden]{display:none}
.tla-azrow{display:flex; flex-wrap:wrap; gap:6px; align-items:center}
.tla-azbtn{min-width:36px; height:36px; padding:0 8px; border-radius:8px; border:1px solid var(--edge2); background:var(--bg2);
  color:var(--ink2); font-family:var(--ff-ui); font-size:var(--fs-small); font-weight:600; cursor:pointer}
.tla-azbtn:hover{background:var(--panel2); color:var(--ink); border-color:var(--gold)}
.tla-azbtn.active{background:var(--gold); color:var(--on-gold); border-color:var(--gold)}
.tla-azbtn.all{width:auto; padding:0 14px}
/* pushed right, and the last thing to be given up when the bar is narrow */
.tla-azcount{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); color:var(--muted);
  margin-left:auto; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; min-width:0}
.tla-azfilter.is-folded .tla-azcount{color:var(--gold2)}
/* Empty state: a version filter can leave a glossary letter (or the whole
   chapter) with nothing to show. Speak to it instead of a blank pane. */
.tla-glossnone{font-family:var(--ff-ui); font-size:var(--fs-small); color:var(--muted);
  margin:28px 0; padding:18px 20px; border:1px dashed var(--edge2);
  border-radius:10px; background:var(--bg2); text-align:center}

/* Jumping to an entry must land it BELOW the pinned toolbar, not behind it. The
   toolbar's height changes with the alphabet and the width (it wraps to two rows
   on a narrow pane), so app.js measures it and sets --sticky-h. */
.tla-entry{scroll-margin-top:calc(var(--sticky-h,0px) + 24px); margin:0 0 30px; padding-top:4px}
.tla-entry h2{font-family:var(--ff-head); font-size:var(--fs-h3); color:var(--gold2); margin:26px 0 10px; letter-spacing:.3px;
  display:flex; align-items:center; gap:8px}
/* 24x24 minimum: the glyph is small, so the target is padded out around it
   (WCAG 2.5.8). inline-flex keeps it on the heading's baseline row. */
.tla-entry h2 .anchor{opacity:0; color:var(--muted); font-family:var(--ff-ui); font-size:var(--fs-body);
  text-decoration:none; transition:opacity .15s;
  display:inline-flex; align-items:center; justify-content:center;
  min-width:24px; min-height:24px; vertical-align:middle}
.tla-entry:hover h2 .anchor,.tla-entry h2 .anchor:focus-visible{opacity:.75}
/* A subsection heading: in the book it is set larger and in teal, with a rule
   under it, and it opens the run of entries that follow. It used to render
   SMALLER than them — the flag that marked it was read backwards. */
.tla-entry.is-subhead h2{color:var(--teal2); font-size:var(--fs-h2); margin-top:38px;
  padding-bottom:8px; border-bottom:1px solid var(--teal); display:block}
.tla-entry.is-subhead h2 .anchor{float:right}

/* STOP! — in the book a red-ruled callout in the margin, not a heading with a
   paragraph under it. It interrupts you on purpose, so it looks like it does. */
.tla-entry.is-callout{border:1px solid var(--new-edge); border-radius:14px;
  padding:20px 26px 22px; margin:30px 0; text-align:center;
  background:linear-gradient(180deg,var(--new-bg),transparent 70%),var(--panel)}
.tla-entry.is-callout h2{justify-content:center; color:var(--new); font-size:var(--fs-h2);
  margin:0 0 4px; letter-spacing:1px}
.tla-entry.is-callout .tla-p{color:var(--ink); max-width:62ch; margin:0 auto}
.tla-entry.is-callout .tla-p:first-of-type{font-family:var(--ff-head); font-size:var(--fs-lead);
  color:var(--new); letter-spacing:.4px; margin-bottom:12px;
  text-decoration:underline; text-underline-offset:5px; text-decoration-thickness:1px}
.tla-entry.is-callout .anchor{display:none}
/* The FAQ's obsolete-Beta warning: the book's red STOP! energy, as a banner at the top of a
   retired section, pointing to the living rule in the Grimoire. */
.tla-obsolete{display:flex; align-items:center; gap:18px; margin:0 0 26px; padding:16px 20px;
  border:1px solid var(--new-edge); border-left:5px solid var(--new); border-radius:12px;
  background:linear-gradient(180deg,var(--new-bg),transparent 80%),var(--panel)}
.tla-obsolete-tag{flex:0 0 auto; font-family:var(--ff-head); font-size:var(--fs-lead); font-weight:700;
  letter-spacing:1.5px; color:var(--new); text-transform:uppercase}
.tla-obsolete-body{min-width:0}
.tla-obsolete-lead{margin:0 0 6px; font-size:var(--fs-small); color:var(--ink); line-height:1.55}
.tla-obsolete-p{margin:0; font-size:var(--fs-small); color:var(--ink2); line-height:1.6}
/* The epigraph a document opens with — a quotation, so it is set as one: indented, with the
   attribution at the far end of the line rather than looking like another sentence of it. */
.tla-entry.is-epigraph .tla-p{padding-left:18px; border-left:2px solid var(--edge2)}
.tla-entry.is-epigraph .tla-p:last-child{border-left-color:transparent; text-align:right;
  color:var(--muted)}
/* The community's deeper timing reference: a real table, so it can be read, searched and
   translated. Three columns, a row per step; the free-window rows are tinted AND labelled,
   never tinted alone. Wide, so it scrolls inside its own box rather than the page. */
.tla-fm{margin:34px 0 0; padding-top:26px; border-top:1px solid var(--edge2)}
.tla-fm-title{font-family:var(--ff-head); font-size:var(--fs-h3); margin:0 0 16px; color:var(--ink)}
.tla-fm-wrap{overflow-x:auto; margin:18px 0 0; border:1px solid var(--edge2); border-radius:12px}
.tla-fm-table{border-collapse:collapse; width:100%; min-width:640px; font-size:var(--fs-small)}
.tla-fm-table th,.tla-fm-table td{text-align:left; vertical-align:top; padding:11px 14px;
  border-bottom:1px solid var(--edge2)}
.tla-fm-table thead th{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); font-weight:700;
  letter-spacing:.6px; text-transform:uppercase; color:var(--muted); background:var(--bg2);
  position:sticky; top:0}
.tla-fm-table tbody tr:last-child th,.tla-fm-table tbody tr:last-child td{border-bottom:0}
.tla-fm-id{white-space:nowrap; font-family:var(--ff-ui); font-weight:700; color:var(--ink);
  font-variant-numeric:tabular-nums; width:1%}
/* The middle column is a short sentence and the right one is a long list, so the browser's
   automatic split starves the middle. Fixed shares instead, with a floor so it never collapses
   to one word per line. */
.tla-fm-desc{color:var(--ink); width:26%; min-width:170px}
.tla-fm-order{width:auto}
.tla-fm-order{color:var(--ink2); line-height:1.6}
.tla-fm-table tr.is-window{background:var(--bg2)}
.tla-fm-win{font-style:italic; font-weight:600; color:var(--ink2)}
.tla-fm-wrap:focus-visible{outline:2px solid var(--gold); outline-offset:2px}
.tla-fm-h{margin:12px 0 4px; font-weight:700; color:var(--ink)}
.tla-fm-order>*:first-child{margin-top:0}
.tla-fm-p,.tla-fm-eg{margin:0 0 4px}
.tla-fm-eg{padding-left:14px; border-left:2px solid var(--edge2)}
.tla-fm-credit{margin:14px 0 0; font-size:var(--fs-eyebrow); color:var(--ink2)}
.tla-obsolete-lead+.tla-obsolete-p{margin-top:2px}
#tla-root .tla-obsolete-go{display:inline-flex; align-items:center; gap:6px; font-family:var(--ff-ui);
  font-weight:700; font-size:var(--fs-eyebrow); color:var(--new); text-decoration:underline; text-underline-offset:3px}
#tla-root .tla-obsolete-go:hover{filter:brightness(1.12)}
@media (max-width:560px){.tla-obsolete{flex-direction:column; align-items:flex-start; gap:10px}}

/* ---------- phase diagrams ---------- */
/* The book draws these as boxes joined by fat arrows: teal for a numbered step,
   red for a player window. Same shapes here, built from the same text. */
.tla-diagbadge{font-family:var(--ff-ui); font-size:var(--fs-micro); font-weight:700; letter-spacing:.6px;
  text-transform:uppercase; color:var(--teal2); border:1px solid var(--teal);
  border-radius:6px; padding:1px 7px; vertical-align:middle; white-space:nowrap}
.tla-toc a .tla-diagbadge{font-size:var(--fs-micro); padding:0 5px; margin-left:4px}
.tla-flowwrap{position:relative; max-width:620px; margin:22px auto 30px}
.tla-flow{list-style:none; margin:0; padding:0}
/* the loops the book curves back up the right-hand side. The boxes' own words
   already say where each one goes, so these are decoration — JS only sets how far
   they reach, because that depends on how the text lays out. */
.tla-flow-loop{position:absolute; pointer-events:none;
  border:2px solid var(--teal); border-left:0; border-radius:0 10px 10px 0}
.tla-flow-loop::before{content:''; position:absolute; top:-6px; left:-1px;
  border:6px solid transparent; border-right-color:var(--teal); border-left:0}
.tla-flow-item{display:flex; flex-direction:column; align-items:center}
.tla-flow-box{width:100%; border:2px solid var(--teal); border-radius:26px;
  padding:12px 22px; text-align:center; background:var(--panel);
  font-size:var(--fs-small); line-height:1.5; color:var(--ink)}
.tla-flow-item.is-window .tla-flow-box{border-color:var(--new-edge); color:var(--new);
  font-family:var(--ff-ui); font-weight:700; font-size:var(--fs-small); padding:9px 22px}
.tla-flow-item.is-window .ico{--icon:var(--new)}
.tla-flow-item.is-goto .tla-flow-box{font-style:italic; font-weight:600}
/* the arrow takes the colour of the box it leaves, as in the book */
.tla-flow-arrow{display:block; width:46px; height:26px; margin:0; flex:0 0 auto;
  background:var(--teal);
  clip-path:polygon(32% 0, 68% 0, 68% 42%, 100% 42%, 50% 100%, 0 42%, 32% 42%)}
.tla-flow-item.is-window .tla-flow-arrow{background:var(--new-edge)}
.tla-flow-box.flash{animation:flowflash 1.4s ease-out}
@keyframes flowflash{from{border-color:var(--gold); box-shadow:0 0 0 4px var(--mark)}
  to{border-color:var(--teal); box-shadow:none}}
/* a step number that the book loops back to */
/* ---------- diagrams-only switch ---------- */
/* A real fieldset with real radios: the segmented look is painted onto the labels,
   while the inputs stay real and focusable — moved out of sight, never hidden — so
   arrow keys, the single tab stop and "1 of 2" are the browser's own. */
/* Borderless, so the legend lays out as an ordinary line instead of being notched
   into a frame. The frame belongs to the row below it. */
.tla-diagpick{border:0; margin:0 0 18px; padding:0; min-width:0}
.tla-diagpick-lg{font-family:var(--ff-ui); font-size:var(--fs-micro); text-transform:uppercase;
  letter-spacing:1px; color:var(--muted); padding:0 0 7px}
/* The pill nests inside the frame's radius only because both are pills and the
   padding is EQUAL on all four sides: outer radius = inner radius + padding exactly.
   An asymmetric padding is what pushed the right-hand option's corner through the
   frame's curve. */
.tla-diagpick-row{display:inline-flex; align-items:center; gap:4px; max-width:100%;
  border:1px solid var(--edge2); border-radius:999px; padding:4px; background:var(--panel)}
.tla-diagopt{position:relative; display:inline-flex; align-items:center; justify-content:center;
  border-radius:999px; cursor:pointer; font-family:var(--ff-ui); font-size:var(--fs-eyebrow); color:var(--ink2);
  padding:0 14px; min-height:34px; text-align:center}
.tla-diagopt:hover{background:var(--panel2); color:var(--ink)}
.tla-diagopt input{position:absolute; width:1px; height:1px; opacity:0; margin:0}
.tla-diagopt:has(input:focus-visible){outline:3px solid var(--gold); outline-offset:2px}
/* Checked is not colour alone (WCAG 1.4.1): the pill is a filled shape a colour-blind
   reader still reads as "this one". */
.tla-diagopt:has(input:checked){background:var(--gold); color:var(--on-gold); font-weight:700}
@media (max-width:560px){
  .tla-diagpick-row{display:flex; width:100%; border-radius:14px}
  .tla-diagopt{flex:1 1 0; min-width:0}
}
/* Fallback for an engine without :has() (pre-2023). The visible label wraps the hidden
   radio, so :has() paints its focus ring and its checked fill; without it a keyboard user
   would see neither which option has focus (WCAG 2.4.7) nor which is selected. focus-within
   is old and universal, and the checked option is emphasised through the input's own
   sibling. Scoped to where :has() is missing so modern engines are untouched (there,
   focus-within would also fire on a mouse click). */
@supports not (selector(:has(*))){
  .tla-themeopt:focus-within,.tla-diagopt:focus-within{outline:3px solid var(--gold); outline-offset:2px}
  .tla-themeopt input:checked ~ .tla-themeopt-n{color:var(--ink); font-weight:700}
  .tla-themeopt input:checked ~ .tla-themeopt-n::before{content:'\2713\00a0'}
  .tla-diagopt input:checked ~ span{text-decoration:underline; text-underline-offset:3px; font-weight:700}
}

/* A <button>, because it acts on this page rather than going anywhere — so it needs
   its button-ness stripped back to the inline word the book prints. font:inherit and
   the zeroed box are what stop it looking like a control mid-sentence. */
.tla-flowref{color:var(--teal2); font-weight:700; cursor:pointer;
  font-family:inherit; font-size:inherit; line-height:inherit;
  background:none; border:0; padding:0; margin:0;
  text-decoration:underline; text-underline-offset:2px; text-decoration-style:dotted}
.tla-flowref:hover{color:var(--gold2)}
.tla-entry.flash{animation:tlaflash 1.6s ease}
@keyframes tlaflash{0%,18%{background:var(--mark)}100%{background:transparent}}

/* ---------- card anatomy ---------- */
/* The card stays a picture; everything the book drew around it — the numbered
   diamonds, the arrows, the key — is rebuilt as text. `data-hot` on the section
   is the whole cross-highlight: set it to a number and both sides light up. */
.tla-anat{margin:26px 0 34px}
.tla-anat-h{font-family:var(--ff-head); font-size:var(--fs-h3); color:var(--gold2);
  margin:0 0 6px; font-weight:400}
.tla-anat-hint{margin:0 0 14px; font-size:var(--fs-small); color:var(--muted); max-width:62ch}
/* the cards, as tabs */
.tla-anat-tabs{display:flex; flex-wrap:wrap; gap:6px; margin:0 0 18px;
  border-bottom:1px solid var(--edge2); padding-bottom:10px}
.tla-anat-tab{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); line-height:1.2;
  padding:8px 13px; min-height:34px; border-radius:8px; cursor:pointer;
  border:1px solid var(--edge2); background:var(--panel); color:var(--ink2)}
.tla-anat-tab:hover{background:var(--panel2); color:var(--ink)}
.tla-anat-tab[aria-selected=true]{background:var(--gold); border-color:var(--gold);
  color:var(--on-gold); font-weight:700}
/* card beside its own key: both on screen at once, which is the whole point */
.tla-anat-split{display:grid; grid-template-columns:300px minmax(0,1fr); gap:24px 28px;
  align-items:start}
.tla-anatcard{margin:0; min-width:0}
.tla-anatcard-t{font-family:var(--ff-head); font-size:var(--fs-small); color:var(--gold2);
  margin:8px 0 0; text-align:center}
/* the frame is the marker's positioning context, so it must hug the image exactly */
.tla-anatcard-frame{position:relative; display:block; line-height:0}
.tla-anatcard-img{display:block; width:100%; height:auto; border-radius:9px;
  background:var(--figbg)}
.tla-anat-none{margin:0; color:var(--muted); font-size:var(--fs-small)}

/* ---- Ultimatums & Boons viewer ---- */
.tla-ub{margin:6px 0 0}
/* Viewer-wide tools row (draw a random hand, download all as .zip). */
.tla-ub-tools{display:flex; flex-wrap:wrap; gap:8px; margin:0 0 14px}
.tla-ub-tool{display:inline-flex; align-items:center; gap:7px; cursor:pointer; min-height:38px;
  font-family:var(--ff-ui); font-size:var(--fs-small); font-weight:600; padding:8px 15px; border-radius:9px;
  border:1px solid var(--edge2); background:var(--panel); color:var(--ink2)}
.tla-ub-tool:hover{background:var(--panel2); color:var(--ink); border-color:var(--gold)}
.tla-ub-tool:disabled{opacity:.6; cursor:progress}
.tla-ub-tool svg{width:16px; height:16px; flex:0 0 auto}
/* View-mode toggle (list / gallery), pushed to the end of the tools row. */
.tla-ub-view{margin-left:auto; display:inline-flex; gap:2px; padding:3px; border-radius:10px;
  border:1px solid var(--edge2); background:var(--bg2)}
/* The frame-skin toggle reuses the view toggle's chip look but sits with the left-hand tools, not
   pushed to the far right, and keeps its V1/V2 labels even on narrow screens. */
.tla-ub-skin{margin-left:0}
.tla-ub-viewbtn{display:inline-flex; align-items:center; gap:6px; cursor:pointer; min-height:32px;
  font-family:var(--ff-ui); font-size:var(--fs-eyebrow); font-weight:600; padding:5px 12px; border-radius:8px;
  border:1px solid transparent; background:transparent; color:var(--ink2)}
.tla-ub-viewbtn:hover{color:var(--ink)}
.tla-ub-viewbtn.is-on{background:var(--gold); border-color:var(--gold); color:var(--on-gold)}
.tla-ub-viewbtn svg{width:15px; height:15px; flex:0 0 auto}
@media (max-width:560px){.tla-ub-view{margin-left:0}.tla-ub-viewbtn span{display:none}
  .tla-ub-skin .tla-ub-viewbtn span{display:inline}}
/* Chapter filter (all / cap 1 / cap 2), same segmented look as the view toggle. */
.tla-ub-chap{display:inline-flex; gap:2px; padding:3px; border-radius:10px;
  border:1px solid var(--edge2); background:var(--bg2)}
.tla-ub-chapbtn{cursor:pointer; min-height:32px; font-family:var(--ff-ui); font-size:var(--fs-eyebrow);
  font-weight:600; padding:5px 12px; border-radius:8px; border:1px solid transparent;
  background:transparent; color:var(--ink2)}
.tla-ub-chapbtn:hover{color:var(--ink)}
.tla-ub-chapbtn.is-on{background:var(--gold); border-color:var(--gold); color:var(--on-gold)}
/* The refractions panel's own filter bar: chapter toggle + campaign/scenario selectors, each a
   labelled column so the three read as one row of filters with room to breathe. */
.tla-ub-rfilter{display:flex; flex-wrap:wrap; align-items:flex-end; gap:16px 26px; margin:0 0 20px;
  padding:15px 18px; border:1px solid var(--edge2); border-radius:12px; background:var(--bg2)}
.tla-ub-fgroup{display:flex; flex-direction:column; gap:7px}
.tla-ub-flabel{display:block; font-family:var(--ff-ui); font-size:var(--fs-micro); font-weight:700;
  letter-spacing:.6px; text-transform:uppercase; color:var(--muted)}
.tla-ub-sel{display:flex; flex-direction:column; gap:7px; min-width:0}
.tla-ub-selbox{font-family:var(--ff-ui); font-size:var(--fs-small); font-weight:600; color:var(--ink);
  min-height:40px; min-width:210px; max-width:min(300px,72vw); padding:8px 34px 8px 13px; cursor:pointer;
  border:1px solid var(--edge2); border-radius:10px; background:var(--panel);
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='none' stroke='%23b89a5f' stroke-width='2.4'><path d='M6 9l6 6 6-6'/></svg>");
  background-repeat:no-repeat; background-position:right 11px center; appearance:none; -webkit-appearance:none;
  transition:border-color .12s, box-shadow .12s}
.tla-ub-selbox:hover{border-color:var(--gold)}
.tla-ub-selbox:focus-visible{outline:none; border-color:var(--gold); box-shadow:0 0 0 3px var(--focus-ring,rgba(184,154,95,.35))}
.tla-ub-selbox:disabled{opacity:.45; cursor:not-allowed; background-image:none}
.tla-ub-selbox option{color:var(--ink); background:var(--panel)}
.tla-ub-clear{display:inline-flex; align-items:center; gap:6px; font-family:var(--ff-ui);
  font-size:var(--fs-eyebrow); font-weight:600; color:var(--ink2); cursor:pointer; min-height:40px;
  padding:8px 14px; border:1px solid var(--edge2); border-radius:10px; background:var(--panel)}
.tla-ub-clear:hover{background:var(--panel2); color:var(--ink); border-color:var(--gold)}
.tla-ub-clear svg{width:14px; height:14px}
/* Which chapter a refraction belongs to (Cap. 1 / Cap. 2) — shown as a labelled pill, never
   colour alone, so the two chapters read apart at a glance in the list and gallery. */
.tla-ub-chip{flex:0 0 auto; font-family:var(--ff-ui); font-size:var(--fs-micro); font-weight:700;
  letter-spacing:.3px; padding:2px 8px; border-radius:999px; border:1px solid var(--edge2);
  white-space:nowrap; color:var(--ink2); background:var(--bg)}
.tla-ub-chip.tla-chip-cap1{color:var(--teal2)}
.tla-ub-chip.tla-chip-cap2{color:var(--gold2)}
.tla-ub-item .tla-ub-chip{margin-left:auto}
.tla-ub-gcard{position:relative}
.tla-ub-gcard > .tla-ub-chip{position:absolute; top:8px; left:8px; z-index:2;
  background:var(--panel); box-shadow:0 1px 4px rgba(0,0,0,.35)}
.tla-ub-tabs{display:flex; flex-wrap:wrap; gap:6px; margin:0 0 20px;
  border-bottom:1px solid var(--edge2); padding-bottom:10px}
.tla-ub-tab{font-family:var(--ff-ui); font-size:var(--fs-small); line-height:1.2;
  padding:9px 15px; min-height:38px; border-radius:9px; cursor:pointer;
  border:1px solid var(--edge2); background:var(--panel); color:var(--ink2)}
.tla-ub-tab:hover{background:var(--panel2); color:var(--ink)}
.tla-ub-tab[aria-selected=true]{background:var(--gold); border-color:var(--gold);
  color:var(--on-gold); font-weight:700}
/* The count keeps full opacity: dimming it blended the ink toward the tab background and
   dropped it under 4.5:1 on several themes (and toward gold on the selected tab). The
   smaller size already reads it as secondary. */
.tla-ub-n{font-size:var(--fs-eyebrow); font-weight:400; margin-left:2px}
/* Gallery: every card of the tab at once, filling the width (5argon-style). A card
   enlarges to a full-size render in the lightbox on click; its glossary links stay
   visible but non-interactive so a click zooms rather than also navigating away. */
.tla-ub-gallery{display:grid; grid-template-columns:repeat(auto-fill,minmax(320px,1fr));
  gap:26px 24px; align-items:start}
.tla-ub-gcard{min-width:0; cursor:zoom-in}
.tla-ub-gcard .tla-ubc a{pointer-events:none}
/* List mode: a big names+thumbnails list (5argon-style) beside one large card. */
.tla-ub-main{display:grid; grid-template-columns:minmax(300px,380px) minmax(0,1fr);
  gap:22px 34px; align-items:start}
.tla-ub-list{list-style:none; margin:0; padding:8px; max-height:78vh; overflow-y:auto;
  border:1px solid var(--edge2); border-radius:12px; background:var(--bg2)}
.tla-ub-item{display:flex; align-items:center; gap:15px; padding:10px 12px; margin:3px 0;
  border-radius:10px; cursor:pointer; border:1px solid transparent}
.tla-ub-item:hover{background:var(--panel2)}
.tla-ub-item.is-sel{background:var(--panel); border-color:var(--edge2);
  box-shadow:inset 3px 0 0 var(--gold)}
.tla-ub-thumb{width:72px; height:auto; flex:0 0 auto; display:block; border-radius:6px;
  background:var(--figbg); box-shadow:0 1px 3px rgba(0,0,0,.4)}
.tla-ub-iwrap{display:flex; flex-direction:column; min-width:0}
.tla-ub-iname{font-family:var(--ff-ui); font-size:var(--fs-body); color:var(--ink2); line-height:1.3}
.tla-ub-item.is-sel .tla-ub-iname{color:var(--gold2); font-weight:600}
/* A refraction's campaign/scenario, under its name in the list. */
.tla-ub-isub{display:inline-flex; align-items:center; gap:6px; margin-top:3px;
  font-family:var(--ff-ui); font-size:var(--fs-eyebrow); font-style:italic; color:var(--muted); line-height:1.2}
.tla-ub-isub .tla-ubc-sym{width:16px; height:16px; flex:0 0 auto; background-color:var(--gold2); filter:none}
/* A scenario refraction lists its campaign and scenario on two labelled lines. */
.tla-ub-isub2{flex-direction:column; align-items:flex-start; gap:4px; margin-top:5px}
.tla-ub-isubrow{display:inline-flex; align-items:center; gap:6px}
.tla-ub-isublbl{font-style:normal; font-weight:700; color:var(--ink2)}
/* "EN": this card is still in English, awaiting translation. */
.tla-ub-en{margin-left:auto; flex:0 0 auto; align-self:center; font-family:var(--ff-ui);
  font-size:var(--fs-micro); font-weight:700; letter-spacing:.5px; color:var(--gold2);
  background:var(--mark); border:1px solid var(--gold); border-radius:5px; padding:1px 5px}
/* No auto side-margins here: this is a grid cell, and an auto margin turns off the
   stretch that gives it width — with the card size-contained (below) that collapses it
   to zero. The card centres itself instead. */
.tla-ub-detail{min-width:0}
/* Leaf through the shown cards. Sits under the card, centred on it; the arrow at the end of
   the stack is disabled and dimmed, so the edges of the list are felt rather than guessed. */
.tla-ub-step{display:flex; align-items:center; justify-content:center; gap:14px;
  max-width:460px; margin:14px auto 0}
.tla-ub-stepbtn{display:inline-flex; align-items:center; justify-content:center; cursor:pointer;
  width:40px; height:40px; border-radius:10px; border:1px solid var(--edge2);
  background:var(--panel); color:var(--ink2)}
.tla-ub-stepbtn:hover:not([disabled]){background:var(--panel2); color:var(--ink); border-color:var(--gold)}
.tla-ub-stepbtn[disabled]{opacity:.35; cursor:default}
.tla-ub-stepbtn svg{width:20px; height:20px}
.tla-ub-stepn{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); font-weight:600; color:var(--muted);
  font-variant-numeric:tabular-nums; min-width:9ch; text-align:center}
/* The card is rendered LIVE: a fixed textless picture (art + 5argon's frame, the
   printed English text hidden under it) with the title, type line and rule laid over
   it in the reader's language and the game's own fonts. Container-query units size
   every text layer from the card's own width, so one set of percentages holds at any
   display size. The card's colours are the print's cream, not the site theme's. */
.tla-ubc{position:relative; width:100%; max-width:460px; margin:0 auto;
  container-type:inline-size; border-radius:16px; overflow:hidden; box-shadow:var(--shadow)}
.tla-ubc-pic{display:block; width:100%; height:auto}
/* Download the card as shown: a small button on the picture, always reachable. */
.tla-ubc-dl{position:absolute; top:2.5%; right:2.5%; z-index:2; width:14%; max-width:44px;
  aspect-ratio:1; display:flex; align-items:center; justify-content:center; cursor:pointer;
  border-radius:50%; border:1px solid rgba(244,236,216,.4); background:rgba(12,10,14,.62);
  color:#f4ecd8; -webkit-backdrop-filter:blur(2px); backdrop-filter:blur(2px)}
.tla-ubc-dl:hover{background:rgba(12,10,14,.85); border-color:#f4ecd8}
.tla-ubc-dl svg{width:52%; height:52%}
.tla-ubc-title,.tla-ubc-type,.tla-ubc-rule,.tla-ubc-illus,.tla-ubc-noart{position:absolute; color:#f4ecd8}
/* The card text sits over artwork and, at the title, over gold line-work — measured as
   low as 1:1 against the brightest of it. A dark halo around every glyph is what keeps
   it legible (WCAG's text-outline technique): the pixels touching each letter are the
   halo, not the gold, so contrast is high wherever the letter actually is. */
.tla-ubc-title,.tla-ubc-type,.tla-ubc-illus,.tla-ubc-noart{
  text-shadow:0 0 .35cqw #000,.09cqw .09cqw .14cqw #000,-.09cqw .09cqw .14cqw #000,
    .09cqw -.09cqw .14cqw #000,-.09cqw -.09cqw .14cqw #000}
.tla-ubc-rule{text-shadow:0 0 .3cqw #000,.06cqw .06cqw .1cqw #000,-.06cqw .06cqw .1cqw #000}
/* The title band is a flat colour strip near the top; centre the name in it rather
   than pinning it to the top edge, so one and two-line names both sit on the strip. */
.tla-ubc-title{top:3.2%; height:10.6%; left:11%; right:11%; margin:0;
  display:flex; align-items:center; justify-content:center; text-align:center;
  font-family:'ubtitle',var(--ff-head); font-weight:400; font-size:6.7cqw;
  line-height:1.02; letter-spacing:.2cqw}
.tla-ubc-type{top:70.1%; left:8%; right:8%; text-align:center;
  font-family:'ubbody',var(--ff-body); font-style:italic; font-weight:700;
  font-size:3.3cqw; line-height:1}
.tla-ubc-rule{top:74%; left:9.5%; right:9.5%; bottom:9.4%; overflow:hidden;
  font-family:'ubbody',var(--ff-body); font-size:calc(var(--ubfit,1)*4.1cqw);
  line-height:1.28; text-align:left}
/* color:inherit, or the global .tla-p{color:var(--ink)} wins and the rule turns dark —
   invisible on the dark card under a light theme (var(--ink) is dark there). */
.tla-ubc-rule .tla-p{margin:0 0 .45em; font-size:inherit; line-height:inherit; color:inherit}
.tla-ubc-rule .tla-p:last-child{margin-bottom:0}
.tla-ubc-rule a.xref{text-decoration:underline; text-underline-offset:2px}
.tla-ubc-rule .ico{background-color:#f4ecd8}
/* Illustrator credit, printed small at the bottom-left of every card. */
.tla-ubc-illus{bottom:2.4%; left:9.5%; right:9.5%; text-align:left;
  font-family:'ubbody',var(--ff-body); font-weight:700; font-size:2.5cqw;
  line-height:1; color:rgba(244,236,216,.9)}
/* A card whose illustration has not arrived yet: a quiet note in the empty window. */
.tla-ubc-noart{top:40%; left:14%; right:14%; text-align:center;
  font-family:var(--ff-ui); font-size:3.1cqw; line-height:1.3;
  color:rgba(244,236,216,.55); letter-spacing:.3cqw; text-transform:uppercase}
/* Encounter-set / product symbols, drawn in the card's cream through a mask. */
.tla-ubc-sym{display:inline-block; background-color:#f4ecd8; vertical-align:middle;
  -webkit-mask-repeat:no-repeat; mask-repeat:no-repeat; -webkit-mask-position:center;
  mask-position:center; -webkit-mask-size:contain; mask-size:contain;
  filter:drop-shadow(0 .06cqw .12cqw #000)}
/* A refraction lifts its title to make room for the encounter-set subtitle under it. */
.tla-ubc.is-refraction .tla-ubc-title{top:2.3%; height:6.6%}
.tla-ubc-subtitle{position:absolute; top:11.1%; left:8%; right:8%; color:#f4ecd8; text-align:center;
  font-family:'ubbody',var(--ff-body); font-style:italic; font-size:2.9cqw; line-height:1.15;
  text-shadow:0 0 .3cqw #000,.07cqw .07cqw .12cqw #000}
/* Emphasis inside a card keeps the card's fixed cream. The theme rule
   `#tla-root em{color:var(--ink2)}` otherwise leaks a dark ink that is invisible on the
   black title band under a light theme. Id-qualified to outrank that theme rule. */
#tla-root .tla-ubc em,#tla-root .tla-ubc i,
#tla-root .tla-ubc b,#tla-root .tla-ubc strong{color:#f4ecd8}
/* Links get a fixed light teal — eye-catching against the card's warm gold/cream and
   legible on any artwork thanks to the shared dark halo (the outline carries the
   contrast, not the hue). Fixed, not var(--teal2): the card art is theme-independent,
   so the theme's teal (which turns dark on light themes) must not reach it. */
#tla-root .tla-ubc a{color:#a7d3e6}
/* Refraction subtitle: the encounter-set and collection symbols sit inline, each in
   front of the name it belongs to, sized to the italic type around them. */
.tla-ubc-subtitle .tla-ubc-sym{width:3cqw; height:3cqw; vertical-align:-.45cqw; margin-right:.55cqw}
.tla-ubc-subsep{margin:0 .8cqw; opacity:.75}
/* The set symbol fills the refraction diamond, centred above the type line. */
.tla-ubc-setmark{position:absolute; top:60.3%; left:0; right:0; height:6.6%;
  display:flex; align-items:center; justify-content:center}
.tla-ubc-setmark .tla-ubc-sym{width:5.4cqw; height:5.4cqw}
.tla-ubc-coll{position:absolute; bottom:2.1%; right:7.5%; line-height:0}
.tla-ubc-coll .tla-ubc-sym{width:5.4cqw; height:5.4cqw}
/* Item present in English but not yet in this language: shown in English, flagged. */
.tla-ub-pending{display:flex; align-items:flex-start; gap:9px; max-width:400px;
  margin:0 auto 16px; padding:9px 13px; border-radius:10px; font-family:var(--ff-ui);
  font-size:var(--fs-eyebrow); line-height:1.35; background:var(--mark); color:var(--mark-ink);
  border:1px solid var(--gold)}
.tla-ub-pending svg{width:17px; height:17px; flex:0 0 auto; margin-top:1px; color:var(--gold2)}
.tla-ub-pending b{color:var(--gold2); font-weight:700}
.tla-ub-credit{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); color:var(--muted);
  margin:24px 0 0; display:flex; flex-wrap:wrap; gap:4px 12px; align-items:center}
.tla-ub-credit .tla-extlink{margin:0}
@media (max-width:760px){
  .tla-ub-main{grid-template-columns:1fr}
  .tla-ub-list{max-height:300px}
  .tla-ub-detail{max-width:none}
}

/* A marker sits where the book's arrowhead pointed. It is translated onto its
   own centre, so the percentage is the point itself and stays the point at any
   size. 26px keeps it a legal target (WCAG 2.5.8) even on a 320px screen — at
   that width the closest two markers in the book are still ~26px apart. */
.tla-anatmark{position:absolute; width:26px; height:26px; margin:-13px 0 0 -13px;
  padding:0; border-radius:50%; cursor:pointer;
  border:2px solid var(--gold); background:var(--panel); color:var(--gold2);
  font-family:var(--ff-ui); font-size:var(--fs-eyebrow); font-weight:700; line-height:1;
  display:flex; align-items:center; justify-content:center;
  box-shadow:0 1px 4px rgba(0,0,0,.55); transition:transform .12s ease}
.tla-anatmark:hover{background:var(--gold); color:var(--on-gold); transform:scale(1.15)}
.tla-anat[data-hot] .tla-anatmark{opacity:.4}
.tla-anat .tla-anatmark.is-hot{opacity:1; background:var(--gold);
  color:var(--on-gold); transform:scale(1.2); box-shadow:0 0 0 4px var(--mark)}

.tla-anat-key{margin:0; padding:0; list-style:none; counter-reset:none}
.tla-anat-key > li{display:flex; gap:10px; align-items:baseline;
  padding:7px 9px; border-radius:8px; font-size:var(--fs-small); line-height:1.55;
  color:var(--ink); border:1px solid transparent}
.tla-anat-key > li.is-hot{background:var(--mark); border-color:var(--gold)}
.tla-anat-key > li.flash{animation:tlaflash 1.6s ease}
.tla-anat-n{flex:0 0 auto; min-width:22px; height:22px; border-radius:50%;
  border:1px solid var(--teal); color:var(--teal2); background:var(--panel);
  font-family:var(--ff-ui); font-size:var(--fs-micro); font-weight:700;
  display:inline-flex; align-items:center; justify-content:center; padding:0 4px}
.tla-anat-key > li.is-hot .tla-anat-n{border-color:var(--gold); color:var(--gold2)}
.tla-anat-term{color:var(--gold2); font-weight:600}
.tla-anat-txt{min-width:0}

/* One column once 300px + text would fight for width. The card keeps 300px:
   below that its markers stop being legal targets (see above), so it is the text
   that moves rather than the card that shrinks. */
@media (max-width:820px){
  .tla-anat-split{grid-template-columns:minmax(0,1fr); gap:18px; justify-items:center}
  .tla-anatcard{width:100%; max-width:300px}
  .tla-anat-key{width:100%}
}
@media (prefers-reduced-motion:reduce){
  .tla-anatmark,.tla-anatmark:hover,.tla-anat .tla-anatmark.is-hot{transition:none; transform:none}
  .tla-anat-key > li.flash{animation:none}
}
.tla-p{margin:0 0 13px; font-size:var(--fs-body); color:var(--ink)}
.tla-bul{list-style:none; margin:0 0 13px; padding:0}
.tla-bul li{position:relative; padding-left:22px; margin:0 0 9px; font-size:var(--fs-body); color:var(--ink2)}
.tla-bul li::before{content:""; position:absolute; left:2px; top:.6em; width:8px;height:8px; transform:rotate(45deg);
  background:var(--gold); opacity:.85; border-radius:1px}
/* The book's second bullet, kept distinct by shape but not by colour: teal means
   a cross-reference or a subsection everywhere else on the page, and a bullet is
   neither. Gold is what a bullet is. */
.tla-bul li.l2{padding-left:40px}
.tla-bul li.l2::before{left:22px; width:7px;height:7px; background:transparent;
  border:1.5px solid var(--gold); opacity:.85; transform:none; border-radius:50%; top:.5em}
#tla-root strong{color:var(--gold2); font-weight:700}
#tla-root em{color:var(--ink2)}
.xref{color:var(--teal2); border-bottom:1px dotted var(--teal); cursor:pointer}
.xref:hover{color:var(--gold2); border-bottom-color:var(--gold)}

/* page reference chip ("orig. p. 13") */
.tla-pageref{font-family:var(--ff-ui); font-size:.82em; color:var(--muted); white-space:nowrap; opacity:.9}
/* The alien script (see the @font-face note). Slightly larger because the glyphs are drawn
   smaller than Latin letters at the same size, and kept on one line: it spells a single word,
   and a word broken across lines in an alphabet nobody reads is unreadable twice over. */
.tla-alien{font-family:'alienglyphs', var(--ff-body); font-size:1.15em; letter-spacing:.04em; white-space:nowrap}

/* ---------- version history ---------- */
/* inline "new since last version" text */
.tla-new{background:var(--new-bg); box-shadow:inset 0 -2px 0 var(--new-edge); border-radius:3px; padding:0 .05em}
/* version badges next to entry titles */
.tla-vbadge{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); font-weight:700; letter-spacing:.5px; text-transform:uppercase;
  padding:2px 8px; border-radius:20px; white-space:nowrap; vertical-align:middle; line-height:1.4}
.tla-vbadge.new{color:var(--new); border:1px solid var(--new-edge); background:transparent}
.tla-vbadge.upd{color:var(--gold2); border:1px solid var(--gold); background:transparent}
.tla-entry h2 .tla-vbadge{font-size:var(--fs-eyebrow)}
.tla-entry.is-new{border-left:3px solid var(--new-edge); padding-left:16px; margin-left:-19px}
.tla-entry.is-upd{border-left:3px solid var(--gold); padding-left:16px; margin-left:-19px}

/* ---------- FAQ ---------- */
/* Here the heading is a whole question, not a term: 24px of display face across two
   hundred characters is a wall, so it reads at close to body size and stays a heading.
   Serif, because it is a sentence to be read rather than a label to be spotted.
   display:block, NOT the flex row every other heading uses. A normal title is one
   text node, so flex lays out [title][badge][anchor] and is right. A question is
   dozens of runs — words, icons, more words — and flex makes every one of them a flex
   item with an 8px gap, which shreds the sentence into a column of fragments. It has
   to flow as text; the badge and the anchor are inline and follow it. */
.tla-entry[data-kind="faq"] h2{display:block; font-family:var(--ff-body); font-size:var(--fs-body);
  font-style:italic; font-weight:600; line-height:1.45; color:var(--ink);
  margin:26px 0 8px; letter-spacing:0}
.tla-entry[data-kind="faq"] h2 .tla-vbadge{font-style:normal; margin-left:6px}
.tla-entry[data-kind="faq"] h2 .anchor{margin-left:4px}
/* The answer sets in from its question. The book runs both flush left — I checked all
   three editions, the x-offset is 0.00 — so this indent is the site's, and on a page
   of alternating questions and answers it is what tells them apart at a glance.
   `> p.tla-p, > ul` and not `> p`: verProvenance emits <p class="tla-prov"> as a
   direct child as well, and that is a note about the entry, not part of the answer. */
.tla-entry[data-kind="faq"] > p.tla-p,
.tla-entry[data-kind="faq"] > ul{margin-left:2px; padding-left:15px; border-left:2px solid var(--edge2)}
.tla-entry[data-kind="faq"] > p.tla-p{margin-top:0; margin-bottom:0; padding-top:3px; padding-bottom:3px}
/* A question is a sentence, and the nav and contents rails are narrow. Clamped here
   rather than cut in JS: where a sentence may be broken is a language's business, and
   the app knows no language. */
.tla-sublink,.tla-toc a{overflow:hidden; display:-webkit-box; -webkit-box-orient:vertical;
  -webkit-line-clamp:3; line-clamp:3}

/* new-version banner on the landing */
.tla-verbanner{display:flex; align-items:center; gap:14px; width:100%; text-align:left; cursor:pointer;
  margin:0 0 22px; padding:16px 20px; border-radius:12px; font-family:var(--ff-ui);
  background:linear-gradient(100deg, var(--new-bg), transparent 60%), var(--panel);
  border:1px solid var(--new-edge); box-shadow:var(--shadow); transition:transform .12s ease, background .12s}
.tla-verbanner:hover{transform:translateY(-1px)}
/* The Elder Sign marks the version history. Vector, drawn as a mask so it takes
   the surrounding colour in either theme — see assets/eldersign.svg. */
.tla-eldersign{display:inline-block; width:1em; height:1em; vertical-align:-.14em;
  background:currentColor;
  -webkit-mask-image:url(../assets/eldersign.svg); mask-image:url(../assets/eldersign.svg);
  -webkit-mask-repeat:no-repeat; mask-repeat:no-repeat;
  -webkit-mask-position:center; mask-position:center;
  -webkit-mask-size:contain; mask-size:contain}
.tla-vb-star{font-size:var(--fs-h2); color:var(--new); flex:0 0 auto}
.tla-vb-main{display:flex; flex-direction:column; min-width:0}
.tla-vb-t{font-size:var(--fs-body); font-weight:700; color:var(--ink)}
.tla-vb-d{font-size:var(--fs-eyebrow); color:var(--muted); margin-top:2px}
.tla-vb-cta{margin-left:auto; font-weight:700; color:var(--new); white-space:nowrap; align-self:center}

/* ---------- waiting on a translation ----------
   Deliberately NOT the red of a new edition: nothing here is new in THIS
   language yet. It is a notice, so it is built like the STOP! callout's
   register rather than like the version banner it sits above. */
.tla-pending{display:flex; align-items:flex-start; gap:16px; font-family:var(--ff-ui);
  margin:0 0 22px; padding:18px 20px; border-radius:12px;
  background:linear-gradient(100deg, var(--mark), transparent 62%), var(--panel);
  border:1px solid var(--gold)}
.tla-pending-star{font-size:var(--fs-h2); color:var(--gold2); flex:0 0 auto; margin-top:2px}
.tla-pending-body{min-width:0}
.tla-pending-t{font-family:var(--ff-head); font-size:var(--fs-lead); font-weight:400;
  color:var(--gold2); margin:0 0 6px; letter-spacing:.3px}
.tla-pending-d{font-size:var(--fs-small); color:var(--ink2); margin:0; max-width:70ch; line-height:1.55}
.tla-pending-cta{display:inline-flex; align-items:center; min-height:40px; margin-top:12px;
  padding:0 16px; border-radius:9px; cursor:pointer; font-family:var(--ff-ui);
  font-size:var(--fs-small); font-weight:700;
  background:var(--gold); color:var(--on-gold); border:1px solid var(--gold)}
.tla-pending-cta:hover{background:var(--gold2); border-color:var(--gold2)}
@media (max-width:560px){ .tla-pending{gap:12px; padding:15px 14px} .tla-pending-star{font-size:var(--fs-h3)} }

/* version history: one chip per edition, newest first */
.tla-vertabs{display:flex; flex-wrap:wrap; gap:8px; align-items:stretch; margin:0 0 18px}
.tla-vertab{display:flex; flex-direction:column; align-items:flex-start; gap:1px; cursor:pointer;
  font-family:var(--ff-ui); padding:8px 13px; border-radius:10px; position:relative;
  background:var(--panel); border:1px solid var(--edge2); color:var(--ink2)}
.tla-vertab:hover{background:var(--panel2); border-color:var(--gold)}
.tla-vertab.active{background:var(--gold); border-color:var(--gold); color:var(--on-gold)}
.tla-vertab-v{font-size:var(--fs-body); font-weight:700}
.tla-vertab-d{font-size:var(--fs-eyebrow); opacity:.8}
/* full strength on the gold chip: at .8 the date measures 3.6:1 there, under the
   4.5:1 this size needs */
.tla-vertab.active .tla-vertab-d{opacity:1}
.tla-vertab-n{position:absolute; top:-7px; right:-7px; min-width:20px; text-align:center;
  font-size:var(--fs-micro); font-weight:700; line-height:1.6; border-radius:10px; padding:0 5px;
  background:var(--new-bg); border:1px solid var(--new-edge); color:var(--new)}
.tla-vertab.active .tla-vertab-n{background:var(--panel); border-color:var(--gold)}
/* the first edition changed nothing — it is where everything began */
.tla-vertab.is-origin{cursor:default; background:transparent; border-style:dashed;
  color:var(--muted); font-size:var(--fs-eyebrow); justify-content:center}
.tla-vertab.is-origin:hover{background:transparent; border-color:var(--edge2)}
.tla-wnhelp{font-family:var(--ff-ui); font-size:var(--fs-small); color:var(--muted); margin:-4px 0 14px; max-width:70ch}

/* where an entry came from, and when it was touched */
.tla-prov{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); color:var(--muted); margin:10px 0 0;
  padding-top:8px; border-top:1px dashed var(--edge)}

/* nav "Novedades" item */
.tla-nav-cnt.new{color:var(--new); border-color:var(--new-edge); background:transparent}
.tla-nav-sec.is-news .tla-nav-num{color:var(--new)}

/* what's-new view */
.tla-wnh{font-family:var(--ff-head); font-size:var(--fs-h3); color:var(--gold2); margin:28px 0 12px; display:flex; align-items:center; gap:10px}
.tla-wncount{font-family:var(--ff-ui); font-size:var(--fs-small); color:var(--muted); font-weight:600}
.tla-wnh .tla-vbadge{font-size:var(--fs-micro)}
/* One row per chapter. The row is the scannable thing; the cards inside are what you
   open once you know where to look. */
.tla-wngrp{border:1px solid var(--edge); border-radius:11px; background:var(--panel); margin:0 0 8px}
.tla-wngrp-s{display:flex; align-items:center; gap:10px; padding:11px 14px; cursor:pointer;
  min-height:44px; border-radius:11px; list-style:none}
.tla-wngrp-s::-webkit-details-marker{display:none}
/* The disclosure triangle, drawn rather than inherited: the native marker cannot be
   placed, and this one has to sit at the head of a flex row. */
.tla-wngrp-s::before{content:''; flex:0 0 auto; width:7px; height:7px; margin-right:2px;
  border-right:2px solid var(--muted); border-bottom:2px solid var(--muted);
  transform:rotate(-45deg); transition:transform .15s ease}
.tla-wngrp[open] > .tla-wngrp-s::before{transform:rotate(45deg)}
.tla-wngrp-s:hover{background:var(--bg)}
.tla-wngrp-s:focus-visible{outline:2px solid var(--teal2); outline-offset:-2px}
.tla-wngrp-n{flex:0 0 auto; min-width:2.2em; font-family:var(--ff-ui); font-size:var(--fs-eyebrow);
  font-weight:700; letter-spacing:.5px; color:var(--muted)}
.tla-wngrp-t{font-family:var(--ff-head); font-size:var(--fs-lead); color:var(--ink); min-width:0; letter-spacing:.2px}
/* The count carries the same colour the badges use, so "new" and "rewritten" read the
   same here as they do on an entry — and it is a word plus a number, never colour alone. */
.tla-wngrp-c{margin-left:auto; flex:0 0 auto; font-family:var(--ff-ui); font-size:var(--fs-eyebrow);
  padding:3px 10px; border-radius:11px; border:1px solid var(--edge2); background:var(--bg); color:var(--muted)}
.tla-wngrp-c.new{color:var(--teal2)}
.tla-wngrp-c.upd{color:var(--gold2)}
/* padding-top separates the first card row from the header: [open], the summary takes a darker
   background on hover and, flush against the cards, it read as a shadow pressing on them. */
.tla-wngrid{display:grid; grid-template-columns:repeat(auto-fill,minmax(248px,1fr)); gap:12px;
  padding:9px 14px 14px}
.tla-wncard{display:flex; flex-direction:column; gap:4px; text-align:left; cursor:pointer;
  padding:13px 15px; border-radius:10px; border:1px solid var(--edge2); background:var(--panel); transition:transform .1s, border-color .12s}
.tla-wncard:hover{transform:translateY(-2px); border-color:var(--gold)}
.tla-wncard.new{border-left:3px solid var(--new-edge)}
.tla-wncard.upd{border-left:3px solid var(--gold)}
.tla-wntitle{font-family:var(--ff-head); font-size:var(--fs-lead); color:var(--ink); line-height:1.25}
.tla-wnsec{font-family:var(--ff-ui); font-size:var(--fs-small); color:var(--muted)}

/* ---------- game icons (recolourable PNG masks) ---------- */
.tla-entry h2 .ico,.tla-wnh .ico,.tla-h1 .ico{--icon:var(--gold2)}

/* ---------- montage figures (example card-art resources inside an entry) ---------- */
.tla-montage{margin:18px auto 26px; max-width:660px}
.tla-montage-frame{position:relative; border:1px solid var(--edge2); border-radius:12px; overflow:hidden;
  background:var(--figbg); box-shadow:var(--shadow)}
.tla-montage-img{display:block; width:100%; height:auto; cursor:zoom-in}
/* the "i" sits on the image; colours are theme-independent (it floats over artwork) */
.tla-montage-i{position:absolute; top:10px; right:10px; width:31px; height:31px; border-radius:50%; cursor:pointer;
  border:1px solid rgba(231,210,154,.55); background:rgba(16,20,26,.82); color:#e7d29a;
  font-family:var(--ff-head); font-size:var(--fs-lead); font-weight:700; line-height:1;
  display:inline-flex; align-items:center; justify-content:center; -webkit-backdrop-filter:blur(2px); backdrop-filter:blur(2px)}
.tla-montage-i:hover{background:#e7d29a; color:#171008; border-color:#e7d29a}
/* source credit band wrapping the image (original page · document version) */
.tla-montage-cap{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); color:var(--muted); letter-spacing:.2px;
  padding:9px 14px; border-top:1px solid var(--edge); background:var(--bg2)}
/* the textual alternative is kept hidden as a data source; shown in the modal below */
.tla-montage-info{display:none}

/* figure-info modal — same centred-overlay pattern as the search dialog */
.tla-figmodal{position:fixed; inset:0; z-index:130; display:flex; align-items:center; justify-content:center;
  padding:clamp(40px,8vh,120px) 16px; background:var(--scrim); -webkit-backdrop-filter:blur(3px); backdrop-filter:blur(3px)}
.tla-figmodal[hidden]{display:none}
.tla-figmodal-box{width:min(560px,100%); max-height:82vh; display:flex; flex-direction:column; overflow:hidden;
  background:var(--panel); border:1px solid var(--edge2); border-radius:14px; box-shadow:var(--shadow)}
.tla-figmodal-head{display:flex; align-items:center; justify-content:space-between; gap:12px;
  padding:13px 16px; border-bottom:1px solid var(--edge); flex:0 0 auto}
.tla-figmodal-h{margin:0; font-family:var(--ff-ui); font-size:var(--fs-eyebrow); letter-spacing:1.4px; text-transform:uppercase; color:var(--gold2)}
.tla-figmodal-close{flex:0 0 auto; background:none; border:0; color:var(--muted); font-size:var(--fs-lead); line-height:1;
  cursor:pointer; padding:2px 7px; border-radius:8px}
.tla-figmodal-close:hover{color:var(--ink); background:var(--panel2)}
.tla-figmodal-body{padding:16px 18px; overflow:auto}
.tla-figmodal-body p{margin:0 0 10px; font-size:var(--fs-small); color:var(--ink2); line-height:1.62}
.tla-figmodal-body p:last-child{margin:0}
.tla-figmodal-body b{color:var(--gold2)} .tla-figmodal-body i{color:var(--ink)}
/* standalone symbol drawn as a PDF vector, re-inserted as a centred icon */
.tla-sym{text-align:center; margin:6px 0 22px}
.tla-sym .ico{width:7.5em; height:7.5em; vertical-align:middle; --icon:var(--gold2)}

/* ---------- figures ---------- */
.tla-figs{display:flex; flex-direction:column; gap:22px; margin-top:8px}
.tla-fig{border:1px solid var(--edge2); border-radius:10px; overflow:hidden; background:var(--figbg); box-shadow:var(--shadow)}
.tla-fig img{display:block; width:100%; height:auto; cursor:zoom-in}
.tla-fig figcaption{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); color:var(--muted); padding:9px 13px; border-top:1px solid var(--edge); background:var(--bg2)}
.tla-note{border-left:4px solid var(--gold); background:var(--mark); padding:14px 18px; border-radius:0 8px 8px 0; margin:0 0 18px; font-size:var(--fs-body); color:var(--ink)}
.tla-note b{color:var(--gold2)}

/* ---------- toc (right) ---------- */
.tla-toc-h{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); font-weight:700; letter-spacing:1.2px; text-transform:uppercase; color:var(--muted); margin:0 0 12px}
.tla-toc a{display:block; font-family:var(--ff-ui); font-size:var(--fs-small); color:var(--muted); padding:7px 9px; border-left:2px solid transparent; line-height:1.45}
.tla-toc a:hover{color:var(--ink2); text-decoration:none}
.tla-toc a.on{color:var(--gold2); border-left-color:var(--gold)}
.tla-toc a.is-subhead{color:var(--teal2); font-weight:700; margin-top:8px}
.tla-toc a .ico{--icon:var(--muted)}

/* ---------- footer ---------- */
.tla-foot{flex:0 0 auto; border-top:1px solid var(--edge); padding:14px 22px; font-family:var(--ff-ui); font-size:var(--fs-eyebrow); color:var(--muted);
  display:flex; gap:14px; flex-wrap:wrap; align-items:center; justify-content:space-between; background:var(--bg2)}
.tla-foot-body{display:contents}
/* No fold on a wide screen: there is room, so the credits just sit there. The
   button is display:none rather than merely invisible, so it is out of the tab
   order too — there is nothing for it to do here. */
.tla-foot-toggle{display:none}
/* Underlined, not just tinted: a link inside a run of text must be findable
   without seeing colour (WCAG 1.4.1) — the tint alone sits at 1.5:1 against the
   surrounding footer text. Qualified with #tla-root to outrank the blanket
   `#tla-root a{text-decoration:none}` above. */
#tla-root .tla-foot a{color:var(--gold2); text-decoration:underline; text-underline-offset:2px}
#tla-root .tla-foot a:hover{color:var(--ink)}
.tla-foot b{color:var(--ink2)}
/* project line + logo, then a contact cluster (email + donate) pushed to the end */
.tla-foot-by-wrap{display:inline-flex; align-items:center; gap:9px}
.tla-foot-logo{display:inline-flex; line-height:0; flex:0 0 auto}
.tla-foot-logo img{width:24px; height:24px; display:block; border-radius:50%}
.tla-foot-contact{display:inline-flex; align-items:center; gap:8px 12px; flex-wrap:wrap}
/* The action cluster: a bare mailto (just the address, opens the reader's mail client),
   then four icon-only controls — source, chat, donate, release notes. */
#tla-root .tla-foot-mail{display:inline-flex; align-items:center; gap:6px; text-decoration:none}
#tla-root .tla-foot-mail:hover{text-decoration:underline}
/* The four travel together. Without this they are four separate flex items, and on a phone the
   line breaks wherever it happens to run out — leaving GitHub stranded beside the e-mail and the
   other three on the row below. As one item the whole cluster wraps, or none of it does. */
.tla-foot-icos{display:inline-flex; align-items:center; gap:8px; flex:0 0 auto}
/* One shape for all four, so the row reads as a set rather than as a link, a pill and a
   circle that happen to be adjacent. 28px clears the 24px minimum target size on its own,
   and .tla-foot-icos' gap keeps them from being mistaken for one another.
   All four are buttons today — each opens a dialog rather than leaving the page — but the
   selector stays #tla-root-qualified so that an <a> added here later still takes this colour
   instead of the blanket `#tla-root a` link colour. */
#tla-root .tla-foot-ico{display:inline-flex; align-items:center; justify-content:center;
  cursor:pointer; width:28px; height:28px; padding:0; border-radius:50%;
  border:1px solid var(--edge2); background:none; color:var(--ink2); text-decoration:none}
#tla-root .tla-foot-ico:hover{color:var(--gold2); border-color:var(--gold); text-decoration:none}
.tla-foot-ico svg{width:15px; height:15px; flex:0 0 auto}

/* ---------- Modified Reprints table ---------- */
.tla-rp-wrap{overflow-x:auto; margin:20px 0 0}
.tla-reprints{border-collapse:collapse; width:100%; font-family:var(--ff-ui); font-size:var(--fs-small)}
.tla-reprints th{text-align:left; font-size:var(--fs-micro); text-transform:uppercase; letter-spacing:.7px;
  color:var(--muted); font-weight:700; padding:0 14px 9px; border-bottom:1px solid var(--edge2)}
.tla-reprints td{padding:9px 14px; border-bottom:1px solid var(--edge); vertical-align:middle}
.tla-reprints tbody tr:hover td{background:var(--bg2)}
.tla-rp-set{width:44px}
/* inline-block, or the shared .tla-prodicon (a flex item elsewhere) is an inline span
   here and collapses to 0x0 in the table cell. */
.tla-rp-set .tla-prodicon{display:inline-block; vertical-align:middle; width:26px; height:26px}
.tla-rp-num{width:52px; color:var(--gold2); font-weight:600; font-variant-numeric:tabular-nums}
.tla-rp-card{color:var(--ink); font-weight:600}
.tla-rp-link{text-align:right; white-space:nowrap}
#tla-root .tla-adb{display:inline-flex; align-items:center; gap:6px; color:var(--teal2);
  font-size:var(--fs-eyebrow); font-weight:600; text-decoration:none}
#tla-root .tla-adb:hover{color:var(--gold2); text-decoration:underline}
.tla-adb svg{width:14px; height:14px; flex:0 0 auto}
/* A card name in the errata/FAQ, linked out to ArkhamDB. Dotted underline so it reads as
   an outbound card link, distinct from the solid-underlined in-book cross-references. */
#tla-root .tla-adbcard{color:var(--teal2); text-decoration:underline; text-decoration-style:dotted;
  text-underline-offset:2px; text-decoration-thickness:1px}
#tla-root .tla-adbcard:hover{color:var(--gold2); text-decoration-style:solid}
@media (max-width:560px){
  .tla-reprints th.tla-rp-link{display:none}
  .tla-rp-link .tla-adb span{position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0 0 0 0)}
}

/* ---------- interactive taboo index (a compact, linked index above the chapter's own text) --- */
.tla-taboos{border:1px solid var(--edge2); border-radius:12px; background:var(--bg2); margin:0 0 26px}
.tla-taboos-sum{display:flex; flex-wrap:wrap; align-items:center; gap:8px 14px; cursor:pointer;
  padding:13px 16px; list-style:none; font-family:var(--ff-ui)}
.tla-taboos-sum::-webkit-details-marker{display:none}
.tla-taboos-sum::before{content:''; flex:0 0 auto; width:8px; height:8px; margin-right:2px;
  border-right:2px solid var(--muted); border-bottom:2px solid var(--muted); transform:rotate(-45deg);
  transition:transform .15s}
.tla-taboos[open] > .tla-taboos-sum::before{transform:rotate(45deg)}
.tla-taboos-sum:hover{background:var(--bg)}
.tla-taboos-sum:focus-visible{outline:2px solid var(--teal2); outline-offset:-2px}
.tla-taboos-sumt{font-size:var(--fs-small); font-weight:700; color:var(--ink)}
.tla-taboo-ver{margin-left:auto; font-size:var(--fs-eyebrow); font-weight:700; color:var(--gold2)}
.tla-taboos-body{padding:4px 16px 14px}
/* The lead-in and the per-bucket explanation: prose, so they read as prose and not as another
   row of the index — muted, narrower than the card list, and out of the way of the names. */
.tla-taboos-lead{margin:2px 0 10px; max-width:68ch; color:var(--ink2); line-height:1.6}
.tla-taboo-desc{margin:2px 0 8px; max-width:68ch; color:var(--muted); font-size:var(--fs-small); line-height:1.55}
.tla-taboo-note{margin:14px 0 0; max-width:68ch; color:var(--muted); font-size:var(--fs-small); line-height:1.55}
.tla-taboo-grp{margin:12px 0 0}
.tla-taboo-h{font-family:var(--ff-head); font-size:var(--fs-lead); color:var(--teal2); margin:0 0 8px;
  display:flex; align-items:baseline; gap:9px}
.tla-taboo-n{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); font-weight:700; color:var(--muted)}
.tla-taboo-list{list-style:none; margin:0; padding:0; display:grid;
  grid-template-columns:repeat(auto-fill,minmax(260px,1fr)); gap:6px 18px}
.tla-taboo-card{display:flex; flex-wrap:wrap; align-items:baseline; gap:4px 10px; padding:5px 0;
  border-bottom:1px solid var(--edge)}
.tla-taboo-card.is-forbidden{color:var(--new)}
#tla-root .tla-taboo-name{display:inline-flex; align-items:center; gap:5px; font-family:var(--ff-ui);
  font-size:var(--fs-small); font-weight:600; color:var(--ink); text-decoration:none}
#tla-root .tla-taboo-name:hover{color:var(--gold2); text-decoration:underline; text-underline-offset:3px}
.tla-taboo-ext{width:12px; height:12px; flex:0 0 auto; opacity:.65}
.tla-taboo-coll{display:inline-flex; align-items:center; gap:6px; font-family:var(--ff-ui);
  font-size:var(--fs-eyebrow); color:var(--muted)}
.tla-taboo-coll .tla-prodicon{width:17px; height:17px}
.tla-taboo-pos{font-variant-numeric:tabular-nums; font-weight:700; color:var(--ink2)}
.tla-taboo-pos::before{content:"·"; margin-right:5px; color:var(--muted); font-weight:400}
.tla-taboo-tag{margin-left:auto; font-family:var(--ff-ui); font-size:var(--fs-micro); font-weight:700;
  letter-spacing:.3px; padding:1px 8px; border-radius:999px; white-space:nowrap}
.tla-taboo-xp{color:var(--gold2); border:1px solid var(--edge2)}
.tla-taboo-forb{color:var(--new); border:1px solid var(--new-edge); background:var(--new-bg)}
.tla-taboo-src{margin:16px 0 0}

/* ---------- generic centred modal (donation) ---------- */
.tla-modal{position:fixed; inset:0; z-index:200; display:none; align-items:center;
  justify-content:center; padding:20px; background:rgba(0,0,0,.66)}
.tla-modal.on{display:flex}
.tla-modal-box{position:relative; width:100%; max-width:460px; background:var(--panel);
  border:1px solid var(--edge2); border-radius:16px; box-shadow:var(--shadow); padding:28px 26px 24px}
.tla-modal-close{position:absolute; top:10px; right:10px; width:38px; height:38px; cursor:pointer;
  border-radius:9px; border:1px solid var(--edge2); background:var(--bg2); color:var(--ink2);
  font-size:var(--fs-body); line-height:1}
.tla-modal-close:hover{background:var(--panel2); color:var(--ink)}
.tla-modal-t{font-family:var(--ff-head); font-size:var(--fs-h3); color:var(--gold2); letter-spacing:.3px;
  margin:0 30px 12px 0}
.tla-modal-p{font-family:var(--ff-body); font-size:var(--fs-small); line-height:1.6; color:var(--ink2); margin:0 0 20px}
/* #tla-root-qualified so its colour outranks the blanket `#tla-root a` link colour —
   otherwise the label renders in the teal link colour on the gold button (1.3:1). */
/* The one call to action a modal is allowed: PayPal's, GitHub's, and whatever comes next. */
#tla-root .tla-modal-cta{display:inline-flex; align-items:center; gap:9px; text-decoration:none;
  font-family:var(--ff-ui); font-size:var(--fs-small); font-weight:700; padding:11px 20px; border-radius:10px;
  background:var(--gold); color:var(--on-gold)}
#tla-root .tla-modal-cta:hover{background:var(--gold2); color:var(--on-gold); text-decoration:none}
.tla-modal-cta svg{width:17px; height:18px; flex:0 0 auto}
/* The Discord modal's placeholder, standing where that modal's CTA will go once there is an
   invite to link to. Dashed and unfilled so it reads as "not yet" rather than as a button
   someone forgot to wire up — and it is a p element, so there is nothing to click or tab onto.
   Colour is --ink2, the same as body copy, so the contrast is one the site already proves. */
.tla-discord-pending{display:inline-flex; align-items:center; gap:9px; margin:0;
  font-family:var(--ff-ui); font-size:var(--fs-small); font-weight:600; padding:10px 18px;
  border-radius:10px; border:1px dashed var(--edge2); color:var(--ink2)}
.tla-discord-pending svg{width:17px; height:18px; flex:0 0 auto; opacity:.75}

/* ---------- draw-at-random modal ---------- */
/* Near-fullscreen so drawn cards are large and readable. Later in the file than
   .tla-modal-box, so its sizing wins at equal specificity. */
#tla-ubdraw{padding:14px}
.tla-ubdraw-box{width:min(1500px,96vw); max-width:none; min-height:82vh;
  max-height:calc(100vh - 28px); overflow-y:auto}
.tla-ubdraw-form{display:flex; flex-wrap:wrap; align-items:flex-end; gap:14px 18px; margin:0}
.tla-ubdraw-field{display:flex; flex-direction:column; gap:6px}
.tla-ubdraw-field label{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); font-weight:700; color:var(--ink2)}
.tla-ubdraw-num{display:inline-flex; align-items:center; gap:9px}
.tla-ubdraw-num input{width:76px; font-family:var(--ff-ui); font-size:var(--fs-small); padding:8px 10px;
  border-radius:8px; border:1px solid var(--edge2); background:var(--bg2); color:var(--ink)}
.tla-ubdraw-max{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); color:var(--muted); white-space:nowrap}
#tla-root .tla-ubdraw-go{display:inline-flex; align-items:center; gap:8px; cursor:pointer; min-height:40px;
  font-family:var(--ff-ui); font-size:var(--fs-small); font-weight:700; padding:9px 20px; border-radius:10px;
  border:1px solid var(--gold); background:var(--gold); color:var(--on-gold)}
#tla-root .tla-ubdraw-go:hover{background:var(--gold2); color:var(--on-gold)}
.tla-ubdraw-go svg{width:17px; height:17px; flex:0 0 auto}
.tla-ubdraw-out{margin-top:20px}
.tla-ubdraw-out:empty{margin:0}
/* Two groups (Ultimatums / Boons), each its own panelled block so the two kinds read
   apart at a glance. */
.tla-ubdraw-group{margin:0 0 20px; padding:16px 16px 18px; border:1px solid var(--edge2);
  border-radius:14px; background:var(--bg2)}
.tla-ubdraw-group:last-child{margin-bottom:0}
.tla-ubdraw-h{font-family:var(--ff-head); font-size:var(--fs-lead); color:var(--gold2); margin:0 0 12px; outline:none}
.tla-ubdraw-n{font-family:var(--ff-ui); font-size:var(--fs-small); font-weight:400; color:var(--muted)}
.tla-ubdraw-list{margin:0 0 14px; padding-left:22px; font-family:var(--ff-body); font-size:var(--fs-small); line-height:1.7; color:var(--ink2); columns:2; column-gap:34px}
.tla-ubdraw-list li{break-inside:avoid}
.tla-ubdraw-list b{color:var(--ink)}
.tla-ubdraw-empty{font-family:var(--ff-body); color:var(--ink2); margin:6px 0 0}
/* Bigger cards; the whole card zooms on click (a rendered PNG in the lightbox). */
.tla-ubdraw-cards{display:grid; grid-template-columns:repeat(auto-fill,minmax(270px,1fr)); gap:22px}
.tla-ubdraw-card{min-width:0; cursor:zoom-in}
/* The card is one zoom target here: its glossary links stay visible but non-interactive,
   so a click zooms the card instead of also navigating away and shifting the page. */
.tla-ubdraw-card .tla-ubc a{pointer-events:none}
/* "Draw another instead", under its own card and the full width of it: the button has to
   read as belonging to the card above and to no other, which a full-width bar does and a
   small floating control does not. cursor is restated because the card sets zoom-in. */
.tla-ubdraw-swap{display:block; width:100%; margin-top:10px; min-height:38px; padding:0 12px;
  cursor:pointer; font-family:var(--ff-ui); font-size:var(--fs-eyebrow); font-weight:700; letter-spacing:.3px;
  color:var(--ink2); background:var(--panel2); border:1px solid var(--edge2); border-radius:9px}
.tla-ubdraw-swap:hover:not(:disabled){background:var(--gold); color:var(--on-gold); border-color:transparent}
.tla-ubdraw-swap:disabled{opacity:.45; cursor:default}

/* ---------- lightbox ---------- */
.tla-lb{position:fixed; inset:0; background:rgba(6,7,10,.93); z-index:300; display:none; align-items:center; justify-content:center; padding:24px; cursor:zoom-out}
.tla-lb.on{display:flex}
.tla-lb img{max-width:96vw; max-height:92vh; border-radius:8px; box-shadow:0 20px 60px rgba(0,0,0,.7)}
.tla-lb-close{position:absolute; top:18px; right:22px; color:#fff; font-size:var(--fs-h2); cursor:pointer; background:none; border:0; line-height:1}

/* ---------- mobile nav scrim ---------- */
.tla-scrim{display:none; position:fixed; inset:0; background:rgba(0,0,0,.5); z-index:45}
.tla-scrim.on{display:block}

/* ---------- responsive ---------- */
@media(max-width:1180px){
  .tla-body{grid-template-columns:280px minmax(0,1fr)}
  .tla-toc{display:none}
}
@media(max-width:820px){
  .tla-body{grid-template-columns:1fr}
  .tla-burger{display:inline-flex}
  /* visibility, not just transform: sliding the drawer off-canvas leaves its
     buttons in the tab order, so a keyboard user Tabs blind through the whole
     hidden menu at x=-288. `visibility:hidden` takes the subtree out of the tab
     order; delaying it by the slide duration keeps the animation intact. */
  .tla-nav{position:fixed; top:0; left:0; bottom:0; width:300px; z-index:50;
    transform:translateX(-100%); visibility:hidden;
    transition:transform .22s ease, visibility 0s linear .22s;
    background:var(--bg2); border-right:1px solid var(--edge2)}
  .tla-nav.on{transform:none; visibility:visible; transition:transform .22s ease, visibility 0s}
  .tla-searchbtn{padding:0; width:44px; justify-content:center}
  .tla-searchbtn-kbd{display:none}
  .tla-title{font-size:var(--fs-lead)}
  .tla-sub{display:none}
  /* The credits fold: two wrapped lines cost ~100px of a 667px phone, and they
     are the least urgent thing on the screen. One tap brings them back. */
  .tla-foot{padding:0 14px; gap:0}
  .tla-foot-toggle{display:flex; align-items:center; justify-content:space-between; gap:8px;
    width:100%; min-height:40px; padding:0; cursor:pointer;
    background:transparent; border:0; color:var(--muted);
    font-family:var(--ff-ui); font-size:var(--fs-eyebrow); text-transform:uppercase; letter-spacing:.9px}
  .tla-foot-toggle::after{content:''; width:9px; height:9px; flex:0 0 auto;
    border-right:2px solid currentColor; border-bottom:2px solid currentColor;
    transform:rotate(-135deg) translate(-2px,-2px); transition:transform .18s ease}
  .tla-foot-toggle[aria-expanded=true]::after{transform:rotate(45deg) translate(-3px,-3px)}
  .tla-foot-toggle:hover{color:var(--ink2)}
  .tla-foot-body{display:flex; flex-direction:column; gap:6px; width:100%; padding:2px 0 12px}
  .tla-foot-body[hidden]{display:none}
}
@media(prefers-reduced-motion:reduce){
  *{animation-duration:.001ms !important; transition-duration:.001ms !important}
  html{scroll-behavior:auto}
}

/* ---------- product icon reference ---------- */
/* The mark is a CSS mask, painted by the page — an <img> of an SVG is an isolated
   document, so its currentColor would resolve to black and it would disappear on five
   of the six themes. Same mechanism as the game icons in css/icons.css. */
.tla-prodicon{flex:0 0 auto; width:30px; height:30px; background-color:var(--gold2);
  -webkit-mask-repeat:no-repeat; mask-repeat:no-repeat;
  -webkit-mask-position:center; mask-position:center;
  -webkit-mask-size:contain; mask-size:contain}
.tla-prodicon.is-none{background:none; border:1px dashed var(--edge2); border-radius:6px}
.tla-icongrp{margin:26px 0 0}
.tla-icongrp-h{font-family:var(--ff-head); font-size:var(--fs-lead); color:var(--teal2); margin:0 0 6px; letter-spacing:.3px}
.tla-icongrp-d{font-family:var(--ff-body); font-size:var(--fs-small); color:var(--ink2); margin:0 0 12px; max-width:66ch}
/* "not out yet" is content, not an error: the book prints the heading and leaves it
   blank, so the site says why rather than hiding the group. */
.tla-iconsoon{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); color:var(--muted); margin:0;
  padding:10px 14px; border:1px dashed var(--edge2); border-radius:10px; background:var(--panel)}
.tla-icontable{list-style:none; margin:0; padding:0; display:grid; gap:8px;
  grid-template-columns:repeat(auto-fill,minmax(290px,1fr))}
.tla-iconrow{display:flex; align-items:center; gap:12px; min-width:0;
  padding:8px 12px; border:1px solid var(--edge); border-radius:10px; background:var(--panel)}
.tla-iconcode{flex:0 0 auto; font-family:var(--ff-ui); font-size:var(--fs-eyebrow); font-weight:700;
  letter-spacing:.5px; color:var(--muted)}
.tla-iconname{font-family:var(--ff-body); font-size:var(--fs-small); color:var(--ink); min-width:0}
.tla-qrlink{display:inline-flex; align-items:center; gap:7px; margin:4px 0 6px;
  font-family:var(--ff-ui); font-size:var(--fs-eyebrow); color:var(--teal2);
  text-decoration:underline; text-underline-offset:3px; min-height:24px}
.tla-qrlink:hover{color:var(--gold2)}
.tla-qrlink svg{width:15px; height:15px; flex:0 0 auto}
/* A nested group: an expansion heading owns grids, and the grids own the icons. */
.tla-icongrp.is-l2{margin-left:14px; padding-left:14px; border-left:2px solid var(--edge)}
.tla-icongrp.is-l2 .tla-icongrp-h{font-size:var(--fs-body); color:var(--gold2)}

/* The substitution table. A real <table>, because it IS one: two columns of sets and a
   header that says which is which — which the book leaves to an arrow the reader has to
   interpret, and a screen reader cannot. */
.tla-subst{margin:14px 0 0}
.tla-substbar{display:flex; flex-wrap:wrap; align-items:center; gap:8px 12px; margin:0 0 12px}
.tla-substlab{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); color:var(--muted)}
.tla-substq{flex:1 1 200px; max-width:320px; min-height:36px; padding:6px 12px;
  font-family:var(--ff-body); font-size:var(--fs-small); color:var(--ink);
  background:var(--panel); border:1px solid var(--edge2); border-radius:9px}
.tla-substq:focus-visible{outline:2px solid var(--teal2); outline-offset:1px}
.tla-substcount{flex:0 0 auto; margin:0; font-family:var(--ff-ui); font-size:var(--fs-eyebrow); color:var(--muted)}
.tla-substtable{width:100%; border-collapse:collapse; font-family:var(--ff-body)}
.tla-substtable th{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); font-weight:700;
  letter-spacing:.5px; text-transform:uppercase; color:var(--muted);
  text-align:left; padding:0 12px 8px; border-bottom:1px solid var(--edge2)}
.tla-substtable td{padding:10px 12px; border-bottom:1px solid var(--edge); vertical-align:middle}
.tla-substrow:last-child td{border-bottom:0}
.tla-substset{display:inline-flex; align-items:center; gap:10px; min-width:0}
.tla-substmark{flex:0 0 auto; width:28px; height:28px; background-color:var(--gold2);
  -webkit-mask-repeat:no-repeat; mask-repeat:no-repeat;
  -webkit-mask-position:center; mask-position:center;
  -webkit-mask-size:contain; mask-size:contain}
.tla-substmark.is-none{background:none; border:1px dashed var(--edge2); border-radius:6px}
.tla-substname{font-size:var(--fs-small); color:var(--ink); min-width:0}
/* A fan-out row's targets stack vertically with the operator between them, so the row
   reads as one-on-the-left, two-on-the-right — the shape the book draws with its brace,
   and the shape its own diagrams use. The source cell centres against the taller stack. */
.tla-substto.is-multi{display:flex; flex-direction:column; align-items:flex-start; gap:6px}
.tla-substto.is-multi .tla-substop{margin:0}
/* The operator the book prints between two replacements. Kept visible and kept as the
   book sets it; the word beside it is for the reader who cannot see a glyph. */
.tla-substop{display:inline-flex; align-items:center; justify-content:center;
  margin:0 10px; padding:0 8px; min-height:22px;
  font-family:var(--ff-ui); font-size:var(--fs-eyebrow); font-weight:700; color:var(--teal2);
  background:var(--panel); border:1px solid var(--edge2); border-radius:999px}
.tla-substnone{font-family:var(--ff-ui); font-size:var(--fs-eyebrow); color:var(--muted); margin:12px 0 0;
  padding:10px 14px; border:1px dashed var(--edge2); border-radius:10px; background:var(--panel)}
/* Narrow: a two-column table of long set names stops being a table. Each row becomes a
   block, and the column headers move onto the cells so the "which is which" survives. */
@media (max-width:560px){
  .tla-substtable thead{position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0 0 0 0)}
  .tla-substtable, .tla-substtable tbody, .tla-substrow, .tla-substtable td{display:block; width:auto}
  .tla-substrow{padding:10px 0; border-bottom:1px solid var(--edge)}
  .tla-substtable td{border-bottom:0; padding:4px 0}
  .tla-substtable td::before{display:block; margin:0 0 4px;
    font-family:var(--ff-ui); font-size:var(--fs-micro); font-weight:700; letter-spacing:.5px;
    text-transform:uppercase; color:var(--muted); content:attr(data-h)}
  .tla-substop{margin:6px 0 6px 38px}
}

/* Material the site adds that the book does not have. Fenced on purpose: it is set off
   from the prose, tagged, and attributed, because a reader must be able to tell what FFG
   published from what a community laid out. Dashed, like every other "not the book"
   surface here (the placeholder card, the empty icon group). */
.tla-extras{margin:14px 0 0; padding:14px 16px; border:1px dashed var(--edge2);
  border-left:3px solid var(--teal2); border-radius:10px; background:var(--panel)}
.tla-extras-h{display:flex; align-items:center; flex-wrap:wrap; gap:8px; margin:0 0 4px;
  font-family:var(--ff-ui); font-size:var(--fs-eyebrow); color:var(--ink)}
.tla-extras-tag{font-size:var(--fs-micro); font-weight:700; letter-spacing:.8px; text-transform:uppercase;
  color:var(--teal2); border:1px solid var(--edge2); border-radius:999px; padding:2px 8px; background:var(--bg)}
.tla-extras-d{font-family:var(--ff-body); font-size:var(--fs-eyebrow); color:var(--muted); margin:0 0 10px; max-width:66ch}
.tla-extras-l{list-style:none; margin:0; padding:0; display:grid; gap:10px}
.tla-extras-l li{display:flex; flex-direction:column; gap:2px}
.tla-extras-l a{display:inline-flex; align-items:center; gap:7px; min-height:24px;
  font-family:var(--ff-ui); font-size:var(--fs-small); color:var(--teal2);
  text-decoration:underline; text-underline-offset:3px}
.tla-extras-l a:hover{color:var(--gold2)}
.tla-extras-l a svg{width:14px; height:14px; flex:0 0 auto}
.tla-extras-n{font-family:var(--ff-body); font-size:var(--fs-eyebrow); color:var(--muted); max-width:66ch}

/* The banner that points to the printable sheet at the foot — the shape of the book's
   own callout, in the calm teal rather than the red STOP, because it invites rather than
   interrupts. */
.tla-qrbanner{display:flex; align-items:center; gap:12px; flex-wrap:wrap;
  margin:6px 0 20px; padding:14px 18px; border-radius:12px;
  border:1px solid var(--edge2); border-left:3px solid var(--teal2); background:var(--panel)}
.tla-qrbanner svg{width:20px; height:20px; flex:0 0 auto; color:var(--teal2)}
.tla-qrbanner-t{flex:1 1 220px; margin:0; font-family:var(--ff-body); font-size:var(--fs-small); color:var(--ink2)}
.tla-qrbanner-go{flex:0 0 auto; min-height:38px; padding:0 16px; cursor:pointer;
  font-family:var(--ff-ui); font-size:var(--fs-eyebrow); font-weight:600; color:var(--on-gold);
  background:var(--gold); border:0; border-radius:9px}
.tla-qrbanner-go:hover{background:var(--gold2)}
.tla-qrbanner-go:focus-visible{outline:3px solid var(--gold); outline-offset:2px}

/* ---------- quick reference: the interactive symbol key ---------- */
.tla-qref{display:grid; gap:24px; margin:8px 0 20px}
.tla-qref-h{font-family:var(--ff-head); font-size:var(--fs-lead); color:var(--teal2); margin:0 0 12px;
  letter-spacing:.3px}
.tla-symgrid{list-style:none; margin:0; padding:0; display:grid;
  grid-template-columns:repeat(auto-fill,minmax(200px,1fr)); gap:10px}
.tla-symrow{display:flex; align-items:center; gap:12px; min-width:0;
  padding:8px 12px; border:1px solid var(--edge); border-radius:10px; background:var(--panel)}
/* The colour lives against a fixed light chip, never the theme — so Guardian blue reads
   the same on Midnight as on Parchment, the way the book prints a badge on a light shield. */
.tla-symchip{flex:0 0 auto; width:40px; height:40px; border-radius:9px;
  display:inline-flex; align-items:center; justify-content:center;
  background:var(--sym-chip); border:1px solid rgba(40,36,24,.18)}
/* A faint dark contour on the glyph, so a pale fill still reads as a shape against the
   light chip (WCAG 1.4.11) — a safety net that holds for whatever colours replace the
   provisional ones, not just today's. The mask's alpha IS the glyph, so drop-shadow
   outlines it. */
.tla-symchip .ico{width:24px; height:24px;
  filter:drop-shadow(0 0 .6px rgba(26,20,10,.7)) drop-shadow(0 0 .6px rgba(26,20,10,.55))}
.tla-symname{font-family:var(--ff-body); font-size:var(--fs-small); color:var(--ink); min-width:0}
/* the sheet image, kept as a download under the interactive key */
.tla-fig.is-download{border:1px dashed var(--edge2); border-radius:12px; overflow:hidden; background:var(--figbg)}
.tla-fig.is-download img{display:block; width:100%; height:auto}
.tla-dl{display:inline-flex; align-items:center; gap:8px; min-height:40px; padding:0 4px;
  font-family:var(--ff-ui); font-size:var(--fs-small); color:var(--teal2);
  text-decoration:underline; text-underline-offset:3px}
.tla-dl:hover{color:var(--gold2)}
.tla-dl svg{width:16px; height:16px; flex:0 0 auto}

/* ---------- the welcome tour ----------
   One scrim, one rectangle, one card. The scrim is not an element of its own: the highlight
   box casts a shadow big enough to darken the whole viewport, which is what makes a hole in
   it without restyling — or re-stacking — anything on the page underneath. */
.tla-foot-tour{font-family:inherit; font-size:inherit; color:inherit; cursor:pointer;
  padding:0; border:0; background:none; text-decoration:underline; text-underline-offset:3px}
.tla-foot-tour:hover{color:var(--gold2)}
.tla-tour[hidden]{display:none}
.tla-tour{position:fixed; inset:0; z-index:120}
.tla-tour-hole{position:fixed; border-radius:12px; pointer-events:none;
  border:2px solid var(--gold); box-shadow:0 0 0 9999px rgba(6,8,12,.72)}
/* Nothing to point at — the welcome and the sign-off, or a sidebar folded away on a narrow
   window: the same scrim, cast inwards over the whole viewport instead of around a box. */
.tla-tour-hole.is-full{inset:0; border:0; border-radius:0;
  box-shadow:inset 0 0 0 9999px rgba(6,8,12,.72)}
.tla-tour-card{position:fixed; width:min(360px,calc(100vw - 28px)); padding:18px 20px 16px;
  border:1px solid var(--edge2); border-radius:14px; background:var(--panel);
  box-shadow:0 18px 44px rgba(0,0,0,.5)}
.tla-tour-card.is-centred{left:50%; top:50%; transform:translate(-50%,-50%)}
.tla-tour-card:focus{outline:none}
.tla-tour-step{margin:0 0 6px; font-family:var(--ff-ui); font-size:var(--fs-micro); font-weight:700;
  letter-spacing:.6px; text-transform:uppercase; color:var(--ink2)}
.tla-tour-t{margin:0 0 8px; font-family:var(--ff-head); font-size:var(--fs-lead); color:var(--ink)}
.tla-tour-d{margin:0; font-size:var(--fs-small); line-height:1.6; color:var(--ink2)}
.tla-tour-btns{display:flex; align-items:center; gap:8px; margin-top:16px}
.tla-tour-gap{flex:1 1 auto}
.tla-tour-btns button{cursor:pointer; font-family:var(--ff-ui); font-size:var(--fs-eyebrow); font-weight:600;
  min-height:38px; padding:8px 14px; border-radius:10px; border:1px solid var(--edge2);
  background:var(--panel); color:var(--ink2)}
.tla-tour-btns button:hover{color:var(--ink); border-color:var(--gold)}
.tla-tour-btns button[hidden]{display:none}
.tla-tour-next{background:var(--gold) !important; border-color:var(--gold) !important;
  color:var(--on-gold) !important}
.tla-tour-next:hover{filter:brightness(1.08)}
.tla-tour-skip{border-color:transparent !important; background:none !important;
  text-decoration:underline; text-underline-offset:3px}
/* The language switch, offered inside the tour's own card: a reader who cannot read the
   language they landed in is exactly who that stop is for. */
.tla-tour-extra:empty{display:none}
/* Every language, right here in the card — the reader this stop is for may not be able to read
   the card itself. It wraps, and past a handful of languages it scrolls rather than growing the
   dialog past the viewport; the scroller is focusable and named so a keyboard can reach it. */
.tla-tour-langs{display:flex; flex-wrap:wrap; gap:8px; margin-top:14px;
  max-height:min(38vh,190px); overflow-y:auto}
.tla-tour-lang{display:inline-flex; align-items:center; gap:7px; cursor:pointer;
  font-family:var(--ff-ui); font-size:var(--fs-eyebrow); font-weight:600; min-height:38px;
  padding:7px 12px; border-radius:10px; border:1px solid var(--edge2);
  background:var(--panel); color:var(--ink2)}
.tla-tour-lang:hover{color:var(--ink); border-color:var(--gold)}
.tla-tour-lang[aria-pressed="true"]{background:var(--gold); border-color:var(--gold); color:var(--on-gold)}
.tla-tour-lang .tla-flag{display:block; border-radius:2px}
/* The banner's illustrator credit, signed bottom-left the way the cards sign theirs. It sits
   over the image's own dark gradient, so it keeps the hero's white; the link underlines on
   hover and focus like every other outbound link. */
.tla-hero-illus{position:absolute; left:0; bottom:0; margin:0; padding:10px 14px;
  font-family:var(--ff-ui); font-size:var(--fs-eyebrow); letter-spacing:.2px;
  color:rgba(255,255,255,.88); text-shadow:0 1px 8px rgba(0,0,0,.85)}
#tla-root .tla-hero-illus a{color:#fff; text-decoration:underline; text-underline-offset:3px}
#tla-root .tla-hero-illus a:hover{color:var(--gold)}
/* What a mutated card's text now says. English only (ArkhamDB keeps no translation), so it is
   set apart and labelled rather than passed off as the reader's language. */
.tla-taboo-mut{flex:1 1 100%; margin:6px 0 0; font-size:var(--fs-small); line-height:1.55; color:var(--ink2)}
.tla-taboo-mutlbl{font-family:var(--ff-ui); font-size:var(--fs-micro); font-weight:700; letter-spacing:.5px;
  text-transform:uppercase; color:var(--muted); margin-right:6px}

/* Release notes — what changed and when, reached from the "i" in the footer's icon row.
   The button itself is styled by .tla-foot-ico, with the other three. */
.tla-rel-box{max-width:min(640px,92vw); text-align:left}
/* The scroll bar belongs to this box, not to the prose. Left alone it sits flush against the
   right edge of the text column and clips the last character of every full line. The negative
   margin lets the scroller reach into the dialog's own padding, so the bar rides near the edge
   of the box where it reads as chrome; the padding then holds the text clear of it. Its colours
   come from the shared ::-webkit-scrollbar rule near the top of this file. */
.tla-rel-body{max-height:min(62vh,560px); overflow-y:auto; margin-top:4px;
  margin-right:-14px; padding-right:24px}
.tla-rel-body:focus-visible{outline:2px solid var(--gold); outline-offset:3px}
/* Each version is a collapsible <details>; the summary is the disclosure control. */
.tla-rel-item{border-top:1px solid var(--edge2)}
.tla-rel-item:first-child{border-top:0}
.tla-rel-sum{list-style:none; cursor:pointer; user-select:none; display:flex; align-items:baseline;
  flex-wrap:wrap; gap:6px 14px; padding:14px 2px}
.tla-rel-sum::-webkit-details-marker{display:none}
/* A chevron that points right when closed and down when open, in place of the native marker. */
.tla-rel-sum::before{content:''; flex:0 0 auto; align-self:center; width:8px; height:8px; margin-right:2px;
  border-right:2px solid var(--gold); border-bottom:2px solid var(--gold);
  transform:rotate(-45deg); transition:transform .15s}
.tla-rel-item[open] > .tla-rel-sum::before{transform:rotate(45deg)}
.tla-rel-sum:hover .tla-rel-v{color:var(--gold)}
.tla-rel-sum:focus-visible{outline:2px solid var(--gold); outline-offset:2px; border-radius:6px}
.tla-rel-head{display:flex; align-items:baseline; flex-wrap:wrap; gap:8px; margin-right:auto}
.tla-rel-v{font-family:var(--ff-head); font-size:var(--fs-lead); color:var(--gold2); font-variant-numeric:tabular-nums}
.tla-rel-name{font-family:var(--ff-body); font-size:var(--fs-body); font-style:italic; color:var(--ink)}
.tla-rel-meta{display:inline-flex; align-items:center; gap:8px; font-family:var(--ff-ui);
  font-size:var(--fs-eyebrow); color:var(--ink2)}
.tla-rel-now,.tla-rel-old{display:inline-block; padding:1px 7px; border-radius:999px;
  font-weight:700; font-size:var(--fs-micro)}
.tla-rel-now{border:1px solid var(--gold); color:var(--gold2)}
.tla-rel-old{border:1px solid var(--edge2); color:var(--ink2)}
/* Native <details> content-hiding is overridden globally in this app, so — like the nav and the
   What's-New groups — the list is hidden EXPLICITLY and shown only in the open state. */
.tla-rel-list{display:none; margin:0 0 14px; padding-left:20px}
.tla-rel-item[open] > .tla-rel-list{display:flex; flex-direction:column; gap:8px}
.tla-rel-list li{font-size:var(--fs-small); line-height:1.6; color:var(--ink2)}
.tla-rel-list strong{color:var(--ink)}
/* shown while data/releases.json is fetched the first time the panel opens */
.tla-rel-loading{width:26px; height:26px; margin:28px auto; border-radius:50%;
  border:3px solid var(--edge2); border-top-color:var(--gold); animation:tlaspin .7s linear infinite}
@keyframes tlaspin{to{transform:rotate(360deg)}}
@media (prefers-reduced-motion:reduce){ .tla-rel-sum::before{transition:none} .tla-rel-loading{animation:none} }
