@bongos/core 1.24.49 → 1.24.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,323 +1,427 @@
1
- /* status.example.com — public ledger of an ancient-Greek city.
2
- Form factor: weathered marble + parchment, Cinzel inscription headings,
3
- EB Garamond body. Square corners, hairline double-rules, no SaaS softness.
4
- Palette stays inside the locked Mediterranean range. */
5
-
6
- :root {
7
- /* aged marble + parchment */
8
- --bg: #ece0c2; /* base — deeper than V1, slightly more yellowed */
9
- --bg-card: #f6ecd2; /* tablet face */
10
- --bg-deep: #ddc99c; /* recessed wells (stat blocks, cat tags) */
11
- --bg-frame: #e3d0a4; /* outer frame channel between double rules */
12
-
13
- /* ink + accents */
14
- --ink: #2a2110; /* burnt umber — the carved letter */
15
- --ink-soft: #6e5b3a; /* aged ink */
16
- /* #409: bumped from #97825a (~2.6:1 against --bg) to meet WCAG AA 4.5:1
17
- for the small italic labels that use this token. ~4.8:1 against --bg now,
18
- still distinct enough from --ink-soft (#6e5b3a, ~5.1:1) to read as
19
- "fainter ink" but no longer fails accessibility on small text. */
20
- --ink-faint: #735f3d;
21
- --rule: #8b6f2c; /* antique gold rule */
22
- --rule-soft: #b89a55;
23
- --accent: #4a7d5c; /* olive */
24
- --accent-deep: #2f5a3f;
25
- --sea: #2d6e7e; /* aegean */
26
- --terracotta: #a85530;
27
-
28
- --font-display: "Cinzel", "Cormorant Garamond", "Trajan Pro", "Iowan Old Style", Georgia, serif;
29
- --font-body: "EB Garamond", "Iowan Old Style", "Hoefler Text", Georgia, serif;
1
+ /* status.<apex> — the public build-status page, on the chrome world (task 1005089,
2
+ goal 1000138; the owner's decision of 2026-11-06 in DESIGN.md "Naming").
3
+
4
+ THE WORLD. DESIGN.md at the repo root governs this sheet the way its chapter
5
+ "The hall (builders' hall)" governs the hall: the pack's thirteen colours and
6
+ two faces, the one warm accent, the panel (bg-card, one hairline, 16px
7
+ corners, no shadow), the shared scales in modules/ui-design/public/tokens.css
8
+ (--ds-*), and the shared button and field (modules/hall-ui/public/controls.css,
9
+ linked by index.html). No parchment, no inscription faces, no bronze cursors,
10
+ no double-ruled frames.
11
+
12
+ WHERE THE COLOURS COME FROM. The server (serve-internal.js themeMarkup) and the
13
+ off-box mirror (scripts/status-mirror-sync.js) both splice the pack's
14
+ thirteen colours, its two faces, its font links and its favicon as a :root at
15
+ the END of <head>. This sheet declares no :root of its own (DESIGN.md: no page
16
+ :root). Its fallback for a pack with no theme is written at ZERO specificity
17
+ (:where(html)), so whatever the pack splices always wins.
18
+
19
+ THE STATUS VOCABULARY. This page renders verification state (what shipped,
20
+ what passed review, what is over budget), so it keeps the hall's fixed
21
+ --ok / --warn / --danger / --info and their -weak fills, the one sanctioned
22
+ exception to the Fifteen Rule. The values are the hall's, byte for byte;
23
+ tests/status_page_chrome.mjs fails if the two drift.
24
+
25
+ BOTH MODES. The page has no theme switch of its own, but the dark tier is
26
+ written on the hall's pair all the same — html[data-theme="dark"], and
27
+ @media (prefers-color-scheme: dark) html:not([data-theme]) — byte-identical,
28
+ so a later switch is a script, not a second sheet. Both outrank the pack's
29
+ :root (0,1,1 over 0,1,0); the pack's accent, sea and terracotta are never
30
+ re-pinned in dark (the Unpinned Accent Rule). */
31
+
32
+ /* ---------- the fallback contract tier (zero specificity; the pack wins) ---------- */
33
+ :where(html) {
34
+ --bg: #edecee;
35
+ --bg-card: #fbfafc;
36
+ --bg-deep: #e2e1e4;
37
+ --bg-frame: #f6f5f7;
38
+ --ink: #17181a;
39
+ --ink-soft: #55565a;
40
+ --ink-faint: #65656a;
41
+ --rule: #c6c6c8;
42
+ --rule-soft: #dcdbdd;
43
+ --accent: #fb9569;
44
+ --accent-deep: #a3481a;
45
+ --sea: #5b6fd0;
46
+ --terracotta: #c9512c;
47
+ --font-display: "Manrope", "Segoe UI", system-ui, -apple-system, sans-serif;
48
+ --font-body: "Manrope", "Segoe UI", system-ui, -apple-system, sans-serif;
49
+ }
50
+
51
+ /* ---------- the derived tier (DESIGN.md "Reuse": the same names, the same recipes) ---------- */
52
+ html {
53
+ color-scheme: light;
54
+ --font-mono: "JetBrains Mono", ui-monospace, "Cascadia Mono", Consolas, monospace;
55
+
56
+ --glass: rgba(23, 24, 26, .05);
57
+ --glass-strong: rgba(23, 24, 26, .08);
58
+ --glass-edge: rgba(23, 24, 26, .12);
59
+
60
+ --accent-ink: color-mix(in srgb, var(--accent) 45%, #240e00);
61
+ --accent-lift: color-mix(in srgb, var(--accent) 58%, #ffffff);
62
+ --accent-tint: color-mix(in srgb, var(--accent) 30%, #fffdf9);
63
+ --accent-on: #2a1305;
64
+
65
+ /* the status vocabulary: the hall's values (modules/hall-ui/public/style.css) */
66
+ --ok: #187444;
67
+ --ok-weak: color-mix(in srgb, #187444 12%, var(--bg-card));
68
+ --warn: #895c00;
69
+ --warn-weak: color-mix(in srgb, #895c00 14%, var(--bg-card));
70
+ --danger: #b42318;
71
+ --danger-weak: color-mix(in srgb, #b42318 10%, var(--bg-card));
72
+ --info: color-mix(in srgb, var(--sea) 86%, #000000);
73
+ --info-weak: color-mix(in srgb, var(--info) 9%, var(--bg-card));
74
+
75
+ --focus: color-mix(in srgb, var(--accent-deep) 82%, #3a1400);
76
+ --scrim: rgba(0, 0, 0, .55);
77
+
78
+ /* the tile inside a panel: a tone, not a frame */
79
+ --tile: color-mix(in srgb, var(--ink) 4%, var(--bg-card));
80
+
81
+ --label-face: var(--font-mono);
82
+ --label-size: var(--ds-text-2xs);
83
+ --label-space: .12em;
84
+
85
+ /* the hall's aliases onto the shared scales, which controls.css spends */
86
+ --line: var(--ds-line);
87
+ --radius: var(--ds-radius-panel);
88
+ --radius-sm: var(--ds-radius-tile);
89
+ --radius-pill: var(--ds-radius-pill);
90
+
91
+ --content-max: 820px;
92
+ }
93
+
94
+ /* ---------- dark: written twice, byte-identical ---------- */
95
+ html[data-theme="dark"] {
96
+ color-scheme: dark;
97
+ --bg: #000000;
98
+ --bg-card: #101012;
99
+ --bg-deep: #000000;
100
+ --bg-frame: #08080a;
101
+ --ink: #ffffff;
102
+ --ink-soft: #c0c0c0;
103
+ --ink-faint: #a8a8a8;
104
+ --rule: rgba(255, 255, 255, .16);
105
+ --rule-soft: rgba(255, 255, 255, .08);
106
+ --glass: rgba(255, 255, 255, .11);
107
+ --glass-strong: rgba(255, 255, 255, .17);
108
+ --glass-edge: rgba(255, 255, 255, .13);
109
+ --accent-ink: var(--accent);
110
+ --accent-tint: color-mix(in srgb, var(--accent) 22%, #0b0a09);
111
+ --ok: #4ade80;
112
+ --ok-weak: color-mix(in srgb, #4ade80 14%, var(--bg-card));
113
+ --warn: #fbbf24;
114
+ --warn-weak: color-mix(in srgb, #fbbf24 14%, var(--bg-card));
115
+ --danger: #f87171;
116
+ --danger-weak: color-mix(in srgb, #f87171 14%, var(--bg-card));
117
+ --info: color-mix(in srgb, var(--sea) 80%, #ffffff);
118
+ --info-weak: color-mix(in srgb, var(--info) 14%, var(--bg-card));
119
+ --focus: var(--accent);
120
+ --tile: color-mix(in srgb, var(--ink) 6%, var(--bg-card));
121
+ --label-face: var(--font-body);
122
+ --label-size: var(--ds-text-2xs-plus);
123
+ --label-space: .1em;
124
+ }
125
+ @media (prefers-color-scheme: dark) {
126
+ html:not([data-theme]) {
127
+ color-scheme: dark;
128
+ --bg: #000000;
129
+ --bg-card: #101012;
130
+ --bg-deep: #000000;
131
+ --bg-frame: #08080a;
132
+ --ink: #ffffff;
133
+ --ink-soft: #c0c0c0;
134
+ --ink-faint: #a8a8a8;
135
+ --rule: rgba(255, 255, 255, .16);
136
+ --rule-soft: rgba(255, 255, 255, .08);
137
+ --glass: rgba(255, 255, 255, .11);
138
+ --glass-strong: rgba(255, 255, 255, .17);
139
+ --glass-edge: rgba(255, 255, 255, .13);
140
+ --accent-ink: var(--accent);
141
+ --accent-tint: color-mix(in srgb, var(--accent) 22%, #0b0a09);
142
+ --ok: #4ade80;
143
+ --ok-weak: color-mix(in srgb, #4ade80 14%, var(--bg-card));
144
+ --warn: #fbbf24;
145
+ --warn-weak: color-mix(in srgb, #fbbf24 14%, var(--bg-card));
146
+ --danger: #f87171;
147
+ --danger-weak: color-mix(in srgb, #f87171 14%, var(--bg-card));
148
+ --info: color-mix(in srgb, var(--sea) 80%, #ffffff);
149
+ --info-weak: color-mix(in srgb, var(--info) 14%, var(--bg-card));
150
+ --focus: var(--accent);
151
+ --tile: color-mix(in srgb, var(--ink) 6%, var(--bg-card));
152
+ --label-face: var(--font-body);
153
+ --label-size: var(--ds-text-2xs-plus);
154
+ --label-space: .1em;
155
+ }
30
156
  }
31
157
 
158
+ /* ---------- the page ---------- */
32
159
  * { box-sizing: border-box; }
33
160
 
34
- html {
161
+ html { background: var(--bg); }
162
+
163
+ body {
164
+ margin: 0;
165
+ min-height: 100vh;
166
+ font-family: var(--font-body);
167
+ font-size: var(--ds-text-2xl);
168
+ font-weight: 400;
169
+ line-height: 1.5;
170
+ color: var(--ink);
35
171
  background: var(--bg);
36
- /* Bronze arrowhead as the ambient cursor (hotspot = tip at 0,0). Inherited
37
- by everything; clickable elements override to the Hand of Hermes below. */
38
- cursor: url('cursors/arrow.png') 0 0, auto;
172
+ -webkit-font-smoothing: antialiased;
39
173
  }
40
174
 
41
- /* #731: themed scrollbars + base select theming across the status dashboard,
42
- matching the builder surface — no page shows a default grey OS scrollbar or a
43
- bare white dropdown. (The .world-timeline keeps its own thinner override.) */
44
- * {
45
- scrollbar-width: thin;
46
- scrollbar-color: var(--rule-soft) var(--bg-frame);
175
+ a {
176
+ color: var(--accent-ink);
177
+ text-decoration: underline;
178
+ text-decoration-thickness: 1px;
179
+ text-underline-offset: 3px;
180
+ text-decoration-color: color-mix(in srgb, var(--accent-ink) 45%, transparent);
181
+ transition: text-decoration-color var(--ds-dur-fast) var(--ds-ease);
182
+ }
183
+ a:hover { text-decoration-color: currentColor; }
184
+
185
+ ::selection { background: var(--accent-tint); color: var(--ink); }
186
+
187
+ /* the two-tone ring: a 2px accent-derived outline at 3px offset inside a --bg halo */
188
+ :focus-visible {
189
+ outline: 2px solid var(--focus);
190
+ outline-offset: 3px;
191
+ box-shadow: 0 0 0 8px var(--bg);
192
+ border-radius: var(--ds-radius-tile);
47
193
  }
48
- ::-webkit-scrollbar { width: 12px; height: 12px; }
49
- ::-webkit-scrollbar-track { background: var(--bg-frame); }
50
- ::-webkit-scrollbar-thumb {
51
- background: var(--rule-soft);
52
- border-radius: 6px;
53
- border: 3px solid var(--bg-frame);
194
+
195
+ .visually-hidden {
196
+ position: absolute;
197
+ width: 1px;
198
+ height: 1px;
199
+ padding: 0;
200
+ margin: -1px;
201
+ overflow: hidden;
202
+ clip: rect(0, 0, 0, 0);
203
+ white-space: nowrap;
204
+ border: 0;
54
205
  }
55
- ::-webkit-scrollbar-thumb:hover { background: var(--rule); }
56
- ::-webkit-scrollbar-corner { background: var(--bg-frame); }
57
206
 
58
207
  /* ---------- Off-box availability banner (ADR 0029, #737) ----------
59
- Only renders on the off-box GitHub Pages mirror, whose index.html injects the
60
- #offbox-status div + driver script; on the droplet the div is absent so these
61
- rules are inert. Kept here so public-status/style.css is byte-identical on
62
- both hosts and the mirror sync stays a pure copy. */
208
+ Only renders on the off-box mirror, whose index.html injects the
209
+ #offbox-status div + driver script; on the server the div is absent and these
210
+ rules are inert. Kept here so style.css is byte-identical on both hosts. */
63
211
  .offbox-status {
64
212
  font-family: var(--font-body);
213
+ font-size: var(--ds-text-md);
214
+ font-weight: 500;
65
215
  text-align: center;
66
- color: #fff;
67
- padding: 6px 12px;
68
- font-size: 0.92rem;
69
- letter-spacing: 0.01em;
216
+ padding: var(--ds-space-hair) var(--ds-space-sm);
217
+ border-bottom: var(--line) solid var(--rule-soft);
70
218
  }
71
219
  .offbox-status:empty { display: none; }
72
- .offbox-status--up { background: #2e7d32; }
73
- .offbox-status--down { background: #b00020; }
74
- .offbox-status--unknown { background: #6b6b6b; color: #f2f2f2; }
220
+ .offbox-status--up { background: var(--ok-weak); color: var(--ok); }
221
+ .offbox-status--down { background: var(--danger-weak); color: var(--danger); }
222
+ .offbox-status--unknown { background: var(--bg-card); color: var(--ink-soft); }
75
223
 
76
- select {
77
- font-family: var(--font-body);
78
- color: var(--ink);
79
- background: var(--bg-card);
80
- border: 1px solid var(--rule);
81
- border-radius: 4px;
82
- padding: 6px 10px;
224
+ /* ---------- the top bar: the mark, the name, the text-size control ---------- */
225
+ .topbar {
226
+ border-bottom: var(--line) solid var(--rule-soft);
227
+ background: var(--bg);
83
228
  }
84
- select:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
85
- select option { background: var(--bg-card); color: var(--ink); }
86
-
87
- /* Clickable affordance: the Hand of Hermes on standard interactive elements
88
- (the arrowhead above stays the ambient default). Low specificity so
89
- disabled / help / not-allowed states keep their own cursors. */
90
- a[href], button, summary, select, label[for],
91
- [role="button"], [role="tab"], [role="link"] {
92
- cursor: url('cursors/hand-pointer.png') 4 1, pointer;
229
+ .topbar__inner {
230
+ display: flex;
231
+ align-items: center;
232
+ justify-content: space-between;
233
+ gap: var(--ds-space-sm);
234
+ max-width: var(--content-max);
235
+ min-height: 56px;
236
+ margin: 0 auto;
237
+ padding: 0 var(--ds-space-gutter-narrow);
93
238
  }
94
-
95
- body {
96
- margin: 0;
97
- font-family: var(--font-body);
98
- font-size: 18px;
99
- font-weight: 400;
239
+ .topbar__brand {
240
+ display: inline-flex;
241
+ align-items: center;
242
+ gap: var(--ds-space-xs);
243
+ min-width: 0;
244
+ }
245
+ .topbar__mark {
246
+ display: block;
247
+ width: 28px;
248
+ height: 28px;
249
+ flex-shrink: 0;
250
+ /* drawn from the one mark (modules/ui-design/public/brand/mark.svg, task 1005088) */
251
+ --mark-ink: var(--ink);
252
+ }
253
+ .topbar__name {
254
+ font-family: var(--font-display);
255
+ font-size: var(--ds-text-xl);
256
+ font-weight: 500;
257
+ letter-spacing: -0.01em;
100
258
  color: var(--ink);
101
- background: var(--bg);
102
- /* subtle weathered-marble veining built from radial blooms + a vertical
103
- wash so the page doesn't read as a flat color */
104
- background-image:
105
- radial-gradient(circle at 18% 12%, rgba(139, 111, 44, 0.08), transparent 45%),
106
- radial-gradient(circle at 82% 88%, rgba(45, 110, 126, 0.07), transparent 50%),
107
- radial-gradient(circle at 50% 50%, rgba(168, 85, 48, 0.04), transparent 70%),
108
- linear-gradient(180deg, rgba(255, 250, 230, 0.18) 0%, transparent 30%, rgba(60, 40, 10, 0.04) 100%);
109
- background-attachment: fixed;
110
- line-height: 1.55;
111
- min-height: 100vh;
112
- -webkit-font-smoothing: antialiased;
259
+ white-space: nowrap;
260
+ overflow: hidden;
261
+ text-overflow: ellipsis;
113
262
  }
114
263
 
115
- a {
116
- color: var(--accent-deep);
117
- text-decoration: none;
118
- border-bottom: 1px solid var(--rule-soft);
119
- transition: color 200ms, border-color 200ms;
264
+ /* task 1475 (idea 280): the text-size control, a ghost pill in the bar */
265
+ .ledger-zoom {
266
+ display: inline-flex;
267
+ align-items: center;
268
+ justify-content: center;
269
+ gap: var(--ds-space-hair);
270
+ min-width: 40px;
271
+ min-height: 40px;
272
+ padding: 0 var(--ds-space-xs);
273
+ border: var(--line) solid var(--rule);
274
+ border-radius: var(--radius-pill);
275
+ background: transparent;
276
+ color: var(--ink-soft);
277
+ font: inherit;
278
+ cursor: pointer;
279
+ transition: color var(--ds-dur-fast) var(--ds-ease), border-color var(--ds-dur-fast) var(--ds-ease);
280
+ }
281
+ .ledger-zoom:hover { color: var(--ink); border-color: var(--ink-faint); }
282
+ .ledger-zoom:focus-visible { border-radius: var(--radius-pill); }
283
+ .ledger-zoom svg { width: 18px; height: 18px; }
284
+ .ledger-zoom--on { color: var(--accent-ink); border-color: var(--accent); }
285
+ .ledger-zoom__pct {
286
+ font-family: var(--font-mono);
287
+ font-size: var(--ds-text-sm);
288
+ font-variant-numeric: tabular-nums;
289
+ line-height: 1;
120
290
  }
121
291
 
122
- a:hover { color: var(--terracotta); border-color: var(--terracotta); }
123
-
124
- /* ---------- Hero ---------- */
125
-
292
+ /* ---------- the opening ---------- */
126
293
  .herm {
127
- text-align: center;
128
- padding: 72px 24px 28px;
129
- max-width: 760px;
294
+ max-width: var(--content-max);
130
295
  margin: 0 auto;
296
+ padding: var(--ds-space-xl) var(--ds-space-gutter-narrow) var(--ds-space-lg);
131
297
  }
132
-
133
- .herm__sigil {
134
- display: block;
135
- width: 72px;
136
- height: 72px;
137
- margin: 0 auto 18px;
138
- color: var(--ink);
139
- opacity: 0.78;
140
- }
141
-
142
298
  .herm h1 {
143
299
  font-family: var(--font-display);
144
- font-weight: 700;
145
- font-size: clamp(2.4rem, 5.5vw, 3.6rem);
146
- letter-spacing: 0.18em;
147
- text-transform: uppercase;
148
- margin: 0 0 14px;
300
+ font-size: var(--ds-text-display);
301
+ font-weight: 300;
302
+ line-height: 0.92;
303
+ letter-spacing: -0.042em;
304
+ text-transform: lowercase;
149
305
  color: var(--ink);
150
- text-shadow: 0 1px 0 rgba(255, 250, 230, 0.6);
306
+ margin: 0 0 var(--ds-space-md);
307
+ overflow-wrap: anywhere;
151
308
  }
152
-
153
309
  .herm__epigraph {
154
- font-family: var(--font-body);
155
- font-style: italic;
156
- font-size: 1.08rem;
310
+ font-size: var(--ds-text-3xl);
311
+ font-weight: 400;
157
312
  color: var(--ink-soft);
158
- letter-spacing: 0.04em;
159
- margin: 0 0 22px;
313
+ margin: 0 0 var(--ds-space-sm);
160
314
  }
161
-
162
315
  .herm__sub {
163
- font-size: 1.05rem;
316
+ max-width: 34em;
164
317
  color: var(--ink);
165
- line-height: 1.65;
166
- max-width: 560px;
167
- margin: 0 auto 22px;
168
- }
169
-
170
- /* drop cap on the hero paragraph */
171
- .herm__sub::first-letter {
172
- font-family: var(--font-display);
173
- font-weight: 700;
174
- font-size: 3.2rem;
175
- line-height: 0.85;
176
- float: left;
177
- margin: 6px 10px 0 0;
178
- color: var(--rule);
318
+ margin: 0 0 var(--ds-space-md);
179
319
  }
180
-
181
320
  .herm__meta {
182
- font-family: var(--font-body);
183
- font-style: italic;
184
- font-size: 0.95rem;
321
+ display: flex;
322
+ flex-wrap: wrap;
323
+ align-items: center;
324
+ gap: var(--ds-space-hair) 0;
325
+ font-size: var(--ds-text-md);
185
326
  color: var(--ink-soft);
186
327
  margin: 0;
187
328
  }
188
-
189
- .dot { margin: 0 10px; opacity: 0.55; }
190
-
191
- /* ---------- Banner / section rule ---------- */
192
-
193
- .rule {
194
- display: flex;
329
+ .herm__meta a {
330
+ display: inline-flex;
195
331
  align-items: center;
196
- justify-content: center;
197
- gap: 14px;
198
- margin: 0 auto;
199
- max-width: 800px;
200
- padding: 18px 24px;
201
- color: var(--rule);
202
- position: relative;
332
+ min-height: 24px;
203
333
  }
334
+ .dot { margin: 0 var(--ds-space-xs); color: var(--ink-faint); }
204
335
 
205
- .rule::before, .rule::after {
206
- content: "";
207
- flex: 1;
208
- height: 0;
209
- border-top: 1px solid var(--rule-soft);
210
- box-shadow: 0 2px 0 -1px var(--rule-soft); /* second rule below */
336
+ /* ---------- the section nav (#409): label chips under a hairline ---------- */
337
+ .status-nav {
338
+ position: sticky;
339
+ top: 0;
340
+ z-index: var(--ds-z-topbar);
341
+ background: var(--bg);
342
+ border-bottom: var(--line) solid var(--rule-soft);
343
+ margin: 0;
211
344
  }
212
-
213
- .rule svg {
214
- width: 9px;
215
- height: 9px;
216
- flex-shrink: 0;
217
- opacity: 0.85;
345
+ .status-nav__inner {
346
+ max-width: var(--content-max);
347
+ margin: 0 auto;
348
+ padding: 0 var(--ds-space-gutter-narrow);
218
349
  }
219
-
220
- .rule--banner svg { width: 11px; height: 11px; }
221
-
222
- .rule--small {
223
- max-width: 280px;
224
- padding: 14px 0 18px;
225
- margin-top: 0;
350
+ .status-nav__list {
351
+ display: flex;
352
+ flex-wrap: wrap;
353
+ gap: 0 var(--ds-space-md);
354
+ margin: 0;
355
+ padding: 0;
356
+ list-style: none;
226
357
  }
227
-
228
- .rule--small::before, .rule--small::after {
229
- box-shadow: none;
230
- border-top-color: var(--rule);
231
- opacity: 0.5;
358
+ .status-nav__chip {
359
+ display: inline-flex;
360
+ align-items: center;
361
+ min-height: 44px;
362
+ font-family: var(--label-face);
363
+ font-size: var(--label-size);
364
+ letter-spacing: var(--label-space);
365
+ text-transform: uppercase;
366
+ color: var(--ink-soft);
367
+ text-decoration: none;
368
+ border-bottom: 2px solid transparent;
369
+ white-space: nowrap;
370
+ transition: color var(--ds-dur-fast) var(--ds-ease), border-color var(--ds-dur-fast) var(--ds-ease);
371
+ }
372
+ .status-nav__chip:hover { color: var(--ink); }
373
+ .status-nav__chip:focus-visible { border-radius: 0; }
374
+ .status-nav__chip--active {
375
+ color: var(--ink);
376
+ border-bottom-color: var(--accent);
232
377
  }
233
378
 
234
- /* ---------- Tablets (sections) ---------- */
235
-
379
+ /* ---------- panels (DESIGN.md "The hall": bg-card, one hairline, 16px, no shadow) ---------- */
236
380
  main {
237
- max-width: 800px;
381
+ max-width: var(--content-max);
238
382
  margin: 0 auto;
239
- padding: 24px 24px 56px;
383
+ padding: var(--ds-space-md) var(--ds-space-gutter-narrow) var(--ds-space-xl);
240
384
  display: flex;
241
385
  flex-direction: column;
242
- gap: 32px;
386
+ gap: var(--ds-space-md);
243
387
  }
244
388
 
245
389
  .tablet {
246
- position: relative;
247
390
  background: var(--bg-card);
248
- /* double-rule frame: outer 1px ink rule + 4px parchment channel + inner
249
- 1px gold rule, achieved with one border + two box-shadows */
250
- border: 1px solid var(--ink-soft);
251
- border-radius: 0;
252
- padding: 28px 32px 30px;
253
- box-shadow:
254
- inset 0 0 0 4px var(--bg-frame),
255
- inset 0 0 0 5px var(--rule-soft),
256
- 0 2px 0 0 rgba(60, 40, 10, 0.10),
257
- 0 12px 32px -20px rgba(60, 40, 10, 0.55);
258
- /* #409: leave room above each tablet so anchor links from the sticky
259
- nav clear the strip. Roughly nav height (~36px) + breathing room. */
260
- scroll-margin-top: 64px;
261
- }
262
-
263
- /* small carved corner ornaments (subtle, just interior tick marks) */
264
- .tablet::before, .tablet::after {
265
- content: "";
266
- position: absolute;
267
- width: 10px;
268
- height: 10px;
269
- border: 1px solid var(--rule);
270
- opacity: 0.55;
391
+ border: var(--line) solid var(--rule-soft);
392
+ border-radius: var(--ds-radius-panel);
393
+ padding: var(--ds-space-gutter);
394
+ /* leave room above each panel so the sticky nav's anchors clear it */
395
+ scroll-margin-top: 60px;
271
396
  }
272
- .tablet::before { top: 10px; left: 10px; border-right: none; border-bottom: none; }
273
- .tablet::after { bottom: 10px; right: 10px; border-left: none; border-top: none; }
274
397
 
275
398
  .tablet__head {
276
399
  display: flex;
277
400
  align-items: flex-start;
278
- gap: 18px;
279
- margin: 0 0 22px;
280
- padding-bottom: 16px;
281
- border-bottom: 1px solid var(--rule-soft);
282
- box-shadow: 0 2px 0 -1px var(--rule-soft);
283
- padding-bottom: 18px;
401
+ gap: var(--ds-space-sm);
402
+ margin: 0 0 var(--ds-space-md);
284
403
  }
285
-
286
- .tablet__icon {
287
- width: 36px;
288
- height: 36px;
289
- flex-shrink: 0;
290
- color: var(--ink);
291
- opacity: 0.82;
292
- margin-top: 2px;
293
- }
294
-
295
404
  .tablet__heading { flex: 1; min-width: 0; }
296
-
297
405
  .tablet h2 {
298
406
  font-family: var(--font-display);
299
- font-weight: 700;
300
- font-size: 1.5rem;
301
- letter-spacing: 0.14em;
302
- text-transform: uppercase;
303
- margin: 0 0 4px;
407
+ font-size: var(--ds-text-title);
408
+ font-weight: 300;
409
+ line-height: 1.2;
410
+ letter-spacing: -0.03em;
304
411
  color: var(--ink);
412
+ margin: 0 0 var(--ds-space-hair);
305
413
  }
306
-
307
414
  .tablet__subtitle {
308
- font-family: var(--font-body);
309
- font-style: italic;
310
- font-size: 0.98rem;
415
+ font-size: var(--ds-text-lg);
311
416
  color: var(--ink-soft);
312
417
  margin: 0;
313
418
  line-height: 1.45;
314
419
  }
315
420
 
316
421
  .empty {
317
- color: var(--ink-faint);
318
- font-style: italic;
422
+ color: var(--ink-soft);
319
423
  margin: 0;
320
- font-size: 1rem;
424
+ font-size: var(--ds-text-lg);
321
425
  }
322
426
 
323
427
  /* ---------- The loader (task 1005053; the hall's, task 1005043) ----------
@@ -374,222 +478,180 @@ main {
374
478
  .versions {
375
479
  display: flex;
376
480
  flex-direction: column;
377
- gap: 22px;
481
+ gap: var(--ds-space-md);
378
482
  }
379
483
 
380
484
  .version-row {
381
485
  display: flex;
382
486
  flex-direction: column;
383
- gap: 8px;
487
+ gap: var(--ds-space-hair);
384
488
  }
385
489
 
386
490
  .version-row__name {
387
491
  font-family: var(--font-display);
492
+ font-size: var(--ds-text-xl);
388
493
  font-weight: 500;
389
- font-size: 1.05rem;
390
- letter-spacing: 0.06em;
391
494
  color: var(--ink);
392
495
  }
393
496
 
394
- /* Stacked three-segment lifecycle bar — shipped / confirmed / completed,
395
- sized by raw task count (matches the work board's bars). */
497
+ /* Stacked three-segment lifecycle bar — shipped / confirmed / completed, sized
498
+ by raw task count (matches the work board's bars). Verification state, so
499
+ the status vocabulary: shipped is the full --ok, the two earlier stages
500
+ lighter mixes of it. */
396
501
  .version-row__bar {
397
502
  display: flex;
398
- height: 12px;
399
- background: var(--bg-deep);
400
- border: 1px solid var(--rule-soft);
503
+ height: 10px;
504
+ background: var(--tile);
505
+ border-radius: var(--radius-pill);
401
506
  overflow: hidden;
402
- box-shadow: inset 0 1px 2px rgba(60, 40, 10, 0.18);
403
507
  }
404
- .version-row__seg { height: 100%; transition: width 600ms ease-out; }
405
- .version-row__seg--shipped { background: linear-gradient(180deg, var(--accent), var(--accent-deep)); }
406
- .version-row__seg--confirmed { background: linear-gradient(180deg, color-mix(in oklab, var(--accent) 65%, white), var(--accent)); }
407
- .version-row__seg--completed { background: linear-gradient(180deg, color-mix(in oklab, var(--accent) 30%, white), color-mix(in oklab, var(--accent) 55%, white)); }
508
+ .version-row__seg { height: 100%; transition: width var(--ds-dur-slower) var(--ds-ease); }
509
+ .version-row__seg--shipped { background: var(--ok); }
510
+ .version-row__seg--confirmed { background: color-mix(in srgb, var(--ok) 55%, var(--bg-card)); }
511
+ .version-row__seg--completed { background: color-mix(in srgb, var(--ok) 28%, var(--bg-card)); }
408
512
 
409
513
  .version-row__pct {
410
- font-size: 0.92rem;
514
+ font-size: var(--ds-text-md);
411
515
  color: var(--ink-soft);
412
- font-style: italic;
413
516
  font-variant-numeric: tabular-nums;
414
517
  }
415
518
 
416
519
  /* Description folded into a collapsed dropdown. */
417
520
  .version-row__about { margin: 2px 0 0; }
418
521
  .version-row__about-summary {
419
- cursor: url('cursors/hand-pointer.png') 4 1, pointer;
522
+ display: inline-flex;
523
+ align-items: center;
524
+ min-height: 24px;
525
+ cursor: pointer;
420
526
  list-style: none;
421
- font-family: var(--font-body);
422
- font-style: italic;
423
- font-size: 0.92rem;
527
+ font-size: var(--ds-text-md);
424
528
  color: var(--ink-soft);
425
529
  user-select: none;
426
530
  }
531
+ .version-row__about-summary:hover { color: var(--ink); }
427
532
  .version-row__about-summary::-webkit-details-marker { display: none; }
428
533
  .version-row__about-summary::before {
429
- content: "▸";
430
- font-style: normal;
431
- font-size: 0.8rem;
432
- color: var(--rule);
433
- transition: transform 180ms;
534
+ content: "";
434
535
  display: inline-block;
435
- width: 0.9em;
536
+ width: 6px;
537
+ height: 6px;
538
+ margin-right: var(--ds-space-xs);
539
+ border-right: 1.5px solid currentColor;
540
+ border-bottom: 1.5px solid currentColor;
541
+ transform: rotate(-45deg);
542
+ transition: transform var(--ds-dur-fast) var(--ds-ease);
436
543
  }
437
- .version-row__about[open] > .version-row__about-summary::before { transform: rotate(90deg); }
544
+ .version-row__about[open] > .version-row__about-summary::before { transform: rotate(45deg); }
438
545
 
439
546
  .version-row__desc {
440
- font-family: var(--font-body);
441
- font-style: italic;
442
- font-size: 0.95rem;
547
+ font-size: var(--ds-text-lg);
443
548
  line-height: 1.5;
444
549
  color: var(--ink-soft);
445
- margin: 8px 0 4px;
446
- /* Use the full tablet width — the dropdown gives the description the whole
447
- row rather than a narrow column (task 981). */
550
+ margin: var(--ds-space-hair) 0 4px;
448
551
  max-width: none;
449
552
  }
450
553
 
451
- /* ---------- Treasury (cost summary) ---------- */
554
+ /* ---------- Treasury (cost summary) and the stat tiles ---------- */
452
555
 
453
556
  .cost-summary {
454
557
  display: grid;
455
558
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
456
- gap: 14px;
457
- margin-bottom: 24px;
559
+ gap: var(--ds-space-xs);
560
+ margin-bottom: var(--ds-space-md);
458
561
  }
459
562
 
460
563
  .stat {
461
- text-align: center;
462
- padding: 16px 12px 14px;
463
- background: var(--bg-deep);
464
- border: 1px solid var(--rule-soft);
465
- position: relative;
466
- }
467
-
468
- .stat::before {
469
- content: "";
470
- position: absolute;
471
- inset: 3px;
472
- border: 1px solid var(--bg-card);
473
- pointer-events: none;
564
+ padding: var(--ds-space-sm);
565
+ background: var(--tile);
566
+ border-radius: var(--ds-radius-tile);
474
567
  }
475
568
 
476
569
  .stat__num {
477
570
  font-family: var(--font-display);
478
- font-weight: 700;
479
- font-size: 1.9rem;
571
+ font-size: var(--ds-text-5xl);
572
+ font-weight: 300;
573
+ line-height: 1.05;
574
+ letter-spacing: -0.03em;
480
575
  color: var(--ink);
481
576
  font-variant-numeric: tabular-nums;
482
- line-height: 1.05;
483
- letter-spacing: 0.02em;
577
+ overflow-wrap: anywhere;
484
578
  }
485
579
 
486
580
  .stat__label {
487
- font-family: var(--font-body);
488
- font-style: italic;
489
- font-size: 0.9rem;
581
+ font-size: var(--ds-text-sm);
490
582
  color: var(--ink-soft);
491
- margin-top: 6px;
492
- letter-spacing: 0.02em;
583
+ margin-top: var(--ds-space-hair);
493
584
  }
494
585
 
495
586
  .chart-wrap {
496
587
  position: relative;
497
588
  height: 260px;
498
- margin: 0 0 10px;
499
- padding: 8px 4px 0;
589
+ margin: 0 0 var(--ds-space-xs);
500
590
  }
501
591
 
502
592
  .chart-note {
503
- font-size: 0.92rem;
593
+ max-width: 44em;
594
+ font-size: var(--ds-text-md);
504
595
  color: var(--ink-soft);
505
- font-style: italic;
506
- margin: 0 0 18px;
507
- text-align: center;
596
+ margin: 0 0 var(--ds-space-md);
508
597
  line-height: 1.5;
509
598
  }
510
599
 
511
600
  /* V3.R83 (#303): attributed-vs-unattributed spend headline above the chips. */
512
601
  .cost-split {
513
- font-size: 0.95rem;
602
+ font-size: var(--ds-text-md);
603
+ font-weight: 500;
514
604
  color: var(--ink);
515
- text-align: center;
516
- margin: 0 0 10px;
517
- font-weight: 600;
605
+ margin: 0 0 var(--ds-space-xs);
518
606
  }
519
607
 
608
+ .cost-filters { gap: var(--ds-space-sm) !important; }
609
+
520
610
  .cost-cats {
521
611
  display: flex;
522
612
  flex-wrap: wrap;
523
- gap: 8px;
524
- justify-content: center;
613
+ gap: var(--ds-space-hair);
525
614
  }
526
615
 
527
616
  .cost-cat {
528
- font-family: var(--font-body);
529
- font-size: 0.92rem;
530
- padding: 5px 12px;
531
- background: var(--bg-deep);
532
- border: 1px solid var(--rule-soft);
617
+ display: inline-flex;
618
+ align-items: center;
619
+ gap: 4px;
620
+ min-height: 26px;
621
+ padding: 0 var(--ds-space-xs);
622
+ border-radius: var(--radius-pill);
623
+ background: var(--tile);
624
+ font-size: var(--ds-text-sm);
533
625
  color: var(--ink-soft);
534
626
  font-variant-numeric: tabular-nums;
535
627
  }
536
628
 
537
629
  .cost-cat strong {
538
- font-family: var(--font-display);
539
- color: var(--ink);
540
630
  font-weight: 500;
541
- letter-spacing: 0.08em;
542
- text-transform: uppercase;
543
- font-size: 0.78rem;
544
- margin-right: 4px;
631
+ color: var(--ink);
632
+ margin-right: 2px;
545
633
  }
546
634
 
547
- /* ---------- Lately Inscribed (shipped feed) ---------- */
548
-
549
- /* GDS #191: in-head date-range filter. Sits to the right of the heading on
550
- wide layouts; falls beneath it on narrow viewports via the existing
551
- tablet__head media query at the bottom of this file. */
635
+ /* ---------- the panel filters (GDS #191) ----------
636
+ The field itself is the shared one (controls.css); this only lays it out. */
552
637
  .tablet__filter {
553
638
  display: flex;
554
639
  align-items: center;
555
- gap: 8px;
640
+ gap: var(--ds-space-hair);
556
641
  flex-shrink: 0;
557
- margin-top: 4px;
558
642
  }
559
643
 
560
644
  .tablet__filter-label {
561
- font-family: var(--font-display);
562
- font-weight: 500;
563
- font-size: 0.72rem;
645
+ font-family: var(--label-face);
646
+ font-size: var(--label-size);
647
+ letter-spacing: var(--label-space);
564
648
  text-transform: uppercase;
565
- letter-spacing: 0.18em;
566
649
  color: var(--ink-soft);
567
650
  }
568
651
 
569
- .tablet__filter-select {
570
- font-family: var(--font-body);
571
- font-size: 0.92rem;
572
- color: var(--ink);
573
- background: transparent;
574
- border: 1px solid var(--rule);
575
- padding: 5px 26px 5px 10px;
576
- cursor: url('cursors/hand-pointer.png') 4 1, pointer;
577
- appearance: none;
578
- -webkit-appearance: none;
579
- background-image: linear-gradient(45deg, transparent 50%, var(--ink-soft) 50%),
580
- linear-gradient(135deg, var(--ink-soft) 50%, transparent 50%);
581
- background-position: calc(100% - 14px) 50%, calc(100% - 9px) 50%;
582
- background-size: 5px 5px, 5px 5px;
583
- background-repeat: no-repeat;
584
- transition: border-color 0.15s ease, background-color 0.15s ease;
585
- }
586
-
587
- .tablet__filter-select:hover,
588
- .tablet__filter-select:focus {
589
- border-color: var(--ink-soft);
590
- outline: none;
591
- background-color: var(--rule-soft);
592
- }
652
+ .tablet__filter-select { cursor: pointer; }
653
+
654
+ /* ---------- Lately Inscribed (shipped feed): ledger rows ---------- */
593
655
 
594
656
  .shipped {
595
657
  list-style: none;
@@ -600,123 +662,76 @@ main {
600
662
  }
601
663
 
602
664
  .shipped li:not(.empty):not(.empty-row) {
603
- padding: 16px 0 14px;
604
- border-bottom: 1px solid var(--rule-soft);
605
- position: relative;
606
- }
607
-
608
- .shipped li:not(.empty):not(.empty-row)::before {
609
- content: "❦";
610
- position: absolute;
611
- left: 0;
612
- top: 17px;
613
- color: var(--rule);
614
- font-size: 0.85rem;
615
- opacity: 0.6;
616
- }
617
-
618
- .shipped li:not(.empty):not(.empty-row) {
619
- padding-left: 22px;
665
+ padding: var(--ds-space-sm) 0;
666
+ border-bottom: var(--line) solid var(--rule-soft);
620
667
  }
621
668
 
622
669
  .shipped li:last-child { border-bottom: none; }
623
670
 
624
- /* GDS #191: invisible placeholder rows pad short pages so the section
625
- height is constant across pages and across date-range changes. Matches
626
- the vertical footprint of a real .shipped li: 16px top padding + ~1.5em
627
- title (24px) + 4px gap + ~0.92rem italic meta (~21px) + 14px bottom
628
- padding + 1px border ≈ 80px. aria-hidden in markup keeps them out of
629
- the a11y tree. */
671
+ /* GDS #191: invisible placeholder rows pad short pages so the section height is
672
+ constant across pages and date ranges. aria-hidden in markup. */
630
673
  .shipped li.empty-row {
631
674
  visibility: hidden;
632
- min-height: 83px;
633
- border-bottom: 1px solid transparent;
675
+ min-height: 76px;
676
+ border-bottom: var(--line) solid transparent;
634
677
  }
635
678
 
636
679
  .shipped__title {
637
- font-size: 1.05rem;
680
+ font-size: var(--ds-text-xl);
638
681
  color: var(--ink);
639
682
  margin: 0 0 4px;
640
- line-height: 1.5;
683
+ line-height: 1.45;
641
684
  }
642
685
 
643
686
  .shipped__meta {
644
- font-size: 0.92rem;
687
+ font-size: var(--ds-text-md);
645
688
  color: var(--ink-soft);
646
- font-style: italic;
647
689
  margin: 0;
648
690
  }
649
691
 
650
- /* task 1003109: the optional ship-time visual on a public shipped row. Small on
651
- purpose — this is a scannable feed, and the thumbnail links to the full-size
652
- image for anyone who wants to look properly. Absent on most rows; nothing is
653
- drawn when a task has no visual. */
692
+ /* task 1003109: the optional ship-time visual on a public shipped row. */
654
693
  .shipped__visual {
655
694
  display: block;
656
695
  width: 40px;
657
696
  height: 40px;
658
697
  object-fit: cover;
659
- margin: 0 0 6px;
660
- border: 1px solid var(--rule, rgba(0, 0, 0, 0.15));
661
- border-radius: 3px;
698
+ margin: 0 0 var(--ds-space-hair);
699
+ border-radius: var(--ds-radius-tile);
662
700
  }
663
701
 
664
702
  .shipped__version {
665
- font-family: var(--font-display);
666
- font-weight: 500;
667
- font-size: 0.7rem;
703
+ display: inline-flex;
704
+ align-items: center;
705
+ min-height: 22px;
706
+ padding: 0 var(--ds-space-hair);
707
+ margin-right: var(--ds-space-xs);
708
+ border-radius: var(--radius-pill);
709
+ background: var(--tile);
710
+ font-family: var(--label-face);
711
+ font-size: var(--label-size);
712
+ letter-spacing: var(--label-space);
668
713
  text-transform: uppercase;
669
- letter-spacing: 0.18em;
670
- padding: 2px 8px 1px;
671
- border: 1px solid var(--rule-soft);
672
714
  color: var(--ink-soft);
673
- margin-right: 10px;
674
- vertical-align: 2px;
675
- font-style: normal;
715
+ vertical-align: 1px;
676
716
  }
677
717
 
678
718
  .shipped-pager {
679
719
  display: flex;
680
720
  align-items: center;
681
721
  justify-content: space-between;
682
- gap: 16px;
683
- margin-top: 18px;
684
- padding-top: 14px;
685
- border-top: 1px solid var(--rule-soft);
686
- }
687
-
688
- .shipped-pager__btn {
689
- font-family: var(--font-display);
690
- font-weight: 500;
691
- font-size: 0.78rem;
692
- text-transform: uppercase;
693
- letter-spacing: 0.14em;
694
- padding: 7px 14px 6px;
695
- background: transparent;
696
- color: var(--ink);
697
- border: 1px solid var(--rule);
698
- cursor: url('cursors/hand-pointer.png') 4 1, pointer;
699
- transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
700
- }
701
-
702
- .shipped-pager__btn:hover:not(:disabled) {
703
- background: var(--rule-soft);
704
- border-color: var(--ink-soft);
705
- }
706
-
707
- .shipped-pager__btn:disabled {
708
- opacity: 0.35;
709
- cursor: not-allowed;
722
+ gap: var(--ds-space-sm);
723
+ margin-top: var(--ds-space-sm);
724
+ padding-top: var(--ds-space-sm);
725
+ border-top: var(--line) solid var(--rule-soft);
710
726
  }
711
727
 
712
728
  .shipped-pager__info {
713
- font-family: var(--font-body);
714
- font-style: italic;
715
729
  color: var(--ink-soft);
716
- font-size: 0.95rem;
730
+ font-size: var(--ds-text-md);
731
+ font-variant-numeric: tabular-nums;
717
732
  }
718
733
 
719
- /* ---------- Architects (leaderboard) ---------- */
734
+ /* ---------- Architects (leaderboard): ledger rows ---------- */
720
735
 
721
736
  .leader {
722
737
  list-style: none;
@@ -728,20 +743,18 @@ main {
728
743
  .leader li:not(.empty) {
729
744
  display: flex;
730
745
  align-items: center;
731
- gap: 14px;
732
- padding: 12px 0;
746
+ gap: var(--ds-space-sm);
747
+ padding: var(--ds-space-xs) 0;
733
748
  counter-increment: leader;
734
- border-bottom: 1px solid var(--rule-soft);
749
+ border-bottom: var(--line) solid var(--rule-soft);
735
750
  }
736
751
 
737
752
  .leader li:not(.empty)::before {
738
- content: counter(leader, upper-roman);
739
- font-family: var(--font-display);
740
- font-weight: 700;
741
- font-size: 1.15rem;
742
- letter-spacing: 0.04em;
743
- color: var(--rule);
744
- width: 42px;
753
+ content: counter(leader);
754
+ font-family: var(--font-mono);
755
+ font-size: var(--ds-text-sm);
756
+ color: var(--ink-faint);
757
+ width: 24px;
745
758
  text-align: right;
746
759
  flex-shrink: 0;
747
760
  font-variant-numeric: tabular-nums;
@@ -752,55 +765,45 @@ main {
752
765
  .leader__avatar {
753
766
  width: 36px;
754
767
  height: 36px;
755
- border-radius: 0;
756
- background: var(--bg-deep);
757
- border: 1px solid var(--rule-soft);
768
+ border-radius: 50%;
769
+ background: var(--tile);
758
770
  flex-shrink: 0;
759
- filter: sepia(0.25) saturate(0.85);
760
771
  }
761
772
 
762
773
  .leader__name {
763
774
  flex-grow: 1;
764
- font-family: var(--font-display);
775
+ min-width: 0;
776
+ overflow-wrap: anywhere;
777
+ font-size: var(--ds-text-xl);
765
778
  font-weight: 500;
766
- font-size: 1rem;
767
- letter-spacing: 0.06em;
768
779
  color: var(--ink);
769
780
  }
770
781
 
771
782
  .leader__login {
772
- font-family: var(--font-body);
773
- font-style: italic;
774
- letter-spacing: 0;
775
- color: var(--ink-soft);
776
- font-size: 0.92rem;
777
- margin-left: 8px;
783
+ font-size: var(--ds-text-md);
778
784
  font-weight: 400;
779
- text-transform: none;
785
+ color: var(--ink-soft);
786
+ margin-left: var(--ds-space-hair);
780
787
  }
781
788
 
782
789
  .leader__credits {
783
790
  font-family: var(--font-display);
791
+ font-size: var(--ds-text-xl);
792
+ font-weight: 500;
793
+ color: var(--ink);
784
794
  font-variant-numeric: tabular-nums;
785
- color: var(--accent-deep);
786
- font-weight: 700;
787
- font-size: 1.05rem;
788
- letter-spacing: 0.04em;
795
+ white-space: nowrap;
789
796
  }
790
797
 
791
798
  .leader__credits-unit {
792
- font-family: var(--font-body);
793
- font-style: italic;
799
+ font-size: var(--ds-text-sm);
794
800
  font-weight: 400;
795
- font-size: 0.85rem;
796
801
  color: var(--ink-soft);
797
802
  margin-left: 4px;
798
- letter-spacing: 0;
799
803
  }
800
804
 
801
- /* The roles under each builder's name (task 1004437): one small tag per role
802
- the builder has earned in, the main one a step stronger, as the hall's
803
- roster and the approved mock draw them, on this page's own palette. */
805
+ /* The roles under each builder's name (task 1004437): one small tag per role,
806
+ the main one a step stronger, as the hall's roster draws them. */
804
807
  .leader__roles {
805
808
  display: flex;
806
809
  flex-wrap: wrap;
@@ -811,181 +814,94 @@ main {
811
814
  display: inline-flex;
812
815
  align-items: center;
813
816
  min-height: 22px;
814
- padding: 0 8px;
815
- border: 1px solid var(--rule-soft);
816
- font-family: var(--font-body);
817
- font-size: 0.78rem;
817
+ padding: 0 var(--ds-space-hair);
818
+ border-radius: var(--radius-pill);
819
+ background: var(--tile);
820
+ font-size: var(--ds-text-xs);
818
821
  font-weight: 400;
819
- letter-spacing: 0;
820
822
  color: var(--ink-soft);
821
- text-transform: none;
822
823
  }
823
- .leader__role--lead { color: var(--ink); border-color: var(--rule); }
824
+ .leader__role--lead { color: var(--ink); background: var(--glass-strong); }
824
825
 
825
- /* Inline laurels next to each architect's name. Slightly dimmed so the
826
- name still leads the row; emoji glyphs would otherwise punch above the
827
- marble palette. PMS-V2 #54 */
828
826
  .leader__achievements {
829
827
  display: inline-flex;
830
828
  gap: 4px;
831
- margin-left: 10px;
829
+ margin-left: var(--ds-space-xs);
832
830
  vertical-align: 1px;
833
831
  line-height: 1;
834
832
  }
835
833
  .leader__ach {
836
- font-size: 0.95rem;
834
+ font-size: var(--ds-text-lg);
837
835
  line-height: 1;
838
- filter: saturate(0.8);
839
836
  cursor: help;
840
837
  }
841
838
 
842
839
  /* ---------- Footer ---------- */
843
840
 
844
841
  .foot {
845
- text-align: center;
846
- padding: 24px 24px 56px;
847
- color: var(--ink-soft);
848
- font-size: 0.95rem;
849
- font-style: italic;
850
- max-width: 640px;
842
+ max-width: var(--content-max);
851
843
  margin: 0 auto;
844
+ padding: var(--ds-space-lg) var(--ds-space-gutter-narrow) var(--ds-space-xl);
845
+ border-top: var(--line) solid var(--rule-soft);
846
+ color: var(--ink-soft);
847
+ font-size: var(--ds-text-md);
852
848
  }
853
849
 
854
- .foot p { margin: 6px 0; line-height: 1.55; }
855
-
856
- .foot strong {
857
- font-family: var(--font-display);
858
- font-weight: 500;
859
- font-style: normal;
860
- letter-spacing: 0.08em;
861
- text-transform: uppercase;
862
- font-size: 0.85rem;
863
- color: var(--ink);
864
- }
850
+ .foot p { margin: var(--ds-space-hair) 0; line-height: 1.55; }
851
+ .foot a { display: inline-flex; align-items: center; min-height: 24px; }
852
+ .foot strong { font-weight: 500; color: var(--ink); }
865
853
 
866
854
  .foot__seal {
867
- font-family: var(--font-display);
868
- font-style: normal;
869
- font-weight: 500;
870
- letter-spacing: 0.22em;
855
+ font-family: var(--label-face);
856
+ font-size: var(--label-size);
857
+ letter-spacing: var(--label-space);
871
858
  text-transform: uppercase;
872
- font-size: 0.78rem;
873
- color: var(--rule);
874
- margin: 6px 0 14px !important;
875
- }
876
-
877
- /* ---------- Mobile ---------- */
878
-
879
- @media (max-width: 540px) {
880
- body { font-size: 17px; }
881
- .herm { padding: 44px 18px 22px; }
882
- .herm h1 {
883
- font-size: clamp(1.9rem, 8vw, 2.4rem);
884
- letter-spacing: 0.06em;
885
- }
886
- .herm__sigil { width: 60px; height: 60px; }
887
- .tablet { padding: 22px 18px 24px; }
888
- .tablet__head { gap: 12px; flex-wrap: wrap; }
889
- .tablet h2 { font-size: 1.15rem; letter-spacing: 0.08em; }
890
- .tablet__icon { width: 28px; height: 28px; }
891
- /* GDS #191: on narrow viewports, push the filter onto its own row beneath
892
- the heading so the subtitle doesn't get squeezed to a single column. */
893
- .tablet__filter { width: 100%; justify-content: flex-end; margin-top: 2px; }
894
- .stat__num { font-size: 1.5rem; }
895
- .stat__label { font-size: 0.82rem; }
896
- .version-row__name { font-size: 0.95rem; letter-spacing: 0.04em; }
897
- .leader li:not(.empty) { gap: 10px; }
898
- .leader li:not(.empty)::before { width: 32px; font-size: 1rem; }
899
- .leader__name { font-size: 0.92rem; letter-spacing: 0.04em; }
900
- .leader__login { display: block; margin-left: 0; margin-top: 2px; }
901
- main { padding: 16px 16px 40px; gap: 22px; }
902
-
903
- .world-snapshot img { max-width: 100%; }
904
- .world-timeline__thumb { width: 96px; height: auto; }
859
+ color: var(--ink-faint);
860
+ margin: 0 0 var(--ds-space-sm) !important;
905
861
  }
906
862
 
907
863
  /* ---------- World snapshot ---------- */
908
864
 
909
- /* The world section breaks out of main's 800px column on wide screens so
910
- the snapshot can render near its native 960px width — sprites are
911
- recognizable at full size, lost in the sand texture below ~750px. On
912
- narrow screens we just stay inside the column. */
913
- @media (min-width: 1080px) {
914
- .tablet.tablet--wide {
915
- margin-left: -140px;
916
- margin-right: -140px;
917
- }
918
- }
919
-
920
- .world-snapshot {
921
- text-align: center;
922
- margin-bottom: 20px;
923
- }
865
+ .world-snapshot { margin-bottom: var(--ds-space-md); }
924
866
 
925
867
  .world-snapshot img {
926
868
  display: block;
927
869
  margin: 0 auto;
928
870
  width: 960px;
929
871
  max-width: 100%;
930
- /* Preserve native 960×576 (5:3) aspect when CSS scales width on narrow
931
- screens. Without height:auto the HTML height attribute is honored and
932
- the image stretches vertically. */
872
+ /* keep the native 960x576 (5:3) aspect when CSS scales the width */
933
873
  height: auto;
934
874
  aspect-ratio: 5 / 3;
935
875
  /* pixel-art rendering: crisp upscaling, no anti-alias blur */
936
876
  image-rendering: pixelated;
937
877
  image-rendering: crisp-edges;
938
- border: 1px solid var(--rule-soft);
939
- box-shadow: 0 2px 12px -4px rgba(60, 40, 10, 0.40);
878
+ border-radius: var(--ds-radius-tile);
940
879
  }
941
880
 
942
881
  .world-snapshot__caption {
943
- font-family: var(--font-body);
944
- font-style: italic;
945
- font-size: 0.95rem;
882
+ font-size: var(--ds-text-md);
946
883
  color: var(--ink-soft);
947
- margin: 12px 0 0;
948
- }
949
-
950
- .world-snapshot__caption strong {
951
- font-style: normal;
952
- font-weight: 600;
953
- color: var(--ink);
954
- font-family: var(--font-display);
955
- font-size: 0.85em;
956
- letter-spacing: 0.08em;
957
- text-transform: uppercase;
958
- margin-right: 2px;
884
+ margin: var(--ds-space-xs) 0 0;
959
885
  }
886
+ .world-snapshot__caption strong { font-weight: 500; color: var(--ink); margin-right: 2px; }
960
887
 
961
888
  .world-snapshot__sha {
962
- font-family: ui-monospace, "SF Mono", Menlo, monospace;
963
- font-size: 0.78rem;
964
- font-style: normal;
889
+ font-family: var(--font-mono);
890
+ font-size: var(--ds-text-xs);
965
891
  color: var(--ink-faint);
966
- letter-spacing: 0.04em;
967
892
  }
968
893
 
969
894
  /* Horizontal scroll strip of thumbnails */
970
895
  .world-timeline {
971
896
  display: flex;
972
- gap: 10px;
897
+ gap: var(--ds-space-xs);
973
898
  overflow-x: auto;
974
- padding-bottom: 8px;
899
+ padding-bottom: var(--ds-space-hair);
975
900
  scroll-snap-type: x mandatory;
976
901
  -webkit-overflow-scrolling: touch;
977
- /* custom scrollbar to match the aged-parchment aesthetic */
978
902
  scrollbar-width: thin;
979
- scrollbar-color: var(--rule-soft) transparent;
903
+ scrollbar-color: var(--rule) transparent;
980
904
  }
981
-
982
- .world-timeline::-webkit-scrollbar { height: 5px; }
983
- .world-timeline::-webkit-scrollbar-track { background: transparent; }
984
- .world-timeline::-webkit-scrollbar-thumb {
985
- background: var(--rule-soft);
986
- border-radius: 3px;
987
- }
988
-
989
905
  .world-timeline:empty { display: none; }
990
906
 
991
907
  .world-timeline__item {
@@ -994,21 +910,14 @@ main {
994
910
  display: flex;
995
911
  flex-direction: column;
996
912
  align-items: center;
997
- gap: 5px;
998
- cursor: url('cursors/hand-pointer.png') 4 1, pointer;
913
+ gap: 4px;
914
+ cursor: pointer;
999
915
  opacity: 0.72;
1000
- transition: opacity 180ms;
916
+ transition: opacity var(--ds-dur-fast) var(--ds-ease);
1001
917
  }
1002
-
1003
918
  .world-timeline__item:hover,
1004
- .world-timeline__item[aria-current="true"] {
1005
- opacity: 1;
1006
- }
1007
-
1008
- .world-timeline__item[aria-current="true"] .world-timeline__thumb {
1009
- border-color: var(--rule);
1010
- box-shadow: 0 0 0 1px var(--rule);
1011
- }
919
+ .world-timeline__item[aria-current="true"] { opacity: 1; }
920
+ .world-timeline__item[aria-current="true"] .world-timeline__thumb { outline: 2px solid var(--accent); outline-offset: 2px; }
1012
921
 
1013
922
  .world-timeline__thumb {
1014
923
  display: block;
@@ -1017,286 +926,184 @@ main {
1017
926
  aspect-ratio: 5 / 3;
1018
927
  image-rendering: pixelated;
1019
928
  image-rendering: crisp-edges;
1020
- border: 1px solid var(--rule-soft);
929
+ border-radius: var(--ds-radius-tile);
1021
930
  }
1022
931
 
1023
932
  .world-timeline__date {
1024
- font-family: var(--font-body);
1025
- font-size: 0.75rem;
933
+ font-size: var(--ds-text-xs);
1026
934
  color: var(--ink-soft);
1027
- letter-spacing: 0.02em;
1028
935
  }
1029
936
 
1030
937
  .world-note {
1031
- font-family: var(--font-body);
1032
- font-style: italic;
1033
- font-size: 0.88rem;
1034
- color: var(--ink-faint);
1035
- margin: 12px 0 0;
1036
- text-align: right;
938
+ font-size: var(--ds-text-md);
939
+ color: var(--ink-soft);
940
+ margin: var(--ds-space-xs) 0 0;
1037
941
  }
1038
942
 
1039
- /* --- Sticky status nav (#409) ----------------------------------------------
1040
- Same design language as the hall's chip strip in public-builders/style.css
1041
- (.hall-nav__*). Independently styled here because the two surfaces don't
1042
- share a stylesheet; this duplication is intentional and per the task spec
1043
- to keep parallel-safety with anyone editing the hall. Visual rhythm is
1044
- identical: Cinzel-uppercase carved labels, terracotta active underline,
1045
- parchment background with hairline bottom rule. */
1046
-
1047
- .status-nav {
1048
- position: sticky;
1049
- top: 0;
1050
- z-index: 50;
1051
- background: rgba(243, 230, 198, 0.96);
1052
- backdrop-filter: blur(2px);
1053
- border-bottom: 1px solid var(--rule);
1054
- box-shadow: inset 0 -1px 0 var(--rule-soft);
1055
- padding: 6px 0 4px;
1056
- margin: 0;
1057
- }
1058
- .status-nav__inner {
1059
- max-width: 800px;
1060
- margin: 0 auto;
1061
- padding: 0 22px;
943
+ /* --- Snapshot history collapsed toggle (#409) ----------------------------- */
944
+ .world-history {
945
+ margin-top: var(--ds-space-sm);
946
+ border-top: var(--line) solid var(--rule-soft);
1062
947
  }
1063
- .status-nav__list {
948
+ .world-history__summary {
1064
949
  display: flex;
1065
- flex-wrap: wrap;
1066
- gap: 2px 12px;
1067
- margin: 0;
1068
- padding: 0;
1069
- list-style: none;
1070
- align-items: baseline;
1071
- }
1072
- .status-nav__chip {
1073
- font-family: var(--font-display);
1074
- font-size: 0.74rem;
1075
- font-weight: 700;
1076
- letter-spacing: 0.14em;
1077
- text-transform: uppercase;
950
+ align-items: center;
951
+ min-height: 44px;
952
+ cursor: pointer;
953
+ font-size: var(--ds-text-md);
1078
954
  color: var(--ink-soft);
1079
- text-decoration: none;
1080
- background: transparent;
1081
- border: none;
1082
- border-bottom: 2px solid transparent;
1083
- padding: 6px 2px 4px;
1084
- cursor: url('cursors/hand-pointer.png') 4 1, pointer;
1085
- transition: color 150ms, border-color 150ms;
1086
- white-space: nowrap;
1087
- }
1088
- .status-nav__chip:hover {
1089
- color: var(--ink);
1090
- border-bottom-color: var(--rule-soft);
1091
- }
1092
- .status-nav__chip:focus-visible {
1093
- outline: 2px solid var(--accent);
1094
- outline-offset: 2px;
1095
- }
1096
- .status-nav__chip--active {
1097
- color: var(--terracotta);
1098
- border-bottom-color: var(--terracotta);
1099
- }
1100
-
1101
- @media (max-width: 640px) {
1102
- .status-nav { padding: 4px 0 2px; }
1103
- .status-nav__inner { padding: 0 12px; }
1104
- .status-nav__list {
1105
- flex-wrap: nowrap;
1106
- overflow-x: auto;
1107
- overflow-y: hidden;
1108
- -webkit-overflow-scrolling: touch;
1109
- gap: 0 12px;
1110
- padding-bottom: 2px;
1111
- mask-image: linear-gradient(90deg, #000 0, #000 calc(100% - 24px), transparent 100%);
1112
- -webkit-mask-image: linear-gradient(90deg, #000 0, #000 calc(100% - 24px), transparent 100%);
1113
- }
1114
- .status-nav__chip {
1115
- flex-shrink: 0;
1116
- font-size: 0.72rem;
1117
- letter-spacing: 0.12em;
1118
- }
1119
- /* Tablets need a touch less clearance under the smaller mobile nav. */
1120
- .tablet { scroll-margin-top: 56px; }
955
+ list-style: none;
956
+ user-select: none;
1121
957
  }
958
+ .world-history__summary::-webkit-details-marker { display: none; }
959
+ .world-history__summary::before {
960
+ content: "";
961
+ display: inline-block;
962
+ width: 6px;
963
+ height: 6px;
964
+ margin-right: var(--ds-space-xs);
965
+ border-right: 1.5px solid currentColor;
966
+ border-bottom: 1.5px solid currentColor;
967
+ transform: rotate(-45deg);
968
+ transition: transform var(--ds-dur-fast) var(--ds-ease);
969
+ }
970
+ .world-history[open] > .world-history__summary::before { transform: rotate(45deg); }
971
+ .world-history__summary:hover { color: var(--ink); }
1122
972
 
1123
- /* --- Headline strip (#409) -------------------------------------------------
1124
- Above-the-fold answer to three common visitor questions (shipped, spend,
1125
- quality). Uses the existing .stat block from the cost summary for visual
1126
- rhythm — no new card vocabulary invented. */
1127
-
1128
- .tablet--headline {
1129
- padding: 22px 32px 24px;
1130
- }
1131
- .visually-hidden {
1132
- position: absolute;
1133
- width: 1px;
1134
- height: 1px;
1135
- padding: 0;
1136
- margin: -1px;
1137
- overflow: hidden;
1138
- clip: rect(0, 0, 0, 0);
1139
- white-space: nowrap;
1140
- border: 0;
1141
- }
973
+ /* --- Headline strip (#409): the same stat tiles ---------------------------- */
1142
974
  .headline-grid {
1143
975
  display: grid;
1144
976
  grid-template-columns: repeat(3, 1fr);
1145
- gap: 14px;
1146
- }
1147
- .headline-stat {
1148
- text-align: center;
1149
- position: relative;
1150
- }
1151
- .headline-stat .stat__num {
1152
- font-size: 1.55rem;
1153
- letter-spacing: 0.04em;
1154
- }
1155
- .headline-stat .stat__label {
1156
- font-size: 0.84rem;
1157
- margin-top: 6px;
977
+ gap: var(--ds-space-xs);
1158
978
  }
979
+ .headline-stat { position: relative; }
1159
980
  .headline-bar {
1160
- margin: 10px auto 0;
1161
- width: 80%;
1162
- height: 5px;
1163
- background: var(--bg-card);
1164
- border: 1px solid var(--rule-soft);
981
+ margin: var(--ds-space-xs) 0 0;
982
+ height: 6px;
983
+ background: var(--glass-strong);
984
+ border-radius: var(--radius-pill);
985
+ overflow: hidden;
1165
986
  }
987
+ /* Spend against the year's purse is a state, so the status vocabulary paints it:
988
+ on course, near the line, over it. */
1166
989
  .headline-bar__fill {
1167
990
  display: block;
1168
991
  height: 100%;
1169
- background: var(--accent);
1170
- transition: width 400ms ease;
1171
- }
1172
- .headline-bar__fill--warn { background: #a86a2a; }
1173
- .headline-bar__fill--over { background: var(--terracotta); }
1174
-
1175
- @media (max-width: 480px) {
1176
- .headline-grid { grid-template-columns: 1fr; }
992
+ background: var(--info);
993
+ transition: width var(--ds-dur-slower) var(--ds-ease);
1177
994
  }
1178
-
1179
- /* --- Snapshot history collapsed toggle (#409) ----------------------------- */
1180
-
1181
- .world-history {
1182
- margin-top: 16px;
1183
- }
1184
- .world-history__summary {
1185
- cursor: url('cursors/hand-pointer.png') 4 1, pointer;
1186
- font-family: var(--font-display);
1187
- font-size: 0.78rem;
1188
- font-weight: 500;
1189
- letter-spacing: 0.14em;
1190
- text-transform: uppercase;
1191
- color: var(--ink-soft);
1192
- padding: 8px 0;
1193
- border-top: 1px dashed var(--rule-soft);
1194
- list-style: none;
1195
- user-select: none;
1196
- }
1197
- .world-history__summary::-webkit-details-marker { display: none; }
1198
- .world-history__summary::before {
1199
- content: "▸ ";
1200
- display: inline-block;
1201
- margin-right: 6px;
1202
- transition: transform 150ms;
1203
- }
1204
- .world-history[open] > .world-history__summary::before {
1205
- content: "▾ ";
1206
- }
1207
- .world-history__summary:hover { color: var(--ink); }
995
+ .headline-bar__fill--warn { background: var(--warn); }
996
+ .headline-bar__fill--over { background: var(--danger); }
1208
997
 
1209
998
  /* ---- The Foundry — ecosystem dev curve (#291, C5) ---------------------- */
1210
999
  .foundry__charts {
1211
1000
  display: grid;
1212
1001
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
1213
- gap: 0.8rem;
1214
- margin: 0.8rem 0;
1002
+ gap: var(--ds-space-xs);
1003
+ margin: var(--ds-space-sm) 0;
1215
1004
  }
1216
1005
  .foundry__chart {
1217
- background: var(--bg-deep);
1218
- border: 1px solid var(--rule-soft);
1219
- border-radius: 6px;
1220
- padding: 0.6rem 0.7rem 0.5rem;
1006
+ background: var(--tile);
1007
+ border-radius: var(--ds-radius-tile);
1008
+ padding: var(--ds-space-xs) var(--ds-space-sm);
1221
1009
  }
1222
1010
  .foundry__chart-title {
1223
- font-size: 0.82rem;
1224
- font-weight: 600;
1011
+ font-size: var(--ds-text-sm);
1012
+ font-weight: 500;
1225
1013
  color: var(--ink-soft);
1226
- margin-bottom: 0.4rem;
1014
+ margin-bottom: var(--ds-space-hair);
1227
1015
  }
1228
- .foundry-spark { display: block; width: 100%; height: 54px; }
1229
- .foundry-spark__area { opacity: 0.16; }
1230
- .foundry-spark__line { stroke-width: 1.8; vector-effect: non-scaling-stroke; stroke-linejoin: round; stroke-linecap: round; }
1231
- .foundry__kinds { margin-top: 0.4rem; }
1016
+ .foundry-spark { display: block; width: 100%; height: 54px; color: var(--info); }
1017
+ .foundry-spark--ink { color: var(--ink); }
1018
+ .foundry-spark__area { fill: currentColor; opacity: 0.16; }
1019
+ .foundry-spark__line { fill: none; stroke: currentColor; stroke-width: 1.8; vector-effect: non-scaling-stroke; stroke-linejoin: round; stroke-linecap: round; }
1020
+ .foundry__kinds { margin-top: var(--ds-space-hair); }
1232
1021
  .foundry__kind {
1233
1022
  display: grid;
1234
1023
  grid-template-columns: 8rem 1fr 2rem;
1235
1024
  align-items: center;
1236
- gap: 0.5rem;
1237
- margin: 0.25rem 0;
1025
+ gap: var(--ds-space-hair);
1026
+ margin: 4px 0;
1238
1027
  }
1239
- .foundry__kind-label { font-size: 0.82rem; color: var(--ink); text-transform: capitalize; }
1240
- .foundry__kind-bar { background: var(--bg-frame); border-radius: 3px; height: 0.7rem; overflow: hidden; }
1241
- .foundry__kind-fill { display: block; height: 100%; background: var(--accent); }
1242
- .foundry__kind-n { font-size: 0.8rem; color: var(--ink-soft); text-align: right; }
1028
+ .foundry__kind-label { font-size: var(--ds-text-sm); color: var(--ink); }
1029
+ .foundry__kind-bar { background: var(--glass-strong); border-radius: var(--radius-pill); height: 8px; overflow: hidden; }
1030
+ .foundry__kind-fill { display: block; height: 100%; background: var(--info); }
1031
+ .foundry__kind-n { font-size: var(--ds-text-sm); color: var(--ink-soft); text-align: right; font-variant-numeric: tabular-nums; }
1243
1032
 
1244
- /* Deep-link card (#654): the minimal task/idea/blocker resolver overlay. */
1033
+ /* Deep-link card (#654): the minimal task/idea/blocker resolver overlay. It
1034
+ floats over a scrim, so it is the one thing on the page with a shadow. */
1245
1035
  .deeplink {
1246
- position: fixed; inset: 0; z-index: 200;
1247
- display: flex; align-items: center; justify-content: center;
1248
- background: rgba(42, 33, 16, 0.55); backdrop-filter: blur(2px); padding: 1.5rem;
1036
+ position: fixed;
1037
+ inset: 0;
1038
+ z-index: var(--ds-z-modal);
1039
+ display: flex;
1040
+ align-items: center;
1041
+ justify-content: center;
1042
+ padding: var(--ds-space-md);
1043
+ background: var(--scrim);
1249
1044
  }
1250
1045
  .deeplink__panel {
1251
- position: relative; max-width: 30rem; width: 100%;
1252
- background: var(--bg-card); border: 2px solid var(--rule); border-radius: 5px;
1253
- padding: 1.4rem 1.6rem; box-shadow: 0 10px 40px rgba(42, 33, 16, 0.35);
1046
+ position: relative;
1047
+ max-width: 30rem;
1048
+ width: 100%;
1049
+ background: var(--bg-card);
1050
+ border: var(--line) solid var(--rule-soft);
1051
+ border-radius: var(--ds-radius-panel);
1052
+ padding: var(--ds-space-md) var(--ds-space-gutter);
1053
+ box-shadow: var(--ds-shadow-pop);
1254
1054
  }
1255
1055
  .deeplink__close {
1256
- position: absolute; top: 0.4rem; right: 0.6rem;
1257
- background: none; border: none; cursor: pointer;
1258
- font-size: 1.5rem; line-height: 1; color: var(--ink-soft);
1056
+ position: absolute;
1057
+ top: var(--ds-space-hair);
1058
+ right: var(--ds-space-hair);
1059
+ min-width: 40px;
1060
+ min-height: 40px;
1061
+ border: 0;
1062
+ border-radius: var(--radius-pill);
1063
+ background: none;
1064
+ cursor: pointer;
1065
+ font-size: var(--ds-text-4xl);
1066
+ line-height: 1;
1067
+ color: var(--ink-soft);
1259
1068
  }
1260
- .deeplink__close:hover { color: var(--ink); }
1069
+ .deeplink__close:hover { color: var(--ink); background: var(--glass); }
1261
1070
  .deeplink__kind {
1262
- font-family: var(--font-display); font-size: 0.7rem; letter-spacing: 0.18em;
1263
- color: var(--rule); margin: 0 0 0.3rem;
1071
+ font-family: var(--label-face);
1072
+ font-size: var(--label-size);
1073
+ letter-spacing: var(--label-space);
1074
+ color: var(--ink-faint);
1075
+ margin: 0 0 var(--ds-space-hair);
1264
1076
  }
1265
- .deeplink__title { font-family: var(--font-display); font-size: 1.15rem; color: var(--ink); margin: 0 0 0.4rem; }
1266
- .deeplink__meta { font-size: 0.85rem; color: var(--ink-soft); margin: 0 0 0.6rem; }
1267
- .deeplink__note { font-size: 0.85rem; color: var(--ink-faint); font-style: italic; margin: 0 0 0.6rem; }
1268
- .deeplink__link { display: inline-block; color: var(--sea); font-weight: 600; text-decoration: none; }
1269
- .deeplink__link:hover { text-decoration: underline; }
1077
+ .deeplink__title { font-size: var(--ds-text-3xl); font-weight: 500; color: var(--ink); margin: 0 0 var(--ds-space-hair); }
1078
+ .deeplink__meta { font-size: var(--ds-text-md); color: var(--ink-soft); margin: 0 0 var(--ds-space-xs); }
1079
+ .deeplink__note { font-size: var(--ds-text-md); color: var(--ink-soft); margin: 0 0 var(--ds-space-xs); }
1080
+ .deeplink__link { display: inline-flex; align-items: center; min-height: 24px; font-weight: 500; }
1270
1081
 
1271
- /* task 1475 (idea 280): the fixed accessibility zoom control, styled to the
1272
- ledger (tablet face + gold rule). Always reachable, top-right. */
1273
- .ledger-zoom {
1274
- position: fixed;
1275
- top: 12px;
1276
- right: 12px;
1277
- z-index: 200;
1278
- display: inline-flex;
1279
- align-items: center;
1280
- gap: 5px;
1281
- min-width: 38px;
1282
- height: 38px;
1283
- padding: 0 10px;
1284
- border: 1px solid var(--rule);
1285
- border-radius: 8px;
1286
- background: var(--bg-card);
1287
- color: var(--ink-soft);
1288
- cursor: pointer;
1289
- box-shadow: 0 1px 4px rgba(42, 33, 16, 0.18);
1082
+ /* ---------- Narrow screens ---------- */
1083
+ @media (max-width: 640px) {
1084
+ .status-nav__list {
1085
+ flex-wrap: nowrap;
1086
+ overflow-x: auto;
1087
+ overflow-y: hidden;
1088
+ -webkit-overflow-scrolling: touch;
1089
+ gap: 0 var(--ds-space-sm);
1090
+ scrollbar-width: none;
1091
+ }
1092
+ .status-nav__chip { flex-shrink: 0; }
1093
+ .tablet { padding: var(--ds-space-md) var(--ds-space-sm); scroll-margin-top: 52px; }
1094
+ .tablet__head { flex-wrap: wrap; }
1095
+ /* GDS #191: the filter takes its own row beneath the heading */
1096
+ .tablet__filter { width: 100%; }
1097
+ .leader li:not(.empty) { gap: var(--ds-space-xs); }
1098
+ .leader__login { display: block; margin-left: 0; margin-top: 2px; }
1099
+ main { padding: var(--ds-space-sm) var(--ds-space-sm) var(--ds-space-lg); gap: var(--ds-space-sm); }
1100
+ .herm { padding: var(--ds-space-lg) var(--ds-space-sm) var(--ds-space-md); }
1101
+ .topbar__inner, .status-nav__inner { padding: 0 var(--ds-space-sm); }
1102
+ .world-timeline__thumb { width: 96px; }
1103
+ .foundry__kind { grid-template-columns: 6rem 1fr 2rem; }
1290
1104
  }
1291
- .ledger-zoom:hover { color: var(--ink); background: var(--bg-deep); }
1292
- .ledger-zoom svg { width: 18px; height: 18px; }
1293
- .ledger-zoom--on { color: var(--terracotta); border-color: var(--terracotta); }
1294
- .ledger-zoom__pct {
1295
- font-family: var(--font-body);
1296
- font-size: 13px;
1297
- font-weight: 700;
1298
- font-variant-numeric: tabular-nums;
1299
- line-height: 1;
1105
+ @media (max-width: 480px) {
1106
+ .headline-grid { grid-template-columns: 1fr; }
1300
1107
  }
1301
1108
 
1302
1109
  /* ---------- The Kill Switch (task 1005053) ----------