@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
@@ -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
+ }