@bongos/core 1.19.447 → 1.19.449

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.
@@ -0,0 +1,324 @@
1
+ /* record.css — the RECORD archetype: one row of the ledger, read end to end
2
+ (task 1003305, goal 1000081). Shared by the task page (task.html) and the idea
3
+ page (idea.html), which are the same composition over different facts.
4
+
5
+ THE ARCHETYPE is v3 "the glass hall", the owner's pick from the composition
6
+ round — docs/design/hall-direction-v2.md §6, mock docs/design/mocks/hall/task/v3.html.
7
+ Reading order, top to bottom: the way back and a mono sub line; then ONE panel
8
+ holding the kind eyebrow, the title, the facts, a figure band, the lifecycle
9
+ rail, and the record's sections. The panel is the shell's `.scroll` — v3 has
10
+ exactly three card levels and a fourth would be a design decision, not a
11
+ local override (modules/hall-ui/CLAUDE.md, Hard rules).
12
+
13
+ WHY IT IS ITS OWN SHEET rather than two copies: the task page and the idea
14
+ page differ in their FACTS, not their composition, and a second copy of a
15
+ hundred lines is how the two would drift apart the first time one is touched.
16
+ Page-specific shapes stay page-local (idea.css keeps the grade badge, the
17
+ five answers and the mark control; task.css keeps the lifecycle rail's
18
+ captions and the touches list).
19
+
20
+ Everything below spends the world's real token names. No compat alias
21
+ (--surface / --surface-2 / --border / --border-strong / --accent-weak /
22
+ --accent-text) appears here — they exist for pages nobody has re-skinned, so
23
+ spending one is legal CSS that quietly opts this sheet back out of the world.
24
+ `--line` is a WIDTH; the hairline's colour is --rule / --rule-soft. */
25
+
26
+ /* ---- the way back ------------------------------------------------------- */
27
+ /* These two pages are deliberately not in the sidebar (both are always reached
28
+ from a link), so a deep-linked visitor needs a way back BEFORE the record has
29
+ loaded — which is why the crumb is static markup and not rendered by the page
30
+ script. 3px of padding buys the 24px control floor without changing the line's
31
+ own leading; the link measured 21px on task.html and 20px on idea.html. */
32
+ .rec-crumb {
33
+ display: flex;
34
+ align-items: baseline;
35
+ gap: 16px;
36
+ flex-wrap: wrap;
37
+ margin: 0 0 4px;
38
+ }
39
+ .rec-back {
40
+ display: inline-flex;
41
+ align-items: center;
42
+ gap: 7px;
43
+ min-height: 24px;
44
+ padding: 3px 0;
45
+ color: var(--ink-soft);
46
+ font-size: 13.5px;
47
+ text-transform: lowercase;
48
+ text-decoration: none;
49
+ }
50
+ .rec-back:hover { color: var(--ink); text-decoration: underline; }
51
+ .rec-back__ic { width: 14px; height: 14px; flex: none; stroke: currentColor; fill: none; stroke-width: 1.4; stroke-linecap: round; stroke-linejoin: round; }
52
+ /* The sub line is the record's address, so it is tabular: an id that re-renders
53
+ must not re-space the line it sits in. */
54
+ .rec-sub {
55
+ margin: 0;
56
+ font-family: var(--label-face);
57
+ font-size: var(--label-size);
58
+ letter-spacing: var(--label-space);
59
+ text-transform: var(--label-case);
60
+ color: var(--ink-faint);
61
+ font-variant-numeric: tabular-nums;
62
+ }
63
+
64
+ /* ---- the head of the record --------------------------------------------- */
65
+ .rec-kind {
66
+ display: flex;
67
+ align-items: center;
68
+ gap: 14px;
69
+ flex-wrap: wrap;
70
+ margin: 0 0 14px;
71
+ font-family: var(--label-face);
72
+ font-size: var(--label-size);
73
+ letter-spacing: var(--label-space);
74
+ text-transform: var(--label-case);
75
+ color: var(--ink-faint);
76
+ }
77
+
78
+ /* The ONE place a lifecycle state is coloured. The status vocabulary is the
79
+ sanctioned exception to the Fifteen Rule (DESIGN.md §Reuse) — a failed grade
80
+ must not be salmon on a page whose ship button is also salmon — and its values
81
+ are measured by tests/hall_tokens.mjs, never hand-tuned. */
82
+ .rec-pill {
83
+ display: inline-flex;
84
+ align-items: center;
85
+ min-height: 26px;
86
+ padding: 0 13px;
87
+ border: var(--line) solid var(--rule);
88
+ border-radius: var(--radius-pill);
89
+ background: none;
90
+ font-family: var(--font-body);
91
+ font-size: 12.5px;
92
+ font-weight: 500;
93
+ letter-spacing: 0;
94
+ text-transform: lowercase;
95
+ color: var(--ink-soft);
96
+ }
97
+ .rec-pill--ok { color: var(--ok); background: var(--ok-weak); border-color: color-mix(in srgb, var(--ok) 42%, transparent); }
98
+ .rec-pill--warn { color: var(--warn); background: var(--warn-weak); border-color: color-mix(in srgb, var(--warn) 42%, transparent); }
99
+ .rec-pill--danger { color: var(--danger); background: var(--danger-weak); border-color: color-mix(in srgb, var(--danger) 42%, transparent); }
100
+ .rec-pill--info { color: var(--info); background: var(--info-weak); border-color: color-mix(in srgb, var(--info) 42%, transparent); }
101
+ .rec-pill--sm { min-height: 22px; padding: 0 9px; font-size: 11.5px; }
102
+
103
+ .rec-title {
104
+ margin: 0 0 18px;
105
+ font-family: var(--font-display);
106
+ font-weight: 300;
107
+ font-size: clamp(24px, 2.6vw, 34px);
108
+ line-height: 1.14;
109
+ letter-spacing: -0.032em;
110
+ color: var(--ink);
111
+ text-shadow: var(--type-halo);
112
+ /* NOT --measure. That token is the BODY reading measure (48ch at 15px, ~60
113
+ characters); spent on a 34px display face it caps at ~950px and the title
114
+ runs the width of the panel. A heading's cap is its own em-based one, and
115
+ 24ch is the mock's — measured on the display face, not the body face. */
116
+ max-width: 24ch;
117
+ }
118
+ /* The record's id, quoted from the machine: mono, tabular, and set back from the
119
+ title so the words lead. */
120
+ .rec-title__id {
121
+ font-family: var(--font-mono);
122
+ font-size: 0.56em;
123
+ font-weight: 400;
124
+ letter-spacing: 0;
125
+ color: var(--ink-faint);
126
+ font-variant-numeric: tabular-nums;
127
+ margin-right: 0.5em;
128
+ vertical-align: 0.14em;
129
+ }
130
+
131
+ .rec-meta,
132
+ .rec-note {
133
+ margin: 0 0 8px;
134
+ font-size: 14px;
135
+ color: var(--ink-soft);
136
+ font-variant-numeric: tabular-nums;
137
+ }
138
+ .rec-meta b { font-weight: 500; color: var(--ink); }
139
+
140
+ .rec-goal {
141
+ margin: 18px 0 0;
142
+ display: flex;
143
+ align-items: center;
144
+ gap: 10px;
145
+ flex-wrap: wrap;
146
+ font-size: 14.5px;
147
+ color: var(--ink-soft);
148
+ }
149
+ .rec-goal a {
150
+ display: inline-block;
151
+ min-height: 24px;
152
+ padding: 3px 0;
153
+ line-height: 18px;
154
+ color: var(--ink);
155
+ text-decoration: none;
156
+ border-bottom: var(--line) solid var(--rule);
157
+ }
158
+ .rec-goal a:hover { border-bottom-color: var(--ink); text-decoration: none; }
159
+
160
+ /* ---- the figure band ----------------------------------------------------- */
161
+ /* v2's stat-tile grid is the reference for any figure row the hall renders
162
+ (hall-direction-v2 §6): ONE band divided by vertical hairlines, not four
163
+ separate objects. A figure is DATA, never live, so it is ink and never the
164
+ accent — the One Warm Thing Rule. Only figures the record actually carries are
165
+ drawn: a task with no recorded actual minutes must not look incomplete. */
166
+ .rec-figs {
167
+ display: grid;
168
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
169
+ gap: 0;
170
+ margin: var(--sp-lg) 0 0;
171
+ border-top: var(--line) solid var(--rule-soft);
172
+ }
173
+ .rec-fig { padding: 18px 20px 2px; border-left: var(--line) solid var(--rule-soft); }
174
+ .rec-fig:first-child { border-left: 0; padding-left: 0; }
175
+ .rec-fig__l {
176
+ display: block;
177
+ font-family: var(--label-face);
178
+ font-size: var(--label-size);
179
+ letter-spacing: var(--label-space);
180
+ text-transform: var(--label-case);
181
+ color: var(--ink-faint);
182
+ margin-bottom: 10px;
183
+ }
184
+ .rec-fig__v {
185
+ display: block;
186
+ font-family: var(--font-display);
187
+ font-weight: 300;
188
+ font-size: clamp(26px, 3vw, 40px);
189
+ line-height: 1;
190
+ letter-spacing: -0.035em;
191
+ color: var(--ink);
192
+ font-variant-numeric: tabular-nums;
193
+ }
194
+ /* The unit, one third the size, in the machine's face. */
195
+ .rec-fig__u {
196
+ text-decoration: none;
197
+ font-family: var(--font-mono);
198
+ font-size: 0.36em;
199
+ letter-spacing: 0;
200
+ color: var(--ink-faint);
201
+ margin-left: 0.3em;
202
+ }
203
+
204
+ /* ---- the sections -------------------------------------------------------- */
205
+ .rec-sec { margin: var(--sp-lg) 0 0; }
206
+ .rec-sec__h {
207
+ display: flex;
208
+ align-items: baseline;
209
+ gap: 12px;
210
+ flex-wrap: wrap;
211
+ margin: 0 0 12px;
212
+ font-family: var(--label-face);
213
+ font-size: var(--label-size);
214
+ font-weight: 400;
215
+ letter-spacing: var(--label-space);
216
+ text-transform: var(--label-case);
217
+ color: var(--ink-faint);
218
+ }
219
+ .rec-sec__h em {
220
+ font-style: normal;
221
+ font-family: var(--font-mono);
222
+ font-size: 10px;
223
+ letter-spacing: 0.05em;
224
+ text-transform: lowercase;
225
+ color: var(--ink-faint);
226
+ border: var(--line) solid var(--rule-soft);
227
+ border-radius: var(--radius-pill);
228
+ padding: 2px 8px;
229
+ }
230
+ .rec-body {
231
+ margin: 0;
232
+ font-size: 15px;
233
+ line-height: 1.6;
234
+ color: var(--ink-soft);
235
+ max-width: var(--measure);
236
+ }
237
+ .rec-body b { font-weight: 500; color: var(--ink); }
238
+ /* The description as filed. `--measure` is MEASURED (48ch renders ~60 characters
239
+ in Manrope) — a `ch` is the zero glyph's width, not a character, so do not do
240
+ fresh ch arithmetic here. */
241
+ .rec-desc {
242
+ margin: 0;
243
+ font-size: 15px;
244
+ line-height: 1.65;
245
+ color: var(--ink-soft);
246
+ max-width: var(--measure);
247
+ white-space: pre-wrap;
248
+ overflow-wrap: anywhere;
249
+ }
250
+
251
+ /* v1's bare ledger inside a v3 panel: a hairline on top, air, and the first row
252
+ drops both. The paths are the machine's words, so they take the mono face. */
253
+ .rec-files { list-style: none; margin: 0; padding: 0; }
254
+ .rec-files li {
255
+ border-top: var(--line) solid var(--rule-soft);
256
+ padding: 11px 0;
257
+ font-family: var(--font-mono);
258
+ font-size: 12.5px;
259
+ color: var(--ink-soft);
260
+ overflow-wrap: anywhere;
261
+ }
262
+ .rec-files li:first-child { border-top: 0; padding-top: 0; }
263
+
264
+ .rec-depcols { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: var(--sp-lg); }
265
+ .rec-deplist { list-style: none; margin: 0; padding: 0; }
266
+ .rec-deplist li {
267
+ display: flex;
268
+ align-items: center;
269
+ gap: 12px;
270
+ flex-wrap: wrap;
271
+ border-top: var(--line) solid var(--rule-soft);
272
+ padding: 12px 0;
273
+ }
274
+ .rec-deplist li:first-child { border-top: 0; padding-top: 0; }
275
+ .rec-dep {
276
+ display: inline-flex;
277
+ align-items: baseline;
278
+ gap: 11px;
279
+ flex: 1 1 auto;
280
+ min-width: 0;
281
+ min-height: 24px;
282
+ padding: 2px 0;
283
+ font-size: 14.5px;
284
+ color: var(--ink);
285
+ text-decoration: none;
286
+ }
287
+ .rec-dep:hover { text-decoration: underline; }
288
+ .rec-dep__id {
289
+ flex: none;
290
+ font-family: var(--font-mono);
291
+ font-size: 12px;
292
+ font-weight: 400;
293
+ color: var(--ink-faint);
294
+ font-variant-numeric: tabular-nums;
295
+ }
296
+
297
+ /* ---- the actions --------------------------------------------------------- */
298
+ .rec-actions { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
299
+ /* Where a lifecycle control would be but is not, the record says why in words.
300
+ Nothing here is pressable-or-live, so nothing here is warm. */
301
+ .rec-actnote { margin: 0; flex: 1 1 240px; font-size: 14px; color: var(--ink-soft); max-width: var(--measure); }
302
+
303
+ /* ---- the honest not-found / could-not-load headings ---------------------- */
304
+ /* A real <h1>, not a styled paragraph: the empty and error states are renders
305
+ like any other, and one-header-main-h1 measures the DOM, not the happy path.
306
+ The mock draws these as a bare line, which is where the size comes from. */
307
+ .rec-big {
308
+ margin: 0 0 14px;
309
+ font-family: var(--font-display);
310
+ font-weight: 300;
311
+ font-size: clamp(22px, 2.4vw, 30px);
312
+ line-height: 1.16;
313
+ letter-spacing: -0.03em;
314
+ color: var(--ink);
315
+ text-shadow: var(--type-halo);
316
+ }
317
+
318
+ @media (max-width: 640px) {
319
+ .rec-figs { grid-template-columns: repeat(2, 1fr); }
320
+ .rec-fig { padding: 16px 14px 2px; }
321
+ .rec-fig:nth-child(odd) { border-left: 0; padding-left: 0; }
322
+ .rec-fig:nth-child(n + 3) { border-top: var(--line) solid var(--rule-soft); margin-top: 12px; }
323
+ .rec-title { max-width: none; }
324
+ }
@@ -173,6 +173,11 @@
173
173
  --sidebar-w: var(--sidebar-w-rail);
174
174
  --rail-open: 246px;
175
175
  --content-max: 1120px;
176
+ /* the RIGHT rail — the room a page reserves beside its main column for a
177
+ fixed side panel (the ideas composer's meter). Named here so the reserve
178
+ and the panel are measured from one value; see `.app-content--railed`. */
179
+ --rail-right-w: 17rem;
180
+ --rail-right-gap: 1.5rem;
176
181
 
177
182
  /* ---- spacing: DESIGN.md's rhythm (6/10/14/22/34/52). The four-step
178
183
  --space-* scale task 2179 named aliases onto it, so no ported rule
@@ -879,6 +884,31 @@ main:focus { outline: none; }
879
884
  flex: 1;
880
885
  }
881
886
 
887
+ /* ---- the right rail (task 1003305) ----
888
+ A page whose main column runs beside a fixed side panel asks the SHELL for the
889
+ room instead of reaching into `.app-content > main` itself. ideas.css did the
890
+ latter, and paid for it twice: a page override of shell layout is invisible
891
+ from the shell, and the panel's `top: 6.5rem` hard-coded a topbar height that
892
+ the shell is free to change. Both halves live here so they cannot drift.
893
+ Opt in with `.app-content--railed` on the content wrapper + `.app-rail` on the
894
+ panel; below the breakpoint the panel is an ordinary block in the flow, which
895
+ is the only honest answer on a phone (a readout you cannot see is not one). */
896
+ .app-content--railed { position: relative; }
897
+ .app-rail { margin: var(--sp-md) 0; }
898
+
899
+ @media (min-width: 62rem) {
900
+ .app-content--railed > main { padding-right: calc(var(--rail-right-w) + var(--rail-right-gap)); }
901
+ .app-rail {
902
+ position: fixed;
903
+ top: calc(var(--topbar-h) + var(--rail-right-gap));
904
+ right: var(--rail-right-gap);
905
+ width: var(--rail-right-w);
906
+ max-height: calc(100vh - var(--topbar-h) - var(--rail-right-gap) * 2);
907
+ overflow-y: auto;
908
+ margin: 0;
909
+ }
910
+ }
911
+
882
912
  .app-views .view > .view-zone + .view-zone { margin-top: var(--sp-md); }
883
913
  .view-zone--band {
884
914
  display: grid;
@@ -1221,6 +1251,25 @@ main:focus { outline: none; }
1221
1251
  }
1222
1252
  .page-head__sub { margin: 0; font-size: 13.5px; color: var(--ink-soft); }
1223
1253
 
1254
+ /* The re-skinned page head: the page's own name in v3's LABEL voice, because the
1255
+ display face is saved for section headings and the page's name is the quietest
1256
+ thing on it. The rule above (22px/650) is the pre-shell compat one, and belongs
1257
+ to the pages nobody has re-skinned yet.
1258
+ Promoted here from work.css by task 1003305 when the ideas composer became the
1259
+ third consumer — a modifier on the shell's own .page-head is shell chrome, and
1260
+ a second copy is how the two would have drifted. */
1261
+ .page-head--board .page-head__h {
1262
+ margin: 0 0 6px;
1263
+ font-family: var(--label-face);
1264
+ font-size: 14px;
1265
+ font-weight: 400;
1266
+ letter-spacing: var(--label-space);
1267
+ text-transform: var(--label-case);
1268
+ color: var(--ink);
1269
+ text-shadow: var(--type-halo);
1270
+ }
1271
+ .page-head--board .page-head__sub { font-size: 14px; max-width: var(--measure); }
1272
+
1224
1273
  .hall-nav {
1225
1274
  position: sticky;
1226
1275
  top: var(--topbar-h);
@@ -1462,7 +1511,52 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
1462
1511
  cursor: pointer;
1463
1512
  }
1464
1513
  .btn-accent:hover:not(:disabled) { background: var(--accent-lift); color: var(--accent-on); text-decoration: none; }
1465
- .btn-accent:disabled { background: var(--surface-2); color: var(--ink-faint); cursor: default; }
1514
+ .btn-accent:disabled { background: var(--glass); color: var(--ink-faint); cursor: default; }
1515
+
1516
+ /* `.btn` / `.btn--ghost` — the SECOND button vocabulary in the hall, used by
1517
+ ideas, idea, copy-desk, my-projects and collab. Task 1003305 found it had no
1518
+ rule anywhere in the surface: every one of those buttons was rendering as a
1519
+ browser default control, on a page whose every other shape is a pill. They
1520
+ are not renamed to .btn-accent/.btn-ghost because the class is spelled into
1521
+ markup and into tests/idea_spark_hall.mjs; instead the two vocabularies are
1522
+ made to say the same thing. `.btn` is the accent door and `.btn--ghost` its
1523
+ quiet sibling, which is exactly how the calling pages already use the pair
1524
+ (submit vs. discard, mark vs. withdraw). --accent-on is the dark ink for the
1525
+ salmon; white on it fails AA and DESIGN.md bans it. */
1526
+ .btn {
1527
+ display: inline-flex;
1528
+ align-items: center;
1529
+ justify-content: center;
1530
+ gap: 6px;
1531
+ min-height: 34px;
1532
+ min-width: 74px;
1533
+ padding: 0 16px;
1534
+ font-family: var(--font-body);
1535
+ font-size: 13.5px;
1536
+ font-weight: 500;
1537
+ text-transform: lowercase;
1538
+ color: var(--accent-on);
1539
+ background: var(--accent);
1540
+ /* transparent rather than absent: collab.css's `.btn--quiet` sets only a
1541
+ border-COLOUR, and a modifier cannot paint an edge that was never reserved. */
1542
+ border: var(--line) solid transparent;
1543
+ border-radius: var(--radius-pill);
1544
+ cursor: pointer;
1545
+ }
1546
+ .btn:hover:not(:disabled) { background: var(--accent-lift); color: var(--accent-on); text-decoration: none; }
1547
+ .btn:disabled { background: var(--glass); color: var(--ink-faint); cursor: default; }
1548
+ .btn--ghost {
1549
+ min-height: 30px;
1550
+ min-width: 56px;
1551
+ padding: 0 14px;
1552
+ font-size: 13px;
1553
+ font-weight: 400;
1554
+ color: var(--ink-soft);
1555
+ background: none;
1556
+ border-color: var(--rule);
1557
+ }
1558
+ .btn--ghost:hover:not(:disabled) { background: none; border-color: var(--ink-faint); color: var(--ink); }
1559
+ .btn--ghost:disabled { background: none; color: var(--ink-faint); border-color: var(--rule-soft); }
1466
1560
 
1467
1561
  /* ---------- profile / standing ---------- */
1468
1562
 
@@ -2377,35 +2471,41 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
2377
2471
  cursor: pointer;
2378
2472
  }
2379
2473
  .deeplink-card__close:hover { border-color: var(--ink-faint); color: var(--ink); }
2474
+ /* The record's kind eyebrow, in the label voice — mono in light, the body face
2475
+ in dark. Task 1003305 retired the hand-rolled 11px/600/0.06em copy of that
2476
+ voice for the tokens, so the overlay flips with the rest of the surface. */
2380
2477
  .deeplink-card__kind {
2381
- font-size: 11px;
2382
- font-weight: 600;
2383
- text-transform: uppercase;
2384
- letter-spacing: 0.06em;
2478
+ display: flex;
2479
+ align-items: center;
2480
+ gap: 12px;
2481
+ font-family: var(--label-face);
2482
+ font-size: var(--label-size);
2483
+ letter-spacing: var(--label-space);
2484
+ text-transform: var(--label-case);
2385
2485
  color: var(--ink-faint);
2386
- margin: 0 0 4px;
2486
+ margin: 0 0 12px;
2387
2487
  }
2388
- .deeplink-card__title { font-family: var(--font-display); font-size: 21px; font-weight: 300; letter-spacing: -0.03em; margin: 0 0 8px; }
2389
- .deeplink-card__meta { display: flex; flex-wrap: wrap; gap: 4px 14px; font-size: 12.5px; color: var(--ink-soft); margin: 0 0 10px; }
2488
+ .deeplink-card__title { font-family: var(--font-display); font-size: 21px; font-weight: 300; letter-spacing: -0.03em; line-height: 1.15; margin: 0 0 10px; }
2489
+ .deeplink-card__meta { display: flex; flex-wrap: wrap; gap: 4px 14px; font-size: 12.5px; color: var(--ink-soft); font-variant-numeric: tabular-nums; margin: 0 0 10px; }
2390
2490
  .deeplink-card__summary { font-size: 13.5px; margin: 0 0 10px; }
2391
2491
  .deeplink-card__note { font-size: 12.5px; color: var(--ink-faint); margin: 0; }
2392
2492
  .deeplink-card__link { font-size: 13px; }
2393
2493
  /* task 1753: the deepened TASK body inside the shared record overlay. */
2394
2494
  .td-goal { font-size: 13px; margin: 0 0 10px; }
2495
+ /* Prose, not a box. The panel is already the container, and in v3 tone does the
2496
+ separation — a bordered well inside a card is the card-in-a-card the pick
2497
+ removed. The scroll cap stays: this sits in a modal with its own max-height. */
2395
2498
  .td-desc {
2396
2499
  font-size: 13px;
2397
- line-height: 1.55;
2500
+ line-height: 1.6;
2398
2501
  white-space: pre-wrap;
2399
2502
  word-break: break-word;
2503
+ color: var(--ink-soft);
2400
2504
  margin: 0 0 12px;
2401
- padding: 10px 12px;
2402
- background: var(--surface-2);
2403
- border: 1px solid var(--border);
2404
- border-radius: var(--radius-sm);
2405
2505
  max-height: 42vh;
2406
2506
  overflow-y: auto;
2407
2507
  }
2408
- .td-touches { font-size: 12.5px; color: var(--ink-faint); word-break: break-word; margin: 0 0 12px; }
2508
+ .td-touches { font-size: 12.5px; color: var(--ink-faint); font-family: var(--font-mono); word-break: break-word; margin: 0 0 12px; }
2409
2509
  /* task 1003109: the ship-time VISUAL, rendered directly under the value summary
2410
2510
  it restates. Sized to be READ (this exists so a non-engineer can see a change),
2411
2511
  capped so a tall screenshot can't push the rest of the record off the page, and
@@ -2417,9 +2517,9 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
2417
2517
  max-height: 52vh;
2418
2518
  width: auto;
2419
2519
  height: auto;
2420
- border: 1px solid var(--border);
2520
+ border: var(--line) solid var(--rule-soft);
2421
2521
  border-radius: var(--radius-sm);
2422
- background: var(--surface-2);
2522
+ background: var(--glass);
2423
2523
  }
2424
2524
  .td-visual__caption { font-size: 12.5px; color: var(--ink-faint); margin: 6px 0 0; }
2425
2525
  /* The compact form: a thumbnail beside a value summary in a ship FEED, where the
@@ -2430,49 +2530,83 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
2430
2530
  height: 44px;
2431
2531
  flex: 0 0 auto;
2432
2532
  object-fit: cover;
2433
- border: 1px solid var(--border);
2533
+ border: var(--line) solid var(--rule-soft);
2434
2534
  border-radius: var(--radius-sm);
2435
- background: var(--surface-2);
2535
+ background: var(--glass);
2436
2536
  vertical-align: middle;
2437
2537
  }
2438
- /* Shared small-caps label: overlay section heads and triage form-field labels. */
2439
- .td-section-h, .td-field > span { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-faint); }
2440
- .td-section-h { margin: 0 0 4px; }
2538
+ /* Shared section label: overlay section heads and triage form-field labels, in
2539
+ the label voice rather than a second hand-rolled copy of it. */
2540
+ .td-section-h, .td-field > span {
2541
+ font-family: var(--label-face);
2542
+ font-size: var(--label-size);
2543
+ font-weight: 400;
2544
+ letter-spacing: var(--label-space);
2545
+ text-transform: var(--label-case);
2546
+ color: var(--ink-faint);
2547
+ }
2548
+ .td-section-h { margin: 0 0 8px; }
2441
2549
  .td-deps { margin: 0 0 12px; }
2442
- .td-dep-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 3px; }
2443
- .td-dep { font-size: 13px; color: var(--accent-text); text-decoration: none; }
2550
+ /* v1's bare ledger inside a v3 panel — a hairline on top, air, and the first row
2551
+ drops both. The same row grammar the board's history list took (task 1003304). */
2552
+ .td-dep-list { list-style: none; margin: 0; padding: 0; }
2553
+ .td-dep-list li { border-top: var(--line) solid var(--rule-soft); padding: 10px 0; }
2554
+ .td-dep-list li:first-child { border-top: 0; padding-top: 0; }
2555
+ .td-dep {
2556
+ display: inline-block;
2557
+ font-size: 13px;
2558
+ color: var(--ink);
2559
+ text-decoration: none;
2560
+ min-height: 24px;
2561
+ padding: 3px 0;
2562
+ line-height: 18px;
2563
+ }
2444
2564
  .td-dep:hover { text-decoration: underline; }
2445
2565
  .td-dep-status { color: var(--ink-faint); font-size: 12px; margin-left: 6px; }
2446
- .td-actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin: 14px 0 0; }
2566
+ .td-actions { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin: 18px 0 0; }
2567
+ /* Pill or nothing (DESIGN.md, Shapes): the ghost pill, with --btn--primary the
2568
+ one accent door. It carried a literal `#fff` on the salmon until task 1003305
2569
+ — the exact pairing DESIGN.md bans, because it fails AA. */
2447
2570
  .td-btn {
2571
+ display: inline-flex;
2572
+ align-items: center;
2573
+ justify-content: center;
2448
2574
  font: inherit;
2449
2575
  font-size: 13px;
2450
- padding: 6px 12px;
2451
- border: 1px solid var(--border-strong);
2452
- border-radius: var(--radius-sm);
2453
- background: var(--surface);
2576
+ min-height: 30px;
2577
+ min-width: 56px;
2578
+ padding: 0 14px;
2579
+ border: var(--line) solid var(--rule);
2580
+ border-radius: var(--radius-pill);
2581
+ background: none;
2454
2582
  color: var(--ink-soft);
2583
+ text-transform: lowercase;
2455
2584
  cursor: pointer;
2456
2585
  }
2457
- .td-btn:hover { background: var(--surface-2); }
2458
- .td-btn--primary { background: var(--accent); color: #fff; border-color: transparent; }
2459
- .td-btn--primary:hover { background: var(--accent-deep); }
2460
- .td-btn:disabled { opacity: 0.6; cursor: default; }
2461
- .td-action-note { flex-basis: 100%; font-size: 12.5px; color: var(--warn); margin: 4px 0 0; }
2586
+ .td-btn:hover:not(:disabled) { border-color: var(--ink-faint); color: var(--ink); text-decoration: none; }
2587
+ .td-btn--primary {
2588
+ min-height: 34px;
2589
+ min-width: 74px;
2590
+ padding: 0 16px;
2591
+ font-weight: 500;
2592
+ background: var(--accent);
2593
+ color: var(--accent-on);
2594
+ border-color: var(--accent);
2595
+ }
2596
+ .td-btn--primary:hover:not(:disabled) { background: var(--accent-lift); border-color: var(--accent-lift); color: var(--accent-on); }
2597
+ .td-btn:disabled { color: var(--ink-faint); border-color: var(--rule-soft); cursor: default; }
2598
+ .td-btn--primary:disabled { background: var(--glass); }
2599
+ .td-action-note { flex-basis: 100%; font-size: 12.5px; color: var(--ink-soft); margin: 4px 0 0; }
2462
2600
 
2463
2601
  /* Idea triage inside the record overlay (task 1002447). A two-column grid so
2464
2602
  promote's five fields fit the panel without scrolling; --wide spans both. */
2465
2603
  .td-form { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 10px; margin: 14px 0 0; }
2466
2604
  .td-field { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
2467
2605
  .td-field--wide { grid-column: 1 / -1; }
2606
+ /* The base `select, input` rule already carries the world's field; this only
2607
+ re-states the sizing the two-column grid needs. */
2468
2608
  .td-field input, .td-field select {
2469
- font: inherit;
2470
2609
  font-size: 13px;
2471
- padding: 5px 8px;
2472
- border: 1px solid var(--border-strong);
2473
- border-radius: var(--radius-sm);
2474
- background: var(--surface);
2475
- color: var(--ink);
2476
2610
  min-width: 0;
2477
2611
  max-width: 100%;
2478
2612
  }
@@ -0,0 +1,71 @@
1
+ /* task.css — what the TASK record has that the idea record does not
2
+ (task 1003305, goal 1000081). The shared composition is record.css; this is
3
+ the page's own two shapes.
4
+
5
+ Promoted out of task.html's inline <style>, which was the last substantive
6
+ inline block in the hall and sat at its tests/hall_audit.mjs ratchet with zero
7
+ headroom — so the re-skin could not have added a line to it even if it wanted
8
+ to. Its three rules are gone rather than ported: the back link and the status
9
+ pill are the record archetype's now (.rec-back, .rec-pill), and the claim line
10
+ is an ordinary section. */
11
+
12
+ /* ---- the lifecycle rail -------------------------------------------------- */
13
+ /* The world's signature component, and the answer to "where is this task": five
14
+ beats with exactly ONE lit, which is the same lit-step grammar as the open tab
15
+ and the current nav item. It is a READOUT, not a control — nothing here is
16
+ pressable, so the accent lights only the beat the task is actually on.
17
+ The six GDS statuses fold into five beats because backlog / blocked / ready
18
+ are all "no builder has it yet"; task.js writes the caption that says which. */
19
+ .tk-rail {
20
+ display: grid;
21
+ grid-template-columns: repeat(5, minmax(0, 1fr));
22
+ gap: 0;
23
+ margin: var(--sp-lg) 0 0;
24
+ padding: 0;
25
+ list-style: none;
26
+ }
27
+ .tk-step { border-top: 2px solid var(--rule-soft); padding: 14px 16px 0 0; }
28
+ .tk-step__dot {
29
+ width: 7px;
30
+ height: 7px;
31
+ border-radius: var(--radius-pill);
32
+ border: var(--line) solid var(--ink-faint);
33
+ margin-bottom: 12px;
34
+ }
35
+ .tk-step__n {
36
+ display: block;
37
+ font-family: var(--label-face);
38
+ font-size: var(--label-size);
39
+ letter-spacing: var(--label-space);
40
+ text-transform: var(--label-case);
41
+ color: var(--ink-faint);
42
+ margin-bottom: 5px;
43
+ }
44
+ .tk-step__c { display: block; font-size: 12.5px; line-height: 1.35; color: var(--ink-faint); }
45
+ .tk-step[aria-current="step"] { border-top-color: var(--accent); }
46
+ .tk-step[aria-current="step"] .tk-step__dot { background: var(--accent); border-color: var(--accent); }
47
+ .tk-step[aria-current="step"] .tk-step__n { color: var(--ink); }
48
+ .tk-step[aria-current="step"] .tk-step__c { color: var(--ink-soft); }
49
+
50
+ /* ---- the ship-time visual ------------------------------------------------ */
51
+ /* task 1003109: the same claim as the value summary in another medium, so it
52
+ renders at a size a NON-ENGINEER can actually read rather than as a thumbnail,
53
+ and capped so a tall screenshot cannot push the rest of the record off the
54
+ page. Nothing at all is drawn when a task has no visual. */
55
+ .tk-visual { margin: 0; }
56
+ .tk-visual__img {
57
+ display: block;
58
+ max-width: 100%;
59
+ max-height: 52vh;
60
+ width: auto;
61
+ height: auto;
62
+ border: var(--line) solid var(--rule-soft);
63
+ border-radius: var(--radius-sm);
64
+ background: var(--glass);
65
+ }
66
+ .tk-visual__caption { margin: 8px 0 0; font-size: 12.5px; color: var(--ink-faint); max-width: var(--measure); }
67
+
68
+ @media (max-width: 640px) {
69
+ .tk-rail { grid-template-columns: 1fr; }
70
+ .tk-step { padding: 12px 0 0; }
71
+ }