@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.
- package/.bongos-core.json +96 -36
- package/docs/copy-inventory.md +121 -114
- package/docs/copy-registry.json +377 -331
- package/docs/file-map.md +1 -1
- package/docs/module-api-changelog.md +4 -0
- package/modules/hall-ui/public/diagram-viewer.css +51 -34
- package/modules/hall-ui/public/diagram-viewer.js +4 -1
- package/modules/hall-ui/public/diagrams.css +45 -0
- package/modules/hall-ui/public/diagrams.html +12 -20
- package/modules/hall-ui/public/diagrams.states.json +28 -0
- package/modules/hall-ui/public/idea.css +138 -71
- package/modules/hall-ui/public/idea.html +13 -3
- package/modules/hall-ui/public/idea.js +17 -4
- package/modules/hall-ui/public/idea.states.json +14 -0
- package/modules/hall-ui/public/ideas.css +148 -107
- package/modules/hall-ui/public/ideas.html +15 -5
- package/modules/hall-ui/public/ideas.states.json +15 -0
- package/modules/hall-ui/public/primer.css +92 -400
- package/modules/hall-ui/public/primer.html +68 -26
- package/modules/hall-ui/public/primer.js +107 -308
- package/modules/hall-ui/public/primer.states.json +38 -0
- package/modules/hall-ui/public/ranks.html +9 -1
- package/modules/hall-ui/public/ranks.states.json +1 -1
- package/modules/hall-ui/public/record.css +324 -0
- package/modules/hall-ui/public/roadmap.css +152 -86
- package/modules/hall-ui/public/roadmap.html +6 -1
- package/modules/hall-ui/public/roadmap.states.json +31 -0
- package/modules/hall-ui/public/room.css +441 -0
- package/modules/hall-ui/public/style.css +269 -63
- package/modules/hall-ui/public/task.css +71 -0
- package/modules/hall-ui/public/task.html +15 -32
- package/modules/hall-ui/public/task.js +142 -39
- package/modules/hall-ui/public/task.states.json +14 -0
- package/modules/hall-ui/public/work.css +4 -15
- package/modules/ui-design/kit/serve.js +7 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/hall-preview/server.js +34 -0
- package/src/module-api.js +1 -1
- package/tests/hall_audit.mjs +18 -11
- package/tests/hall_reading_world.mjs +430 -0
- 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
|
|
205
|
-
|
|
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(--
|
|
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:
|
|
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(--
|
|
2271
|
-
border:
|
|
2432
|
+
background: var(--glass);
|
|
2433
|
+
border: var(--line) solid transparent;
|
|
2272
2434
|
border-radius: var(--radius);
|
|
2273
|
-
padding:
|
|
2435
|
+
padding: var(--sp-sm) 16px;
|
|
2274
2436
|
}
|
|
2275
|
-
|
|
2276
|
-
.rank-card--
|
|
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:
|
|
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-
|
|
2284
|
-
font-
|
|
2285
|
-
|
|
2286
|
-
|
|
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-
|
|
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-
|
|
2295
|
-
font-
|
|
2296
|
-
|
|
2297
|
-
letter-spacing:
|
|
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:
|
|
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
|
-
.
|
|
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
|
-
|
|
2382
|
-
|
|
2383
|
-
|
|
2384
|
-
|
|
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
|
|
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
|
|
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.
|
|
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:
|
|
2592
|
+
border: var(--line) solid var(--rule-soft);
|
|
2421
2593
|
border-radius: var(--radius-sm);
|
|
2422
|
-
background: var(--
|
|
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:
|
|
2605
|
+
border: var(--line) solid var(--rule-soft);
|
|
2434
2606
|
border-radius: var(--radius-sm);
|
|
2435
|
-
background: var(--
|
|
2607
|
+
background: var(--glass);
|
|
2436
2608
|
vertical-align: middle;
|
|
2437
2609
|
}
|
|
2438
|
-
/* Shared
|
|
2439
|
-
|
|
2440
|
-
.td-section-h
|
|
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
|
-
|
|
2443
|
-
.
|
|
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:
|
|
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
|
-
|
|
2451
|
-
|
|
2452
|
-
|
|
2453
|
-
|
|
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 {
|
|
2458
|
-
.td-btn--primary {
|
|
2459
|
-
|
|
2460
|
-
|
|
2461
|
-
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
<
|
|
55
|
-
|
|
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
|
-
|
|
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>
|