mattrguerra/meridian-ops-boardmainPrivate on GitHub, published here in full

theme.ts

Language TypeScript60.4 KB1058 lines

apps/dashboard/src/theme.ts

  1. /**
  2. * The board's entire visual system: tokens, both palettes, every component.
  3. *
  4. * Source health is not in the hue system. Hue means exactly one category
  5. * everywhere (orange is Bitrix task, magenta is waiting on client), so a hue
  6. * cannot also mean "stale" or "failed". Data-integrity state is ink plus
  7. * texture (dot, ring, fine hatch, coarse hatch). Deltas avoid green/red for
  8. * the same reason.
  9. *
  10. * Two palettes, one markup. Everything user-visible reads custom properties;
  11. * `:root[data-theme="dark"]` swaps the values. The dark ramp is a derived
  12. * palette (the brand has no dark version). Two things genuinely break on a
  13. * dark ground and both are handled, not ignored:
  14. * the four-colour rule's ink segment inverts to #eef2f5 (the same substitution
  15. * the brand makes with its reversed logo), and the not-tracked hatch inverts so
  16. * absence stays quieter than measurement: light gray on dark reads as the
  17. * loudest thing on the row, which would make "not tracked" the biggest number.
  18. *
  19. * Print forces the light ramp regardless of theme: paper is light.
  20. */
  21. import { FONT_FACES } from './fonts.js'
  22. /**
  23. * Colour handles for inline styles. These are var() references, not hex.
  24. * Markup that writes `style="background:${C.blue}"` stays theme-aware for
  25. * free; hex here would pin every call site to the light ramp.
  26. */
  27. export const C = {
  28. ink: 'var(--strong)',
  29. blue: 'var(--hue-ours)',
  30. blueDeep: 'var(--hue-todo)',
  31. magenta: 'var(--hue-waiting)',
  32. magentaDark: 'var(--hue-waiting-dark)',
  33. yellow: 'var(--hue-tracker)',
  34. orange: 'var(--hue-task)',
  35. orangeDark: 'var(--hue-task-dark)',
  36. green: 'var(--hue-vendor)',
  37. gray: 'var(--meridian-gray-400)',
  38. grayText: 'var(--text-muted)',
  39. border: 'var(--border-default)',
  40. wash: 'var(--wash)',
  41. } as const
  42. /**
  43. * Work classes keep fixed colors across every surface. Identity, not severity:
  44. * "at vendor" is not worse than "our move", it is a different kind of thing.
  45. */
  46. export const CLASS_COLOR: Record<string, string> = {
  47. ours: C.blue,
  48. client: C.magenta,
  49. waiting: C.magenta,
  50. vendor: C.green,
  51. parked: C.gray,
  52. terminal: C.gray,
  53. }
  54. /** The hatch used wherever a number is absent rather than zero. */
  55. export const UNTRACKED_FILL = 'var(--hatch)'
  56. export const THEME_CSS = `
  57. ${FONT_FACES}
  58. /* ---- tokens --------------------------------------------------------------- */
  59. :root{
  60. /* THE BODY FACE SITS BETWEEN THE DISPLAY FACE AND GEORGIA. The display face
  61. has no em dash, en dash, ellipsis or arrow (not a subsetting choice, the
  62. glyphs are absent from the font), so every "Name: heading" mark this
  63. board draws in it was falling through to Georgia, a serif next to a
  64. condensed display face. Inter carries all of them, so a gap now falls back
  65. to something that belongs here. Georgia stays last as the real-glyph
  66. floor: a fallback miss must never be tofu. */
  67. --font-display:"Anton","Inter",Georgia,serif;
  68. --font-body:"Inter",system-ui,-apple-system,"Segoe UI",sans-serif;
  69. --font-mono:ui-monospace,Menlo,Consolas,monospace;
  70. /* Raw brand hues, light ramp. */
  71. --meridian-ink:#0f141d; --meridian-white:#fff;
  72. --meridian-gray-700:#333; --meridian-gray-400:#bdb9c7; --meridian-gray-200:#d7d7d7; --meridian-gray-050:#f5f5f5;
  73. --meridian-blue-050:#f3f6f7; --meridian-blue-100:#d3e2e4;
  74. /* Semantic surfaces and text. The dark block below swaps ONLY these. */
  75. --surface-page:#f3f6f7;
  76. --surface-card:#fff;
  77. --surface-card2:#fbfbfc;
  78. --wash:#f3f6f7;
  79. --slab:#0f141d; /* emphasis bands: drill head, My Day header, footers */
  80. --on-slab:#fff;
  81. --on-slab-dim:#bdb9c7;
  82. --slab-line:#333;
  83. --text-body:#0f141d;
  84. --text-2:#333;
  85. /* 6.3:1 on white, NOT #777181, which is the bare 4.5:1 floor. */
  86. --text-muted:#655f70;
  87. --border-default:#d7d7d7;
  88. --hairline:#ececec;
  89. --strong:#0f141d; /* elev-1 borders, dashed knowledge boundaries, health ink */
  90. --track:#f1f1ef; --tick:#dcdcd8;
  91. --hover-row:#f3f6f7;
  92. --delta-bg:#eef2f5;
  93. /* Hue = category, one meaning each, stated in the on-page legend. */
  94. --hue-ours:#1f7a8c; --hue-ours-dark:#175f6d;
  95. --hue-waiting:#c8325f; --hue-waiting-dark:#9c2449;
  96. --hue-vendor:#70bf4a;
  97. --hue-task:#f99d22; --hue-task-dark:#e18408;
  98. --hue-todo:#175f6d;
  99. --hue-tracker:#f2c94c; --hue-tracker-dark:#b8942a;
  100. /* NOT A CATEGORY HUE, AND DELIBERATELY OUTSIDE THE HUE SYSTEM. Every hue
  101. above means exactly one category (see the note at the top of this file);
  102. this one means "read this before you send mail from someone else's
  103. mailbox" and is used by the compose caveats only. Sam asked for it bright
  104. and large, 2026-09-08, so that whoever sends from a shared mailbox cannot
  105. miss what the board does NOT carry: the Cc, and attachments. 5.9:1 on the
  106. light card. If it ever starts appearing on data, it has become a category
  107. hue and this comment is a lie. */
  108. --caveat:#c40d0d;
  109. /* The signature motif. Never a solid line. */
  110. --meridian-rule:linear-gradient(90deg,#0f141d 0 25%,#1f7a8c 25% 50%,#f2c94c 50% 75%,#c8325f 75%);
  111. /* Textures: "do not read this as a quantity". */
  112. --hatch:repeating-linear-gradient(45deg,#bdb9c7 0 6px,#e6e4ea 6px 12px);
  113. --hatch-ink:repeating-linear-gradient(45deg,#0f141d 0 5px,#fff 5px 10px);
  114. --hatch-fine:repeating-linear-gradient(45deg,#0f141d 0 2px,#fff 2px 4px);
  115. --hatch-ghost:repeating-linear-gradient(45deg,rgba(200,50,95,.32) 0 5px,transparent 5px 10px);
  116. --radius-md:8px; --radius-sm:5px;
  117. --border-rule:2px;
  118. --shadow-menu:0 2px 20px -7px rgba(0,0,0,.2); /* overlays only */
  119. --sticky-tabs:52px;
  120. /* Motion: expressive on load, quiet after. Steady state is 200ms. */
  121. --state:200ms ease;
  122. --transition-default:color var(--state),background-color var(--state),border-color var(--state);
  123. color-scheme:light;
  124. }
  125. /*
  126. * Dark, derived. Every value is a stated derivation from the light ramp:
  127. * see the handoff's ratio table. Hue lifts keep the hue angle so the legend
  128. * still reads as the legend; --hue-todo is fill-only on dark (4.2:1), so
  129. * anything writing to-do TEXT uses --text-body there.
  130. */
  131. :root[data-theme="dark"]{
  132. --surface-page:#0e161c;
  133. --surface-card:#1b262f;
  134. --surface-card2:#18222a; /* read/zebra rows sit BELOW the card on dark */
  135. --wash:#232f3a;
  136. --slab:#2b3a46; --on-slab:#eef2f5; --on-slab-dim:#a8b4c0; --slab-line:#3d4c58;
  137. --text-body:#eef2f5; /* not pure #fff; it haloes at 13px */
  138. --text-2:#cdd5dc;
  139. --text-muted:#a3aeb8; /* 6.8:1, beating the light theme's 6.3:1 */
  140. --border-default:#2f3b45;
  141. --hairline:#232e37;
  142. --strong:#eef2f5;
  143. --track:#232f3a; --tick:#3a444f;
  144. --hover-row:#232f3a;
  145. --delta-bg:#232f3a;
  146. --meridian-gray-050:#18222a; --meridian-gray-400:#5c6874; --meridian-gray-700:#cdd5dc;
  147. --meridian-blue-050:#232f3a;
  148. --hue-ours:#4fb3c2;
  149. --hue-waiting:#f06a8d;
  150. --hue-vendor:#8fd968;
  151. --hue-task:#ffb24d;
  152. --hue-todo:#3799a8;
  153. /* tracker yellow is the one hue needing no lift: 11.8:1 on the dark card */
  154. /* #c40d0d is 2.9:1 on the dark card: unreadable, not merely dimmer. Lifted
  155. to the same hue angle at 5.6:1. */
  156. --caveat:#ff6a5e;
  157. /* The rule's ink segment, and only the ink segment, inverts, the same
  158. substitution the brand makes with its reversed logo. */
  159. --meridian-rule:linear-gradient(90deg,#eef2f5 0 25%,#1f7a8c 25% 50%,#f2c94c 50% 75%,#c8325f 75%);
  160. /* Absence must stay QUIETER than measurement. */
  161. --hatch:repeating-linear-gradient(45deg,#3a444f 0 6px,#243039 6px 12px);
  162. --hatch-ink:repeating-linear-gradient(45deg,#eef2f5 0 5px,#2f3b45 5px 10px);
  163. --hatch-fine:repeating-linear-gradient(45deg,#eef2f5 0 2px,#2f3b45 2px 4px);
  164. --hatch-ghost:repeating-linear-gradient(45deg,rgba(240,106,141,.34) 0 5px,transparent 5px 10px);
  165. color-scheme:dark;
  166. }
  167. /* ---- reset / page ---------------------------------------------------------- */
  168. *{box-sizing:border-box}
  169. html{scroll-behavior:smooth}
  170. body{
  171. margin:0;background:var(--surface-page);color:var(--text-body);
  172. font-family:var(--font-body);font-size:14.5px;line-height:1.55;
  173. -webkit-font-smoothing:antialiased;
  174. }
  175. h1,h2,h3,h4{font-weight:normal;margin:0}
  176. h1,h2.display{font-family:var(--font-display)}
  177. b,strong{font-weight:600}
  178. a{color:var(--hue-ours);text-decoration:none;transition:color var(--state)}
  179. a:hover{color:var(--hue-ours-dark)}
  180. :focus-visible{outline:2px solid var(--hue-ours);outline-offset:2px;border-radius:var(--radius-sm)}
  181. code{font-family:var(--font-mono);font-size:.92em}
  182. /* ---- type scale (eleven steps, ~1.2, anchored on 14.5) --------------------- */
  183. .t-micro{font-size:10px;line-height:1.3;font-weight:600;letter-spacing:.16em;text-transform:uppercase}
  184. .t-meta{font-size:11.5px;line-height:1.6}
  185. .t-small{font-size:13px;line-height:1.5}
  186. .t-lede{font-size:17px;line-height:1.5}
  187. .t-h3{font-size:20px;line-height:1.3;font-weight:600}
  188. .t-h2{font-family:var(--font-display);font-size:27px;line-height:1.15;font-weight:normal}
  189. .t-stat{font-family:var(--font-display);font-size:44px;line-height:1;font-variant-numeric:tabular-nums}
  190. .t-hero{font-family:var(--font-display);font-size:76px;line-height:.88;font-variant-numeric:tabular-nums}
  191. /* ---- motion ----------------------------------------------------------------- */
  192. @keyframes rule-wipe{from{transform:scaleX(0)}to{transform:scaleX(1)}}
  193. @keyframes rise{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}
  194. @keyframes bar-grow{from{transform:scaleX(0)}to{transform:scaleX(1)}}
  195. .rise{animation:rise 360ms ease both;animation-delay:calc(min(var(--i,0),8) * 50ms)}
  196. /* Numbers never animate. A stat counting up through 0 reads as zero. */
  197. /* ---- the 4-colour rule ------------------------------------------------------ */
  198. .rule{height:var(--border-rule);background:var(--meridian-rule);
  199. animation:rule-wipe 500ms ease both;transform-origin:left}
  200. /* ---- shell ------------------------------------------------------------------ */
  201. .page{max-width:1220px;margin:0 auto;padding:0 20px 64px}
  202. .page-rule{height:3px;background:var(--meridian-rule)}
  203. .masthead{padding:18px 0 0}
  204. /* TWO COLUMNS, ENFORCED. The first ship let the title block take its full
  205. 70ch max-width, so 699 + 520 + gap outgrew the 1180px container by 63px and
  206. the source pills wrapped BELOW the title: a header twice as tall as it
  207. needed to be, for nothing. The title column now shrinks (flex:1, min-width:0)
  208. and the pill column is fixed; they share a row at any desktop width. */
  209. .masthead .top{flex-wrap:nowrap}
  210. .masthead .mast-left{flex:1 1 0;min-width:0}
  211. .masthead .mast-right{flex:0 0 auto}
  212. .eyebrow{
  213. font-family:var(--font-display);font-size:10px;letter-spacing:.5em;
  214. text-transform:uppercase;color:var(--text-muted);margin-bottom:10px;
  215. }
  216. .masthead h1{font-size:40px;line-height:1.05;text-transform:uppercase;color:var(--text-body)}
  217. .masthead .lede{margin:6px 0 0;font-size:14.5px;color:var(--text-2);max-width:64ch}
  218. .mast-right{max-width:520px;text-align:right}
  219. /* ---- source health: ink + texture, never a category hue -------------------- */
  220. .sources{display:flex;gap:6px;flex-wrap:wrap;justify-content:flex-end}
  221. .pill{
  222. display:inline-flex;align-items:center;gap:6px;font-size:11px;padding:4px 9px;
  223. border:1px solid var(--border-default);border-radius:var(--radius-sm);
  224. color:var(--text-body);background:var(--surface-card);white-space:nowrap;
  225. }
  226. .pill i{width:8px;height:8px;border-radius:50%;display:inline-block;flex:none}
  227. .pill.live i{background:var(--strong)}
  228. .pill.read i{background:transparent;border:2px solid var(--strong);width:8px;height:8px}
  229. .pill.stale{border-color:var(--strong);background:var(--surface-card2)}
  230. .pill.stale i{background:var(--hatch-fine);border:1px solid var(--strong);border-radius:2px}
  231. .pill.failed{border-color:var(--strong)}
  232. .pill.failed i{background:var(--hatch-ink);border-radius:2px;width:12px}
  233. .pill .err{font-family:var(--font-mono);font-size:10px;color:var(--text-muted)}
  234. .synced{font-size:11.5px;color:var(--text-muted);text-align:right;margin-top:8px}
  235. /* ---- tabs -------------------------------------------------------------------- */
  236. .tabs{display:flex;gap:2px;flex-wrap:wrap;margin:22px 0 0;border-bottom:1px solid var(--border-default);
  237. position:sticky;top:0;z-index:30;background:var(--surface-page)}
  238. .tab{
  239. position:relative;padding:12px 16px;font-size:14px;color:var(--text-body);
  240. background:none;border:0;font-family:inherit;cursor:pointer;
  241. }
  242. .tab::after{
  243. content:"";position:absolute;left:0;right:0;bottom:-1px;height:var(--border-rule);
  244. background:var(--meridian-rule);transform:scaleX(0);transform-origin:left;
  245. transition:transform 500ms ease;
  246. }
  247. .tab:hover::after,.tab[aria-selected="true"]::after,.tab[aria-current="page"]::after{transform:scaleX(1)}
  248. .tab[aria-selected="true"],.tab[aria-current="page"]{font-weight:600}
  249. a.tab{display:inline-block;color:var(--text-body)}
  250. a.tab:hover{color:var(--text-body)}
  251. .surface[hidden]{display:none}
  252. /* ---- cards -------------------------------------------------------------------- */
  253. .card{
  254. background:var(--surface-card);border:1px solid var(--border-default);
  255. border-radius:var(--radius-md);overflow:hidden;
  256. }
  257. .card-pad{padding:18px 22px}
  258. .section{margin-top:26px}
  259. .section-head{display:flex;align-items:baseline;gap:10px;margin-bottom:12px;flex-wrap:wrap}
  260. .section-head h2{font-family:var(--font-display);font-size:27px;line-height:1.15;color:var(--text-body)}
  261. .section-head .hint{font-size:12px;color:var(--text-muted)}
  262. .note{font-size:11.5px;color:var(--text-muted);line-height:1.6;margin:0}
  263. .note.wide{max-width:82ch}
  264. /* ---- "Check this": ink edge, one row per note ------------------------------- */
  265. .caveat{
  266. background:var(--surface-card);border:1px solid var(--border-default);
  267. border-left:3px solid var(--strong);border-radius:0 var(--radius-md) var(--radius-md) 0;
  268. padding:12px 16px;font-size:13px;line-height:1.55;color:var(--text-body);
  269. }
  270. .caveat b{color:var(--text-body)}
  271. .caveat.down{border-left-color:var(--strong)}
  272. .caveat-band{background:var(--surface-card);border:1px solid var(--border-default);
  273. border-left:3px solid var(--strong);border-radius:0 var(--radius-md) var(--radius-md) 0;overflow:hidden}
  274. .caveat-head{display:flex;gap:12px;align-items:center;padding:12px 18px}
  275. .caveat-chip{background:var(--slab);color:var(--on-slab);font-size:10px;font-weight:600;
  276. letter-spacing:.16em;text-transform:uppercase;padding:4px 9px;border-radius:3px;white-space:nowrap}
  277. .caveat-row{display:grid;grid-template-columns:158px 1fr;gap:18px;padding:11px 18px;
  278. border-top:1px solid var(--hairline);font-size:13px}
  279. .caveat-row .src{font-size:10px;font-weight:600;letter-spacing:.16em;text-transform:uppercase;
  280. color:var(--text-muted);padding-top:2px}
  281. /* ---- headline tiles ------------------------------------------------------------ */
  282. .tiles{display:grid;grid-template-columns:1.35fr 1fr 1fr 1fr;gap:12px;align-items:stretch}
  283. .tile{
  284. text-align:left;font-family:inherit;background:var(--surface-card);
  285. border:1px solid var(--border-default);border-radius:var(--radius-md);
  286. padding:0;color:var(--text-body);transition:var(--transition-default);
  287. display:flex;flex-direction:column;overflow:hidden;
  288. }
  289. button.tile{cursor:pointer}
  290. .tile-body{padding:18px 22px 0;flex:1}
  291. .tile-foot{display:flex;justify-content:space-between;align-items:center;gap:8px;
  292. border-top:1px solid var(--hairline);padding:12px 22px;font-size:12.5px;min-height:40px}
  293. .tile-label{font-size:10px;font-weight:600;letter-spacing:.16em;text-transform:uppercase;
  294. color:var(--text-muted);margin-bottom:8px}
  295. .tile-value{font-family:var(--font-display);font-size:44px;line-height:1;font-variant-numeric:tabular-nums}
  296. .tile-note{font-size:11.5px;color:var(--text-muted);margin-top:8px;line-height:1.6}
  297. .tile[aria-expanded="true"]{border-color:var(--strong)}
  298. button.tile:hover{border-color:var(--hue-ours)}
  299. .tile.hero{background:var(--slab);border-color:var(--slab);color:var(--on-slab)}
  300. .tile.hero .tile-label,.tile.hero .tile-note{color:var(--on-slab-dim)}
  301. .tile.hero .tile-foot{border-top-color:var(--slab-line);color:var(--on-slab)}
  302. .tile.hero .tile-value{font-size:76px;line-height:.88}
  303. button.tile.hero:hover{background:#000}
  304. :root[data-theme="dark"] button.tile.hero:hover{background:#1f2c36}
  305. .tile.accent{border-color:var(--hue-waiting)}
  306. button.tile.accent:hover{background:var(--wash)}
  307. .delta{display:inline-block;font-size:11px;padding:2px 8px;border-radius:3px;
  308. background:var(--delta-bg);color:var(--text-body);border:1px solid var(--border-default);
  309. font-variant-numeric:tabular-nums}
  310. .tile.hero .delta{background:transparent;color:var(--on-slab);border-color:var(--text-muted)}
  311. .answer-chip{display:inline-block;background:var(--hue-waiting);color:#fff;font-size:10px;
  312. font-weight:600;letter-spacing:.16em;text-transform:uppercase;padding:3px 8px;border-radius:3px}
  313. .zero-chip{display:inline-block;border:1px solid var(--strong);color:var(--text-body);font-size:10px;
  314. font-weight:600;letter-spacing:.16em;text-transform:uppercase;padding:3px 8px;border-radius:3px}
  315. /* ---- context strip: deliberately demoted ------------------------------------- */
  316. .ctx{display:grid;grid-template-columns:auto 1fr 1fr;background:var(--surface-card);
  317. border:1px solid var(--border-default);border-radius:var(--radius-md);overflow:hidden;margin-top:12px}
  318. .ctx-key{background:var(--wash);border-right:1px solid var(--border-default);max-width:200px;
  319. padding:16px 20px;font-size:10px;font-weight:600;letter-spacing:.16em;text-transform:uppercase;
  320. color:var(--text-muted);line-height:1.8}
  321. .ctx-cell{padding:16px 20px;display:flex;gap:16px;align-items:baseline}
  322. .ctx-cell .n{font-family:var(--font-display);font-size:34px;color:var(--text-muted);font-variant-numeric:tabular-nums}
  323. .ctx-cell .t{font-size:13px;font-weight:600}
  324. .ctx-cell .s{font-size:12px;color:var(--text-muted);line-height:1.55;margin-top:2px}
  325. /* ---- meeting topics ------------------------------------------------------------- */
  326. /* Buttons named after topics, each opening its own panel. The panel is hidden
  327. with the hidden ATTRIBUTE, so (as the inbox search learned the hard way on
  328. 2026-09-04) any rule here that sets display needs the [hidden] line below to
  329. beat it, because the user-agent default loses to every author rule.
  330. No backticks in this comment: THEME_CSS is a template literal and one would
  331. end the stylesheet mid-file. That is the second time in one day. */
  332. .topic-row{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 2px}
  333. .topic-btn{display:inline-flex;align-items:center;gap:8px;cursor:pointer;
  334. font-family:inherit;font-size:12.5px;padding:7px 12px;border:1px solid var(--border-default);
  335. border-radius:var(--radius-sm);background:var(--surface-card);color:var(--text-body)}
  336. .topic-btn:hover{border-color:var(--hue-waiting);color:var(--hue-waiting)}
  337. .topic-btn[aria-expanded="true"]{border-color:var(--strong);background:var(--wash);font-weight:600}
  338. .topic-btn .n{font-variant-numeric:tabular-nums;font-size:11.5px;color:var(--text-muted);
  339. background:var(--meridian-gray-050);border-radius:10px;padding:1px 7px}
  340. .topic-btn[aria-expanded="true"] .n{color:var(--text-body)}
  341. .topic-panel{margin-top:12px;border:1px solid var(--strong);border-radius:var(--radius-md);
  342. overflow:hidden;background:var(--surface-card)}
  343. .topic-panel[hidden]{display:none}
  344. .topic-head{display:flex;align-items:center;gap:12px;padding:11px 16px;
  345. background:var(--slab);color:var(--on-slab)}
  346. .topic-head .n{font-family:var(--font-display);font-size:20px}
  347. .topic-head .t{font-size:13.5px;font-weight:600}
  348. .topic-head .m{font-size:11.5px;color:var(--on-slab-dim);flex:1}
  349. .topic-head button{cursor:pointer;font-family:inherit;font-size:11px;padding:3px 10px;
  350. border:1px solid var(--on-slab-dim);border-radius:var(--radius-sm);
  351. background:transparent;color:var(--on-slab)}
  352. .topic-body{padding:0 16px}
  353. @media (max-width:720px){
  354. .topic-row{flex-direction:column;align-items:stretch}
  355. .topic-btn{justify-content:space-between;min-height:38px}
  356. }
  357. /* ---- drill-down ----------------------------------------------------------------- */
  358. .drill{margin-top:14px;border:1px solid var(--strong);border-radius:var(--radius-md);
  359. overflow:hidden;background:var(--surface-card)}
  360. .drill-head{
  361. display:flex;align-items:center;gap:12px;
  362. padding:13px 18px;background:var(--slab);color:var(--on-slab);
  363. }
  364. .drill-head .n{font-family:var(--font-display);font-size:22px}
  365. .drill-head .t{font-size:13.5px;font-weight:600}
  366. .drill-head .m{font-size:11.5px;color:var(--on-slab-dim);flex:1}
  367. .drill-body{padding:0 0 0}
  368. .drill-row{
  369. display:grid;grid-template-columns:3px 100px 1fr 148px 52px;gap:0 14px;align-items:center;
  370. padding:9px 18px 9px 0;border-top:1px solid var(--hairline);font-size:13px;
  371. }
  372. .drill-row:hover{background:var(--hover-row)}
  373. .drill-row .bar{align-self:stretch}
  374. .drill-row .id{font-family:var(--font-mono);font-size:12px;color:var(--hue-ours)}
  375. .drill-row .who{color:var(--text-muted);font-size:12px}
  376. .drill-row .age{text-align:right;font-variant-numeric:tabular-nums}
  377. .drill-note{padding:8px 18px 6px;font-size:11.5px;color:var(--text-muted)}
  378. .withheld{background:var(--wash);border-top:1px solid var(--border-default);
  379. display:grid;grid-template-columns:auto 1fr;gap:16px;align-items:center;padding:12px 18px;font-size:12.5px}
  380. .withheld .n{font-family:var(--font-display);font-size:30px;font-variant-numeric:tabular-nums}
  381. /* Buttons, per the system: 5px radius, no shadow, darken on hover. */
  382. .btn{
  383. font-family:inherit;font-size:12px;padding:6px 12px;border-radius:var(--radius-sm);
  384. border:1px solid transparent;cursor:pointer;box-shadow:none;
  385. transition:var(--transition-default);
  386. }
  387. .btn-secondary{background:var(--hue-tracker);color:#000}
  388. .btn-secondary:hover{background:var(--hue-tracker-dark)}
  389. .btn-outline{background:transparent;border-color:var(--hue-ours);color:var(--hue-ours)}
  390. .btn-outline:hover{background:var(--hue-ours);color:#fff}
  391. .btn-outline[aria-pressed="true"]{background:var(--hue-ours);color:#fff}
  392. /* ---- bars (simple, for stage rows and briefing board sizes) ------------------- */
  393. .bar-track{height:16px;border-radius:4px;background:var(--track);overflow:hidden}
  394. .bar-fill{height:100%;border-radius:0 4px 4px 0;min-width:2px;
  395. animation:bar-grow 560ms ease 200ms both;transform-origin:left}
  396. .stage-row{display:grid;grid-template-columns:150px 1fr 34px;gap:10px;align-items:center;margin-bottom:7px}
  397. .stage-row .n{font-size:12px;color:var(--text-2);text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  398. .stage-row .c{font-size:12px;text-align:right;font-variant-numeric:tabular-nums}
  399. /* ---- workload: the bar is a measurement ---------------------------------------- */
  400. .ruler{display:flex;justify-content:space-between;font-size:10px;color:var(--text-muted);
  401. font-variant-numeric:tabular-nums;padding:0 0 4px}
  402. .measure{display:flex;height:22px;border-radius:4px;overflow:hidden;background:var(--track);
  403. background-image:repeating-linear-gradient(90deg,var(--tick) 0 1px,transparent 1px 20%)}
  404. .measure .seg{height:100%;animation:bar-grow 560ms ease 200ms both;transform-origin:left}
  405. .measure .ghost{background:var(--hatch-ghost);border-left:2px solid var(--strong);
  406. animation:bar-grow 560ms ease 200ms both;transform-origin:left}
  407. .measure .rest{flex:1;background:var(--hatch);border-left:2px dashed var(--strong);
  408. position:relative;animation:bar-grow 560ms ease 200ms both;transform-origin:left}
  409. .measure .rest .lbl{position:absolute;inset:0;display:flex;align-items:center;padding:0 8px;
  410. font-size:10px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:#0f141d}
  411. .measure .rest .lbl span{background:rgba(255,255,255,.82);padding:1px 6px;border-radius:2px}
  412. :root[data-theme="dark"] .measure .rest .lbl span{background:rgba(14,22,28,.82);color:#eef2f5}
  413. .person{display:grid;grid-template-columns:210px 1fr 118px;gap:20px;align-items:center;
  414. padding:13px 22px;border-top:1px solid var(--hairline)}
  415. .person-id{display:flex;gap:10px;align-items:center}
  416. .avatar{width:30px;height:30px;border-radius:var(--radius-sm);background:var(--slab);color:var(--on-slab);
  417. font-family:var(--font-display);font-size:12px;display:flex;align-items:center;justify-content:center;flex:none}
  418. .person-name{font-size:14px;font-weight:600;color:var(--text-body)}
  419. .person-role{font-size:11px;color:var(--text-muted)}
  420. .person-detail{font-size:12px;color:var(--text-2);margin-top:6px}
  421. .person-aside{color:var(--text-muted)}
  422. .person-note{font-size:11.5px;color:var(--text-muted);margin-top:5px;max-width:78ch;
  423. border-left:2px solid var(--border-default);padding-left:10px}
  424. .person-load{text-align:right}
  425. .person-load .v{font-family:var(--font-display);font-size:28px;font-variant-numeric:tabular-nums;color:var(--text-body)}
  426. .person-load .k{font-size:10px;color:var(--text-muted);letter-spacing:.1em;text-transform:uppercase}
  427. .untracked{display:inline-block;font-size:11px;font-weight:600;color:var(--text-body);
  428. background:var(--hatch);padding:2px 8px;border-radius:3px}
  429. /* ---- generic rows ---------------------------------------------------------------- */
  430. .rows{width:100%}
  431. .row-head{
  432. display:grid;gap:10px;padding:8px 0;font-size:10px;font-weight:600;letter-spacing:.16em;
  433. text-transform:uppercase;color:var(--text-muted);border-bottom:1px solid var(--meridian-gray-400);
  434. }
  435. .row{display:grid;gap:10px;padding:9px 0;border-bottom:1px solid var(--hairline);font-size:13px;align-items:center}
  436. .row:last-child{border-bottom:none}
  437. .lead-cols{grid-template-columns:52px 150px 1fr}
  438. .num{font-variant-numeric:tabular-nums}
  439. /* ---- briefing ---------------------------------------------------------------------- */
  440. .brief{max-width:760px}
  441. .brief .kicker{font-size:17px;line-height:1.5;margin:0 0 18px;text-wrap:pretty}
  442. .brief h3{
  443. font-size:10px;font-weight:600;margin:0 0 8px;color:var(--hue-ours);
  444. text-transform:uppercase;letter-spacing:.16em;
  445. }
  446. .brief p{font-size:14.5px;line-height:1.7;margin:0 0 20px;text-wrap:pretty}
  447. .brief .quiet{color:var(--text-muted)}
  448. .blind{
  449. border:1px solid var(--border-default);border-left:3px solid var(--strong);
  450. border-radius:0 var(--radius-md) var(--radius-md) 0;padding:14px 18px;margin-bottom:22px;
  451. background:var(--surface-card2);
  452. }
  453. .blind h3{color:var(--text-body)}
  454. .blind p{font-size:14px;line-height:1.6;margin:0}
  455. /* Deltas: direction by arrow and words only. Green/red collided with at-vendor
  456. and waiting-on-client: the same hue crime the pills committed. */
  457. .delta.down,.delta.up,.delta.flat{color:var(--text-body)}
  458. .seg-control{display:inline-flex;border:1px solid var(--border-default);border-radius:var(--radius-sm);overflow:hidden}
  459. .seg-control button{font-family:inherit;font-size:12px;padding:7px 14px;border:0;background:var(--surface-card);
  460. color:var(--text-body);cursor:pointer;transition:var(--transition-default)}
  461. .seg-control button[aria-pressed="true"]{background:var(--slab);color:var(--on-slab)}
  462. details.brief-inline{border:1px solid var(--border-default);border-radius:var(--radius-md);
  463. background:var(--surface-card);margin:16px 0 14px;overflow:hidden}
  464. details.brief-inline>summary{cursor:pointer;padding:12px 18px;font-size:13px;font-weight:600;
  465. display:flex;gap:10px;align-items:baseline}
  466. details.brief-inline>summary .hint{font-weight:400;font-size:11.5px;color:var(--text-muted)}
  467. details.brief-inline .body{padding:2px 18px 16px;font-size:14px;line-height:1.7;max-width:76ch}
  468. /* ---- feed --------------------------------------------------------------------------- */
  469. .feed-row{display:grid;grid-template-columns:84px 1fr;gap:14px;padding:14px 0;border-bottom:1px solid var(--hairline)}
  470. .feed-row:last-child{border-bottom:none}
  471. .badge{
  472. display:inline-block;font-size:10px;padding:3px 8px;border-radius:3px;
  473. font-weight:600;letter-spacing:.02em;
  474. }
  475. .badge.primary{background:var(--hue-ours);color:#fff}
  476. .badge.accent{background:var(--hue-waiting);color:#fff}
  477. .badge.dark{background:var(--slab);color:var(--on-slab)}
  478. .badge.hot{background:var(--hue-task);color:#0f141d}
  479. .feed-time{font-size:11px;color:var(--text-muted);margin-top:6px}
  480. .feed-text{font-size:14px;line-height:1.5}
  481. .feed-why{font-size:11.5px;color:var(--text-muted);margin-top:4px}
  482. /* ---- data health ----------------------------------------------------------------------- */
  483. .source-row{display:grid;grid-template-columns:16px 190px 1fr 130px;gap:16px;align-items:start;
  484. padding:15px 0;border-bottom:1px solid var(--hairline)}
  485. .source-row:last-child{border-bottom:none}
  486. .health{width:11px;height:11px;margin-top:4px;border-radius:50%}
  487. .health.live{background:var(--strong)}
  488. .health.read{background:transparent;border:2px solid var(--strong)}
  489. .health.stale{background:var(--hatch-fine);border:1px solid var(--strong);border-radius:2px}
  490. .health.failed{background:var(--hatch-ink);border-radius:2px}
  491. .source-name{font-size:14px;font-weight:600;color:var(--text-body)}
  492. .source-covers{font-size:11.5px;color:var(--text-muted)}
  493. .source-note{font-size:12.5px;color:var(--text-2);line-height:1.6}
  494. .source-note .err{font-family:var(--font-mono);font-size:11.5px;background:var(--meridian-gray-050);
  495. padding:1px 5px;border-radius:3px}
  496. .source-status{text-align:right;font-size:11.5px;font-weight:600;color:var(--text-body)}
  497. .matrix{border:1px solid var(--border-default);border-radius:var(--radius-md);overflow:hidden}
  498. .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}
  499. .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}
  500. .cell-covered i{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--strong);margin-right:6px}
  501. .cell-untracked{display:inline-block;font-size:10px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;
  502. background:var(--hatch);color:#0f141d;padding:2px 7px;border-radius:3px}
  503. :root[data-theme="dark"] .cell-untracked{color:#eef2f5}
  504. .blindspots{display:grid;grid-template-columns:1fr 1fr;gap:10px}
  505. .blindspot{border:1px solid var(--border-default);border-radius:var(--radius-md);overflow:hidden}
  506. .blindspot .strip{height:3px;background:var(--hatch)}
  507. .blindspot h3{font-size:13px;font-weight:600;color:var(--text-body);margin:12px 15px 4px}
  508. .blindspot p{font-size:12px;color:var(--text-muted);line-height:1.55;margin:0 15px 13px}
  509. /* ---- my day -------------------------------------------------------------------------------- */
  510. .chips{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:16px}
  511. .chip{font-size:11px;padding:5px 10px;border-radius:var(--radius-sm);border:1px solid var(--border-default)}
  512. .chip.solid{background:var(--slab);color:var(--on-slab);border-color:var(--slab)}
  513. .chip.quiet{color:var(--text-muted);background:var(--surface-card2)}
  514. .chip.hatch{background:var(--hatch);color:#0f141d;font-weight:600}
  515. :root[data-theme="dark"] .chip.hatch{color:#eef2f5}
  516. .first3{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:16px 0}
  517. .first3 .f{border:1px solid var(--border-default);border-radius:var(--radius-md);overflow:hidden;
  518. background:var(--surface-card)}
  519. .first3 .f .strip{height:3px}
  520. .first3 .f .in{padding:12px 14px}
  521. .first3 .kchip{display:inline-block;color:#fff;font-size:10px;font-weight:600;letter-spacing:.16em;
  522. text-transform:uppercase;padding:3px 8px;border-radius:3px}
  523. .first3 .age{float:right;font-family:var(--font-display);font-size:20px;font-variant-numeric:tabular-nums}
  524. .first3 .id{font-family:var(--font-mono);font-size:11.5px;color:var(--hue-ours);margin-top:8px}
  525. .first3 .what{font-size:15px;font-weight:600;margin-top:2px;line-height:1.4}
  526. .first3 .why{font-size:12.5px;color:var(--text-2);margin-top:4px;line-height:1.5}
  527. .kind{border:1px solid var(--border-default);border-radius:var(--radius-md);overflow:hidden;margin-bottom:12px}
  528. .kind-head{display:flex;gap:8px;align-items:center;background:var(--surface-card2);
  529. padding:8px 18px;font-size:13px;font-weight:600;border-bottom:1px solid var(--hairline)}
  530. .kind-head .swatch{width:11px;height:11px;border-radius:3px}
  531. .kind-head .c{margin-left:auto;font-variant-numeric:tabular-nums;color:var(--text-muted);font-weight:400}
  532. .work-row{display:grid;grid-template-columns:1fr 62px;gap:12px;align-items:start;padding:11px 18px;border-top:1px solid var(--hairline)}
  533. .work-row:first-of-type{border-top:0}
  534. .work-what{font-size:14.5px;color:var(--text-body)}
  535. .work-meta{font-size:11.5px;color:var(--text-muted);margin-top:3px}
  536. .work-age{text-align:right;font-size:12px;font-variant-numeric:tabular-nums;color:var(--text-2)}
  537. .work-age .late{display:block;font-size:9.5px;font-weight:600;letter-spacing:.12em;
  538. text-transform:uppercase;color:var(--hue-waiting)}
  539. .myday-head{background:var(--slab);color:var(--on-slab);padding:24px 28px 22px;
  540. display:flex;justify-content:space-between;gap:24px;flex-wrap:wrap}
  541. .myday-head .who h1{font-family:var(--font-display);font-size:34px;color:var(--on-slab)}
  542. .myday-head .cover{font-size:12.5px;color:var(--on-slab-dim);margin-top:4px}
  543. .myday-nums{display:flex;align-items:baseline}
  544. .myday-nums .b{text-align:right}
  545. .myday-nums .b+.b{border-left:1px solid var(--slab-line);padding-left:28px;margin-left:28px}
  546. .myday-nums .v{font-family:var(--font-display);font-size:56px;line-height:1;font-variant-numeric:tabular-nums}
  547. .myday-nums .k{font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--on-slab-dim)}
  548. .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)}
  549. /* ---- footer ------------------------------------------------------------------------------- */
  550. .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)}
  551. .howto b{color:var(--on-slab)}
  552. .howto code{font-family:var(--font-mono);font-size:11px;color:var(--on-slab)}
  553. .empty{color:var(--text-muted);font-size:13px;margin:0}
  554. /* ---- theme control ---------------------------------------------------------------------------- */
  555. /* Sync now: same visual weight as the theme control beside it. It is an
  556. action, not a status, so it must not read as louder than the numbers. */
  557. .sync-ctl{display:inline-flex;border:1px solid var(--border-default);border-radius:var(--radius-sm);
  558. overflow:hidden;margin-left:10px;vertical-align:middle}
  559. .sync-ctl button{font-family:inherit;font-size:10.5px;padding:4px 9px;border:0;
  560. background:var(--surface-card);color:var(--text-muted);cursor:pointer}
  561. .sync-ctl button:hover{color:var(--text-body)}
  562. .sync-ctl button[disabled]{cursor:default;opacity:.55}
  563. .sync-state{margin-left:10px;padding:2px 8px;border-radius:3px;background:var(--wash);
  564. color:var(--text-body);font-weight:600}
  565. .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}
  566. .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}
  567. .theme-ctl button[aria-pressed="true"]{background:var(--slab);color:var(--on-slab)}
  568. /* ---- orientation legend ------------------------------------------------------------------------ */
  569. .legend{display:flex;gap:14px;flex-wrap:wrap;align-items:center;font-size:12px}
  570. .legend .swatch{display:inline-block;width:12px;height:12px;border-radius:3px;
  571. margin-right:5px;vertical-align:-1px;border:1px solid rgba(0,0,0,.1)}
  572. :root[data-theme="dark"] .legend .swatch{border-color:rgba(255,255,255,.14)}
  573. .legend-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:9px 20px;font-size:12px;margin-top:10px}
  574. /* ---- accessibility ------------------------------------------------------------------------------ */
  575. .skip-link{position:absolute;left:-9999px;top:0;z-index:100;padding:10px 16px;
  576. background:var(--slab);color:var(--on-slab);border-radius:0 0 var(--radius-sm) 0}
  577. .skip-link:focus{left:0}
  578. .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  579. clip:rect(0,0,0,0);white-space:nowrap;border:0}
  580. /* ---- responsive --------------------------------------------------------------------------------- */
  581. @media (max-width:1024px){
  582. .tiles{grid-template-columns:1fr 1fr}
  583. .blindspots{grid-template-columns:1fr}
  584. .two-up{grid-template-columns:1fr !important}
  585. .legend-grid{grid-template-columns:1fr 1fr}
  586. .first3{grid-template-columns:1fr}
  587. }
  588. @media (max-width:900px){
  589. .masthead .top{flex-wrap:wrap}
  590. }
  591. @media (max-width:768px){
  592. .page{padding:0 14px 48px}
  593. .top{flex-direction:column;align-items:flex-start !important}
  594. .sources{justify-content:flex-start}
  595. .synced{text-align:left}
  596. .mast-right{text-align:left;max-width:none}
  597. .stage-row{grid-template-columns:110px 1fr 30px}
  598. .drill-row{grid-template-columns:3px 80px 1fr 56px}
  599. .drill-row .who{display:none}
  600. .row.lead-cols{grid-template-columns:44px 1fr}
  601. .row.lead-cols .stage{display:none}
  602. .source-row{grid-template-columns:16px 1fr;gap:10px}
  603. .source-note,.source-status{grid-column:2}
  604. .source-status{text-align:left}
  605. .matrix-head{display:none}
  606. .matrix-row{grid-template-columns:1fr 1fr;gap:4px 10px}
  607. .feed-row{grid-template-columns:1fr}
  608. .ctx{grid-template-columns:1fr}
  609. .ctx-key{max-width:none;border-right:0;border-bottom:1px solid var(--border-default)}
  610. .myday-nums .v{font-size:40px}
  611. }
  612. @media (max-width:720px){
  613. .page{padding:0 12px 48px}
  614. .masthead h1{font-size:26px}
  615. .sources{justify-content:flex-start;margin-top:10px}
  616. .tabs{overflow-x:auto;flex-wrap:nowrap;scrollbar-width:thin}
  617. .tab{white-space:nowrap;min-height:44px}
  618. /* Name and load stay on one line so the number keeps its subject; the bar
  619. drops to a full-width second row rather than being squeezed to noise. */
  620. .person{grid-template-columns:1fr 72px;gap:4px 8px;padding:13px 14px}
  621. .person-load{grid-column:2;grid-row:1}
  622. .person-bar{grid-column:1 / -1;grid-row:2}
  623. .legend-grid{grid-template-columns:1fr}
  624. }
  625. @media (max-width:375px){
  626. .tiles{grid-template-columns:1fr 1fr}
  627. .tile-value{font-size:34px}
  628. /* The hero does NOT shrink like the others. If it does, the one number that
  629. matters stops being the one number that matters. */
  630. .tile.hero{grid-column:1 / -1}
  631. .tile.hero .tile-value{font-size:56px}
  632. }
  633. @media print{
  634. /* Paper is light, whatever the screen theme was. */
  635. :root,:root[data-theme="dark"]{
  636. --surface-page:#fff;--surface-card:#fff;--surface-card2:#fbfbfc;--wash:#f3f6f7;
  637. --slab:#0f141d;--on-slab:#fff;--on-slab-dim:#bdb9c7;--slab-line:#333;
  638. --text-body:#0f141d;--text-2:#333;--text-muted:#655f70;
  639. --border-default:#d7d7d7;--hairline:#ececec;--strong:#0f141d;
  640. --track:#f1f1ef;--tick:#dcdcd8;
  641. --hue-ours:#1f7a8c;--hue-waiting:#c8325f;--hue-vendor:#70bf4a;
  642. --hue-task:#f99d22;--hue-todo:#175f6d;--hue-tracker:#f2c94c;
  643. --meridian-rule:linear-gradient(90deg,#0f141d 0 25%,#1f7a8c 25% 50%,#f2c94c 50% 75%,#c8325f 75%);
  644. --hatch:repeating-linear-gradient(45deg,#bdb9c7 0 6px,#e6e4ea 6px 12px);
  645. --hatch-ink:repeating-linear-gradient(45deg,#0f141d 0 5px,#fff 5px 10px);
  646. }
  647. body{background:#fff}
  648. .tabs,.btn,.theme-ctl,.sync-ctl{display:none}
  649. .surface[hidden]{display:block !important}
  650. .card{break-inside:avoid}
  651. }
  652. @media (prefers-reduced-motion:reduce){
  653. *{animation-duration:1ms !important;animation-delay:0ms !important;transition-duration:0ms !important}
  654. html{scroll-behavior:auto}
  655. }
  656. `
  657. export const QUEUE_CSS = `
  658. /* Onboarding (2026-09-14). A DOCUMENT, not a data surface: measured line
  659. length, real paragraph rhythm, and none of the hue system, no colour here
  660. means a category, because nothing here is a category. The tag chip borrows
  661. the board's chip shape so it does not read as a new vocabulary. */
  662. .ob-title{font-family:var(--font-display);font-size:17px;margin:0;color:var(--text-body)}
  663. .ob-intro{font-size:13px;line-height:1.65;color:var(--meridian-gray-700);margin:0 0 10px;max-width:78ch}
  664. /* Collapsible days and topics (2026-09-16). Native <details>, so there is no
  665. script and no state to lose: it folds with the keyboard, it survives a
  666. file:// open of dashboard.html, and print shows whatever is open. The marker
  667. is drawn here because the platform default differs per browser and this is a
  668. document, where a row of inconsistent triangles reads as a bug. */
  669. .ob-day{border-bottom:1px solid var(--border-default)}
  670. .ob-day:last-of-type{border-bottom:0}
  671. .ob-day-sum,.ob-topic-sum{display:flex;align-items:baseline;gap:10px;cursor:pointer;
  672. list-style:none;user-select:none}
  673. .ob-day-sum::-webkit-details-marker,.ob-topic-sum::-webkit-details-marker{display:none}
  674. .ob-day-sum::before,.ob-topic-sum::before{content:"";flex:none;align-self:center;
  675. width:0;height:0;border-left:5px solid var(--text-muted);
  676. border-top:4px solid transparent;border-bottom:4px solid transparent;
  677. transition:transform .12s ease}
  678. .ob-day[open]>.ob-day-sum::before,.ob-topic[open]>.ob-topic-sum::before{transform:rotate(90deg)}
  679. .ob-day-sum{padding:15px 0 14px;flex-wrap:wrap}
  680. .ob-day-sum:hover .ob-day-title{text-decoration:underline;text-underline-offset:3px}
  681. .ob-day-eyebrow{font-size:9.5px;font-weight:700;letter-spacing:.11em;text-transform:uppercase;
  682. color:var(--text-muted);white-space:nowrap}
  683. .ob-day-title{font-family:var(--font-display);font-size:18px;color:var(--text-body)}
  684. .ob-day-body{padding:0 0 10px 15px}
  685. .ob-rec{margin:0 0 12px;font-size:12px;display:flex;gap:16px;flex-wrap:wrap}
  686. .ob-rec a{color:var(--text-2);text-decoration:none;border-bottom:1px solid var(--border-default)}
  687. .ob-rec a:hover{color:var(--text-body);border-bottom-color:var(--text-body)}
  688. .ob-topic{border-top:1px solid var(--hairline)}
  689. .ob-topic:first-of-type{border-top:0}
  690. .ob-topic-sum{padding:9px 0}
  691. .ob-topic-sum:hover .ob-title{text-decoration:underline;text-underline-offset:3px}
  692. /* The count a folded heading owes the reader: how many points are inside it,
  693. taken off the very items rendered below and nothing else (rule 9 in docs/ARCHITECTURE.md). */
  694. .ob-count{margin-left:auto;font-size:10px;font-variant-numeric:tabular-nums;color:var(--text-muted);
  695. white-space:nowrap}
  696. .ob-topic-body{padding:0 0 12px 15px}
  697. .ob-topic-body>.ob-intro:first-child{margin-top:-2px}
  698. /* The master list (2026-09-16). Deliberately NOT collapsible: it is the part
  699. you come back to mid-task. */
  700. .ob-resources{border-top:2px solid var(--border-default);margin-top:6px;padding:18px 0 4px}
  701. .ob-res-head{font-family:var(--font-display);font-size:18px;margin:0 0 4px;color:var(--text-body)}
  702. .ob-res-group{margin-top:14px}
  703. .ob-res-title{font-size:10px;font-weight:700;letter-spacing:.11em;text-transform:uppercase;
  704. color:var(--text-muted);margin:0 0 4px}
  705. .ob-list{margin:0;padding-left:18px;max-width:78ch}
  706. .ob-list li{font-size:13px;line-height:1.65;color:var(--text-body);margin-bottom:5px}
  707. .ob-row{display:grid;grid-template-columns:minmax(130px,230px) 1fr;gap:10px 18px;
  708. padding:7px 0;border-top:1px solid var(--hairline);align-items:baseline}
  709. .ob-row:first-of-type{border-top:0}
  710. .ob-label{font-size:13px;font-weight:600;color:var(--text-body)}
  711. .ob-detail{font-size:13px;line-height:1.6;color:var(--meridian-gray-700);max-width:70ch}
  712. .ob-tag{display:inline-block;margin-left:8px;font-size:9.5px;font-weight:600;letter-spacing:.09em;
  713. text-transform:uppercase;border:1px solid var(--border-default);color:var(--text-muted);
  714. padding:1px 6px;border-radius:3px;white-space:nowrap;vertical-align:1px}
  715. @media (max-width:640px){.ob-row{grid-template-columns:1fr;gap:2px}}
  716. /* The end-of-day note (2026-09-15). Same document voice as the onboarding
  717. material it sits above, with no hue system, because none of this is a category.
  718. The only colour is on the two states a reader scans for: written, and not. */
  719. .ci-card{margin-bottom:18px}
  720. .ci-head{display:flex;justify-content:space-between;align-items:flex-start;gap:14px;flex-wrap:wrap;
  721. padding:22px 28px 16px;border-bottom:1px solid var(--border-default)}
  722. .ci-title{font-family:var(--font-display);font-size:22px;color:var(--text-body);margin:0}
  723. .ci-body{padding:14px 28px 24px}
  724. .ci-intro{font-size:13px;line-height:1.65;color:var(--meridian-gray-700);margin:0 0 12px;max-width:78ch}
  725. .ci-sub{font-family:var(--font-display);font-size:15px;margin:20px 0 8px;color:var(--text-body)}
  726. .ci-chip{display:inline-block;font-size:9.5px;font-weight:600;letter-spacing:.09em;
  727. text-transform:uppercase;border:1px solid var(--border-default);color:var(--text-muted);
  728. padding:2px 7px;border-radius:3px;white-space:nowrap}
  729. .ci-chip.ci-done{border-color:var(--hue-ours);color:var(--hue-ours)}
  730. .ci-chip.ci-due{border-color:var(--hue-waiting);color:var(--hue-waiting-dark)}
  731. .ci-banner{font-size:12.5px;line-height:1.6;margin:0 0 12px;padding:9px 12px;max-width:78ch;
  732. border:1px solid var(--border-default);border-left:3px solid var(--border-default);
  733. border-radius:0 var(--radius-sm) var(--radius-sm) 0;background:var(--surface-card)}
  734. .ci-banner.ci-good{border-left-color:var(--hue-ours)}
  735. .ci-banner.ci-bad{border-left-color:var(--hue-waiting)}
  736. .ci-empty{font-size:13px;line-height:1.65;color:var(--text-muted);margin:8px 0;max-width:78ch}
  737. .ci-form-wrap{margin:4px 0 8px}
  738. .ci-summary{cursor:pointer;font-size:13px;font-weight:600;color:var(--text-body);
  739. padding:6px 0;list-style:revert}
  740. .ci-form{margin-top:8px;max-width:78ch}
  741. .ci-field{margin-bottom:12px}
  742. .ci-q{display:block;font-size:13px;font-weight:600;color:var(--text-body);margin-bottom:5px}
  743. .ci-input{width:100%;padding:9px 11px;font-family:inherit;font-size:13px;line-height:1.55;
  744. color:var(--text-body);background:var(--surface-page);border:1px solid var(--border-default);
  745. border-radius:var(--radius-sm);resize:vertical}
  746. .ci-input:focus{outline:2px solid var(--hue-ours);outline-offset:1px}
  747. .ci-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:6px}
  748. .ci-save{cursor:pointer;font-size:12px;font-weight:600;padding:7px 16px;
  749. border:1px solid var(--hue-ours);border-radius:var(--radius-sm);
  750. background:var(--hue-ours);color:#fff}
  751. .ci-hint{font-size:11px;color:var(--text-muted);max-width:52ch;line-height:1.5}
  752. .ci-note{padding:12px 0;border-top:1px solid var(--hairline)}
  753. .ci-note:first-of-type{border-top:0}
  754. .ci-note-head{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:6px}
  755. .ci-day{font-size:13px;font-weight:600;color:var(--text-body)}
  756. .ci-when{font-size:11px;color:var(--text-muted)}
  757. .ci-none .ci-when{font-style:italic}
  758. .ci-a{display:grid;grid-template-columns:minmax(120px,170px) 1fr;gap:6px 18px;padding:4px 0;
  759. align-items:baseline}
  760. .ci-a-label{font-size:11px;font-weight:600;letter-spacing:.04em;color:var(--text-muted)}
  761. .ci-answer{margin:0;font-size:13px;line-height:1.65;color:var(--text-body);
  762. white-space:pre-wrap;word-break:break-word;max-width:70ch}
  763. .ci-answer.ci-blank{color:var(--text-muted);font-style:italic}
  764. .ci-prior{margin-top:8px}
  765. .ci-prior summary{cursor:pointer;font-size:11.5px;color:var(--text-muted);list-style:revert}
  766. .ci-old{opacity:.78;padding-left:12px;border-left:2px solid var(--hairline);border-top:0}
  767. .ci-mine{margin-top:18px;border-top:1px solid var(--border-default);padding-top:6px}
  768. @media (max-width:640px){.ci-a{grid-template-columns:1fr;gap:2px}}
  769. .queue-group{margin:18px 0 0}
  770. .queue-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  771. font-size:17px;font-weight:600;margin:0 0 8px;padding-bottom:6px;
  772. border-bottom:1px solid var(--border-default)}
  773. .queue-sub{font-weight:400;font-size:12.5px;color:var(--text-muted)}
  774. .queue-aging-count{margin-left:auto;font-size:11px;font-weight:600;color:var(--hue-waiting-dark);
  775. border:1px solid var(--hue-waiting);border-radius:3px;padding:2px 8px}
  776. .queue-unassigned .queue-head{color:var(--hue-waiting)}
  777. .unassigned-notice{background:var(--surface-card);border:1px solid var(--border-default);
  778. border-left:3px solid var(--hue-waiting);border-radius:0 var(--radius-md) var(--radius-md) 0;
  779. display:grid;grid-template-columns:auto 1fr;gap:16px;align-items:center;padding:14px 18px;
  780. font-size:13px;line-height:1.6;margin-top:12px}
  781. .unassigned-notice .n{font-family:var(--font-display);font-size:34px;color:var(--hue-waiting);
  782. font-variant-numeric:tabular-nums}
  783. /* User notes on orders and tasks, injected at serve time, decorated by script.
  784. The button reads quiet until a note exists; a row with context should be the
  785. one that catches the eye. */
  786. .note-btn{cursor:pointer;font-size:10.5px;font-weight:600;padding:2px 8px;margin-top:4px;
  787. border:1px solid var(--border-default);border-radius:3px;background:var(--surface-card);
  788. color:var(--text-muted);white-space:nowrap}
  789. .note-btn:hover{border-color:var(--hue-ours);color:var(--hue-ours)}
  790. .note-btn.has-note{border-color:var(--hue-ours);color:var(--hue-ours)}
  791. .note-panel{background:var(--surface-card);border:1px solid var(--border-default);
  792. border-left:3px solid var(--hue-ours);border-radius:0 var(--radius-sm) var(--radius-sm) 0;
  793. padding:12px 14px;margin:6px 0;font-size:13px;line-height:1.55}
  794. .note-row td{padding:0 0 8px;border-bottom:0}
  795. .note-text{margin:0;white-space:pre-wrap;word-break:break-word}
  796. .note-by{margin:6px 0 0;font-size:11px;color:var(--text-muted)}
  797. .note-panel textarea{width:100%;margin-top:10px;padding:8px 10px;
  798. font-family:inherit;font-size:13px;line-height:1.5;
  799. color:var(--text-body);background:var(--surface-page);border:1px solid var(--border-default);
  800. border-radius:var(--radius-sm);resize:vertical}
  801. .note-bar{display:flex;align-items:center;gap:10px;margin-top:8px}
  802. .note-hint{font-size:11px;color:var(--text-muted)}
  803. .queue-table{width:100%;border-collapse:collapse;font-size:13px}
  804. .queue-table caption{text-align:left}
  805. .queue-table th[scope=col]{text-align:left;font-size:10px;letter-spacing:.16em;
  806. text-transform:uppercase;color:var(--text-muted);font-weight:600;
  807. padding:8px 10px 8px 0;border-bottom:1px solid var(--border-default);
  808. position:sticky;top:var(--sticky-tabs,52px);background:var(--surface-card);z-index:2}
  809. .queue-table td,.queue-table th[scope=row]{padding:11px 10px 11px 0;
  810. border-bottom:1px solid var(--hairline);vertical-align:top;text-align:left}
  811. .queue-table tbody tr:hover{background:var(--hover-row)}
  812. .queue-table th[scope=row]{font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap;
  813. font-family:var(--font-mono);font-size:12px;color:var(--hue-ours)}
  814. .queue-table tr.aging th[scope=row]{color:var(--hue-waiting)}
  815. /* The age system: number, then a bar over a 60-day field with a hairline at 30,
  816. so 54d and 5d differ before either number is read. */
  817. .age-cell{font-variant-numeric:tabular-nums;white-space:nowrap;text-align:right}
  818. .age-cell .d{font-family:var(--font-display);font-size:17px}
  819. .age-cell .u{font-size:11px}
  820. .age-track{height:3px;border-radius:2px;background:var(--track);margin-top:4px;position:relative;
  821. background-image:linear-gradient(90deg,transparent 0 49%,var(--meridian-gray-400) 49% 51%,transparent 51%)}
  822. .age-track i{position:absolute;left:0;top:0;bottom:0;border-radius:2px;background:var(--text-muted)}
  823. tr.aging .age-track i{background:var(--hue-waiting)}
  824. .aging-flag{display:inline-block;margin-top:4px;padding:1px 5px;border-radius:3px;
  825. font-size:9.5px;font-weight:650;letter-spacing:.12em;text-transform:uppercase;
  826. border:1px solid var(--hue-waiting);color:var(--hue-waiting-dark)}
  827. .status-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:7px;
  828. vertical-align:baseline}
  829. .class-bar{display:inline-block;width:3px;align-self:stretch}
  830. .ordnum{font-variant-numeric:tabular-nums}
  831. @media (max-width:640px){
  832. .queue-table thead{display:none}
  833. .queue-table tr{display:block;padding:8px 0;border-bottom:1px solid var(--border-default)}
  834. .queue-table td,.queue-table th[scope=row]{display:block;border:0;padding:1px 0}
  835. .queue-table td::before{content:attr(data-label);display:inline-block;min-width:74px;
  836. color:var(--text-muted);font-size:11px;text-transform:uppercase;letter-spacing:.04em}
  837. .age-track{max-width:120px}
  838. }
  839. @media print{
  840. .queue-group{break-inside:avoid}
  841. .aging-flag{border:1px solid currentColor}
  842. }
  843. /* The private list, 2026-09-23. BOARD-ONLY, so it belongs in this sheet and not
  844. in THEME_CSS or EXPORT_CSS: the card is stamped into the pre-rendered board
  845. page and reaches no Worker-served route. The block below the EXPORT_CSS
  846. header records the deploy where rules went into the wrong sheet and the page
  847. shipped unstyled while verifying fine locally.
  848. NO --hue-* ANYWHERE. A hue means a category on this board, and a private list
  849. is not one. The only colour is on the state a reader scans for, which here is
  850. overdue: the same --hue-waiting the card already uses for work past a gate,
  851. so "late" looks the same whoever noticed it. */
  852. .own-wrap{border-top:1px solid var(--border-default);padding-top:16px;margin-top:4px}
  853. .own-head{display:flex;justify-content:space-between;align-items:baseline;gap:12px;flex-wrap:wrap}
  854. .own-title{font-size:13px;font-weight:600;color:var(--text-body)}
  855. .own-chip{font-size:11px;letter-spacing:.04em;border:1px solid var(--border-default);
  856. color:var(--text-muted);padding:1px 8px;border-radius:10px;white-space:nowrap}
  857. .own-chip-due{border-color:var(--hue-waiting);color:var(--hue-waiting)}
  858. .own-chip-dark{border-style:dashed}
  859. .own-sub{font-size:12px;color:var(--text-muted);margin:6px 0 12px;max-width:62ch;line-height:1.5}
  860. .own-banner{font-size:12px;line-height:1.55;margin:0 0 10px;padding:8px 12px;
  861. border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--text-body)}
  862. .own-good{border-left:3px solid var(--text-body)}
  863. .own-bad{border-left:3px solid var(--hue-waiting)}
  864. .own-empty{font-size:12px;color:var(--text-muted);line-height:1.55;margin:0 0 12px;max-width:62ch}
  865. .own-group{margin-bottom:12px}
  866. .own-group-head{font-size:11px;text-transform:uppercase;letter-spacing:.06em;
  867. color:var(--text-muted);margin-bottom:4px}
  868. .own-group-n{color:var(--text-muted);opacity:.8}
  869. .own-rows{list-style:none;margin:0;padding:0}
  870. .own-row{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;
  871. padding:7px 0;border-bottom:1px solid var(--hairline)}
  872. .own-row:last-child{border-bottom:0}
  873. .own-row-main{min-width:0;flex:1}
  874. .own-text{margin:0;font-size:13px;line-height:1.45;color:var(--text-body);
  875. overflow-wrap:anywhere}
  876. .own-row-done .own-text{color:var(--text-muted);text-decoration:line-through}
  877. .own-meta{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-top:2px;
  878. font-size:11px;color:var(--text-muted)}
  879. .own-when-overdue{color:var(--hue-waiting);font-weight:600}
  880. .own-when-today{color:var(--text-body);font-weight:600}
  881. .own-nodate{opacity:.75}
  882. .own-link,.own-pri,.own-edited{border:1px solid var(--border-default);border-radius:3px;
  883. padding:0 5px;font-size:10px;letter-spacing:.03em;white-space:nowrap}
  884. .own-pri-high{border-color:var(--hue-waiting);color:var(--hue-waiting)}
  885. .own-row-acts{display:flex;gap:6px;align-items:flex-start;flex-shrink:0}
  886. .own-btn{font:inherit;font-size:11px;cursor:pointer;background:none;list-style:none;
  887. border:1px solid var(--border-default);border-radius:var(--radius-sm);
  888. padding:3px 10px;color:var(--text-body);white-space:nowrap}
  889. .own-btn::-webkit-details-marker{display:none}
  890. .own-btn-quiet{color:var(--text-muted)}
  891. .own-btn-go{font-weight:600}
  892. .own-act{display:inline}
  893. .own-add,.own-done{margin-top:10px}
  894. .own-add>summary,.own-done>summary{display:inline-block}
  895. .own-form{margin-top:10px;padding:12px;border:1px solid var(--border-default);
  896. border-radius:var(--radius-sm)}
  897. .own-label{display:block;font-size:11px;text-transform:uppercase;letter-spacing:.05em;
  898. color:var(--text-muted);margin-bottom:3px}
  899. .own-opt{text-transform:none;letter-spacing:0;opacity:.7}
  900. .own-input,.own-date,.own-select,.own-text-in{font:inherit;font-size:13px;width:100%;
  901. color:var(--text-body);background:var(--surface-card);
  902. border:1px solid var(--border-default);border-radius:var(--radius-sm);padding:6px 8px}
  903. .own-input{resize:vertical}
  904. .own-form-row{display:flex;gap:10px;flex-wrap:wrap;margin-top:8px}
  905. .own-field{flex:1 1 150px;min-width:0}
  906. .own-form-acts{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:10px}
  907. .own-hint{font-size:11px;color:var(--text-muted);margin:6px 0 0;line-height:1.5}
  908. .own-hint-warn{color:var(--hue-waiting)}
  909. .own-reconcile{font-size:11px;color:var(--text-muted);line-height:1.55;margin:10px 0 0;
  910. max-width:70ch}
  911. .own-foot{font-size:10px;color:var(--text-muted);opacity:.75;margin:12px 0 0}
  912. @media (max-width:640px){
  913. .own-row{flex-direction:column;gap:6px}
  914. .own-row-acts{width:100%}
  915. .own-form-row{flex-direction:column}
  916. }
  917. `
  918. /**
  919. * The training export's own sheet, and that is the point. The export is served
  920. * by the Worker, whose shell loads THEME_CSS + INBOX_CSS + EXPORT_CSS; QUEUE_CSS
  921. * goes only into the pre-rendered board. A rule placed in QUEUE_CSS would look
  922. * right in any harness that loads both and ship unstyled.
  923. *
  924. * `.ob-intro` is repeated from QUEUE_CSS deliberately: the two sheets are never
  925. * loaded together, so this is not a duplicate at runtime.
  926. */
  927. export const EXPORT_CSS = `
  928. .ob-intro{font-size:13px;line-height:1.65;color:var(--meridian-gray-700);margin:0 0 10px;max-width:78ch}
  929. .ob-wins{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:14px 0 10px}
  930. .ob-win-label{font-size:9.5px;font-weight:700;letter-spacing:.11em;text-transform:uppercase;
  931. color:var(--text-muted);margin-right:4px}
  932. .ob-win{font-size:12px;font-variant-numeric:tabular-nums;text-decoration:none;color:var(--text-2);
  933. border:1px solid var(--border-default);border-radius:var(--radius-sm);padding:3px 10px;
  934. transition:var(--transition-default)}
  935. .ob-win:hover{border-color:var(--text-body);color:var(--text-body)}
  936. .ob-win.on{background:var(--slab);border-color:var(--slab);color:var(--on-slab)}
  937. .ob-export{width:100%;box-sizing:border-box;font:12px/1.6 var(--font-mono);
  938. color:var(--text-body);background:var(--surface-card2);border:1px solid var(--border-default);
  939. border-radius:var(--radius-sm);padding:12px 14px;resize:vertical}
  940. .ob-copy{font:inherit;font-size:12px;cursor:pointer;color:var(--text-2);
  941. background:var(--surface-card);border:1px solid var(--border-default);
  942. border-radius:var(--radius-sm);padding:2px 10px;transition:var(--transition-default)}
  943. .ob-copy:hover{border-color:var(--text-body);color:var(--text-body)}
  944. /* The recap document (2026-09-17). Its own "rc-" vocabulary rather than the
  945. tab's "ob-" one: that surface is built on <details>, and a printed document
  946. does not fold. Type weight, italics, whitespace and BORDERS carry every
  947. separation here; see the print block below for why no fill does. */
  948. .rc-shell{background:var(--surface-card);border:1px solid var(--border-default);
  949. border-radius:var(--radius-md);padding:0 28px 24px}
  950. .rc-controls{padding:18px 0 4px}
  951. .rc-hint{font-size:11px;color:var(--text-muted);margin-left:2px}
  952. .rc-doc{padding:8px 0 4px}
  953. .rc-title{font-family:var(--font-display);font-size:26px;color:var(--text-body);margin:0 0 4px}
  954. .rc-sub{font-size:12px;line-height:1.55;color:var(--text-muted);margin:0 0 18px;max-width:78ch}
  955. .rc-day{padding:14px 0 2px;border-top:1px solid var(--hairline)}
  956. .rc-day:first-of-type{border-top:0;padding-top:4px}
  957. .rc-day-head{font-family:var(--font-display);font-size:19px;color:var(--text-body);margin:0 0 8px}
  958. .rc-session{font-size:14px;font-style:italic;font-weight:400;color:var(--text-2);
  959. margin:12px 0 4px}
  960. .rc-points{margin:0 0 8px;padding-left:18px;max-width:78ch}
  961. .rc-points li{font-size:13px;line-height:1.6;color:var(--text-body);margin-bottom:5px}
  962. .rc-acc{font-size:13px;line-height:1.6;color:var(--text-body);margin:8px 0 0;max-width:78ch}
  963. .rc-acc b{font-weight:600}
  964. .rc-acc-none{color:var(--text-muted)}
  965. .rc-note{font-size:11.5px;line-height:1.55;color:var(--text-muted);margin:6px 0 0;max-width:78ch}
  966. .rc-none{font-size:13px;line-height:1.6;color:var(--text-muted);margin:0 0 8px;max-width:78ch}
  967. .rc-coverage{font-size:12px;line-height:1.6;color:var(--text-muted);max-width:78ch;
  968. margin:18px 0 0;padding-top:12px;border-top:1px solid var(--border-default)}
  969. /* PRINT. This is the feature
  970. (No backticks anywhere in this comment: the sheet is a TypeScript
  971. template literal, and one would end it mid-stylesheet.) The deliverable is a PDF, and ⌘P is how it is
  972. made. THEME_CSS's own print block already forces the light ramp and hides
  973. ".tabs"; this adds the page box and the document's own pagination.
  974. @page CANNOT BE SCOPED TO A SELECTOR: it is document-level by spec. Living
  975. in EXPORT_CSS it therefore also applies to the Inbox, which is this sheet's
  976. only other consumer (an improvement there, not a regression), and reaches
  977. "dashboard.html" not at all, since that page loads THEME_CSS + QUEUE_CSS.
  978. NO "print-color-adjust:exact", DELIBERATELY. Browsers default to not printing
  979. backgrounds, so a document that needs fills to be legible is a document that
  980. prints wrong for most people the first time. Forcing them would also override
  981. the reader's own print settings to produce a heavy page nobody asked for.
  982. Borders print; fills do not; everything here separates with a border.
  983. "break-after:avoid" on the headings rather than "break-inside:avoid" on the
  984. days: a heading stranded at the foot of a sheet is the failure that happens,
  985. and a day too tall for a page is the failure "break-inside:avoid" CREATES. */
  986. @page{size:letter;margin:0.75in}
  987. @media print{
  988. .masthead,.page-rule,.rc-noprint{display:none !important}
  989. .page{padding:0;max-width:none}
  990. .rc-shell{background:none;border:0;padding:0;margin:0;box-shadow:none;break-inside:auto}
  991. .rc-doc{max-width:none;break-inside:auto}
  992. .rc-title{font-size:18pt}
  993. .rc-sub{font-size:10pt}
  994. .rc-day-head{font-size:13pt}
  995. .rc-session{font-size:11pt}
  996. .rc-points li,.rc-acc,.rc-none,.rc-note{font-size:10.5pt;orphans:2;widows:2}
  997. .rc-day-head,.rc-session{break-after:avoid}
  998. .rc-points li,.rc-acc{break-inside:avoid}
  999. .rc-coverage{font-size:9pt}
  1000. }
  1001. `