@bongos/core 1.19.448 → 1.19.450

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.
Files changed (42) hide show
  1. package/.bongos-core.json +96 -36
  2. package/docs/copy-inventory.md +121 -114
  3. package/docs/copy-registry.json +377 -331
  4. package/docs/file-map.md +1 -1
  5. package/docs/module-api-changelog.md +4 -0
  6. package/modules/hall-ui/public/diagram-viewer.css +51 -34
  7. package/modules/hall-ui/public/diagram-viewer.js +4 -1
  8. package/modules/hall-ui/public/diagrams.css +45 -0
  9. package/modules/hall-ui/public/diagrams.html +12 -20
  10. package/modules/hall-ui/public/diagrams.states.json +28 -0
  11. package/modules/hall-ui/public/idea.css +138 -71
  12. package/modules/hall-ui/public/idea.html +13 -3
  13. package/modules/hall-ui/public/idea.js +17 -4
  14. package/modules/hall-ui/public/idea.states.json +14 -0
  15. package/modules/hall-ui/public/ideas.css +148 -107
  16. package/modules/hall-ui/public/ideas.html +15 -5
  17. package/modules/hall-ui/public/ideas.states.json +15 -0
  18. package/modules/hall-ui/public/primer.css +92 -400
  19. package/modules/hall-ui/public/primer.html +68 -26
  20. package/modules/hall-ui/public/primer.js +107 -308
  21. package/modules/hall-ui/public/primer.states.json +38 -0
  22. package/modules/hall-ui/public/ranks.html +9 -1
  23. package/modules/hall-ui/public/ranks.states.json +1 -1
  24. package/modules/hall-ui/public/record.css +324 -0
  25. package/modules/hall-ui/public/roadmap.css +152 -86
  26. package/modules/hall-ui/public/roadmap.html +6 -1
  27. package/modules/hall-ui/public/roadmap.states.json +31 -0
  28. package/modules/hall-ui/public/room.css +441 -0
  29. package/modules/hall-ui/public/style.css +269 -63
  30. package/modules/hall-ui/public/task.css +71 -0
  31. package/modules/hall-ui/public/task.html +15 -32
  32. package/modules/hall-ui/public/task.js +142 -39
  33. package/modules/hall-ui/public/task.states.json +14 -0
  34. package/modules/hall-ui/public/work.css +4 -15
  35. package/modules/ui-design/kit/serve.js +7 -1
  36. package/package-lock.json +2 -2
  37. package/package.json +1 -1
  38. package/scripts/hall-preview/server.js +34 -0
  39. package/src/module-api.js +1 -1
  40. package/tests/hall_audit.mjs +18 -11
  41. package/tests/hall_reading_world.mjs +430 -0
  42. package/tests/hall_record_world.mjs +412 -0
@@ -173,6 +173,16 @@
173
173
  --sidebar-w: var(--sidebar-w-rail);
174
174
  --rail-open: 246px;
175
175
  --content-max: 1120px;
176
+ /* the READING ceiling (task 1003306). A reading room is narrower than a
177
+ working surface: past ~1010px the article card is more empty ground than
178
+ page and reads as a void, so the room's head and its two columns share one
179
+ cap rather than each carrying a literal. */
180
+ --room-max: 1010px;
181
+ /* the RIGHT rail — the room a page reserves beside its main column for a
182
+ fixed side panel (the ideas composer's meter). Named here so the reserve
183
+ and the panel are measured from one value; see `.app-content--railed`. */
184
+ --rail-right-w: 17rem;
185
+ --rail-right-gap: 1.5rem;
176
186
 
177
187
  /* ---- spacing: DESIGN.md's rhythm (6/10/14/22/34/52). The four-step
178
188
  --space-* scale task 2179 named aliases onto it, so no ported rule
@@ -201,12 +211,18 @@
201
211
  --shadow-pop: 0 18px 40px rgba(0, 0, 0, .28);
202
212
 
203
213
  /* ---- z ladder — content overlays (rank tips z-50, modals z-50, toast z-100,
204
- copy-toast z-1000, deeplink z-2000, diagram fullscreen z-9999) must beat
205
- the chrome; the mobile drawer sits above chrome but below dialogs. ---- */
214
+ copy-toast z-1000, deeplink z-2000) must beat the chrome; the mobile drawer
215
+ sits above chrome but below dialogs. The two ends belong to the reading
216
+ rooms and were hand-written numbers until task 1003306 named them: the
217
+ reading hairline sits UNDER the topbar so it reads as the article's
218
+ progress and not as app chrome, and the diagram's fullscreen canvas is the
219
+ top of the whole ladder because it covers the shell entirely. ---- */
220
+ --z-progress: 25;
206
221
  --z-topbar: 30;
207
222
  --z-sidebar: 40;
208
223
  --z-scrim: 140;
209
224
  --z-drawer: 150;
225
+ --z-diagram-full: 9999;
210
226
 
211
227
  /* ---- the hall's own plate: the declared seam, deferred by the owner
212
228
  ("decide after the shell lands", 2026-08-30). The hall's plate was
@@ -879,6 +895,31 @@ main:focus { outline: none; }
879
895
  flex: 1;
880
896
  }
881
897
 
898
+ /* ---- the right rail (task 1003305) ----
899
+ A page whose main column runs beside a fixed side panel asks the SHELL for the
900
+ room instead of reaching into `.app-content > main` itself. ideas.css did the
901
+ latter, and paid for it twice: a page override of shell layout is invisible
902
+ from the shell, and the panel's `top: 6.5rem` hard-coded a topbar height that
903
+ the shell is free to change. Both halves live here so they cannot drift.
904
+ Opt in with `.app-content--railed` on the content wrapper + `.app-rail` on the
905
+ panel; below the breakpoint the panel is an ordinary block in the flow, which
906
+ is the only honest answer on a phone (a readout you cannot see is not one). */
907
+ .app-content--railed { position: relative; }
908
+ .app-rail { margin: var(--sp-md) 0; }
909
+
910
+ @media (min-width: 62rem) {
911
+ .app-content--railed > main { padding-right: calc(var(--rail-right-w) + var(--rail-right-gap)); }
912
+ .app-rail {
913
+ position: fixed;
914
+ top: calc(var(--topbar-h) + var(--rail-right-gap));
915
+ right: var(--rail-right-gap);
916
+ width: var(--rail-right-w);
917
+ max-height: calc(100vh - var(--topbar-h) - var(--rail-right-gap) * 2);
918
+ overflow-y: auto;
919
+ margin: 0;
920
+ }
921
+ }
922
+
882
923
  .app-views .view > .view-zone + .view-zone { margin-top: var(--sp-md); }
883
924
  .view-zone--band {
884
925
  display: grid;
@@ -1221,6 +1262,72 @@ main:focus { outline: none; }
1221
1262
  }
1222
1263
  .page-head__sub { margin: 0; font-size: 13.5px; color: var(--ink-soft); }
1223
1264
 
1265
+ /* The re-skinned page head: the page's own name in v3's LABEL voice, because the
1266
+ display face is saved for section headings and the page's name is the quietest
1267
+ thing on it. The rule above (22px/650) is the pre-shell compat one, and belongs
1268
+ to the pages nobody has re-skinned yet.
1269
+ Promoted here from work.css by task 1003305 when the ideas composer became the
1270
+ third consumer — a modifier on the shell's own .page-head is shell chrome, and
1271
+ a second copy is how the two would have drifted. */
1272
+ .page-head--board .page-head__h {
1273
+ margin: 0 0 6px;
1274
+ font-family: var(--label-face);
1275
+ font-size: 14px;
1276
+ font-weight: 400;
1277
+ letter-spacing: var(--label-space);
1278
+ text-transform: var(--label-case);
1279
+ color: var(--ink);
1280
+ text-shadow: var(--type-halo);
1281
+ }
1282
+ .page-head--board .page-head__sub { font-size: 14px; max-width: var(--measure); }
1283
+
1284
+ /* The READING-ROOM page head (task 1003306, mock docs/design/mocks/hall/reading/v3.html).
1285
+ The board's head is quiet BECAUSE the board is a working surface and the page's
1286
+ name is the least interesting thing on it. A reading room is the opposite: the
1287
+ document IS the page, so its name is the largest thing in the first viewport,
1288
+ lowercase in the display face over the ground, with the label voice spent on a
1289
+ one-word eyebrow above it. Two voices, one per archetype — the divergence is
1290
+ the owner's pick, not drift.
1291
+ The sub takes --measure because it is body prose. The h1 does NOT: --measure is
1292
+ the BODY measure, and spending it on a display line caps it near 950px and lets
1293
+ the title run the column's width (tests/hall_record_world.mjs §8). A heading's
1294
+ cap is the room's own --room-max, which is a layout ceiling, not a measure.
1295
+ The modifier carries the VOICE only. The room's WIDTH belongs to room.css,
1296
+ which caps the head and the column it heads from one value — so a page that
1297
+ takes the voice without loading the archetype (Ranks) keeps the shell's width
1298
+ for both, and never ends up with a 1010px head over 1120px cards. */
1299
+ .page-head--room { padding: var(--sp-xl) 0 var(--sp-lg); margin: 0; }
1300
+ .page-head--room .page-head__eyebrow {
1301
+ margin: 0 0 14px;
1302
+ font-family: var(--label-face);
1303
+ font-size: var(--label-size);
1304
+ font-weight: 400;
1305
+ letter-spacing: var(--label-space);
1306
+ text-transform: var(--label-case);
1307
+ color: var(--ink-faint);
1308
+ }
1309
+ .page-head--room .page-head__h {
1310
+ margin: 0;
1311
+ font-family: var(--font-display);
1312
+ font-weight: 300;
1313
+ font-size: clamp(34px, 4.6vw, 58px);
1314
+ line-height: 1.02;
1315
+ letter-spacing: -0.042em;
1316
+ text-transform: lowercase;
1317
+ color: var(--ink);
1318
+ text-shadow: var(--type-halo);
1319
+ }
1320
+ .page-head--room .page-head__sub {
1321
+ margin: var(--sp-md) 0 0;
1322
+ max-width: var(--measure);
1323
+ font-size: 16px;
1324
+ color: var(--ink-soft);
1325
+ }
1326
+ @media (max-width: 760px) {
1327
+ .page-head--room { padding-top: var(--sp-lg); }
1328
+ .page-head--room .page-head__h { font-size: 34px; }
1329
+ }
1330
+
1224
1331
  .hall-nav {
1225
1332
  position: sticky;
1226
1333
  top: var(--topbar-h);
@@ -1462,7 +1569,52 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
1462
1569
  cursor: pointer;
1463
1570
  }
1464
1571
  .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; }
1572
+ .btn-accent:disabled { background: var(--glass); color: var(--ink-faint); cursor: default; }
1573
+
1574
+ /* `.btn` / `.btn--ghost` — the SECOND button vocabulary in the hall, used by
1575
+ ideas, idea, copy-desk, my-projects and collab. Task 1003305 found it had no
1576
+ rule anywhere in the surface: every one of those buttons was rendering as a
1577
+ browser default control, on a page whose every other shape is a pill. They
1578
+ are not renamed to .btn-accent/.btn-ghost because the class is spelled into
1579
+ markup and into tests/idea_spark_hall.mjs; instead the two vocabularies are
1580
+ made to say the same thing. `.btn` is the accent door and `.btn--ghost` its
1581
+ quiet sibling, which is exactly how the calling pages already use the pair
1582
+ (submit vs. discard, mark vs. withdraw). --accent-on is the dark ink for the
1583
+ salmon; white on it fails AA and DESIGN.md bans it. */
1584
+ .btn {
1585
+ display: inline-flex;
1586
+ align-items: center;
1587
+ justify-content: center;
1588
+ gap: 6px;
1589
+ min-height: 34px;
1590
+ min-width: 74px;
1591
+ padding: 0 16px;
1592
+ font-family: var(--font-body);
1593
+ font-size: 13.5px;
1594
+ font-weight: 500;
1595
+ text-transform: lowercase;
1596
+ color: var(--accent-on);
1597
+ background: var(--accent);
1598
+ /* transparent rather than absent: collab.css's `.btn--quiet` sets only a
1599
+ border-COLOUR, and a modifier cannot paint an edge that was never reserved. */
1600
+ border: var(--line) solid transparent;
1601
+ border-radius: var(--radius-pill);
1602
+ cursor: pointer;
1603
+ }
1604
+ .btn:hover:not(:disabled) { background: var(--accent-lift); color: var(--accent-on); text-decoration: none; }
1605
+ .btn:disabled { background: var(--glass); color: var(--ink-faint); cursor: default; }
1606
+ .btn--ghost {
1607
+ min-height: 30px;
1608
+ min-width: 56px;
1609
+ padding: 0 14px;
1610
+ font-size: 13px;
1611
+ font-weight: 400;
1612
+ color: var(--ink-soft);
1613
+ background: none;
1614
+ border-color: var(--rule);
1615
+ }
1616
+ .btn--ghost:hover:not(:disabled) { background: none; border-color: var(--ink-faint); color: var(--ink); }
1617
+ .btn--ghost:disabled { background: none; color: var(--ink-faint); border-color: var(--rule-soft); }
1466
1618
 
1467
1619
  /* ---------- profile / standing ---------- */
1468
1620
 
@@ -2251,7 +2403,17 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
2251
2403
  .task__body { grid-column: 1 / -1; }
2252
2404
  }
2253
2405
 
2254
- /* ---------- ranks page ---------- */
2406
+ /* ---------- ranks page ----------
2407
+ Re-skinned into the chrome world by task 1003306 (goal 1000081). Ranks is a
2408
+ reading room by archetype — a document about the ladder — so it takes the
2409
+ room's page head (.page-head--room) and the room's voice on its labels, but
2410
+ not room.css: it has no article, no table of contents and no figures, and a
2411
+ sheet loaded for one max-width is a request spent on nothing.
2412
+ The rank card is `.scroll--quiet`'s level expressed as a list row: a tone one
2413
+ step further from the ground than the panel it sits in, with the edge
2414
+ reserved as transparent so a modifier can draw one without the base having
2415
+ to. The compat aliases are retired here; the badges above still spend them,
2416
+ because they render on every page in the hall and belong to 1003308. */
2255
2417
 
2256
2418
  .ranks-standing {
2257
2419
  display: grid;
@@ -2260,47 +2422,51 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
2260
2422
  align-items: center;
2261
2423
  }
2262
2424
  .ranks-standing__badge { display: flex; }
2263
- .ranks-standing__title { font-weight: 650; font-size: 15px; }
2264
- .ranks-standing__blurb { grid-column: 1 / -1; font-size: 13.5px; color: var(--ink-soft); }
2425
+ .ranks-standing__title { font-family: var(--font-display); font-weight: 300; font-size: 19px; letter-spacing: -0.02em; }
2426
+ .ranks-standing__blurb { grid-column: 1 / -1; font-size: 13.5px; color: var(--ink-soft); max-width: var(--measure); }
2265
2427
  .ranks-standing__next { grid-column: 1 / -1; font-size: 13px; color: var(--ink-faint); }
2266
2428
  @media (max-width: 540px) { .ranks-standing { grid-template-columns: minmax(0, 1fr); } }
2267
2429
 
2268
2430
  .ranks-ladder { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
2269
2431
  .rank-card {
2270
- background: var(--surface);
2271
- border: 1px solid var(--border);
2432
+ background: var(--glass);
2433
+ border: var(--line) solid transparent;
2272
2434
  border-radius: var(--radius);
2273
- padding: 14px 16px;
2435
+ padding: var(--sp-sm) 16px;
2274
2436
  }
2275
- .rank-card--current { border-color: color-mix(in srgb, var(--accent) 45%, var(--border)); background: var(--accent-weak); }
2276
- .rank-card--next { border-style: dashed; }
2437
+ /* the reader's own rung is the one warm thing on the ladder */
2438
+ .rank-card--current { background: var(--accent-tint); border-color: color-mix(in srgb, var(--accent) 45%, transparent); }
2439
+ .rank-card--next { border-style: dashed; border-color: var(--rule); }
2277
2440
  .rank-card--sealed { opacity: 0.7; }
2278
2441
  .rank-card--placeholder { color: var(--ink-faint); }
2279
2442
  .rank-card__head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
2280
- .rank-card__title { font-weight: 650; font-size: 14px; }
2443
+ .rank-card__title { font-family: var(--font-display); font-weight: 400; font-size: 16px; letter-spacing: -0.02em; }
2281
2444
  .rank-card__status {
2282
2445
  margin-left: auto;
2283
- font-size: 11px;
2284
- font-weight: 600;
2285
- letter-spacing: 0.05em;
2286
- text-transform: uppercase;
2446
+ font-family: var(--label-face);
2447
+ font-size: var(--label-size);
2448
+ font-weight: 400;
2449
+ letter-spacing: var(--label-space);
2450
+ text-transform: var(--label-case);
2287
2451
  }
2288
- .rank-card__status--current { color: var(--accent-text); }
2452
+ .rank-card__status--current { color: var(--accent-ink); }
2289
2453
  .rank-card__status--next { color: var(--info); }
2290
2454
  .rank-card__status--sealed { color: var(--ink-faint); }
2291
- .rank-card__blurb { font-size: 13px; color: var(--ink-soft); margin: 6px 0; }
2455
+ .rank-card__blurb { font-size: 13px; color: var(--ink-soft); margin: 6px 0; max-width: var(--measure); }
2292
2456
  .rank-card__blurb--sealed { font-style: italic; }
2293
2457
  .rank-card__unlocks-label {
2294
- font-size: 11px;
2295
- font-weight: 600;
2296
- text-transform: uppercase;
2297
- letter-spacing: 0.06em;
2458
+ font-family: var(--label-face);
2459
+ font-size: var(--label-size);
2460
+ font-weight: 400;
2461
+ letter-spacing: var(--label-space);
2462
+ text-transform: var(--label-case);
2298
2463
  color: var(--ink-faint);
2299
- margin: 8px 0 4px;
2464
+ margin: 10px 0 4px;
2300
2465
  }
2301
- .rank-card__list { margin: 0; padding-left: 18px; font-size: 13px; color: var(--ink-soft); }
2466
+ .rank-card__list { margin: 0; padding-left: 18px; font-size: 13px; color: var(--ink-soft); max-width: var(--measure); }
2302
2467
  .rank-card__list li { margin: 2px 0; }
2303
- .ranks-rise__body { font-size: 13.5px; }
2468
+ .rank-card__list li::marker { color: var(--ink-faint); }
2469
+ .ranks-rise__body { font-size: 13.5px; max-width: var(--measure); }
2304
2470
  .ranks-rise__body p { margin: 8px 0; }
2305
2471
 
2306
2472
  /* ---------- toast + copy toast + deep-link overlay ---------- */
@@ -2377,35 +2543,41 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
2377
2543
  cursor: pointer;
2378
2544
  }
2379
2545
  .deeplink-card__close:hover { border-color: var(--ink-faint); color: var(--ink); }
2546
+ /* The record's kind eyebrow, in the label voice — mono in light, the body face
2547
+ in dark. Task 1003305 retired the hand-rolled 11px/600/0.06em copy of that
2548
+ voice for the tokens, so the overlay flips with the rest of the surface. */
2380
2549
  .deeplink-card__kind {
2381
- font-size: 11px;
2382
- font-weight: 600;
2383
- text-transform: uppercase;
2384
- letter-spacing: 0.06em;
2550
+ display: flex;
2551
+ align-items: center;
2552
+ gap: 12px;
2553
+ font-family: var(--label-face);
2554
+ font-size: var(--label-size);
2555
+ letter-spacing: var(--label-space);
2556
+ text-transform: var(--label-case);
2385
2557
  color: var(--ink-faint);
2386
- margin: 0 0 4px;
2558
+ margin: 0 0 12px;
2387
2559
  }
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; }
2560
+ .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; }
2561
+ .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
2562
  .deeplink-card__summary { font-size: 13.5px; margin: 0 0 10px; }
2391
2563
  .deeplink-card__note { font-size: 12.5px; color: var(--ink-faint); margin: 0; }
2392
2564
  .deeplink-card__link { font-size: 13px; }
2393
2565
  /* task 1753: the deepened TASK body inside the shared record overlay. */
2394
2566
  .td-goal { font-size: 13px; margin: 0 0 10px; }
2567
+ /* Prose, not a box. The panel is already the container, and in v3 tone does the
2568
+ separation — a bordered well inside a card is the card-in-a-card the pick
2569
+ removed. The scroll cap stays: this sits in a modal with its own max-height. */
2395
2570
  .td-desc {
2396
2571
  font-size: 13px;
2397
- line-height: 1.55;
2572
+ line-height: 1.6;
2398
2573
  white-space: pre-wrap;
2399
2574
  word-break: break-word;
2575
+ color: var(--ink-soft);
2400
2576
  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
2577
  max-height: 42vh;
2406
2578
  overflow-y: auto;
2407
2579
  }
2408
- .td-touches { font-size: 12.5px; color: var(--ink-faint); word-break: break-word; margin: 0 0 12px; }
2580
+ .td-touches { font-size: 12.5px; color: var(--ink-faint); font-family: var(--font-mono); word-break: break-word; margin: 0 0 12px; }
2409
2581
  /* task 1003109: the ship-time VISUAL, rendered directly under the value summary
2410
2582
  it restates. Sized to be READ (this exists so a non-engineer can see a change),
2411
2583
  capped so a tall screenshot can't push the rest of the record off the page, and
@@ -2417,9 +2589,9 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
2417
2589
  max-height: 52vh;
2418
2590
  width: auto;
2419
2591
  height: auto;
2420
- border: 1px solid var(--border);
2592
+ border: var(--line) solid var(--rule-soft);
2421
2593
  border-radius: var(--radius-sm);
2422
- background: var(--surface-2);
2594
+ background: var(--glass);
2423
2595
  }
2424
2596
  .td-visual__caption { font-size: 12.5px; color: var(--ink-faint); margin: 6px 0 0; }
2425
2597
  /* The compact form: a thumbnail beside a value summary in a ship FEED, where the
@@ -2430,49 +2602,83 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
2430
2602
  height: 44px;
2431
2603
  flex: 0 0 auto;
2432
2604
  object-fit: cover;
2433
- border: 1px solid var(--border);
2605
+ border: var(--line) solid var(--rule-soft);
2434
2606
  border-radius: var(--radius-sm);
2435
- background: var(--surface-2);
2607
+ background: var(--glass);
2436
2608
  vertical-align: middle;
2437
2609
  }
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; }
2610
+ /* Shared section label: overlay section heads and triage form-field labels, in
2611
+ the label voice rather than a second hand-rolled copy of it. */
2612
+ .td-section-h, .td-field > span {
2613
+ font-family: var(--label-face);
2614
+ font-size: var(--label-size);
2615
+ font-weight: 400;
2616
+ letter-spacing: var(--label-space);
2617
+ text-transform: var(--label-case);
2618
+ color: var(--ink-faint);
2619
+ }
2620
+ .td-section-h { margin: 0 0 8px; }
2441
2621
  .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; }
2622
+ /* v1's bare ledger inside a v3 panel — a hairline on top, air, and the first row
2623
+ drops both. The same row grammar the board's history list took (task 1003304). */
2624
+ .td-dep-list { list-style: none; margin: 0; padding: 0; }
2625
+ .td-dep-list li { border-top: var(--line) solid var(--rule-soft); padding: 10px 0; }
2626
+ .td-dep-list li:first-child { border-top: 0; padding-top: 0; }
2627
+ .td-dep {
2628
+ display: inline-block;
2629
+ font-size: 13px;
2630
+ color: var(--ink);
2631
+ text-decoration: none;
2632
+ min-height: 24px;
2633
+ padding: 3px 0;
2634
+ line-height: 18px;
2635
+ }
2444
2636
  .td-dep:hover { text-decoration: underline; }
2445
2637
  .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; }
2638
+ .td-actions { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin: 18px 0 0; }
2639
+ /* Pill or nothing (DESIGN.md, Shapes): the ghost pill, with --btn--primary the
2640
+ one accent door. It carried a literal `#fff` on the salmon until task 1003305
2641
+ — the exact pairing DESIGN.md bans, because it fails AA. */
2447
2642
  .td-btn {
2643
+ display: inline-flex;
2644
+ align-items: center;
2645
+ justify-content: center;
2448
2646
  font: inherit;
2449
2647
  font-size: 13px;
2450
- padding: 6px 12px;
2451
- border: 1px solid var(--border-strong);
2452
- border-radius: var(--radius-sm);
2453
- background: var(--surface);
2648
+ min-height: 30px;
2649
+ min-width: 56px;
2650
+ padding: 0 14px;
2651
+ border: var(--line) solid var(--rule);
2652
+ border-radius: var(--radius-pill);
2653
+ background: none;
2454
2654
  color: var(--ink-soft);
2655
+ text-transform: lowercase;
2455
2656
  cursor: pointer;
2456
2657
  }
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; }
2658
+ .td-btn:hover:not(:disabled) { border-color: var(--ink-faint); color: var(--ink); text-decoration: none; }
2659
+ .td-btn--primary {
2660
+ min-height: 34px;
2661
+ min-width: 74px;
2662
+ padding: 0 16px;
2663
+ font-weight: 500;
2664
+ background: var(--accent);
2665
+ color: var(--accent-on);
2666
+ border-color: var(--accent);
2667
+ }
2668
+ .td-btn--primary:hover:not(:disabled) { background: var(--accent-lift); border-color: var(--accent-lift); color: var(--accent-on); }
2669
+ .td-btn:disabled { color: var(--ink-faint); border-color: var(--rule-soft); cursor: default; }
2670
+ .td-btn--primary:disabled { background: var(--glass); }
2671
+ .td-action-note { flex-basis: 100%; font-size: 12.5px; color: var(--ink-soft); margin: 4px 0 0; }
2462
2672
 
2463
2673
  /* Idea triage inside the record overlay (task 1002447). A two-column grid so
2464
2674
  promote's five fields fit the panel without scrolling; --wide spans both. */
2465
2675
  .td-form { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 10px; margin: 14px 0 0; }
2466
2676
  .td-field { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
2467
2677
  .td-field--wide { grid-column: 1 / -1; }
2678
+ /* The base `select, input` rule already carries the world's field; this only
2679
+ re-states the sizing the two-column grid needs. */
2468
2680
  .td-field input, .td-field select {
2469
- font: inherit;
2470
2681
  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
2682
  min-width: 0;
2477
2683
  max-width: 100%;
2478
2684
  }
@@ -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
+ }
@@ -9,35 +9,11 @@
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
11
  <link rel="stylesheet" href="/builders/style.css?v=2026-07-03-roadmap1">
12
- <style>
13
- /* Page-local styles for the task-detail page (task 751) — the full-page
14
- replacement for the old #/task/N overlay (task-detail.js). Reuses the
15
- overlay's .deeplink-card__*/.td-* content classes (style.css) since the
16
- body markup is the same shape, just not wrapped in a modal panel. */
17
-
18
- .task-detail__back { font-size: 13px; color: var(--ink-soft); text-decoration: none; display: inline-block; margin-bottom: 10px; }
19
- .task-detail__back:hover { color: var(--ink); text-decoration: underline; }
20
-
21
- .task-status-pill {
22
- display: inline-flex; align-items: center; height: 20px; padding: 0 10px;
23
- border-radius: 999px; font-size: 12px; font-weight: 600;
24
- background: var(--surface-2); border: 1px solid var(--border); color: var(--ink-soft);
25
- text-transform: capitalize;
26
- }
27
- .task-status-pill--ready,
28
- .task-status-pill--shipped,
29
- .task-status-pill--confirmed { background: var(--ok-weak); color: var(--ok); border-color: color-mix(in srgb, var(--ok) 30%, transparent); }
30
- .task-status-pill--active,
31
- .task-status-pill--completed { background: var(--accent-weak); color: var(--accent-text); border-color: color-mix(in srgb, var(--accent) 30%, transparent); }
32
- .task-status-pill--blocked,
33
- .task-status-pill--backlog { background: var(--warn-weak); color: var(--warn); border-color: color-mix(in srgb, var(--warn) 30%, transparent); }
34
-
35
- .task-detail__claim {
36
- font-size: 13px; color: var(--ink-soft); margin: 0 0 12px;
37
- display: flex; flex-wrap: wrap; gap: 4px 8px; align-items: baseline;
38
- }
39
- .task-detail__claim strong { color: var(--ink); font-weight: 600; }
40
- </style>
12
+ <!-- The record archetype (shared with idea.html) and this page's own two
13
+ shapes. Promoted out of an inline <style> by task 1003305 — the block was
14
+ the hall's last substantive one and sat at its hall_audit ratchet. -->
15
+ <link rel="stylesheet" href="/builders/record.css">
16
+ <link rel="stylesheet" href="/builders/task.css">
41
17
  </head>
42
18
  <body data-page="task" data-page-title="Task">
43
19
 
@@ -51,14 +27,21 @@
51
27
  <!-- task 2175: the breadcrumb sits in the page head, above the card, so a
52
28
  deep-linked visitor (this page is deliberately not in the nav) has a
53
29
  way back before the task body has loaded. -->
54
- <a class="task-detail__back" href="/work">← Back to Tasks</a>
55
- <p class="page-head__sub" id="task-sub">Loading task…</p>
30
+ <div class="rec-crumb">
31
+ <a class="rec-back" href="/work">
32
+ <svg class="rec-back__ic" viewBox="0 0 16 16" aria-hidden="true"><path d="M9.4 3.6 5 8l4.4 4.4"/><path d="M5 8h7.2"/></svg>Back to tasks</a>
33
+ <p class="rec-sub" id="task-sub">Loading task</p>
34
+ </div>
56
35
  </div>
57
36
 
58
37
  <main id="hall-main">
59
38
  <section class="scroll" id="task-scroll" aria-labelledby="task-h">
60
39
  <div id="task-body">
61
- <p class="deeplink-card__title" id="task-h">Loading…</p>
40
+ <!-- The h1 is present in EVERY state, including this one: the
41
+ one-header-main-h1 floor measures the rendered DOM, and a page
42
+ whose heading only appears once a fetch lands has none for the
43
+ whole of the load, the not-found and the error renders. -->
44
+ <h1 class="rec-big" id="task-h">Loading the task</h1>
62
45
  </div>
63
46
  </section>
64
47
  </main>