@bongos/core 1.19.447 → 1.19.449
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.bongos-core.json +55 -25
- package/docs/copy-inventory.md +60 -49
- package/docs/copy-registry.json +249 -117
- package/docs/module-api-changelog.md +4 -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/record.css +324 -0
- package/modules/hall-ui/public/style.css +173 -39
- 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 +5 -0
- package/src/module-api.js +1 -1
- package/tests/hall_audit.mjs +4 -1
- 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
|
+
}
|
|
@@ -173,6 +173,11 @@
|
|
|
173
173
|
--sidebar-w: var(--sidebar-w-rail);
|
|
174
174
|
--rail-open: 246px;
|
|
175
175
|
--content-max: 1120px;
|
|
176
|
+
/* the RIGHT rail — the room a page reserves beside its main column for a
|
|
177
|
+
fixed side panel (the ideas composer's meter). Named here so the reserve
|
|
178
|
+
and the panel are measured from one value; see `.app-content--railed`. */
|
|
179
|
+
--rail-right-w: 17rem;
|
|
180
|
+
--rail-right-gap: 1.5rem;
|
|
176
181
|
|
|
177
182
|
/* ---- spacing: DESIGN.md's rhythm (6/10/14/22/34/52). The four-step
|
|
178
183
|
--space-* scale task 2179 named aliases onto it, so no ported rule
|
|
@@ -879,6 +884,31 @@ main:focus { outline: none; }
|
|
|
879
884
|
flex: 1;
|
|
880
885
|
}
|
|
881
886
|
|
|
887
|
+
/* ---- the right rail (task 1003305) ----
|
|
888
|
+
A page whose main column runs beside a fixed side panel asks the SHELL for the
|
|
889
|
+
room instead of reaching into `.app-content > main` itself. ideas.css did the
|
|
890
|
+
latter, and paid for it twice: a page override of shell layout is invisible
|
|
891
|
+
from the shell, and the panel's `top: 6.5rem` hard-coded a topbar height that
|
|
892
|
+
the shell is free to change. Both halves live here so they cannot drift.
|
|
893
|
+
Opt in with `.app-content--railed` on the content wrapper + `.app-rail` on the
|
|
894
|
+
panel; below the breakpoint the panel is an ordinary block in the flow, which
|
|
895
|
+
is the only honest answer on a phone (a readout you cannot see is not one). */
|
|
896
|
+
.app-content--railed { position: relative; }
|
|
897
|
+
.app-rail { margin: var(--sp-md) 0; }
|
|
898
|
+
|
|
899
|
+
@media (min-width: 62rem) {
|
|
900
|
+
.app-content--railed > main { padding-right: calc(var(--rail-right-w) + var(--rail-right-gap)); }
|
|
901
|
+
.app-rail {
|
|
902
|
+
position: fixed;
|
|
903
|
+
top: calc(var(--topbar-h) + var(--rail-right-gap));
|
|
904
|
+
right: var(--rail-right-gap);
|
|
905
|
+
width: var(--rail-right-w);
|
|
906
|
+
max-height: calc(100vh - var(--topbar-h) - var(--rail-right-gap) * 2);
|
|
907
|
+
overflow-y: auto;
|
|
908
|
+
margin: 0;
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
|
|
882
912
|
.app-views .view > .view-zone + .view-zone { margin-top: var(--sp-md); }
|
|
883
913
|
.view-zone--band {
|
|
884
914
|
display: grid;
|
|
@@ -1221,6 +1251,25 @@ main:focus { outline: none; }
|
|
|
1221
1251
|
}
|
|
1222
1252
|
.page-head__sub { margin: 0; font-size: 13.5px; color: var(--ink-soft); }
|
|
1223
1253
|
|
|
1254
|
+
/* The re-skinned page head: the page's own name in v3's LABEL voice, because the
|
|
1255
|
+
display face is saved for section headings and the page's name is the quietest
|
|
1256
|
+
thing on it. The rule above (22px/650) is the pre-shell compat one, and belongs
|
|
1257
|
+
to the pages nobody has re-skinned yet.
|
|
1258
|
+
Promoted here from work.css by task 1003305 when the ideas composer became the
|
|
1259
|
+
third consumer — a modifier on the shell's own .page-head is shell chrome, and
|
|
1260
|
+
a second copy is how the two would have drifted. */
|
|
1261
|
+
.page-head--board .page-head__h {
|
|
1262
|
+
margin: 0 0 6px;
|
|
1263
|
+
font-family: var(--label-face);
|
|
1264
|
+
font-size: 14px;
|
|
1265
|
+
font-weight: 400;
|
|
1266
|
+
letter-spacing: var(--label-space);
|
|
1267
|
+
text-transform: var(--label-case);
|
|
1268
|
+
color: var(--ink);
|
|
1269
|
+
text-shadow: var(--type-halo);
|
|
1270
|
+
}
|
|
1271
|
+
.page-head--board .page-head__sub { font-size: 14px; max-width: var(--measure); }
|
|
1272
|
+
|
|
1224
1273
|
.hall-nav {
|
|
1225
1274
|
position: sticky;
|
|
1226
1275
|
top: var(--topbar-h);
|
|
@@ -1462,7 +1511,52 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
|
|
|
1462
1511
|
cursor: pointer;
|
|
1463
1512
|
}
|
|
1464
1513
|
.btn-accent:hover:not(:disabled) { background: var(--accent-lift); color: var(--accent-on); text-decoration: none; }
|
|
1465
|
-
.btn-accent:disabled { background: var(--
|
|
1514
|
+
.btn-accent:disabled { background: var(--glass); color: var(--ink-faint); cursor: default; }
|
|
1515
|
+
|
|
1516
|
+
/* `.btn` / `.btn--ghost` — the SECOND button vocabulary in the hall, used by
|
|
1517
|
+
ideas, idea, copy-desk, my-projects and collab. Task 1003305 found it had no
|
|
1518
|
+
rule anywhere in the surface: every one of those buttons was rendering as a
|
|
1519
|
+
browser default control, on a page whose every other shape is a pill. They
|
|
1520
|
+
are not renamed to .btn-accent/.btn-ghost because the class is spelled into
|
|
1521
|
+
markup and into tests/idea_spark_hall.mjs; instead the two vocabularies are
|
|
1522
|
+
made to say the same thing. `.btn` is the accent door and `.btn--ghost` its
|
|
1523
|
+
quiet sibling, which is exactly how the calling pages already use the pair
|
|
1524
|
+
(submit vs. discard, mark vs. withdraw). --accent-on is the dark ink for the
|
|
1525
|
+
salmon; white on it fails AA and DESIGN.md bans it. */
|
|
1526
|
+
.btn {
|
|
1527
|
+
display: inline-flex;
|
|
1528
|
+
align-items: center;
|
|
1529
|
+
justify-content: center;
|
|
1530
|
+
gap: 6px;
|
|
1531
|
+
min-height: 34px;
|
|
1532
|
+
min-width: 74px;
|
|
1533
|
+
padding: 0 16px;
|
|
1534
|
+
font-family: var(--font-body);
|
|
1535
|
+
font-size: 13.5px;
|
|
1536
|
+
font-weight: 500;
|
|
1537
|
+
text-transform: lowercase;
|
|
1538
|
+
color: var(--accent-on);
|
|
1539
|
+
background: var(--accent);
|
|
1540
|
+
/* transparent rather than absent: collab.css's `.btn--quiet` sets only a
|
|
1541
|
+
border-COLOUR, and a modifier cannot paint an edge that was never reserved. */
|
|
1542
|
+
border: var(--line) solid transparent;
|
|
1543
|
+
border-radius: var(--radius-pill);
|
|
1544
|
+
cursor: pointer;
|
|
1545
|
+
}
|
|
1546
|
+
.btn:hover:not(:disabled) { background: var(--accent-lift); color: var(--accent-on); text-decoration: none; }
|
|
1547
|
+
.btn:disabled { background: var(--glass); color: var(--ink-faint); cursor: default; }
|
|
1548
|
+
.btn--ghost {
|
|
1549
|
+
min-height: 30px;
|
|
1550
|
+
min-width: 56px;
|
|
1551
|
+
padding: 0 14px;
|
|
1552
|
+
font-size: 13px;
|
|
1553
|
+
font-weight: 400;
|
|
1554
|
+
color: var(--ink-soft);
|
|
1555
|
+
background: none;
|
|
1556
|
+
border-color: var(--rule);
|
|
1557
|
+
}
|
|
1558
|
+
.btn--ghost:hover:not(:disabled) { background: none; border-color: var(--ink-faint); color: var(--ink); }
|
|
1559
|
+
.btn--ghost:disabled { background: none; color: var(--ink-faint); border-color: var(--rule-soft); }
|
|
1466
1560
|
|
|
1467
1561
|
/* ---------- profile / standing ---------- */
|
|
1468
1562
|
|
|
@@ -2377,35 +2471,41 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
|
|
|
2377
2471
|
cursor: pointer;
|
|
2378
2472
|
}
|
|
2379
2473
|
.deeplink-card__close:hover { border-color: var(--ink-faint); color: var(--ink); }
|
|
2474
|
+
/* The record's kind eyebrow, in the label voice — mono in light, the body face
|
|
2475
|
+
in dark. Task 1003305 retired the hand-rolled 11px/600/0.06em copy of that
|
|
2476
|
+
voice for the tokens, so the overlay flips with the rest of the surface. */
|
|
2380
2477
|
.deeplink-card__kind {
|
|
2381
|
-
|
|
2382
|
-
|
|
2383
|
-
|
|
2384
|
-
|
|
2478
|
+
display: flex;
|
|
2479
|
+
align-items: center;
|
|
2480
|
+
gap: 12px;
|
|
2481
|
+
font-family: var(--label-face);
|
|
2482
|
+
font-size: var(--label-size);
|
|
2483
|
+
letter-spacing: var(--label-space);
|
|
2484
|
+
text-transform: var(--label-case);
|
|
2385
2485
|
color: var(--ink-faint);
|
|
2386
|
-
margin: 0 0
|
|
2486
|
+
margin: 0 0 12px;
|
|
2387
2487
|
}
|
|
2388
|
-
.deeplink-card__title { font-family: var(--font-display); font-size: 21px; font-weight: 300; letter-spacing: -0.03em; margin: 0 0
|
|
2389
|
-
.deeplink-card__meta { display: flex; flex-wrap: wrap; gap: 4px 14px; font-size: 12.5px; color: var(--ink-soft); margin: 0 0 10px; }
|
|
2488
|
+
.deeplink-card__title { font-family: var(--font-display); font-size: 21px; font-weight: 300; letter-spacing: -0.03em; line-height: 1.15; margin: 0 0 10px; }
|
|
2489
|
+
.deeplink-card__meta { display: flex; flex-wrap: wrap; gap: 4px 14px; font-size: 12.5px; color: var(--ink-soft); font-variant-numeric: tabular-nums; margin: 0 0 10px; }
|
|
2390
2490
|
.deeplink-card__summary { font-size: 13.5px; margin: 0 0 10px; }
|
|
2391
2491
|
.deeplink-card__note { font-size: 12.5px; color: var(--ink-faint); margin: 0; }
|
|
2392
2492
|
.deeplink-card__link { font-size: 13px; }
|
|
2393
2493
|
/* task 1753: the deepened TASK body inside the shared record overlay. */
|
|
2394
2494
|
.td-goal { font-size: 13px; margin: 0 0 10px; }
|
|
2495
|
+
/* Prose, not a box. The panel is already the container, and in v3 tone does the
|
|
2496
|
+
separation — a bordered well inside a card is the card-in-a-card the pick
|
|
2497
|
+
removed. The scroll cap stays: this sits in a modal with its own max-height. */
|
|
2395
2498
|
.td-desc {
|
|
2396
2499
|
font-size: 13px;
|
|
2397
|
-
line-height: 1.
|
|
2500
|
+
line-height: 1.6;
|
|
2398
2501
|
white-space: pre-wrap;
|
|
2399
2502
|
word-break: break-word;
|
|
2503
|
+
color: var(--ink-soft);
|
|
2400
2504
|
margin: 0 0 12px;
|
|
2401
|
-
padding: 10px 12px;
|
|
2402
|
-
background: var(--surface-2);
|
|
2403
|
-
border: 1px solid var(--border);
|
|
2404
|
-
border-radius: var(--radius-sm);
|
|
2405
2505
|
max-height: 42vh;
|
|
2406
2506
|
overflow-y: auto;
|
|
2407
2507
|
}
|
|
2408
|
-
.td-touches { font-size: 12.5px; color: var(--ink-faint); word-break: break-word; margin: 0 0 12px; }
|
|
2508
|
+
.td-touches { font-size: 12.5px; color: var(--ink-faint); font-family: var(--font-mono); word-break: break-word; margin: 0 0 12px; }
|
|
2409
2509
|
/* task 1003109: the ship-time VISUAL, rendered directly under the value summary
|
|
2410
2510
|
it restates. Sized to be READ (this exists so a non-engineer can see a change),
|
|
2411
2511
|
capped so a tall screenshot can't push the rest of the record off the page, and
|
|
@@ -2417,9 +2517,9 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
|
|
|
2417
2517
|
max-height: 52vh;
|
|
2418
2518
|
width: auto;
|
|
2419
2519
|
height: auto;
|
|
2420
|
-
border:
|
|
2520
|
+
border: var(--line) solid var(--rule-soft);
|
|
2421
2521
|
border-radius: var(--radius-sm);
|
|
2422
|
-
background: var(--
|
|
2522
|
+
background: var(--glass);
|
|
2423
2523
|
}
|
|
2424
2524
|
.td-visual__caption { font-size: 12.5px; color: var(--ink-faint); margin: 6px 0 0; }
|
|
2425
2525
|
/* The compact form: a thumbnail beside a value summary in a ship FEED, where the
|
|
@@ -2430,49 +2530,83 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
|
|
|
2430
2530
|
height: 44px;
|
|
2431
2531
|
flex: 0 0 auto;
|
|
2432
2532
|
object-fit: cover;
|
|
2433
|
-
border:
|
|
2533
|
+
border: var(--line) solid var(--rule-soft);
|
|
2434
2534
|
border-radius: var(--radius-sm);
|
|
2435
|
-
background: var(--
|
|
2535
|
+
background: var(--glass);
|
|
2436
2536
|
vertical-align: middle;
|
|
2437
2537
|
}
|
|
2438
|
-
/* Shared
|
|
2439
|
-
|
|
2440
|
-
.td-section-h
|
|
2538
|
+
/* Shared section label: overlay section heads and triage form-field labels, in
|
|
2539
|
+
the label voice rather than a second hand-rolled copy of it. */
|
|
2540
|
+
.td-section-h, .td-field > span {
|
|
2541
|
+
font-family: var(--label-face);
|
|
2542
|
+
font-size: var(--label-size);
|
|
2543
|
+
font-weight: 400;
|
|
2544
|
+
letter-spacing: var(--label-space);
|
|
2545
|
+
text-transform: var(--label-case);
|
|
2546
|
+
color: var(--ink-faint);
|
|
2547
|
+
}
|
|
2548
|
+
.td-section-h { margin: 0 0 8px; }
|
|
2441
2549
|
.td-deps { margin: 0 0 12px; }
|
|
2442
|
-
|
|
2443
|
-
.
|
|
2550
|
+
/* v1's bare ledger inside a v3 panel — a hairline on top, air, and the first row
|
|
2551
|
+
drops both. The same row grammar the board's history list took (task 1003304). */
|
|
2552
|
+
.td-dep-list { list-style: none; margin: 0; padding: 0; }
|
|
2553
|
+
.td-dep-list li { border-top: var(--line) solid var(--rule-soft); padding: 10px 0; }
|
|
2554
|
+
.td-dep-list li:first-child { border-top: 0; padding-top: 0; }
|
|
2555
|
+
.td-dep {
|
|
2556
|
+
display: inline-block;
|
|
2557
|
+
font-size: 13px;
|
|
2558
|
+
color: var(--ink);
|
|
2559
|
+
text-decoration: none;
|
|
2560
|
+
min-height: 24px;
|
|
2561
|
+
padding: 3px 0;
|
|
2562
|
+
line-height: 18px;
|
|
2563
|
+
}
|
|
2444
2564
|
.td-dep:hover { text-decoration: underline; }
|
|
2445
2565
|
.td-dep-status { color: var(--ink-faint); font-size: 12px; margin-left: 6px; }
|
|
2446
|
-
.td-actions { display: flex; flex-wrap: wrap; gap:
|
|
2566
|
+
.td-actions { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin: 18px 0 0; }
|
|
2567
|
+
/* Pill or nothing (DESIGN.md, Shapes): the ghost pill, with --btn--primary the
|
|
2568
|
+
one accent door. It carried a literal `#fff` on the salmon until task 1003305
|
|
2569
|
+
— the exact pairing DESIGN.md bans, because it fails AA. */
|
|
2447
2570
|
.td-btn {
|
|
2571
|
+
display: inline-flex;
|
|
2572
|
+
align-items: center;
|
|
2573
|
+
justify-content: center;
|
|
2448
2574
|
font: inherit;
|
|
2449
2575
|
font-size: 13px;
|
|
2450
|
-
|
|
2451
|
-
|
|
2452
|
-
|
|
2453
|
-
|
|
2576
|
+
min-height: 30px;
|
|
2577
|
+
min-width: 56px;
|
|
2578
|
+
padding: 0 14px;
|
|
2579
|
+
border: var(--line) solid var(--rule);
|
|
2580
|
+
border-radius: var(--radius-pill);
|
|
2581
|
+
background: none;
|
|
2454
2582
|
color: var(--ink-soft);
|
|
2583
|
+
text-transform: lowercase;
|
|
2455
2584
|
cursor: pointer;
|
|
2456
2585
|
}
|
|
2457
|
-
.td-btn:hover {
|
|
2458
|
-
.td-btn--primary {
|
|
2459
|
-
|
|
2460
|
-
|
|
2461
|
-
|
|
2586
|
+
.td-btn:hover:not(:disabled) { border-color: var(--ink-faint); color: var(--ink); text-decoration: none; }
|
|
2587
|
+
.td-btn--primary {
|
|
2588
|
+
min-height: 34px;
|
|
2589
|
+
min-width: 74px;
|
|
2590
|
+
padding: 0 16px;
|
|
2591
|
+
font-weight: 500;
|
|
2592
|
+
background: var(--accent);
|
|
2593
|
+
color: var(--accent-on);
|
|
2594
|
+
border-color: var(--accent);
|
|
2595
|
+
}
|
|
2596
|
+
.td-btn--primary:hover:not(:disabled) { background: var(--accent-lift); border-color: var(--accent-lift); color: var(--accent-on); }
|
|
2597
|
+
.td-btn:disabled { color: var(--ink-faint); border-color: var(--rule-soft); cursor: default; }
|
|
2598
|
+
.td-btn--primary:disabled { background: var(--glass); }
|
|
2599
|
+
.td-action-note { flex-basis: 100%; font-size: 12.5px; color: var(--ink-soft); margin: 4px 0 0; }
|
|
2462
2600
|
|
|
2463
2601
|
/* Idea triage inside the record overlay (task 1002447). A two-column grid so
|
|
2464
2602
|
promote's five fields fit the panel without scrolling; --wide spans both. */
|
|
2465
2603
|
.td-form { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 10px; margin: 14px 0 0; }
|
|
2466
2604
|
.td-field { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
|
|
2467
2605
|
.td-field--wide { grid-column: 1 / -1; }
|
|
2606
|
+
/* The base `select, input` rule already carries the world's field; this only
|
|
2607
|
+
re-states the sizing the two-column grid needs. */
|
|
2468
2608
|
.td-field input, .td-field select {
|
|
2469
|
-
font: inherit;
|
|
2470
2609
|
font-size: 13px;
|
|
2471
|
-
padding: 5px 8px;
|
|
2472
|
-
border: 1px solid var(--border-strong);
|
|
2473
|
-
border-radius: var(--radius-sm);
|
|
2474
|
-
background: var(--surface);
|
|
2475
|
-
color: var(--ink);
|
|
2476
2610
|
min-width: 0;
|
|
2477
2611
|
max-width: 100%;
|
|
2478
2612
|
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/* task.css — what the TASK record has that the idea record does not
|
|
2
|
+
(task 1003305, goal 1000081). The shared composition is record.css; this is
|
|
3
|
+
the page's own two shapes.
|
|
4
|
+
|
|
5
|
+
Promoted out of task.html's inline <style>, which was the last substantive
|
|
6
|
+
inline block in the hall and sat at its tests/hall_audit.mjs ratchet with zero
|
|
7
|
+
headroom — so the re-skin could not have added a line to it even if it wanted
|
|
8
|
+
to. Its three rules are gone rather than ported: the back link and the status
|
|
9
|
+
pill are the record archetype's now (.rec-back, .rec-pill), and the claim line
|
|
10
|
+
is an ordinary section. */
|
|
11
|
+
|
|
12
|
+
/* ---- the lifecycle rail -------------------------------------------------- */
|
|
13
|
+
/* The world's signature component, and the answer to "where is this task": five
|
|
14
|
+
beats with exactly ONE lit, which is the same lit-step grammar as the open tab
|
|
15
|
+
and the current nav item. It is a READOUT, not a control — nothing here is
|
|
16
|
+
pressable, so the accent lights only the beat the task is actually on.
|
|
17
|
+
The six GDS statuses fold into five beats because backlog / blocked / ready
|
|
18
|
+
are all "no builder has it yet"; task.js writes the caption that says which. */
|
|
19
|
+
.tk-rail {
|
|
20
|
+
display: grid;
|
|
21
|
+
grid-template-columns: repeat(5, minmax(0, 1fr));
|
|
22
|
+
gap: 0;
|
|
23
|
+
margin: var(--sp-lg) 0 0;
|
|
24
|
+
padding: 0;
|
|
25
|
+
list-style: none;
|
|
26
|
+
}
|
|
27
|
+
.tk-step { border-top: 2px solid var(--rule-soft); padding: 14px 16px 0 0; }
|
|
28
|
+
.tk-step__dot {
|
|
29
|
+
width: 7px;
|
|
30
|
+
height: 7px;
|
|
31
|
+
border-radius: var(--radius-pill);
|
|
32
|
+
border: var(--line) solid var(--ink-faint);
|
|
33
|
+
margin-bottom: 12px;
|
|
34
|
+
}
|
|
35
|
+
.tk-step__n {
|
|
36
|
+
display: block;
|
|
37
|
+
font-family: var(--label-face);
|
|
38
|
+
font-size: var(--label-size);
|
|
39
|
+
letter-spacing: var(--label-space);
|
|
40
|
+
text-transform: var(--label-case);
|
|
41
|
+
color: var(--ink-faint);
|
|
42
|
+
margin-bottom: 5px;
|
|
43
|
+
}
|
|
44
|
+
.tk-step__c { display: block; font-size: 12.5px; line-height: 1.35; color: var(--ink-faint); }
|
|
45
|
+
.tk-step[aria-current="step"] { border-top-color: var(--accent); }
|
|
46
|
+
.tk-step[aria-current="step"] .tk-step__dot { background: var(--accent); border-color: var(--accent); }
|
|
47
|
+
.tk-step[aria-current="step"] .tk-step__n { color: var(--ink); }
|
|
48
|
+
.tk-step[aria-current="step"] .tk-step__c { color: var(--ink-soft); }
|
|
49
|
+
|
|
50
|
+
/* ---- the ship-time visual ------------------------------------------------ */
|
|
51
|
+
/* task 1003109: the same claim as the value summary in another medium, so it
|
|
52
|
+
renders at a size a NON-ENGINEER can actually read rather than as a thumbnail,
|
|
53
|
+
and capped so a tall screenshot cannot push the rest of the record off the
|
|
54
|
+
page. Nothing at all is drawn when a task has no visual. */
|
|
55
|
+
.tk-visual { margin: 0; }
|
|
56
|
+
.tk-visual__img {
|
|
57
|
+
display: block;
|
|
58
|
+
max-width: 100%;
|
|
59
|
+
max-height: 52vh;
|
|
60
|
+
width: auto;
|
|
61
|
+
height: auto;
|
|
62
|
+
border: var(--line) solid var(--rule-soft);
|
|
63
|
+
border-radius: var(--radius-sm);
|
|
64
|
+
background: var(--glass);
|
|
65
|
+
}
|
|
66
|
+
.tk-visual__caption { margin: 8px 0 0; font-size: 12.5px; color: var(--ink-faint); max-width: var(--measure); }
|
|
67
|
+
|
|
68
|
+
@media (max-width: 640px) {
|
|
69
|
+
.tk-rail { grid-template-columns: 1fr; }
|
|
70
|
+
.tk-step { padding: 12px 0 0; }
|
|
71
|
+
}
|