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