@bongos/core 1.19.449 → 1.19.451
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 +59 -29
- package/docs/copy-inventory.md +67 -71
- package/docs/copy-registry.json +135 -221
- 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/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/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 +96 -24
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/gds/land-watch.js +28 -9
- package/scripts/hall-preview/server.js +29 -0
- package/src/module-api.js +1 -1
- package/tests/hall_audit.mjs +14 -10
- package/tests/hall_reading_world.mjs +430 -0
- package/tests/land_watch.mjs +48 -3
|
@@ -1,53 +1,69 @@
|
|
|
1
|
-
/* roadmap.css —
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
at boot (src/asset-version.js).
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
:root
|
|
1
|
+
/* roadmap.css — the Roadmap "command deck" (task 1002426; lifted out of the
|
|
2
|
+
page's inline <style> by task 1002176; rebuilt into the chrome world by task
|
|
3
|
+
1003306, goal 1000081). The ?v= cache-bust is stamped automatically from this
|
|
4
|
+
file's content hash at boot (src/asset-version.js).
|
|
5
|
+
|
|
6
|
+
THE PAGE: a program-level hero, then versions GROUPED BY their real status
|
|
7
|
+
(planning=Staged · building=In flight · frozen=Parked · shipped=Shipped),
|
|
8
|
+
and a SUMMARIZED goal layer per version (status bar + only the goals active
|
|
9
|
+
right now, the full list on the Goals page).
|
|
10
|
+
|
|
11
|
+
It is a reading room by task, not by archetype: nothing here is long-form, so
|
|
12
|
+
it does not load room.css. What it takes from the world is the world itself —
|
|
13
|
+
the token tier, v3's panel (a tone at the full radius, never a drawn box and
|
|
14
|
+
never a shadow), the label voice, and the display face on a figure.
|
|
15
|
+
|
|
16
|
+
THREE THINGS THIS SHEET USED TO DO THAT IT DOES NOT ANY MORE:
|
|
17
|
+
* A page-local `:root`. It was the only one in the hall and it is
|
|
18
|
+
forbidden: the branding pack's :root is spliced at the END of <head> at
|
|
19
|
+
(0,1,0), so a page-local one is outranked one way and defeats re-branding
|
|
20
|
+
the other. The three --rm-* values were fine; only the scope was wrong.
|
|
21
|
+
Page tokens live on `body`.
|
|
22
|
+
* `--rm-shadow-soft`, on five surfaces. v3 separates by TONE: a panel is
|
|
23
|
+
never a drawn box and never a shadow (modules/hall-ui/CLAUDE.md).
|
|
24
|
+
* The compat aliases (--surface / --surface-2 / --border / --border-strong /
|
|
25
|
+
--accent-weak / --accent-text). They still EXIST for pages nobody has
|
|
26
|
+
re-skinned yet, so spending one here would be legal CSS that quietly opts
|
|
27
|
+
this sheet back out of the world.
|
|
28
|
+
|
|
29
|
+
`--line` is a WIDTH; the hairline's colour is --rule / --rule-soft. */
|
|
30
|
+
|
|
31
|
+
body[data-page="roadmap"] {
|
|
19
32
|
--rm-plan: color-mix(in srgb, var(--ink) 16%, var(--bg));
|
|
20
33
|
--rm-terra-weak: color-mix(in srgb, var(--terracotta) 13%, var(--bg-card));
|
|
21
|
-
--rm-shadow-soft: 0 1px 2px color-mix(in srgb, var(--ink) 8%, transparent);
|
|
22
34
|
}
|
|
23
35
|
|
|
24
36
|
.rm-num { font-variant-numeric: tabular-nums; }
|
|
25
37
|
|
|
26
|
-
/* ---- shared atoms ----
|
|
27
|
-
|
|
28
|
-
|
|
38
|
+
/* ---- shared atoms ----
|
|
39
|
+
The chips are the deck's label voice: they name a KIND, so they take the
|
|
40
|
+
label tokens rather than a hand-written uppercase of their own. */
|
|
41
|
+
.rm-chip { display:inline-flex; align-items:center; gap:5px;
|
|
42
|
+
font-family:var(--label-face); font-size:var(--label-size); font-weight:400;
|
|
43
|
+
letter-spacing:var(--label-space); text-transform:var(--label-case);
|
|
44
|
+
padding:4px 9px; border-radius:var(--radius-pill); white-space:nowrap; }
|
|
29
45
|
.rm-chip .rm-sq { width:7px; height:7px; border-radius:2px; }
|
|
30
|
-
.rm-chip--product { background:var(--accent-
|
|
46
|
+
.rm-chip--product { background:var(--accent-tint); color:var(--accent-ink); }
|
|
31
47
|
.rm-chip--product .rm-sq { background:var(--accent); }
|
|
32
|
-
.rm-chip--internal { background:var(--info-weak); color:
|
|
48
|
+
.rm-chip--internal { background:var(--info-weak); color:var(--info); }
|
|
33
49
|
.rm-chip--internal .rm-sq { background:var(--sea); }
|
|
34
50
|
.rm-chip--dogfood { background:var(--rm-terra-weak); color:color-mix(in srgb, var(--terracotta) 82%, var(--ink)); }
|
|
35
51
|
.rm-chip--dogfood .rm-sq { background:var(--terracotta); }
|
|
36
52
|
|
|
37
|
-
.rm-phase { display:inline-flex; align-items:center; gap:6px; font-size:
|
|
38
|
-
padding:
|
|
53
|
+
.rm-phase { display:inline-flex; align-items:center; gap:6px; font-size:11.5px; font-weight:500;
|
|
54
|
+
padding:4px 10px; border-radius:var(--radius-pill); white-space:nowrap; border:var(--line) solid transparent; }
|
|
39
55
|
.rm-phase .rm-pd { width:6px; height:6px; border-radius:50%; }
|
|
40
56
|
.rm-phase--building { background:var(--ok-weak); color:var(--ok); }
|
|
41
57
|
.rm-phase--building .rm-pd { background:var(--ok); }
|
|
42
|
-
.rm-phase--planning { background:var(--accent-
|
|
43
|
-
border-color:color-mix(in srgb, var(--accent) 22%, var(--
|
|
58
|
+
.rm-phase--planning { background:var(--accent-tint); color:var(--accent-ink);
|
|
59
|
+
border-color:color-mix(in srgb, var(--accent) 22%, var(--rule-soft)); }
|
|
44
60
|
.rm-phase--planning .rm-pd { background:transparent; box-shadow:inset 0 0 0 1.5px var(--accent); }
|
|
45
|
-
.rm-phase--frozen { background:var(--
|
|
61
|
+
.rm-phase--frozen { background:var(--glass); color:var(--ink-soft); border-color:var(--rule-soft); }
|
|
46
62
|
.rm-phase--frozen .rm-pd { background:var(--ink-faint); }
|
|
47
63
|
|
|
48
64
|
/* lifecycle segmented bar (shipped / confirmed / completed / remaining) */
|
|
49
|
-
.rm-lbar { display:flex; height:9px; border-radius:
|
|
50
|
-
background:var(--rule-soft);
|
|
65
|
+
.rm-lbar { display:flex; height:9px; border-radius:var(--radius-pill); overflow:hidden;
|
|
66
|
+
background:var(--rule-soft); }
|
|
51
67
|
.rm-lbar__s { height:100%; }
|
|
52
68
|
.rm-lbar__s--sh { background:var(--ok); }
|
|
53
69
|
.rm-lbar__s--co { background:var(--info); }
|
|
@@ -57,65 +73,87 @@
|
|
|
57
73
|
.rm-ring { --p:0; --rc:var(--accent); position:relative; flex:none; width:60px; height:60px;
|
|
58
74
|
border-radius:50%; display:grid; place-items:center;
|
|
59
75
|
background:conic-gradient(var(--rc) calc(var(--p)*3.6deg), var(--rule-soft) 0); }
|
|
60
|
-
.rm-ring::after { content:""; position:absolute; inset:6px; border-radius:50%; background:var(--
|
|
61
|
-
.rm-ring b { position:relative; z-index:1; font-
|
|
62
|
-
|
|
76
|
+
.rm-ring::after { content:""; position:absolute; inset:6px; border-radius:50%; background:var(--bg-card); }
|
|
77
|
+
.rm-ring b { position:relative; z-index:1; font-family:var(--font-display); font-size:16px; font-weight:300;
|
|
78
|
+
font-variant-numeric:tabular-nums; letter-spacing:-.02em; }
|
|
79
|
+
.rm-ring b i { font-style:normal; font-size:9.5px; font-weight:400; color:var(--ink-faint); }
|
|
63
80
|
|
|
64
81
|
/* goal-status bar (segmented by goal COUNT: achieved / in progress / not started) */
|
|
65
|
-
.rm-gbar { display:flex; height:8px; border-radius:
|
|
66
|
-
background:var(--rule-soft);
|
|
82
|
+
.rm-gbar { display:flex; height:8px; border-radius:var(--radius-pill); overflow:hidden;
|
|
83
|
+
background:var(--rule-soft); }
|
|
67
84
|
.rm-gbar__s { height:100%; }
|
|
68
85
|
.rm-gbar__s--ach { background:var(--ok); }
|
|
69
86
|
.rm-gbar__s--prog { background:var(--accent); }
|
|
70
87
|
.rm-gbar__s--plan { background:var(--rm-plan); }
|
|
71
88
|
|
|
72
|
-
/* ---- program hero ----
|
|
73
|
-
|
|
74
|
-
|
|
89
|
+
/* ---- program hero ----
|
|
90
|
+
v3's figure band: one glass strip of numbers, not a tinted card. The old
|
|
91
|
+
accent gradient spent the warm colour on something nobody can press. */
|
|
92
|
+
.rm-hero { background:var(--glass); border:var(--line) solid var(--glass-edge);
|
|
93
|
+
-webkit-backdrop-filter:blur(var(--glass-blur)); backdrop-filter:blur(var(--glass-blur));
|
|
94
|
+
border-radius:var(--radius); padding:var(--sp-md); margin-bottom:var(--sp-md); }
|
|
75
95
|
.rm-hero__top { display:grid; grid-template-columns:auto 1fr; gap:26px; align-items:center; }
|
|
76
96
|
.rm-big { display:flex; align-items:baseline; gap:3px; }
|
|
77
|
-
.rm-big .n { font-size:52px; font-weight:
|
|
78
|
-
|
|
79
|
-
.rm-
|
|
97
|
+
.rm-big .n { font-family:var(--font-display); font-size:52px; font-weight:300; line-height:.95;
|
|
98
|
+
letter-spacing:-.03em; font-variant-numeric:tabular-nums; }
|
|
99
|
+
.rm-big .u { font-size:18px; font-weight:400; color:var(--ink-faint); }
|
|
100
|
+
/* The cap is load-bearing — the hero's left column is `auto`, so without it the
|
|
101
|
+
caption sizes to its content and never wraps under the figure. It is a length
|
|
102
|
+
and not a `ch`: this is a label in the mono face, and a `ch` there is the zero
|
|
103
|
+
glyph's width, which is the measurement that put 90 characters on the primer. */
|
|
104
|
+
.rm-lab { font-family:var(--label-face); font-size:var(--label-size); font-weight:400;
|
|
105
|
+
letter-spacing:var(--label-space); text-transform:var(--label-case); color:var(--ink-faint);
|
|
106
|
+
margin-top:7px; max-width:8rem; }
|
|
80
107
|
.rm-hbar { height:15px; }
|
|
81
108
|
.rm-stats { display:flex; flex-wrap:wrap; gap:9px 24px; margin-top:14px; }
|
|
82
109
|
.rm-stat { display:flex; flex-direction:column; gap:1px; }
|
|
83
|
-
.rm-stat .v { font-
|
|
84
|
-
|
|
110
|
+
.rm-stat .v { font-family:var(--font-display); font-size:19px; font-weight:300;
|
|
111
|
+
font-variant-numeric:tabular-nums; letter-spacing:-.01em; }
|
|
112
|
+
.rm-stat .k { font-size:11.5px; color:var(--ink-faint); }
|
|
85
113
|
.rm-stat .v.sh { color:var(--ok); } .rm-stat .v.co { color:var(--info); } .rm-stat .v.cm { color:var(--warn); }
|
|
86
|
-
.rm-hgoals { display:flex; align-items:center; gap:14px; flex-wrap:wrap; margin-top:16px; padding-top:15px;
|
|
87
|
-
|
|
114
|
+
.rm-hgoals { display:flex; align-items:center; gap:14px; flex-wrap:wrap; margin-top:16px; padding-top:15px;
|
|
115
|
+
border-top:var(--line) solid var(--rule-soft); }
|
|
116
|
+
.rm-hgoals .glab { font-family:var(--label-face); font-size:var(--label-size); font-weight:400;
|
|
117
|
+
letter-spacing:var(--label-space); text-transform:var(--label-case); color:var(--ink-faint); }
|
|
88
118
|
.rm-hgoals .rm-gbar { width:200px; max-width:44vw; }
|
|
89
119
|
.rm-hgoals .gleg { font-size:12.5px; color:var(--ink-soft); }
|
|
90
|
-
.rm-hgoals .gleg b { color:var(--ink); font-variant-numeric:tabular-nums; }
|
|
120
|
+
.rm-hgoals .gleg b { color:var(--ink); font-weight:500; font-variant-numeric:tabular-nums; }
|
|
91
121
|
|
|
92
122
|
/* ---- section rhythm ---- */
|
|
93
|
-
.rm-sec { margin-top:
|
|
123
|
+
.rm-sec { margin-top:var(--sp-md); }
|
|
94
124
|
.rm-sec__h { display:flex; align-items:center; gap:10px; margin:0 2px 13px; }
|
|
95
125
|
.rm-sec__dot { width:8px; height:8px; border-radius:50%; }
|
|
96
126
|
.rm-sec__dot--flight { background:var(--ok); }
|
|
97
127
|
.rm-sec__dot--staged { background:var(--accent); }
|
|
98
128
|
.rm-sec__dot--parked { background:var(--ink-faint); }
|
|
99
129
|
.rm-sec__dot--shipped { background:var(--sea); }
|
|
100
|
-
.rm-sec__t { font-
|
|
130
|
+
.rm-sec__t { font-family:var(--label-face); font-size:var(--label-size); font-weight:400;
|
|
131
|
+
letter-spacing:var(--label-space); text-transform:var(--label-case); color:var(--ink); }
|
|
101
132
|
.rm-sec__n { font-size:11.5px; color:var(--ink-faint); font-variant-numeric:tabular-nums;
|
|
102
|
-
background:var(--
|
|
103
|
-
.rm-sec__rule { flex:1; height:
|
|
133
|
+
background:var(--glass); border-radius:var(--radius-pill); padding:2px 9px; }
|
|
134
|
+
.rm-sec__rule { flex:1; height:var(--line); background:var(--rule-soft); }
|
|
104
135
|
|
|
105
|
-
/* ---- version cards ----
|
|
136
|
+
/* ---- version cards ----
|
|
137
|
+
v3's panel: a tone at the full radius, with a transparent edge reserved so a
|
|
138
|
+
modifier can draw one (staged) without the base having to. */
|
|
106
139
|
.rm-grid { display:grid; grid-template-columns:1fr 1fr; gap:16px; }
|
|
107
|
-
.rm-card { background:var(--
|
|
140
|
+
.rm-card { background:var(--bg-card); border:var(--line) solid transparent;
|
|
141
|
+
border-radius:var(--radius); padding:var(--sp-md); }
|
|
108
142
|
.rm-card--feat { grid-column:1 / -1; }
|
|
109
|
-
.rm-card--parked { background:var(--
|
|
110
|
-
|
|
143
|
+
.rm-card--parked { background:var(--glass); }
|
|
144
|
+
/* staged is the one card that IS a drawn edge, and it earns it: a dashed border
|
|
145
|
+
is the deck's whole signal that the version is not real yet. */
|
|
146
|
+
.rm-card--staged { background:none; border-style:dashed; border-color:var(--rule); }
|
|
111
147
|
.rm-row { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
|
|
112
|
-
.rm-name { font-size:
|
|
113
|
-
|
|
114
|
-
.rm-
|
|
148
|
+
.rm-name { font-family:var(--font-display); font-size:19px; font-weight:300; line-height:1.15;
|
|
149
|
+
letter-spacing:-.03em; margin:9px 0 0; }
|
|
150
|
+
.rm-id { font-family:var(--label-face); font-size:var(--label-size); font-weight:400;
|
|
151
|
+
letter-spacing:var(--label-space); color:var(--ink-faint); font-variant-numeric:tabular-nums; }
|
|
152
|
+
.rm-desc { font-size:13px; color:var(--ink-soft); margin:7px 0 0; max-width:var(--measure); }
|
|
115
153
|
.rm-desc--clamp { display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }
|
|
116
154
|
.rm-cardprog { margin-top:14px; }
|
|
117
|
-
.rm-count { display:flex; justify-content:space-between; gap:10px; font-size:
|
|
118
|
-
.rm-count b { color:var(--ink); font-variant-numeric:tabular-nums; }
|
|
155
|
+
.rm-count { display:flex; justify-content:space-between; gap:10px; font-size:12.5px; color:var(--ink-soft); margin-bottom:6px; }
|
|
156
|
+
.rm-count b { color:var(--ink); font-weight:500; font-variant-numeric:tabular-nums; }
|
|
119
157
|
.rm-featgrid { display:grid; grid-template-columns:1.05fr 1fr; gap:22px; align-items:start; }
|
|
120
158
|
.rm-featgrid__l { min-width:0; }
|
|
121
159
|
.rm-feat-top { display:flex; align-items:flex-start; gap:16px; }
|
|
@@ -123,57 +161,85 @@
|
|
|
123
161
|
|
|
124
162
|
/* ---- goals block ---- */
|
|
125
163
|
.rm-goals { min-width:0; }
|
|
126
|
-
.rm-goals__frame { background:var(--
|
|
164
|
+
.rm-goals__frame { background:var(--glass); border:var(--line) solid var(--glass-edge);
|
|
165
|
+
border-radius:var(--radius-sm); padding:var(--sp-sm); }
|
|
127
166
|
.rm-goals__h { display:flex; align-items:baseline; justify-content:space-between; gap:8px; margin-bottom:10px; }
|
|
128
|
-
.rm-goals__h .t { font-
|
|
167
|
+
.rm-goals__h .t { font-family:var(--label-face); font-size:var(--label-size); font-weight:400;
|
|
168
|
+
letter-spacing:var(--label-space); text-transform:var(--label-case); color:var(--ink-faint); }
|
|
129
169
|
.rm-goals__h .n { font-size:12px; color:var(--ink-soft); font-variant-numeric:tabular-nums; }
|
|
130
|
-
.rm-gdist { display:flex; gap:12px; flex-wrap:wrap; margin-top:9px; font-size:
|
|
170
|
+
.rm-gdist { display:flex; gap:12px; flex-wrap:wrap; margin-top:9px; font-size:12.5px; color:var(--ink-soft); }
|
|
131
171
|
.rm-gdist span { display:inline-flex; align-items:center; gap:6px; }
|
|
132
172
|
.rm-gdist i { width:9px; height:9px; border-radius:2px; }
|
|
133
173
|
.rm-gdist i.rm-ach { background:var(--ok); } .rm-gdist i.rm-prog { background:var(--accent); } .rm-gdist i.rm-plan { background:var(--rm-plan); }
|
|
134
|
-
.rm-gdist b { color:var(--ink); font-variant-numeric:tabular-nums; }
|
|
174
|
+
.rm-gdist b { color:var(--ink); font-weight:500; font-variant-numeric:tabular-nums; }
|
|
135
175
|
.rm-ginp { margin-top:14px; }
|
|
136
|
-
.rm-ginp__cap { font-
|
|
137
|
-
|
|
138
|
-
.rm-goal
|
|
176
|
+
.rm-ginp__cap { font-family:var(--label-face); font-size:var(--label-size); font-weight:400;
|
|
177
|
+
letter-spacing:var(--label-space); text-transform:var(--label-case); color:var(--ink-faint); margin-bottom:2px; }
|
|
178
|
+
.rm-goal { display:flex; align-items:center; gap:10px; padding:4px 0; }
|
|
179
|
+
.rm-goal + .rm-goal { border-top:var(--line) solid var(--rule-soft); }
|
|
139
180
|
.rm-goal__dot { flex:none; width:8px; height:8px; border-radius:50%; background:var(--accent); }
|
|
140
|
-
|
|
181
|
+
/* THE 24px FLOOR, BOTH AXES (task 1003304's rule, applied here). This is a link
|
|
182
|
+
in a row whose only height was its 13px line box plus 7px of row padding —
|
|
183
|
+
measured 20px, and it is the deck's most-clicked target. The row's padding
|
|
184
|
+
comes down by the same amount the link's goes up, so the target grows and the
|
|
185
|
+
list does not re-space around it. */
|
|
186
|
+
.rm-goal__t { flex:1; min-width:0; display:flex; align-items:center; min-height:24px; padding:3px 0;
|
|
187
|
+
font-size:13px; color:var(--ink); text-decoration:none;
|
|
141
188
|
overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
142
|
-
a.rm-goal__t:hover { color:var(--accent-
|
|
143
|
-
.rm-goal__ready { flex:none; font-
|
|
144
|
-
|
|
145
|
-
|
|
189
|
+
a.rm-goal__t:hover { color:var(--accent-ink); text-decoration:underline; }
|
|
190
|
+
.rm-goal__ready { flex:none; font-family:var(--label-face); font-size:10px; font-weight:400;
|
|
191
|
+
letter-spacing:var(--label-space); text-transform:var(--label-case);
|
|
192
|
+
color:var(--ok); background:var(--ok-weak); padding:3px 7px; border-radius:var(--radius-pill); }
|
|
193
|
+
.rm-goal__meter { flex:none; width:70px; height:5px; border-radius:var(--radius-pill); background:var(--rule-soft); overflow:hidden; }
|
|
146
194
|
.rm-goal__meter i { display:block; height:100%; background:var(--accent); }
|
|
147
195
|
.rm-goal__n { flex:none; font-size:11.5px; color:var(--ink-soft); font-variant-numeric:tabular-nums; min-width:28px; text-align:right; }
|
|
148
|
-
.rm-goal__seed { flex:none; font-size:
|
|
149
|
-
|
|
196
|
+
.rm-goal__seed { flex:none; font-size:11.5px; color:var(--ink-faint); }
|
|
197
|
+
/* the same floor: this link measured 19px */
|
|
198
|
+
.rm-gmore { display:inline-flex; align-items:center; gap:6px; min-height:24px; margin-top:10px; padding:3px 0;
|
|
199
|
+
font-size:12.5px; font-weight:500; color:var(--accent-ink); text-decoration:none; }
|
|
150
200
|
.rm-gmore:hover { text-decoration:underline; }
|
|
151
201
|
.rm-gmore svg { width:13px; height:13px; }
|
|
152
202
|
.rm-gnone { font-size:12.5px; color:var(--ink-faint); margin:2px 0 0; }
|
|
153
203
|
|
|
154
204
|
/* parked note + staged state */
|
|
155
|
-
.rm-parknote { display:flex; gap:9px; font-size:12.5px; color:var(--ink-soft); background:var(--
|
|
156
|
-
border
|
|
205
|
+
.rm-parknote { display:flex; gap:9px; font-size:12.5px; color:var(--ink-soft); background:var(--bg-card);
|
|
206
|
+
border-radius:var(--radius-sm); padding:10px 12px; margin-top:13px; }
|
|
157
207
|
.rm-parknote svg { flex:none; width:15px; height:15px; margin-top:1px; color:var(--ink-faint); }
|
|
158
208
|
.rm-staged-state { display:flex; align-items:center; gap:11px; margin-top:15px; padding:12px 14px;
|
|
159
|
-
border:
|
|
209
|
+
border:var(--line) dashed var(--rule); border-radius:var(--radius-sm); }
|
|
160
210
|
.rm-staged-state svg { flex:none; width:18px; height:18px; color:var(--accent); }
|
|
161
|
-
.rm-staged-state .s1 { font-size:13px; font-weight:
|
|
162
|
-
.rm-staged-state .s2 { font-size:
|
|
163
|
-
.rm-staged-state .s2 b { color:var(--ink); font-variant-numeric:tabular-nums; }
|
|
211
|
+
.rm-staged-state .s1 { font-size:13px; font-weight:500; color:var(--ink); }
|
|
212
|
+
.rm-staged-state .s2 { font-size:12.5px; color:var(--ink-soft); margin-top:1px; }
|
|
213
|
+
.rm-staged-state .s2 b { color:var(--ink); font-weight:500; font-variant-numeric:tabular-nums; }
|
|
164
214
|
|
|
165
215
|
/* shipped strip */
|
|
166
216
|
.rm-shipstrip { display:flex; flex-wrap:wrap; gap:10px; }
|
|
167
|
-
.rm-shippill { display:flex; align-items:center; gap:11px;
|
|
168
|
-
border-radius:
|
|
169
|
-
.rm-shippill:hover { border-color:var(--
|
|
217
|
+
.rm-shippill { display:flex; align-items:center; gap:11px; min-height:38px; background:var(--bg-card);
|
|
218
|
+
border:var(--line) solid transparent; border-radius:var(--radius-pill); padding:8px 15px 8px 10px; text-decoration:none; }
|
|
219
|
+
.rm-shippill:hover { border-color:var(--rule); }
|
|
170
220
|
.rm-shippill .ok { width:20px; height:20px; border-radius:50%; background:var(--ok-weak); color:var(--ok);
|
|
171
221
|
display:grid; place-items:center; font-size:11px; }
|
|
172
|
-
.rm-shippill .nm { font-size:
|
|
173
|
-
.rm-shippill .mt { font-size:
|
|
222
|
+
.rm-shippill .nm { font-size:13px; font-weight:500; color:var(--ink); }
|
|
223
|
+
.rm-shippill .mt { font-size:11.5px; color:var(--ink-faint); font-variant-numeric:tabular-nums; }
|
|
174
224
|
|
|
175
225
|
@media (max-width:820px) {
|
|
176
226
|
.rm-grid { grid-template-columns:1fr; }
|
|
177
227
|
.rm-featgrid { grid-template-columns:1fr; }
|
|
178
228
|
.rm-hero__top { grid-template-columns:1fr; gap:14px; }
|
|
179
|
-
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/* A goal row is dot + title + ready pill + meter + count on ONE line, and the
|
|
232
|
+
title is the only flexible item — so at 320 the four fixed ones eat the row
|
|
233
|
+
and `flex: 1; min-width: 0` resolves the title to ZERO width. Measured: a
|
|
234
|
+
0x26 link, which passes the 24px floor's height and fails its width, and is
|
|
235
|
+
invisible either way. The row wraps here instead: the title takes the first
|
|
236
|
+
line whole and the meters follow under it. */
|
|
237
|
+
@media (max-width:400px) {
|
|
238
|
+
.rm-goal { flex-wrap:wrap; row-gap:2px; }
|
|
239
|
+
/* the title takes the first line whole; the meter, count and ready pill
|
|
240
|
+
follow under it. The dot goes — it is a decorative repeat of a state the
|
|
241
|
+
meter already carries, and left in place it would sit alone above the
|
|
242
|
+
title on a line of its own. */
|
|
243
|
+
.rm-goal__dot { display:none; }
|
|
244
|
+
.rm-goal__t { flex:1 0 100%; white-space:normal; }
|
|
245
|
+
}
|
|
@@ -19,7 +19,12 @@
|
|
|
19
19
|
<div class="app-body">
|
|
20
20
|
<header class="app-topbar" id="app-topbar"></header>
|
|
21
21
|
<div class="app-content">
|
|
22
|
-
|
|
22
|
+
<!-- The page had no <h1> at all before task 1003306, so it failed
|
|
23
|
+
one-header-main-h1 on every render. The deck takes the BOARD voice,
|
|
24
|
+
not the reading room's: it is a working surface whose figures are the
|
|
25
|
+
thing to look at, and its own name is the quietest thing on it. -->
|
|
26
|
+
<div class="page-head page-head--board">
|
|
27
|
+
<h1 class="page-head__h">Roadmap</h1>
|
|
23
28
|
<p class="page-head__sub" id="roadmap-sub">Loading the roadmap…</p>
|
|
24
29
|
</div>
|
|
25
30
|
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_": "The hall's roadmap deck through modules/ui-design/kit/render.js (task 1003306). The deck is the hall's densest figure surface — a hero band, four status groups and a summarised goal layer per version — so its floors are the 24px one (the goal rows are links in a tight list) and horizontal overflow at 320.",
|
|
3
|
+
"page": "/builders/roadmap",
|
|
4
|
+
"surface": "hall-ui",
|
|
5
|
+
"stub": { "prefix": "/builders/" },
|
|
6
|
+
"modeQuery": false,
|
|
7
|
+
"_feeds": "The kit's stub carries the public-landing fixtures, not the hall's versions/goals feeds, so the deck renders its EMPTY state here and the feed 404s are declared, never hidden. The populated deck is the hall-preview harness's job: node scripts/hall-preview/server.js --port 4612 --fixture-me, then this same file with --base-in/--base-out pointed at it.",
|
|
8
|
+
"ignoreRequests": [
|
|
9
|
+
"/api/(gds|bongos)/me$",
|
|
10
|
+
"/api/(gds|bongos)/me/",
|
|
11
|
+
"/api/(gds|bongos)/versions",
|
|
12
|
+
"/api/(gds|bongos)/goals",
|
|
13
|
+
"/api/(gds|bongos)/tasks",
|
|
14
|
+
"/api/(gds|bongos)/inbox/",
|
|
15
|
+
"/api/(gds|bongos)/public/"
|
|
16
|
+
],
|
|
17
|
+
"ignoreConsole": [
|
|
18
|
+
"/api/(gds|bongos)/",
|
|
19
|
+
"\\b401\\b",
|
|
20
|
+
"\\b404\\b",
|
|
21
|
+
"Unauthorized",
|
|
22
|
+
"Not Found",
|
|
23
|
+
"load failed",
|
|
24
|
+
"roadmap"
|
|
25
|
+
],
|
|
26
|
+
"states": {
|
|
27
|
+
"in": { "auth": true, "expect": { "visible": ["#rm-root"] } },
|
|
28
|
+
"out": { "auth": false }
|
|
29
|
+
},
|
|
30
|
+
"reducedMotion": { "auth": true }
|
|
31
|
+
}
|