theme.ts
Language TypeScript60.4 KB1058 lines
/*** The board's entire visual system: tokens, both palettes, every component.** Source health is not in the hue system. Hue means exactly one category* everywhere (orange is Bitrix task, magenta is waiting on client), so a hue* cannot also mean "stale" or "failed". Data-integrity state is ink plus* texture (dot, ring, fine hatch, coarse hatch). Deltas avoid green/red for* the same reason.** Two palettes, one markup. Everything user-visible reads custom properties;* `:root[data-theme="dark"]` swaps the values. The dark ramp is a derived* palette (the brand has no dark version). Two things genuinely break on a* dark ground and both are handled, not ignored:* the four-colour rule's ink segment inverts to #eef2f5 (the same substitution* the brand makes with its reversed logo), and the not-tracked hatch inverts so* absence stays quieter than measurement: light gray on dark reads as the* loudest thing on the row, which would make "not tracked" the biggest number.** Print forces the light ramp regardless of theme: paper is light.*/import { FONT_FACES } from './fonts.js'/*** Colour handles for inline styles. These are var() references, not hex.* Markup that writes `style="background:${C.blue}"` stays theme-aware for* free; hex here would pin every call site to the light ramp.*/export const C = {ink: 'var(--strong)',blue: 'var(--hue-ours)',blueDeep: 'var(--hue-todo)',magenta: 'var(--hue-waiting)',magentaDark: 'var(--hue-waiting-dark)',yellow: 'var(--hue-tracker)',orange: 'var(--hue-task)',orangeDark: 'var(--hue-task-dark)',green: 'var(--hue-vendor)',gray: 'var(--meridian-gray-400)',grayText: 'var(--text-muted)',border: 'var(--border-default)',wash: 'var(--wash)',} as const/*** Work classes keep fixed colors across every surface. Identity, not severity:* "at vendor" is not worse than "our move", it is a different kind of thing.*/export const CLASS_COLOR: Record<string, string> = {ours: C.blue,client: C.magenta,waiting: C.magenta,vendor: C.green,parked: C.gray,terminal: C.gray,}/** The hatch used wherever a number is absent rather than zero. */export const UNTRACKED_FILL = 'var(--hatch)'export const THEME_CSS = `${FONT_FACES}/* ---- tokens --------------------------------------------------------------- */:root{/* THE BODY FACE SITS BETWEEN THE DISPLAY FACE AND GEORGIA. The display facehas no em dash, en dash, ellipsis or arrow (not a subsetting choice, theglyphs are absent from the font), so every "Name: heading" mark thisboard draws in it was falling through to Georgia, a serif next to acondensed display face. Inter carries all of them, so a gap now falls backto something that belongs here. Georgia stays last as the real-glyphfloor: a fallback miss must never be tofu. */--font-display:"Anton","Inter",Georgia,serif;--font-body:"Inter",system-ui,-apple-system,"Segoe UI",sans-serif;--font-mono:ui-monospace,Menlo,Consolas,monospace;/* Raw brand hues, light ramp. */--meridian-ink:#0f141d; --meridian-white:#fff;--meridian-gray-700:#333; --meridian-gray-400:#bdb9c7; --meridian-gray-200:#d7d7d7; --meridian-gray-050:#f5f5f5;--meridian-blue-050:#f3f6f7; --meridian-blue-100:#d3e2e4;/* Semantic surfaces and text. The dark block below swaps ONLY these. */--surface-page:#f3f6f7;--surface-card:#fff;--surface-card2:#fbfbfc;--wash:#f3f6f7;--slab:#0f141d; /* emphasis bands: drill head, My Day header, footers */--on-slab:#fff;--on-slab-dim:#bdb9c7;--slab-line:#333;--text-body:#0f141d;--text-2:#333;/* 6.3:1 on white, NOT #777181, which is the bare 4.5:1 floor. */--text-muted:#655f70;--border-default:#d7d7d7;--hairline:#ececec;--strong:#0f141d; /* elev-1 borders, dashed knowledge boundaries, health ink */--track:#f1f1ef; --tick:#dcdcd8;--hover-row:#f3f6f7;--delta-bg:#eef2f5;/* Hue = category, one meaning each, stated in the on-page legend. */--hue-ours:#1f7a8c; --hue-ours-dark:#175f6d;--hue-waiting:#c8325f; --hue-waiting-dark:#9c2449;--hue-vendor:#70bf4a;--hue-task:#f99d22; --hue-task-dark:#e18408;--hue-todo:#175f6d;--hue-tracker:#f2c94c; --hue-tracker-dark:#b8942a;/* NOT A CATEGORY HUE, AND DELIBERATELY OUTSIDE THE HUE SYSTEM. Every hueabove means exactly one category (see the note at the top of this file);this one means "read this before you send mail from someone else'smailbox" and is used by the compose caveats only. Sam asked for it brightand large, 2026-09-08, so that whoever sends from a shared mailbox cannotmiss what the board does NOT carry: the Cc, and attachments. 5.9:1 on thelight card. If it ever starts appearing on data, it has become a categoryhue and this comment is a lie. */--caveat:#c40d0d;/* The signature motif. Never a solid line. */--meridian-rule:linear-gradient(90deg,#0f141d 0 25%,#1f7a8c 25% 50%,#f2c94c 50% 75%,#c8325f 75%);/* Textures: "do not read this as a quantity". */--hatch:repeating-linear-gradient(45deg,#bdb9c7 0 6px,#e6e4ea 6px 12px);--hatch-ink:repeating-linear-gradient(45deg,#0f141d 0 5px,#fff 5px 10px);--hatch-fine:repeating-linear-gradient(45deg,#0f141d 0 2px,#fff 2px 4px);--hatch-ghost:repeating-linear-gradient(45deg,rgba(200,50,95,.32) 0 5px,transparent 5px 10px);--radius-md:8px; --radius-sm:5px;--border-rule:2px;--shadow-menu:0 2px 20px -7px rgba(0,0,0,.2); /* overlays only */--sticky-tabs:52px;/* Motion: expressive on load, quiet after. Steady state is 200ms. */--state:200ms ease;--transition-default:color var(--state),background-color var(--state),border-color var(--state);color-scheme:light;}/** Dark, derived. Every value is a stated derivation from the light ramp:* see the handoff's ratio table. Hue lifts keep the hue angle so the legend* still reads as the legend; --hue-todo is fill-only on dark (4.2:1), so* anything writing to-do TEXT uses --text-body there.*/:root[data-theme="dark"]{--surface-page:#0e161c;--surface-card:#1b262f;--surface-card2:#18222a; /* read/zebra rows sit BELOW the card on dark */--wash:#232f3a;--slab:#2b3a46; --on-slab:#eef2f5; --on-slab-dim:#a8b4c0; --slab-line:#3d4c58;--text-body:#eef2f5; /* not pure #fff; it haloes at 13px */--text-2:#cdd5dc;--text-muted:#a3aeb8; /* 6.8:1, beating the light theme's 6.3:1 */--border-default:#2f3b45;--hairline:#232e37;--strong:#eef2f5;--track:#232f3a; --tick:#3a444f;--hover-row:#232f3a;--delta-bg:#232f3a;--meridian-gray-050:#18222a; --meridian-gray-400:#5c6874; --meridian-gray-700:#cdd5dc;--meridian-blue-050:#232f3a;--hue-ours:#4fb3c2;--hue-waiting:#f06a8d;--hue-vendor:#8fd968;--hue-task:#ffb24d;--hue-todo:#3799a8;/* tracker yellow is the one hue needing no lift: 11.8:1 on the dark card *//* #c40d0d is 2.9:1 on the dark card: unreadable, not merely dimmer. Liftedto the same hue angle at 5.6:1. */--caveat:#ff6a5e;/* The rule's ink segment, and only the ink segment, inverts, the samesubstitution the brand makes with its reversed logo. */--meridian-rule:linear-gradient(90deg,#eef2f5 0 25%,#1f7a8c 25% 50%,#f2c94c 50% 75%,#c8325f 75%);/* Absence must stay QUIETER than measurement. */--hatch:repeating-linear-gradient(45deg,#3a444f 0 6px,#243039 6px 12px);--hatch-ink:repeating-linear-gradient(45deg,#eef2f5 0 5px,#2f3b45 5px 10px);--hatch-fine:repeating-linear-gradient(45deg,#eef2f5 0 2px,#2f3b45 2px 4px);--hatch-ghost:repeating-linear-gradient(45deg,rgba(240,106,141,.34) 0 5px,transparent 5px 10px);color-scheme:dark;}/* ---- reset / page ---------------------------------------------------------- */*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--surface-page);color:var(--text-body);font-family:var(--font-body);font-size:14.5px;line-height:1.55;-webkit-font-smoothing:antialiased;}h1,h2,h3,h4{font-weight:normal;margin:0}h1,h2.display{font-family:var(--font-display)}b,strong{font-weight:600}a{color:var(--hue-ours);text-decoration:none;transition:color var(--state)}a:hover{color:var(--hue-ours-dark)}:focus-visible{outline:2px solid var(--hue-ours);outline-offset:2px;border-radius:var(--radius-sm)}code{font-family:var(--font-mono);font-size:.92em}/* ---- type scale (eleven steps, ~1.2, anchored on 14.5) --------------------- */.t-micro{font-size:10px;line-height:1.3;font-weight:600;letter-spacing:.16em;text-transform:uppercase}.t-meta{font-size:11.5px;line-height:1.6}.t-small{font-size:13px;line-height:1.5}.t-lede{font-size:17px;line-height:1.5}.t-h3{font-size:20px;line-height:1.3;font-weight:600}.t-h2{font-family:var(--font-display);font-size:27px;line-height:1.15;font-weight:normal}.t-stat{font-family:var(--font-display);font-size:44px;line-height:1;font-variant-numeric:tabular-nums}.t-hero{font-family:var(--font-display);font-size:76px;line-height:.88;font-variant-numeric:tabular-nums}/* ---- motion ----------------------------------------------------------------- */@keyframes rule-wipe{from{transform:scaleX(0)}to{transform:scaleX(1)}}@keyframes rise{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes bar-grow{from{transform:scaleX(0)}to{transform:scaleX(1)}}.rise{animation:rise 360ms ease both;animation-delay:calc(min(var(--i,0),8) * 50ms)}/* Numbers never animate. A stat counting up through 0 reads as zero. *//* ---- the 4-colour rule ------------------------------------------------------ */.rule{height:var(--border-rule);background:var(--meridian-rule);animation:rule-wipe 500ms ease both;transform-origin:left}/* ---- shell ------------------------------------------------------------------ */.page{max-width:1220px;margin:0 auto;padding:0 20px 64px}.page-rule{height:3px;background:var(--meridian-rule)}.masthead{padding:18px 0 0}/* TWO COLUMNS, ENFORCED. The first ship let the title block take its full70ch max-width, so 699 + 520 + gap outgrew the 1180px container by 63px andthe source pills wrapped BELOW the title: a header twice as tall as itneeded to be, for nothing. The title column now shrinks (flex:1, min-width:0)and the pill column is fixed; they share a row at any desktop width. */.masthead .top{flex-wrap:nowrap}.masthead .mast-left{flex:1 1 0;min-width:0}.masthead .mast-right{flex:0 0 auto}.eyebrow{font-family:var(--font-display);font-size:10px;letter-spacing:.5em;text-transform:uppercase;color:var(--text-muted);margin-bottom:10px;}.masthead h1{font-size:40px;line-height:1.05;text-transform:uppercase;color:var(--text-body)}.masthead .lede{margin:6px 0 0;font-size:14.5px;color:var(--text-2);max-width:64ch}.mast-right{max-width:520px;text-align:right}/* ---- source health: ink + texture, never a category hue -------------------- */.sources{display:flex;gap:6px;flex-wrap:wrap;justify-content:flex-end}.pill{display:inline-flex;align-items:center;gap:6px;font-size:11px;padding:4px 9px;border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--text-body);background:var(--surface-card);white-space:nowrap;}.pill i{width:8px;height:8px;border-radius:50%;display:inline-block;flex:none}.pill.live i{background:var(--strong)}.pill.read i{background:transparent;border:2px solid var(--strong);width:8px;height:8px}.pill.stale{border-color:var(--strong);background:var(--surface-card2)}.pill.stale i{background:var(--hatch-fine);border:1px solid var(--strong);border-radius:2px}.pill.failed{border-color:var(--strong)}.pill.failed i{background:var(--hatch-ink);border-radius:2px;width:12px}.pill .err{font-family:var(--font-mono);font-size:10px;color:var(--text-muted)}.synced{font-size:11.5px;color:var(--text-muted);text-align:right;margin-top:8px}/* ---- tabs -------------------------------------------------------------------- */.tabs{display:flex;gap:2px;flex-wrap:wrap;margin:22px 0 0;border-bottom:1px solid var(--border-default);position:sticky;top:0;z-index:30;background:var(--surface-page)}.tab{position:relative;padding:12px 16px;font-size:14px;color:var(--text-body);background:none;border:0;font-family:inherit;cursor:pointer;}.tab::after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:var(--border-rule);background:var(--meridian-rule);transform:scaleX(0);transform-origin:left;transition:transform 500ms ease;}.tab:hover::after,.tab[aria-selected="true"]::after,.tab[aria-current="page"]::after{transform:scaleX(1)}.tab[aria-selected="true"],.tab[aria-current="page"]{font-weight:600}a.tab{display:inline-block;color:var(--text-body)}a.tab:hover{color:var(--text-body)}.surface[hidden]{display:none}/* ---- cards -------------------------------------------------------------------- */.card{background:var(--surface-card);border:1px solid var(--border-default);border-radius:var(--radius-md);overflow:hidden;}.card-pad{padding:18px 22px}.section{margin-top:26px}.section-head{display:flex;align-items:baseline;gap:10px;margin-bottom:12px;flex-wrap:wrap}.section-head h2{font-family:var(--font-display);font-size:27px;line-height:1.15;color:var(--text-body)}.section-head .hint{font-size:12px;color:var(--text-muted)}.note{font-size:11.5px;color:var(--text-muted);line-height:1.6;margin:0}.note.wide{max-width:82ch}/* ---- "Check this": ink edge, one row per note ------------------------------- */.caveat{background:var(--surface-card);border:1px solid var(--border-default);border-left:3px solid var(--strong);border-radius:0 var(--radius-md) var(--radius-md) 0;padding:12px 16px;font-size:13px;line-height:1.55;color:var(--text-body);}.caveat b{color:var(--text-body)}.caveat.down{border-left-color:var(--strong)}.caveat-band{background:var(--surface-card);border:1px solid var(--border-default);border-left:3px solid var(--strong);border-radius:0 var(--radius-md) var(--radius-md) 0;overflow:hidden}.caveat-head{display:flex;gap:12px;align-items:center;padding:12px 18px}.caveat-chip{background:var(--slab);color:var(--on-slab);font-size:10px;font-weight:600;letter-spacing:.16em;text-transform:uppercase;padding:4px 9px;border-radius:3px;white-space:nowrap}.caveat-row{display:grid;grid-template-columns:158px 1fr;gap:18px;padding:11px 18px;border-top:1px solid var(--hairline);font-size:13px}.caveat-row .src{font-size:10px;font-weight:600;letter-spacing:.16em;text-transform:uppercase;color:var(--text-muted);padding-top:2px}/* ---- headline tiles ------------------------------------------------------------ */.tiles{display:grid;grid-template-columns:1.35fr 1fr 1fr 1fr;gap:12px;align-items:stretch}.tile{text-align:left;font-family:inherit;background:var(--surface-card);border:1px solid var(--border-default);border-radius:var(--radius-md);padding:0;color:var(--text-body);transition:var(--transition-default);display:flex;flex-direction:column;overflow:hidden;}button.tile{cursor:pointer}.tile-body{padding:18px 22px 0;flex:1}.tile-foot{display:flex;justify-content:space-between;align-items:center;gap:8px;border-top:1px solid var(--hairline);padding:12px 22px;font-size:12.5px;min-height:40px}.tile-label{font-size:10px;font-weight:600;letter-spacing:.16em;text-transform:uppercase;color:var(--text-muted);margin-bottom:8px}.tile-value{font-family:var(--font-display);font-size:44px;line-height:1;font-variant-numeric:tabular-nums}.tile-note{font-size:11.5px;color:var(--text-muted);margin-top:8px;line-height:1.6}.tile[aria-expanded="true"]{border-color:var(--strong)}button.tile:hover{border-color:var(--hue-ours)}.tile.hero{background:var(--slab);border-color:var(--slab);color:var(--on-slab)}.tile.hero .tile-label,.tile.hero .tile-note{color:var(--on-slab-dim)}.tile.hero .tile-foot{border-top-color:var(--slab-line);color:var(--on-slab)}.tile.hero .tile-value{font-size:76px;line-height:.88}button.tile.hero:hover{background:#000}:root[data-theme="dark"] button.tile.hero:hover{background:#1f2c36}.tile.accent{border-color:var(--hue-waiting)}button.tile.accent:hover{background:var(--wash)}.delta{display:inline-block;font-size:11px;padding:2px 8px;border-radius:3px;background:var(--delta-bg);color:var(--text-body);border:1px solid var(--border-default);font-variant-numeric:tabular-nums}.tile.hero .delta{background:transparent;color:var(--on-slab);border-color:var(--text-muted)}.answer-chip{display:inline-block;background:var(--hue-waiting);color:#fff;font-size:10px;font-weight:600;letter-spacing:.16em;text-transform:uppercase;padding:3px 8px;border-radius:3px}.zero-chip{display:inline-block;border:1px solid var(--strong);color:var(--text-body);font-size:10px;font-weight:600;letter-spacing:.16em;text-transform:uppercase;padding:3px 8px;border-radius:3px}/* ---- context strip: deliberately demoted ------------------------------------- */.ctx{display:grid;grid-template-columns:auto 1fr 1fr;background:var(--surface-card);border:1px solid var(--border-default);border-radius:var(--radius-md);overflow:hidden;margin-top:12px}.ctx-key{background:var(--wash);border-right:1px solid var(--border-default);max-width:200px;padding:16px 20px;font-size:10px;font-weight:600;letter-spacing:.16em;text-transform:uppercase;color:var(--text-muted);line-height:1.8}.ctx-cell{padding:16px 20px;display:flex;gap:16px;align-items:baseline}.ctx-cell .n{font-family:var(--font-display);font-size:34px;color:var(--text-muted);font-variant-numeric:tabular-nums}.ctx-cell .t{font-size:13px;font-weight:600}.ctx-cell .s{font-size:12px;color:var(--text-muted);line-height:1.55;margin-top:2px}/* ---- meeting topics ------------------------------------------------------------- *//* Buttons named after topics, each opening its own panel. The panel is hiddenwith the hidden ATTRIBUTE, so (as the inbox search learned the hard way on2026-09-04) any rule here that sets display needs the [hidden] line below tobeat it, because the user-agent default loses to every author rule.No backticks in this comment: THEME_CSS is a template literal and one wouldend the stylesheet mid-file. That is the second time in one day. */.topic-row{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 2px}.topic-btn{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-family:inherit;font-size:12.5px;padding:7px 12px;border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--surface-card);color:var(--text-body)}.topic-btn:hover{border-color:var(--hue-waiting);color:var(--hue-waiting)}.topic-btn[aria-expanded="true"]{border-color:var(--strong);background:var(--wash);font-weight:600}.topic-btn .n{font-variant-numeric:tabular-nums;font-size:11.5px;color:var(--text-muted);background:var(--meridian-gray-050);border-radius:10px;padding:1px 7px}.topic-btn[aria-expanded="true"] .n{color:var(--text-body)}.topic-panel{margin-top:12px;border:1px solid var(--strong);border-radius:var(--radius-md);overflow:hidden;background:var(--surface-card)}.topic-panel[hidden]{display:none}.topic-head{display:flex;align-items:center;gap:12px;padding:11px 16px;background:var(--slab);color:var(--on-slab)}.topic-head .n{font-family:var(--font-display);font-size:20px}.topic-head .t{font-size:13.5px;font-weight:600}.topic-head .m{font-size:11.5px;color:var(--on-slab-dim);flex:1}.topic-head button{cursor:pointer;font-family:inherit;font-size:11px;padding:3px 10px;border:1px solid var(--on-slab-dim);border-radius:var(--radius-sm);background:transparent;color:var(--on-slab)}.topic-body{padding:0 16px}@media (max-width:720px){.topic-row{flex-direction:column;align-items:stretch}.topic-btn{justify-content:space-between;min-height:38px}}/* ---- drill-down ----------------------------------------------------------------- */.drill{margin-top:14px;border:1px solid var(--strong);border-radius:var(--radius-md);overflow:hidden;background:var(--surface-card)}.drill-head{display:flex;align-items:center;gap:12px;padding:13px 18px;background:var(--slab);color:var(--on-slab);}.drill-head .n{font-family:var(--font-display);font-size:22px}.drill-head .t{font-size:13.5px;font-weight:600}.drill-head .m{font-size:11.5px;color:var(--on-slab-dim);flex:1}.drill-body{padding:0 0 0}.drill-row{display:grid;grid-template-columns:3px 100px 1fr 148px 52px;gap:0 14px;align-items:center;padding:9px 18px 9px 0;border-top:1px solid var(--hairline);font-size:13px;}.drill-row:hover{background:var(--hover-row)}.drill-row .bar{align-self:stretch}.drill-row .id{font-family:var(--font-mono);font-size:12px;color:var(--hue-ours)}.drill-row .who{color:var(--text-muted);font-size:12px}.drill-row .age{text-align:right;font-variant-numeric:tabular-nums}.drill-note{padding:8px 18px 6px;font-size:11.5px;color:var(--text-muted)}.withheld{background:var(--wash);border-top:1px solid var(--border-default);display:grid;grid-template-columns:auto 1fr;gap:16px;align-items:center;padding:12px 18px;font-size:12.5px}.withheld .n{font-family:var(--font-display);font-size:30px;font-variant-numeric:tabular-nums}/* Buttons, per the system: 5px radius, no shadow, darken on hover. */.btn{font-family:inherit;font-size:12px;padding:6px 12px;border-radius:var(--radius-sm);border:1px solid transparent;cursor:pointer;box-shadow:none;transition:var(--transition-default);}.btn-secondary{background:var(--hue-tracker);color:#000}.btn-secondary:hover{background:var(--hue-tracker-dark)}.btn-outline{background:transparent;border-color:var(--hue-ours);color:var(--hue-ours)}.btn-outline:hover{background:var(--hue-ours);color:#fff}.btn-outline[aria-pressed="true"]{background:var(--hue-ours);color:#fff}/* ---- bars (simple, for stage rows and briefing board sizes) ------------------- */.bar-track{height:16px;border-radius:4px;background:var(--track);overflow:hidden}.bar-fill{height:100%;border-radius:0 4px 4px 0;min-width:2px;animation:bar-grow 560ms ease 200ms both;transform-origin:left}.stage-row{display:grid;grid-template-columns:150px 1fr 34px;gap:10px;align-items:center;margin-bottom:7px}.stage-row .n{font-size:12px;color:var(--text-2);text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.stage-row .c{font-size:12px;text-align:right;font-variant-numeric:tabular-nums}/* ---- workload: the bar is a measurement ---------------------------------------- */.ruler{display:flex;justify-content:space-between;font-size:10px;color:var(--text-muted);font-variant-numeric:tabular-nums;padding:0 0 4px}.measure{display:flex;height:22px;border-radius:4px;overflow:hidden;background:var(--track);background-image:repeating-linear-gradient(90deg,var(--tick) 0 1px,transparent 1px 20%)}.measure .seg{height:100%;animation:bar-grow 560ms ease 200ms both;transform-origin:left}.measure .ghost{background:var(--hatch-ghost);border-left:2px solid var(--strong);animation:bar-grow 560ms ease 200ms both;transform-origin:left}.measure .rest{flex:1;background:var(--hatch);border-left:2px dashed var(--strong);position:relative;animation:bar-grow 560ms ease 200ms both;transform-origin:left}.measure .rest .lbl{position:absolute;inset:0;display:flex;align-items:center;padding:0 8px;font-size:10px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:#0f141d}.measure .rest .lbl span{background:rgba(255,255,255,.82);padding:1px 6px;border-radius:2px}:root[data-theme="dark"] .measure .rest .lbl span{background:rgba(14,22,28,.82);color:#eef2f5}.person{display:grid;grid-template-columns:210px 1fr 118px;gap:20px;align-items:center;padding:13px 22px;border-top:1px solid var(--hairline)}.person-id{display:flex;gap:10px;align-items:center}.avatar{width:30px;height:30px;border-radius:var(--radius-sm);background:var(--slab);color:var(--on-slab);font-family:var(--font-display);font-size:12px;display:flex;align-items:center;justify-content:center;flex:none}.person-name{font-size:14px;font-weight:600;color:var(--text-body)}.person-role{font-size:11px;color:var(--text-muted)}.person-detail{font-size:12px;color:var(--text-2);margin-top:6px}.person-aside{color:var(--text-muted)}.person-note{font-size:11.5px;color:var(--text-muted);margin-top:5px;max-width:78ch;border-left:2px solid var(--border-default);padding-left:10px}.person-load{text-align:right}.person-load .v{font-family:var(--font-display);font-size:28px;font-variant-numeric:tabular-nums;color:var(--text-body)}.person-load .k{font-size:10px;color:var(--text-muted);letter-spacing:.1em;text-transform:uppercase}.untracked{display:inline-block;font-size:11px;font-weight:600;color:var(--text-body);background:var(--hatch);padding:2px 8px;border-radius:3px}/* ---- generic rows ---------------------------------------------------------------- */.rows{width:100%}.row-head{display:grid;gap:10px;padding:8px 0;font-size:10px;font-weight:600;letter-spacing:.16em;text-transform:uppercase;color:var(--text-muted);border-bottom:1px solid var(--meridian-gray-400);}.row{display:grid;gap:10px;padding:9px 0;border-bottom:1px solid var(--hairline);font-size:13px;align-items:center}.row:last-child{border-bottom:none}.lead-cols{grid-template-columns:52px 150px 1fr}.num{font-variant-numeric:tabular-nums}/* ---- briefing ---------------------------------------------------------------------- */.brief{max-width:760px}.brief .kicker{font-size:17px;line-height:1.5;margin:0 0 18px;text-wrap:pretty}.brief h3{font-size:10px;font-weight:600;margin:0 0 8px;color:var(--hue-ours);text-transform:uppercase;letter-spacing:.16em;}.brief p{font-size:14.5px;line-height:1.7;margin:0 0 20px;text-wrap:pretty}.brief .quiet{color:var(--text-muted)}.blind{border:1px solid var(--border-default);border-left:3px solid var(--strong);border-radius:0 var(--radius-md) var(--radius-md) 0;padding:14px 18px;margin-bottom:22px;background:var(--surface-card2);}.blind h3{color:var(--text-body)}.blind p{font-size:14px;line-height:1.6;margin:0}/* Deltas: direction by arrow and words only. Green/red collided with at-vendorand waiting-on-client: the same hue crime the pills committed. */.delta.down,.delta.up,.delta.flat{color:var(--text-body)}.seg-control{display:inline-flex;border:1px solid var(--border-default);border-radius:var(--radius-sm);overflow:hidden}.seg-control button{font-family:inherit;font-size:12px;padding:7px 14px;border:0;background:var(--surface-card);color:var(--text-body);cursor:pointer;transition:var(--transition-default)}.seg-control button[aria-pressed="true"]{background:var(--slab);color:var(--on-slab)}details.brief-inline{border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--surface-card);margin:16px 0 14px;overflow:hidden}details.brief-inline>summary{cursor:pointer;padding:12px 18px;font-size:13px;font-weight:600;display:flex;gap:10px;align-items:baseline}details.brief-inline>summary .hint{font-weight:400;font-size:11.5px;color:var(--text-muted)}details.brief-inline .body{padding:2px 18px 16px;font-size:14px;line-height:1.7;max-width:76ch}/* ---- feed --------------------------------------------------------------------------- */.feed-row{display:grid;grid-template-columns:84px 1fr;gap:14px;padding:14px 0;border-bottom:1px solid var(--hairline)}.feed-row:last-child{border-bottom:none}.badge{display:inline-block;font-size:10px;padding:3px 8px;border-radius:3px;font-weight:600;letter-spacing:.02em;}.badge.primary{background:var(--hue-ours);color:#fff}.badge.accent{background:var(--hue-waiting);color:#fff}.badge.dark{background:var(--slab);color:var(--on-slab)}.badge.hot{background:var(--hue-task);color:#0f141d}.feed-time{font-size:11px;color:var(--text-muted);margin-top:6px}.feed-text{font-size:14px;line-height:1.5}.feed-why{font-size:11.5px;color:var(--text-muted);margin-top:4px}/* ---- data health ----------------------------------------------------------------------- */.source-row{display:grid;grid-template-columns:16px 190px 1fr 130px;gap:16px;align-items:start;padding:15px 0;border-bottom:1px solid var(--hairline)}.source-row:last-child{border-bottom:none}.health{width:11px;height:11px;margin-top:4px;border-radius:50%}.health.live{background:var(--strong)}.health.read{background:transparent;border:2px solid var(--strong)}.health.stale{background:var(--hatch-fine);border:1px solid var(--strong);border-radius:2px}.health.failed{background:var(--hatch-ink);border-radius:2px}.source-name{font-size:14px;font-weight:600;color:var(--text-body)}.source-covers{font-size:11.5px;color:var(--text-muted)}.source-note{font-size:12.5px;color:var(--text-2);line-height:1.6}.source-note .err{font-family:var(--font-mono);font-size:11.5px;background:var(--meridian-gray-050);padding:1px 5px;border-radius:3px}.source-status{text-align:right;font-size:11.5px;font-weight:600;color:var(--text-body)}.matrix{border:1px solid var(--border-default);border-radius:var(--radius-md);overflow:hidden}.matrix-head{display:grid;grid-template-columns:1.4fr 1fr 1fr 1fr 1fr;background:var(--slab);color:var(--on-slab);font-size:11px;padding:9px 16px}.matrix-row{display:grid;grid-template-columns:1.4fr 1fr 1fr 1fr 1fr;padding:11px 16px;border-top:1px solid var(--hairline);font-size:13px;align-items:center}.cell-covered i{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--strong);margin-right:6px}.cell-untracked{display:inline-block;font-size:10px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;background:var(--hatch);color:#0f141d;padding:2px 7px;border-radius:3px}:root[data-theme="dark"] .cell-untracked{color:#eef2f5}.blindspots{display:grid;grid-template-columns:1fr 1fr;gap:10px}.blindspot{border:1px solid var(--border-default);border-radius:var(--radius-md);overflow:hidden}.blindspot .strip{height:3px;background:var(--hatch)}.blindspot h3{font-size:13px;font-weight:600;color:var(--text-body);margin:12px 15px 4px}.blindspot p{font-size:12px;color:var(--text-muted);line-height:1.55;margin:0 15px 13px}/* ---- my day -------------------------------------------------------------------------------- */.chips{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:16px}.chip{font-size:11px;padding:5px 10px;border-radius:var(--radius-sm);border:1px solid var(--border-default)}.chip.solid{background:var(--slab);color:var(--on-slab);border-color:var(--slab)}.chip.quiet{color:var(--text-muted);background:var(--surface-card2)}.chip.hatch{background:var(--hatch);color:#0f141d;font-weight:600}:root[data-theme="dark"] .chip.hatch{color:#eef2f5}.first3{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:16px 0}.first3 .f{border:1px solid var(--border-default);border-radius:var(--radius-md);overflow:hidden;background:var(--surface-card)}.first3 .f .strip{height:3px}.first3 .f .in{padding:12px 14px}.first3 .kchip{display:inline-block;color:#fff;font-size:10px;font-weight:600;letter-spacing:.16em;text-transform:uppercase;padding:3px 8px;border-radius:3px}.first3 .age{float:right;font-family:var(--font-display);font-size:20px;font-variant-numeric:tabular-nums}.first3 .id{font-family:var(--font-mono);font-size:11.5px;color:var(--hue-ours);margin-top:8px}.first3 .what{font-size:15px;font-weight:600;margin-top:2px;line-height:1.4}.first3 .why{font-size:12.5px;color:var(--text-2);margin-top:4px;line-height:1.5}.kind{border:1px solid var(--border-default);border-radius:var(--radius-md);overflow:hidden;margin-bottom:12px}.kind-head{display:flex;gap:8px;align-items:center;background:var(--surface-card2);padding:8px 18px;font-size:13px;font-weight:600;border-bottom:1px solid var(--hairline)}.kind-head .swatch{width:11px;height:11px;border-radius:3px}.kind-head .c{margin-left:auto;font-variant-numeric:tabular-nums;color:var(--text-muted);font-weight:400}.work-row{display:grid;grid-template-columns:1fr 62px;gap:12px;align-items:start;padding:11px 18px;border-top:1px solid var(--hairline)}.work-row:first-of-type{border-top:0}.work-what{font-size:14.5px;color:var(--text-body)}.work-meta{font-size:11.5px;color:var(--text-muted);margin-top:3px}.work-age{text-align:right;font-size:12px;font-variant-numeric:tabular-nums;color:var(--text-2)}.work-age .late{display:block;font-size:9.5px;font-weight:600;letter-spacing:.12em;text-transform:uppercase;color:var(--hue-waiting)}.myday-head{background:var(--slab);color:var(--on-slab);padding:24px 28px 22px;display:flex;justify-content:space-between;gap:24px;flex-wrap:wrap}.myday-head .who h1{font-family:var(--font-display);font-size:34px;color:var(--on-slab)}.myday-head .cover{font-size:12.5px;color:var(--on-slab-dim);margin-top:4px}.myday-nums{display:flex;align-items:baseline}.myday-nums .b{text-align:right}.myday-nums .b+.b{border-left:1px solid var(--slab-line);padding-left:28px;margin-left:28px}.myday-nums .v{font-family:var(--font-display);font-size:56px;line-height:1;font-variant-numeric:tabular-nums}.myday-nums .k{font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--on-slab-dim)}.picker{font-family:inherit;font-size:13px;padding:7px 10px;border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--surface-card)}/* ---- footer ------------------------------------------------------------------------------- */.howto{background:var(--slab);color:var(--on-slab-dim);padding:20px 24px;font-size:12px;line-height:1.7;border-radius:0 0 var(--radius-md) var(--radius-md)}.howto b{color:var(--on-slab)}.howto code{font-family:var(--font-mono);font-size:11px;color:var(--on-slab)}.empty{color:var(--text-muted);font-size:13px;margin:0}/* ---- theme control ---------------------------------------------------------------------------- *//* Sync now: same visual weight as the theme control beside it. It is anaction, not a status, so it must not read as louder than the numbers. */.sync-ctl{display:inline-flex;border:1px solid var(--border-default);border-radius:var(--radius-sm);overflow:hidden;margin-left:10px;vertical-align:middle}.sync-ctl button{font-family:inherit;font-size:10.5px;padding:4px 9px;border:0;background:var(--surface-card);color:var(--text-muted);cursor:pointer}.sync-ctl button:hover{color:var(--text-body)}.sync-ctl button[disabled]{cursor:default;opacity:.55}.sync-state{margin-left:10px;padding:2px 8px;border-radius:3px;background:var(--wash);color:var(--text-body);font-weight:600}.theme-ctl{display:inline-flex;gap:0;border:1px solid var(--border-default);border-radius:var(--radius-sm);overflow:hidden;margin-left:10px;vertical-align:middle}.theme-ctl button{font-family:inherit;font-size:10.5px;padding:4px 9px;border:0;background:var(--surface-card);color:var(--text-muted);cursor:pointer}.theme-ctl button[aria-pressed="true"]{background:var(--slab);color:var(--on-slab)}/* ---- orientation legend ------------------------------------------------------------------------ */.legend{display:flex;gap:14px;flex-wrap:wrap;align-items:center;font-size:12px}.legend .swatch{display:inline-block;width:12px;height:12px;border-radius:3px;margin-right:5px;vertical-align:-1px;border:1px solid rgba(0,0,0,.1)}:root[data-theme="dark"] .legend .swatch{border-color:rgba(255,255,255,.14)}.legend-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:9px 20px;font-size:12px;margin-top:10px}/* ---- accessibility ------------------------------------------------------------------------------ */.skip-link{position:absolute;left:-9999px;top:0;z-index:100;padding:10px 16px;background:var(--slab);color:var(--on-slab);border-radius:0 0 var(--radius-sm) 0}.skip-link:focus{left:0}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}/* ---- responsive --------------------------------------------------------------------------------- */@media (max-width:1024px){.tiles{grid-template-columns:1fr 1fr}.blindspots{grid-template-columns:1fr}.two-up{grid-template-columns:1fr !important}.legend-grid{grid-template-columns:1fr 1fr}.first3{grid-template-columns:1fr}}@media (max-width:900px){.masthead .top{flex-wrap:wrap}}@media (max-width:768px){.page{padding:0 14px 48px}.top{flex-direction:column;align-items:flex-start !important}.sources{justify-content:flex-start}.synced{text-align:left}.mast-right{text-align:left;max-width:none}.stage-row{grid-template-columns:110px 1fr 30px}.drill-row{grid-template-columns:3px 80px 1fr 56px}.drill-row .who{display:none}.row.lead-cols{grid-template-columns:44px 1fr}.row.lead-cols .stage{display:none}.source-row{grid-template-columns:16px 1fr;gap:10px}.source-note,.source-status{grid-column:2}.source-status{text-align:left}.matrix-head{display:none}.matrix-row{grid-template-columns:1fr 1fr;gap:4px 10px}.feed-row{grid-template-columns:1fr}.ctx{grid-template-columns:1fr}.ctx-key{max-width:none;border-right:0;border-bottom:1px solid var(--border-default)}.myday-nums .v{font-size:40px}}@media (max-width:720px){.page{padding:0 12px 48px}.masthead h1{font-size:26px}.sources{justify-content:flex-start;margin-top:10px}.tabs{overflow-x:auto;flex-wrap:nowrap;scrollbar-width:thin}.tab{white-space:nowrap;min-height:44px}/* Name and load stay on one line so the number keeps its subject; the bardrops to a full-width second row rather than being squeezed to noise. */.person{grid-template-columns:1fr 72px;gap:4px 8px;padding:13px 14px}.person-load{grid-column:2;grid-row:1}.person-bar{grid-column:1 / -1;grid-row:2}.legend-grid{grid-template-columns:1fr}}@media (max-width:375px){.tiles{grid-template-columns:1fr 1fr}.tile-value{font-size:34px}/* The hero does NOT shrink like the others. If it does, the one number thatmatters stops being the one number that matters. */.tile.hero{grid-column:1 / -1}.tile.hero .tile-value{font-size:56px}}@media print{/* Paper is light, whatever the screen theme was. */:root,:root[data-theme="dark"]{--surface-page:#fff;--surface-card:#fff;--surface-card2:#fbfbfc;--wash:#f3f6f7;--slab:#0f141d;--on-slab:#fff;--on-slab-dim:#bdb9c7;--slab-line:#333;--text-body:#0f141d;--text-2:#333;--text-muted:#655f70;--border-default:#d7d7d7;--hairline:#ececec;--strong:#0f141d;--track:#f1f1ef;--tick:#dcdcd8;--hue-ours:#1f7a8c;--hue-waiting:#c8325f;--hue-vendor:#70bf4a;--hue-task:#f99d22;--hue-todo:#175f6d;--hue-tracker:#f2c94c;--meridian-rule:linear-gradient(90deg,#0f141d 0 25%,#1f7a8c 25% 50%,#f2c94c 50% 75%,#c8325f 75%);--hatch:repeating-linear-gradient(45deg,#bdb9c7 0 6px,#e6e4ea 6px 12px);--hatch-ink:repeating-linear-gradient(45deg,#0f141d 0 5px,#fff 5px 10px);}body{background:#fff}.tabs,.btn,.theme-ctl,.sync-ctl{display:none}.surface[hidden]{display:block !important}.card{break-inside:avoid}}@media (prefers-reduced-motion:reduce){*{animation-duration:1ms !important;animation-delay:0ms !important;transition-duration:0ms !important}html{scroll-behavior:auto}}`export const QUEUE_CSS = `/* Onboarding (2026-09-14). A DOCUMENT, not a data surface: measured linelength, real paragraph rhythm, and none of the hue system, no colour heremeans a category, because nothing here is a category. The tag chip borrowsthe board's chip shape so it does not read as a new vocabulary. */.ob-title{font-family:var(--font-display);font-size:17px;margin:0;color:var(--text-body)}.ob-intro{font-size:13px;line-height:1.65;color:var(--meridian-gray-700);margin:0 0 10px;max-width:78ch}/* Collapsible days and topics (2026-09-16). Native <details>, so there is noscript and no state to lose: it folds with the keyboard, it survives afile:// open of dashboard.html, and print shows whatever is open. The markeris drawn here because the platform default differs per browser and this is adocument, where a row of inconsistent triangles reads as a bug. */.ob-day{border-bottom:1px solid var(--border-default)}.ob-day:last-of-type{border-bottom:0}.ob-day-sum,.ob-topic-sum{display:flex;align-items:baseline;gap:10px;cursor:pointer;list-style:none;user-select:none}.ob-day-sum::-webkit-details-marker,.ob-topic-sum::-webkit-details-marker{display:none}.ob-day-sum::before,.ob-topic-sum::before{content:"";flex:none;align-self:center;width:0;height:0;border-left:5px solid var(--text-muted);border-top:4px solid transparent;border-bottom:4px solid transparent;transition:transform .12s ease}.ob-day[open]>.ob-day-sum::before,.ob-topic[open]>.ob-topic-sum::before{transform:rotate(90deg)}.ob-day-sum{padding:15px 0 14px;flex-wrap:wrap}.ob-day-sum:hover .ob-day-title{text-decoration:underline;text-underline-offset:3px}.ob-day-eyebrow{font-size:9.5px;font-weight:700;letter-spacing:.11em;text-transform:uppercase;color:var(--text-muted);white-space:nowrap}.ob-day-title{font-family:var(--font-display);font-size:18px;color:var(--text-body)}.ob-day-body{padding:0 0 10px 15px}.ob-rec{margin:0 0 12px;font-size:12px;display:flex;gap:16px;flex-wrap:wrap}.ob-rec a{color:var(--text-2);text-decoration:none;border-bottom:1px solid var(--border-default)}.ob-rec a:hover{color:var(--text-body);border-bottom-color:var(--text-body)}.ob-topic{border-top:1px solid var(--hairline)}.ob-topic:first-of-type{border-top:0}.ob-topic-sum{padding:9px 0}.ob-topic-sum:hover .ob-title{text-decoration:underline;text-underline-offset:3px}/* The count a folded heading owes the reader: how many points are inside it,taken off the very items rendered below and nothing else (rule 9 in docs/ARCHITECTURE.md). */.ob-count{margin-left:auto;font-size:10px;font-variant-numeric:tabular-nums;color:var(--text-muted);white-space:nowrap}.ob-topic-body{padding:0 0 12px 15px}.ob-topic-body>.ob-intro:first-child{margin-top:-2px}/* The master list (2026-09-16). Deliberately NOT collapsible: it is the partyou come back to mid-task. */.ob-resources{border-top:2px solid var(--border-default);margin-top:6px;padding:18px 0 4px}.ob-res-head{font-family:var(--font-display);font-size:18px;margin:0 0 4px;color:var(--text-body)}.ob-res-group{margin-top:14px}.ob-res-title{font-size:10px;font-weight:700;letter-spacing:.11em;text-transform:uppercase;color:var(--text-muted);margin:0 0 4px}.ob-list{margin:0;padding-left:18px;max-width:78ch}.ob-list li{font-size:13px;line-height:1.65;color:var(--text-body);margin-bottom:5px}.ob-row{display:grid;grid-template-columns:minmax(130px,230px) 1fr;gap:10px 18px;padding:7px 0;border-top:1px solid var(--hairline);align-items:baseline}.ob-row:first-of-type{border-top:0}.ob-label{font-size:13px;font-weight:600;color:var(--text-body)}.ob-detail{font-size:13px;line-height:1.6;color:var(--meridian-gray-700);max-width:70ch}.ob-tag{display:inline-block;margin-left:8px;font-size:9.5px;font-weight:600;letter-spacing:.09em;text-transform:uppercase;border:1px solid var(--border-default);color:var(--text-muted);padding:1px 6px;border-radius:3px;white-space:nowrap;vertical-align:1px}@media (max-width:640px){.ob-row{grid-template-columns:1fr;gap:2px}}/* The end-of-day note (2026-09-15). Same document voice as the onboardingmaterial it sits above, with no hue system, because none of this is a category.The only colour is on the two states a reader scans for: written, and not. */.ci-card{margin-bottom:18px}.ci-head{display:flex;justify-content:space-between;align-items:flex-start;gap:14px;flex-wrap:wrap;padding:22px 28px 16px;border-bottom:1px solid var(--border-default)}.ci-title{font-family:var(--font-display);font-size:22px;color:var(--text-body);margin:0}.ci-body{padding:14px 28px 24px}.ci-intro{font-size:13px;line-height:1.65;color:var(--meridian-gray-700);margin:0 0 12px;max-width:78ch}.ci-sub{font-family:var(--font-display);font-size:15px;margin:20px 0 8px;color:var(--text-body)}.ci-chip{display:inline-block;font-size:9.5px;font-weight:600;letter-spacing:.09em;text-transform:uppercase;border:1px solid var(--border-default);color:var(--text-muted);padding:2px 7px;border-radius:3px;white-space:nowrap}.ci-chip.ci-done{border-color:var(--hue-ours);color:var(--hue-ours)}.ci-chip.ci-due{border-color:var(--hue-waiting);color:var(--hue-waiting-dark)}.ci-banner{font-size:12.5px;line-height:1.6;margin:0 0 12px;padding:9px 12px;max-width:78ch;border:1px solid var(--border-default);border-left:3px solid var(--border-default);border-radius:0 var(--radius-sm) var(--radius-sm) 0;background:var(--surface-card)}.ci-banner.ci-good{border-left-color:var(--hue-ours)}.ci-banner.ci-bad{border-left-color:var(--hue-waiting)}.ci-empty{font-size:13px;line-height:1.65;color:var(--text-muted);margin:8px 0;max-width:78ch}.ci-form-wrap{margin:4px 0 8px}.ci-summary{cursor:pointer;font-size:13px;font-weight:600;color:var(--text-body);padding:6px 0;list-style:revert}.ci-form{margin-top:8px;max-width:78ch}.ci-field{margin-bottom:12px}.ci-q{display:block;font-size:13px;font-weight:600;color:var(--text-body);margin-bottom:5px}.ci-input{width:100%;padding:9px 11px;font-family:inherit;font-size:13px;line-height:1.55;color:var(--text-body);background:var(--surface-page);border:1px solid var(--border-default);border-radius:var(--radius-sm);resize:vertical}.ci-input:focus{outline:2px solid var(--hue-ours);outline-offset:1px}.ci-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:6px}.ci-save{cursor:pointer;font-size:12px;font-weight:600;padding:7px 16px;border:1px solid var(--hue-ours);border-radius:var(--radius-sm);background:var(--hue-ours);color:#fff}.ci-hint{font-size:11px;color:var(--text-muted);max-width:52ch;line-height:1.5}.ci-note{padding:12px 0;border-top:1px solid var(--hairline)}.ci-note:first-of-type{border-top:0}.ci-note-head{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:6px}.ci-day{font-size:13px;font-weight:600;color:var(--text-body)}.ci-when{font-size:11px;color:var(--text-muted)}.ci-none .ci-when{font-style:italic}.ci-a{display:grid;grid-template-columns:minmax(120px,170px) 1fr;gap:6px 18px;padding:4px 0;align-items:baseline}.ci-a-label{font-size:11px;font-weight:600;letter-spacing:.04em;color:var(--text-muted)}.ci-answer{margin:0;font-size:13px;line-height:1.65;color:var(--text-body);white-space:pre-wrap;word-break:break-word;max-width:70ch}.ci-answer.ci-blank{color:var(--text-muted);font-style:italic}.ci-prior{margin-top:8px}.ci-prior summary{cursor:pointer;font-size:11.5px;color:var(--text-muted);list-style:revert}.ci-old{opacity:.78;padding-left:12px;border-left:2px solid var(--hairline);border-top:0}.ci-mine{margin-top:18px;border-top:1px solid var(--border-default);padding-top:6px}@media (max-width:640px){.ci-a{grid-template-columns:1fr;gap:2px}}.queue-group{margin:18px 0 0}.queue-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:17px;font-weight:600;margin:0 0 8px;padding-bottom:6px;border-bottom:1px solid var(--border-default)}.queue-sub{font-weight:400;font-size:12.5px;color:var(--text-muted)}.queue-aging-count{margin-left:auto;font-size:11px;font-weight:600;color:var(--hue-waiting-dark);border:1px solid var(--hue-waiting);border-radius:3px;padding:2px 8px}.queue-unassigned .queue-head{color:var(--hue-waiting)}.unassigned-notice{background:var(--surface-card);border:1px solid var(--border-default);border-left:3px solid var(--hue-waiting);border-radius:0 var(--radius-md) var(--radius-md) 0;display:grid;grid-template-columns:auto 1fr;gap:16px;align-items:center;padding:14px 18px;font-size:13px;line-height:1.6;margin-top:12px}.unassigned-notice .n{font-family:var(--font-display);font-size:34px;color:var(--hue-waiting);font-variant-numeric:tabular-nums}/* User notes on orders and tasks, injected at serve time, decorated by script.The button reads quiet until a note exists; a row with context should be theone that catches the eye. */.note-btn{cursor:pointer;font-size:10.5px;font-weight:600;padding:2px 8px;margin-top:4px;border:1px solid var(--border-default);border-radius:3px;background:var(--surface-card);color:var(--text-muted);white-space:nowrap}.note-btn:hover{border-color:var(--hue-ours);color:var(--hue-ours)}.note-btn.has-note{border-color:var(--hue-ours);color:var(--hue-ours)}.note-panel{background:var(--surface-card);border:1px solid var(--border-default);border-left:3px solid var(--hue-ours);border-radius:0 var(--radius-sm) var(--radius-sm) 0;padding:12px 14px;margin:6px 0;font-size:13px;line-height:1.55}.note-row td{padding:0 0 8px;border-bottom:0}.note-text{margin:0;white-space:pre-wrap;word-break:break-word}.note-by{margin:6px 0 0;font-size:11px;color:var(--text-muted)}.note-panel textarea{width:100%;margin-top:10px;padding:8px 10px;font-family:inherit;font-size:13px;line-height:1.5;color:var(--text-body);background:var(--surface-page);border:1px solid var(--border-default);border-radius:var(--radius-sm);resize:vertical}.note-bar{display:flex;align-items:center;gap:10px;margin-top:8px}.note-hint{font-size:11px;color:var(--text-muted)}.queue-table{width:100%;border-collapse:collapse;font-size:13px}.queue-table caption{text-align:left}.queue-table th[scope=col]{text-align:left;font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--text-muted);font-weight:600;padding:8px 10px 8px 0;border-bottom:1px solid var(--border-default);position:sticky;top:var(--sticky-tabs,52px);background:var(--surface-card);z-index:2}.queue-table td,.queue-table th[scope=row]{padding:11px 10px 11px 0;border-bottom:1px solid var(--hairline);vertical-align:top;text-align:left}.queue-table tbody tr:hover{background:var(--hover-row)}.queue-table th[scope=row]{font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap;font-family:var(--font-mono);font-size:12px;color:var(--hue-ours)}.queue-table tr.aging th[scope=row]{color:var(--hue-waiting)}/* The age system: number, then a bar over a 60-day field with a hairline at 30,so 54d and 5d differ before either number is read. */.age-cell{font-variant-numeric:tabular-nums;white-space:nowrap;text-align:right}.age-cell .d{font-family:var(--font-display);font-size:17px}.age-cell .u{font-size:11px}.age-track{height:3px;border-radius:2px;background:var(--track);margin-top:4px;position:relative;background-image:linear-gradient(90deg,transparent 0 49%,var(--meridian-gray-400) 49% 51%,transparent 51%)}.age-track i{position:absolute;left:0;top:0;bottom:0;border-radius:2px;background:var(--text-muted)}tr.aging .age-track i{background:var(--hue-waiting)}.aging-flag{display:inline-block;margin-top:4px;padding:1px 5px;border-radius:3px;font-size:9.5px;font-weight:650;letter-spacing:.12em;text-transform:uppercase;border:1px solid var(--hue-waiting);color:var(--hue-waiting-dark)}.status-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:7px;vertical-align:baseline}.class-bar{display:inline-block;width:3px;align-self:stretch}.ordnum{font-variant-numeric:tabular-nums}@media (max-width:640px){.queue-table thead{display:none}.queue-table tr{display:block;padding:8px 0;border-bottom:1px solid var(--border-default)}.queue-table td,.queue-table th[scope=row]{display:block;border:0;padding:1px 0}.queue-table td::before{content:attr(data-label);display:inline-block;min-width:74px;color:var(--text-muted);font-size:11px;text-transform:uppercase;letter-spacing:.04em}.age-track{max-width:120px}}@media print{.queue-group{break-inside:avoid}.aging-flag{border:1px solid currentColor}}/* The private list, 2026-09-23. BOARD-ONLY, so it belongs in this sheet and notin THEME_CSS or EXPORT_CSS: the card is stamped into the pre-rendered boardpage and reaches no Worker-served route. The block below the EXPORT_CSSheader records the deploy where rules went into the wrong sheet and the pageshipped unstyled while verifying fine locally.NO --hue-* ANYWHERE. A hue means a category on this board, and a private listis not one. The only colour is on the state a reader scans for, which here isoverdue: the same --hue-waiting the card already uses for work past a gate,so "late" looks the same whoever noticed it. */.own-wrap{border-top:1px solid var(--border-default);padding-top:16px;margin-top:4px}.own-head{display:flex;justify-content:space-between;align-items:baseline;gap:12px;flex-wrap:wrap}.own-title{font-size:13px;font-weight:600;color:var(--text-body)}.own-chip{font-size:11px;letter-spacing:.04em;border:1px solid var(--border-default);color:var(--text-muted);padding:1px 8px;border-radius:10px;white-space:nowrap}.own-chip-due{border-color:var(--hue-waiting);color:var(--hue-waiting)}.own-chip-dark{border-style:dashed}.own-sub{font-size:12px;color:var(--text-muted);margin:6px 0 12px;max-width:62ch;line-height:1.5}.own-banner{font-size:12px;line-height:1.55;margin:0 0 10px;padding:8px 12px;border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--text-body)}.own-good{border-left:3px solid var(--text-body)}.own-bad{border-left:3px solid var(--hue-waiting)}.own-empty{font-size:12px;color:var(--text-muted);line-height:1.55;margin:0 0 12px;max-width:62ch}.own-group{margin-bottom:12px}.own-group-head{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted);margin-bottom:4px}.own-group-n{color:var(--text-muted);opacity:.8}.own-rows{list-style:none;margin:0;padding:0}.own-row{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;padding:7px 0;border-bottom:1px solid var(--hairline)}.own-row:last-child{border-bottom:0}.own-row-main{min-width:0;flex:1}.own-text{margin:0;font-size:13px;line-height:1.45;color:var(--text-body);overflow-wrap:anywhere}.own-row-done .own-text{color:var(--text-muted);text-decoration:line-through}.own-meta{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-top:2px;font-size:11px;color:var(--text-muted)}.own-when-overdue{color:var(--hue-waiting);font-weight:600}.own-when-today{color:var(--text-body);font-weight:600}.own-nodate{opacity:.75}.own-link,.own-pri,.own-edited{border:1px solid var(--border-default);border-radius:3px;padding:0 5px;font-size:10px;letter-spacing:.03em;white-space:nowrap}.own-pri-high{border-color:var(--hue-waiting);color:var(--hue-waiting)}.own-row-acts{display:flex;gap:6px;align-items:flex-start;flex-shrink:0}.own-btn{font:inherit;font-size:11px;cursor:pointer;background:none;list-style:none;border:1px solid var(--border-default);border-radius:var(--radius-sm);padding:3px 10px;color:var(--text-body);white-space:nowrap}.own-btn::-webkit-details-marker{display:none}.own-btn-quiet{color:var(--text-muted)}.own-btn-go{font-weight:600}.own-act{display:inline}.own-add,.own-done{margin-top:10px}.own-add>summary,.own-done>summary{display:inline-block}.own-form{margin-top:10px;padding:12px;border:1px solid var(--border-default);border-radius:var(--radius-sm)}.own-label{display:block;font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);margin-bottom:3px}.own-opt{text-transform:none;letter-spacing:0;opacity:.7}.own-input,.own-date,.own-select,.own-text-in{font:inherit;font-size:13px;width:100%;color:var(--text-body);background:var(--surface-card);border:1px solid var(--border-default);border-radius:var(--radius-sm);padding:6px 8px}.own-input{resize:vertical}.own-form-row{display:flex;gap:10px;flex-wrap:wrap;margin-top:8px}.own-field{flex:1 1 150px;min-width:0}.own-form-acts{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:10px}.own-hint{font-size:11px;color:var(--text-muted);margin:6px 0 0;line-height:1.5}.own-hint-warn{color:var(--hue-waiting)}.own-reconcile{font-size:11px;color:var(--text-muted);line-height:1.55;margin:10px 0 0;max-width:70ch}.own-foot{font-size:10px;color:var(--text-muted);opacity:.75;margin:12px 0 0}@media (max-width:640px){.own-row{flex-direction:column;gap:6px}.own-row-acts{width:100%}.own-form-row{flex-direction:column}}`/*** The training export's own sheet, and that is the point. The export is served* by the Worker, whose shell loads THEME_CSS + INBOX_CSS + EXPORT_CSS; QUEUE_CSS* goes only into the pre-rendered board. A rule placed in QUEUE_CSS would look* right in any harness that loads both and ship unstyled.** `.ob-intro` is repeated from QUEUE_CSS deliberately: the two sheets are never* loaded together, so this is not a duplicate at runtime.*/export const EXPORT_CSS = `.ob-intro{font-size:13px;line-height:1.65;color:var(--meridian-gray-700);margin:0 0 10px;max-width:78ch}.ob-wins{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:14px 0 10px}.ob-win-label{font-size:9.5px;font-weight:700;letter-spacing:.11em;text-transform:uppercase;color:var(--text-muted);margin-right:4px}.ob-win{font-size:12px;font-variant-numeric:tabular-nums;text-decoration:none;color:var(--text-2);border:1px solid var(--border-default);border-radius:var(--radius-sm);padding:3px 10px;transition:var(--transition-default)}.ob-win:hover{border-color:var(--text-body);color:var(--text-body)}.ob-win.on{background:var(--slab);border-color:var(--slab);color:var(--on-slab)}.ob-export{width:100%;box-sizing:border-box;font:12px/1.6 var(--font-mono);color:var(--text-body);background:var(--surface-card2);border:1px solid var(--border-default);border-radius:var(--radius-sm);padding:12px 14px;resize:vertical}.ob-copy{font:inherit;font-size:12px;cursor:pointer;color:var(--text-2);background:var(--surface-card);border:1px solid var(--border-default);border-radius:var(--radius-sm);padding:2px 10px;transition:var(--transition-default)}.ob-copy:hover{border-color:var(--text-body);color:var(--text-body)}/* The recap document (2026-09-17). Its own "rc-" vocabulary rather than thetab's "ob-" one: that surface is built on <details>, and a printed documentdoes not fold. Type weight, italics, whitespace and BORDERS carry everyseparation here; see the print block below for why no fill does. */.rc-shell{background:var(--surface-card);border:1px solid var(--border-default);border-radius:var(--radius-md);padding:0 28px 24px}.rc-controls{padding:18px 0 4px}.rc-hint{font-size:11px;color:var(--text-muted);margin-left:2px}.rc-doc{padding:8px 0 4px}.rc-title{font-family:var(--font-display);font-size:26px;color:var(--text-body);margin:0 0 4px}.rc-sub{font-size:12px;line-height:1.55;color:var(--text-muted);margin:0 0 18px;max-width:78ch}.rc-day{padding:14px 0 2px;border-top:1px solid var(--hairline)}.rc-day:first-of-type{border-top:0;padding-top:4px}.rc-day-head{font-family:var(--font-display);font-size:19px;color:var(--text-body);margin:0 0 8px}.rc-session{font-size:14px;font-style:italic;font-weight:400;color:var(--text-2);margin:12px 0 4px}.rc-points{margin:0 0 8px;padding-left:18px;max-width:78ch}.rc-points li{font-size:13px;line-height:1.6;color:var(--text-body);margin-bottom:5px}.rc-acc{font-size:13px;line-height:1.6;color:var(--text-body);margin:8px 0 0;max-width:78ch}.rc-acc b{font-weight:600}.rc-acc-none{color:var(--text-muted)}.rc-note{font-size:11.5px;line-height:1.55;color:var(--text-muted);margin:6px 0 0;max-width:78ch}.rc-none{font-size:13px;line-height:1.6;color:var(--text-muted);margin:0 0 8px;max-width:78ch}.rc-coverage{font-size:12px;line-height:1.6;color:var(--text-muted);max-width:78ch;margin:18px 0 0;padding-top:12px;border-top:1px solid var(--border-default)}/* PRINT. This is the feature(No backticks anywhere in this comment: the sheet is a TypeScripttemplate literal, and one would end it mid-stylesheet.) The deliverable is a PDF, and ⌘P is how it ismade. THEME_CSS's own print block already forces the light ramp and hides".tabs"; this adds the page box and the document's own pagination.@page CANNOT BE SCOPED TO A SELECTOR: it is document-level by spec. Livingin EXPORT_CSS it therefore also applies to the Inbox, which is this sheet'sonly other consumer (an improvement there, not a regression), and reaches"dashboard.html" not at all, since that page loads THEME_CSS + QUEUE_CSS.NO "print-color-adjust:exact", DELIBERATELY. Browsers default to not printingbackgrounds, so a document that needs fills to be legible is a document thatprints wrong for most people the first time. Forcing them would also overridethe reader's own print settings to produce a heavy page nobody asked for.Borders print; fills do not; everything here separates with a border."break-after:avoid" on the headings rather than "break-inside:avoid" on thedays: a heading stranded at the foot of a sheet is the failure that happens,and a day too tall for a page is the failure "break-inside:avoid" CREATES. */@page{size:letter;margin:0.75in}@media print{.masthead,.page-rule,.rc-noprint{display:none !important}.page{padding:0;max-width:none}.rc-shell{background:none;border:0;padding:0;margin:0;box-shadow:none;break-inside:auto}.rc-doc{max-width:none;break-inside:auto}.rc-title{font-size:18pt}.rc-sub{font-size:10pt}.rc-day-head{font-size:13pt}.rc-session{font-size:11pt}.rc-points li,.rc-acc,.rc-none,.rc-note{font-size:10.5pt;orphans:2;widows:2}.rc-day-head,.rc-session{break-after:avoid}.rc-points li,.rc-acc{break-inside:avoid}.rc-coverage{font-size:9pt}}`