@bongos/core 1.19.455 → 1.19.457

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 (48) hide show
  1. package/.bongos-core.json +106 -41
  2. package/docs/copy-inventory.md +231 -228
  3. package/docs/copy-registry.json +352 -312
  4. package/docs/module-api-changelog.md +4 -0
  5. package/modules/hall-ui/public/atlas.css +41 -32
  6. package/modules/hall-ui/public/atlas.html +8 -0
  7. package/modules/hall-ui/public/atlas.states.json +60 -0
  8. package/modules/hall-ui/public/collab.css +2 -2
  9. package/modules/hall-ui/public/collab.html +7 -1
  10. package/modules/hall-ui/public/collab.states.json +60 -0
  11. package/modules/hall-ui/public/copy-desk.css +21 -16
  12. package/modules/hall-ui/public/copy-desk.html +9 -1
  13. package/modules/hall-ui/public/copy-desk.states.json +59 -0
  14. package/modules/hall-ui/public/drachmae.html +38 -5
  15. package/modules/hall-ui/public/drachmae.js +20 -2
  16. package/modules/hall-ui/public/drachmae.states.json +64 -0
  17. package/modules/hall-ui/public/gate.css +20 -25
  18. package/modules/hall-ui/public/gate.html +9 -1
  19. package/modules/hall-ui/public/gate.states.json +60 -0
  20. package/modules/hall-ui/public/goals-lib.js +22 -5
  21. package/modules/hall-ui/public/goals-render.js +27 -5
  22. package/modules/hall-ui/public/goals.css +141 -60
  23. package/modules/hall-ui/public/goals.html +8 -1
  24. package/modules/hall-ui/public/goals.states.json +74 -0
  25. package/modules/hall-ui/public/government.css +35 -36
  26. package/modules/hall-ui/public/government.html +9 -1
  27. package/modules/hall-ui/public/government.states.json +59 -0
  28. package/modules/hall-ui/public/harbor.css +23 -26
  29. package/modules/hall-ui/public/harbor.html +9 -1
  30. package/modules/hall-ui/public/harbor.states.json +59 -0
  31. package/modules/hall-ui/public/modules.css +22 -21
  32. package/modules/hall-ui/public/modules.html +9 -1
  33. package/modules/hall-ui/public/modules.states.json +73 -0
  34. package/modules/hall-ui/public/people.html +7 -1
  35. package/modules/hall-ui/public/people.states.json +59 -0
  36. package/modules/hall-ui/public/scouting.html +7 -1
  37. package/modules/hall-ui/public/scouting.states.json +54 -0
  38. package/modules/hall-ui/public/sessions.css +1 -1
  39. package/modules/hall-ui/public/sessions.html +9 -1
  40. package/modules/hall-ui/public/sessions.states.json +58 -0
  41. package/modules/hall-ui/public/style.css +125 -5
  42. package/modules/hall-ui/public/watch.css +36 -39
  43. package/modules/hall-ui/public/watch.html +9 -1
  44. package/modules/hall-ui/public/watch.states.json +60 -0
  45. package/package-lock.json +2 -2
  46. package/package.json +1 -1
  47. package/src/module-api.js +1 -1
  48. package/tests/goal_subtitle.mjs +14 -8
@@ -3,8 +3,27 @@
3
3
  shared kit doesn't carry lives here: goal cards, the detail band, criteria /
4
4
  member / conflict lists, the invite + pending panels. Shared pieces —
5
5
  .pager--paged, .count-pill, .kit-tabs, .filters, .empty-state, .kit-skel —
6
- are in style.css's hall-kit section. Everything derives from the shared
7
- design tokens so instance packs reskin this page along with the rest. */
6
+ are in style.css's hall-kit section.
7
+
8
+ RE-SKINNED INTO THE CHROME WORLD, task 1003307 (goal 1000081). Goals is the
9
+ LIST ARCHETYPE the governance-and-lists pass applies across thirteen pages,
10
+ so this sheet is the reference the other twelve are held against. The
11
+ archetype is v3 "the glass hall", the owner's pick from the composition round
12
+ — docs/design/hall-direction-v2.md §6.
13
+
14
+ Three rules this sheet now keeps, and the next editor has to keep too:
15
+ - NO COMPAT ALIAS. --surface / --surface-2 / --border / --border-strong /
16
+ --accent-weak / --accent-text still resolve, because pages nobody has
17
+ re-skinned need them to. Spending one HERE is legal CSS that quietly opts
18
+ this sheet back out of the world. The real names are --bg-card / --glass /
19
+ --rule-soft / --rule / --accent-tint / --accent-ink.
20
+ - --line IS A WIDTH (1px), not a colour. The hairline's colour is --rule or
21
+ --rule-soft. A "border: var(--line) solid var(--rule-soft)" reads as one
22
+ idea; "1px solid var(--border)" reads as two guesses.
23
+ - THE PANEL HAS NO EDGE. v3 separates by tone: --bg-card at the full
24
+ --radius, its border transparent so focus and state have somewhere to go.
25
+ The ch unit is the zero glyph's width, not a character — the body measure is
26
+ --measure (48ch, measured at ~60 characters), never fresh ch arithmetic. */
8
27
 
9
28
  /* ---- goal-card grid (the CARDS view) ----
10
29
  task 2171 density pass: minmax 300→230 (four across at desktop width),
@@ -15,11 +34,12 @@
15
34
  .goal-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 10px; }
16
35
  .goal-card {
17
36
  display: flex; flex-direction: column; gap: 7px;
18
- background: var(--surface); border: 1px solid var(--border);
37
+ background: var(--bg-card); border: var(--line) solid transparent;
19
38
  border-radius: var(--radius); padding: 10px 12px;
20
39
  color: var(--ink);
21
40
  }
22
- a.goal-card:hover { text-decoration: none; border-color: var(--border-strong); background: var(--surface-2); }
41
+ /* Hover lifts the tone; the transparent edge is what focus lands on. */
42
+ a.goal-card:hover { text-decoration: none; background: var(--glass); }
23
43
  .goal-card__head { display: flex; align-items: flex-start; gap: 9px; }
24
44
  /* task 1003136: the task-1760 drag handle/priority/dragging rules that lived
25
45
  here are deleted with wireDragReorder (see goals-page.js) — the revived
@@ -34,10 +54,10 @@ a.goal-card:hover { text-decoration: none; border-color: var(--border-strong); b
34
54
  /* task 2163 — the real goal id, shown as a monospace #NNN token so it reads as
35
55
  an identifier and never gets confused with the priority ordinal on the left. */
36
56
  .goal-card__id, .goal-detail__id {
37
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
57
+ font-family: var(--font-mono);
38
58
  font-variant-numeric: tabular-nums; font-weight: 600; color: var(--ink-faint);
39
59
  }
40
- .goal-card__id { padding: 0 5px; border: 1px solid var(--rule-soft); border-radius: 5px; }
60
+ .goal-card__id { padding: 0 5px; border: var(--line) solid var(--rule-soft); border-radius: var(--radius-sm); }
41
61
  .goal-detail__id { font-size: 0.72em; vertical-align: 0.12em; margin-right: 4px; }
42
62
  .goal-card__foot { display: flex; flex-wrap: wrap; gap: 4px 10px; font-size: 11.5px; color: var(--ink-soft); }
43
63
  .goal-card__foot strong { font-variant-numeric: tabular-nums; }
@@ -49,8 +69,15 @@ a.goal-card:hover { text-decoration: none; border-color: var(--border-strong); b
49
69
 
50
70
  /* ---- detail view ---- */
51
71
  .goal-detail__head { display: flex; align-items: flex-start; gap: 20px; flex-wrap: wrap; }
52
- .goal-detail__title { font-size: 19px; font-weight: 650; letter-spacing: -0.01em; margin: 0; }
53
- .goal-detail__desc { color: var(--ink-soft); font-size: 13.5px; max-width: 72ch; margin: 6px 0 0; }
72
+ /* The goal's name is the subject of the detail view, so it takes the display
73
+ voice (Manrope 300, tight, sentence case) rather than a heavy UI weight —
74
+ v3's own divergence from the mono-label archetypes. */
75
+ .goal-detail__title {
76
+ font-family: var(--font-display); font-weight: 300;
77
+ font-size: clamp(22px, 2.4vw, 28px); line-height: 1.15; letter-spacing: -0.03em;
78
+ color: var(--ink); text-shadow: var(--type-halo); margin: 0;
79
+ }
80
+ .goal-detail__desc { color: var(--ink-soft); font-size: 13.5px; max-width: var(--measure); margin: 6px 0 0; }
54
81
  .goal-detail__actions { margin-left: auto; display: flex; gap: 8px; align-items: center; }
55
82
  /* task 1888/1828 — Completion | Members | Conflicts share ONE card. Wide:
56
83
  three columns split by vertical rules. Narrow: they stack, split by
@@ -59,10 +86,10 @@ a.goal-card:hover { text-decoration: none; border-color: var(--border-strong); b
59
86
  work list can no longer push them off the bottom of the page. */
60
87
  .goal-band { padding: 0; margin-top: 20px; display: grid; grid-template-columns: 1fr; }
61
88
  .goal-band__col { padding: 14px 18px; min-width: 0; }
62
- .goal-band__col + .goal-band__col { border-top: 1px solid var(--rule-soft); }
89
+ .goal-band__col + .goal-band__col { border-top: var(--line) solid var(--rule-soft); }
63
90
  @media (min-width: 900px) {
64
91
  .goal-band { grid-template-columns: repeat(3, minmax(0, 1fr)); }
65
- .goal-band__col + .goal-band__col { border-top: none; border-left: 1px solid var(--rule-soft); }
92
+ .goal-band__col + .goal-band__col { border-top: none; border-left: var(--line) solid var(--rule-soft); }
66
93
  }
67
94
 
68
95
  /* Live conflicts: the band COLUMN can't own the card border, so it gets a
@@ -70,26 +97,26 @@ a.goal-card:hover { text-decoration: none; border-color: var(--border-strong); b
70
97
  (Count pills on these headers are the shared .count-pill.) */
71
98
  .goal-conflicts-card--live { background: color-mix(in srgb, var(--warn) 6%, transparent); }
72
99
  .goal-conflicts-card--live .count-pill { background: var(--warn-weak); color: var(--warn); }
73
- #goal-conflicts-view-card.goal-conflicts-card--live { background: var(--surface); border-color: color-mix(in srgb, var(--warn) 40%, var(--border)); }
100
+ #goal-conflicts-view-card.goal-conflicts-card--live { background: var(--bg-card); border-color: color-mix(in srgb, var(--warn) 42%, transparent); }
74
101
 
75
102
  /* task 1828 — inline Claim on a ready To-do row + the conflicts "view all". */
76
103
  .goal-claim-btn {
77
104
  display: inline-flex; align-items: center; justify-content: center;
78
105
  height: 24px; padding: 0 12px; border-radius: var(--radius-sm);
79
- border: 1px solid var(--accent); background: var(--accent); color: #fff;
106
+ border: var(--line) solid var(--accent); background: var(--accent); color: var(--accent-on);
80
107
  font-size: 12px; font-weight: 600; cursor: pointer; white-space: nowrap;
81
108
  }
82
- .goal-claim-btn:hover:not(:disabled) { background: var(--accent-deep); }
109
+ .goal-claim-btn:hover:not(:disabled) { background: var(--accent-lift); }
83
110
  .goal-claim-btn:disabled { opacity: 0.55; cursor: default; }
84
111
  /* task 1828 — Release on the viewer's OWN active claim (ghost, not accent —
85
112
  it's the undo of a claim); a muted label for another builder's claim. */
86
113
  .goal-release-btn {
87
114
  display: inline-flex; align-items: center; justify-content: center;
88
115
  height: 24px; padding: 0 12px; border-radius: var(--radius-sm);
89
- border: 1px solid var(--border-strong); background: var(--surface); color: var(--ink-soft);
116
+ border: var(--line) solid var(--rule); background: var(--bg-card); color: var(--ink-soft);
90
117
  font-size: 12px; font-weight: 600; cursor: pointer; white-space: nowrap;
91
118
  }
92
- .goal-release-btn:hover:not(:disabled) { background: var(--surface-2); color: var(--ink); }
119
+ .goal-release-btn:hover:not(:disabled) { background: var(--glass); color: var(--ink); }
93
120
  .goal-release-btn:disabled { opacity: 0.55; cursor: default; }
94
121
  .ledger__claimed { font-size: 12px; color: var(--ink-faint); white-space: nowrap; }
95
122
  .ledger__action { text-align: right; white-space: nowrap; }
@@ -121,8 +148,8 @@ a.goal-card:hover { text-decoration: none; border-color: var(--border-strong); b
121
148
  .goal-work__tabs .kit-tabs { margin: 0; }
122
149
  .conflict__sev {
123
150
  display: inline-flex; align-items: center; height: 18px; padding: 0 7px; margin-left: 8px;
124
- border-radius: 999px; font-size: 10.5px; font-weight: 600; vertical-align: 1px;
125
- background: var(--surface-2); color: var(--ink-soft);
151
+ border-radius: var(--radius-pill); font-size: 10.5px; font-weight: 600; vertical-align: 1px;
152
+ background: var(--glass); color: var(--ink-soft);
126
153
  }
127
154
  .conflict__sev--high { background: var(--danger-weak); color: var(--danger); }
128
155
  .conflict__sev--medium { background: var(--warn-weak); color: var(--warn); }
@@ -130,10 +157,13 @@ a.goal-card:hover { text-decoration: none; border-color: var(--border-strong); b
130
157
  .crit-list { list-style: none; margin: 10px 0 0; padding: 0; display: flex; flex-direction: column; }
131
158
  /* task 1002164 — a third trailing column holds the per-criterion Confirm action;
132
159
  it collapses to zero width on the rows that have none. */
133
- .crit { display: grid; grid-template-columns: 22px minmax(0,1fr) auto; gap: 10px; padding: 6px 0; border-bottom: 1px solid var(--rule-soft); font-size: 13px; }
160
+ .crit { display: grid; grid-template-columns: 22px minmax(0,1fr) auto; gap: 10px; padding: 6px 0; border-bottom: var(--line) solid var(--rule-soft); font-size: 13px; }
134
161
  .crit:last-child { border-bottom: none; }
135
- .crit__mark { width: 18px; height: 18px; border-radius: 50%; border: 1.5px solid var(--border-strong); display: flex; align-items: center; justify-content: center; font-size: 11px; color: var(--ink-faint); }
136
- .crit--done .crit__mark { background: var(--ok); border-color: var(--ok); color: #fff; }
162
+ .crit__mark { width: 18px; height: 18px; border-radius: 50%; border: 1.5px solid var(--rule); display: flex; align-items: center; justify-content: center; font-size: 11px; color: var(--ink-faint); }
163
+ /* The tick reads ON the ok fill, so it takes the card ground: near-white in
164
+ light where --ok is a deep green, near-black in dark where --ok is a light
165
+ one. A fixed #fff was legible in one mode only. */
166
+ .crit--done .crit__mark { background: var(--ok); border-color: var(--ok); color: var(--bg-card); }
137
167
  .crit--done .crit__text { color: var(--ink-soft); }
138
168
 
139
169
  /* task 1002164 — "met, awaiting confirmation": every linked task shipped but the
@@ -143,33 +173,33 @@ a.goal-card:hover { text-decoration: none; border-color: var(--border-strong); b
143
173
  .crit__act { display: flex; align-items: center; }
144
174
  .crit-list--full .crit__act { align-self: start; padding-top: 1px; }
145
175
  .crit__confirm {
146
- cursor: pointer; white-space: nowrap; padding: 3px 10px; border-radius: 999px;
147
- border: 1px solid var(--ok); background: transparent; color: var(--ok);
148
- font: inherit; font-size: 11.5px; font-weight: 600;
176
+ cursor: pointer; white-space: nowrap; padding: 3px 10px; border-radius: var(--radius-pill);
177
+ border: var(--line) solid var(--ok); background: transparent; color: var(--ok);
178
+ font: inherit; font-size: 11.5px; font-weight: 600; min-height: 24px;
149
179
  }
150
- .crit__confirm:hover:not(:disabled) { background: var(--ok); color: #fff; }
180
+ .crit__confirm:hover:not(:disabled) { background: var(--ok); color: var(--bg-card); }
151
181
  .crit__confirm:disabled { opacity: .6; cursor: default; }
152
182
  .crit__flag {
153
- white-space: nowrap; padding: 2px 8px; border-radius: 999px;
183
+ white-space: nowrap; padding: 2px 8px; border-radius: var(--radius-pill);
154
184
  background: var(--warn-weak); color: var(--warn); font-size: 10.5px; font-weight: 600;
155
185
  }
156
186
  /* BV1.R79: per-criterion expand in the capped band — short label, full text on
157
187
  click (matches the Roadmap page's .vbar__crit-d pattern). */
158
188
  .crit-d { min-width: 0; }
159
- .crit-d > summary { cursor: pointer; list-style: none; text-decoration: underline dotted var(--border-strong); text-underline-offset: 3px; }
189
+ .crit-d > summary { cursor: pointer; list-style: none; min-height: 24px; text-decoration: underline dotted var(--rule); text-underline-offset: 3px; }
160
190
  .crit-d > summary::-webkit-details-marker { display: none; }
161
191
  .crit-d[open] > summary { text-decoration: none; font-weight: 500; }
162
192
  .crit-d .crit__detail { margin-top: 4px; }
163
193
 
164
194
  .member-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; }
165
- .member { display: flex; align-items: center; gap: 10px; padding: 6px 0; border-bottom: 1px solid var(--rule-soft); font-size: 13px; }
195
+ .member { display: flex; align-items: center; gap: 10px; padding: 6px 0; border-bottom: var(--line) solid var(--rule-soft); font-size: 13px; }
166
196
  .member:last-child { border-bottom: none; }
167
- .member__avatar { width: 24px; height: 24px; border-radius: 50%; background: var(--accent-weak); color: var(--accent-text); font-size: 10px; font-weight: 600; display: flex; align-items: center; justify-content: center; overflow: hidden; flex-shrink: 0; }
197
+ .member__avatar { width: 24px; height: 24px; border-radius: 50%; background: var(--accent-tint); color: var(--accent-ink); font-size: 10px; font-weight: 600; display: flex; align-items: center; justify-content: center; overflow: hidden; flex-shrink: 0; }
168
198
  .member__avatar img { width: 100%; height: 100%; object-fit: cover; border-radius: 50%; }
169
199
  .member__name { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
170
200
  .member__name small { color: var(--ink-faint); }
171
- .member-pill { display: inline-flex; align-items: center; height: 20px; padding: 0 9px; border-radius: 999px; font-size: 11px; font-weight: 600; background: var(--surface-2); color: var(--ink-soft); }
172
- .member-pill--lead { background: var(--accent-weak); color: var(--accent-text); }
201
+ .member-pill { display: inline-flex; align-items: center; height: 20px; padding: 0 9px; border-radius: var(--radius-pill); font-size: 11px; font-weight: 600; background: var(--glass); color: var(--ink-soft); }
202
+ .member-pill--lead { background: var(--accent-tint); color: var(--accent-ink); }
173
203
 
174
204
  /* task 1762/1877 — owner/manager invite control (goal member admission),
175
205
  collapsed behind "+ Invite" (disclosure, closed by default — task 2171). */
@@ -181,17 +211,21 @@ a.goal-card:hover { text-decoration: none; border-color: var(--border-strong); b
181
211
  pending invite/join-request queue (manager view, next to the invite box). */
182
212
  .goal-badge--locked { background: var(--warn-weak); color: var(--warn); }
183
213
  .goal-pending { margin: 4px 0 10px; display: flex; flex-direction: column; gap: 10px; }
184
- .pending-group__h { font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.02em; color: var(--ink-faint); margin: 0 0 4px; display: flex; align-items: center; gap: 6px; }
214
+ .pending-group__h {
215
+ font-family: var(--label-face); font-size: var(--label-size); font-weight: 400;
216
+ letter-spacing: var(--label-space); text-transform: var(--label-case);
217
+ color: var(--ink-faint); margin: 0 0 4px; display: flex; align-items: center; gap: 6px;
218
+ }
185
219
  .pending-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; }
186
- .pending-row { display: flex; align-items: center; gap: 8px; padding: 6px 0; border-bottom: 1px solid var(--rule-soft); font-size: 13px; flex-wrap: wrap; }
220
+ .pending-row { display: flex; align-items: center; gap: 8px; padding: 6px 0; border-bottom: var(--line) solid var(--rule-soft); font-size: 13px; flex-wrap: wrap; }
187
221
  .pending-row:last-child { border-bottom: none; }
188
222
  .pending-row__who { font-weight: 600; }
189
223
  .pending-row__note { color: var(--ink-faint); font-size: 12px; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
190
224
  .pending-row__actions { display: flex; gap: 6px; margin-left: auto; }
191
225
 
192
- .conflict { border: 1px solid color-mix(in srgb, var(--warn) 30%, var(--border)); background: var(--warn-weak); border-radius: var(--radius-sm); padding: 8px 12px; font-size: 12.5px; margin: 8px 0 0; }
226
+ .conflict { border: var(--line) solid color-mix(in srgb, var(--warn) 42%, transparent); background: var(--warn-weak); border-radius: var(--radius-sm); padding: 8px 12px; font-size: 12.5px; margin: 8px 0 0; }
193
227
  .conflict__pair { font-weight: 600; }
194
- .conflict__paths { font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; font-size: 11.5px; color: var(--ink-soft); margin-top: 4px; word-break: break-all; }
228
+ .conflict__paths { font-family: var(--font-mono); font-size: 11.5px; color: var(--ink-soft); margin-top: 4px; word-break: break-all; }
195
229
  .conflict-note { font-size: 12px; color: var(--ink-faint); margin: 10px 0 0; }
196
230
 
197
231
  /* Filtered-count line under the kit filter bar (list view). */
@@ -214,37 +248,84 @@ a.goal-card:hover { text-decoration: none; border-color: var(--border-strong); b
214
248
  .gr-sm b { font-size: 20px; font-weight: 700; letter-spacing: -.02em; color: var(--ink); font-variant-numeric: tabular-nums; }
215
249
  .gr-sm__dot { width: 8px; height: 8px; border-radius: 50%; align-self: center; }
216
250
 
217
- .gr-sec { display: flex; align-items: center; gap: 9px; margin: 26px 0 8px; }
218
- .gr-sec b { font-size: 12px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--ink-faint); }
251
+ /* The group head sits on a --rule hairline (the archetype's .group__head): a
252
+ heavier line than the rows' --rule-soft, so the groups read as the outer
253
+ division and the rows as the inner one. */
254
+ .gr-sec { display: flex; align-items: center; gap: 12px; margin: 26px 0 0; padding: 0 0 10px; border-bottom: var(--line) solid var(--rule); }
255
+ /* The section name is the label voice — take the tokens, never the family:
256
+ --label-face is mono in light and the body face in dark, because mono caps
257
+ read as precise on paper and as thin and technical on black. */
258
+ .gr-sec b {
259
+ font-family: var(--label-face); font-size: var(--label-size); font-weight: 400;
260
+ letter-spacing: var(--label-space); text-transform: var(--label-case);
261
+ color: var(--ink-faint);
262
+ }
219
263
  .gr-sec__n { font-size: 12px; color: var(--ink-faint); font-variant-numeric: tabular-nums; }
220
264
 
221
- .gr-list { border: 1px solid var(--border); border-radius: var(--radius); background: var(--bg-card); overflow: hidden; }
222
- .gr-row { display: grid; grid-template-columns: auto 1fr auto; gap: 16px; align-items: center; padding: 15px 17px; border-bottom: 1px solid var(--rule-soft); }
223
- .gr-row:last-child { border-bottom: 0; }
224
- .gr-row:hover { background: color-mix(in srgb, var(--ink) 2.5%, var(--bg-card)); }
265
+ /* The rollup list is one panel, not a stack of bordered rows: --bg-card at the
266
+ full radius with a transparent edge, and the rows' own hairlines doing the
267
+ dividing. The padding is the panel's, so the first and last rows breathe
268
+ against it rather than against their own borders. */
269
+ .gr-list { border: var(--line) solid transparent; border-radius: var(--radius); background: var(--bg-card); padding: 4px 0; overflow: hidden; }
270
+ /* The archetype's row (mock .goal): the air is the loosest of the three
271
+ versions, the columns are ring / content / right, and the rule sits on TOP so
272
+ the first row can drop it and start flush against the panel's own padding. */
273
+ .gr-row { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 24px; align-items: start; padding: 20px 22px; border-top: var(--line) solid var(--rule-soft); }
274
+ .gr-row:first-child { border-top: 0; }
275
+ .gr-row:hover { background: var(--glass); }
225
276
  .gr-ringcol { flex: none; }
226
277
  .gr-crit-none { display: inline-grid; place-items: center; width: 44px; height: 44px; border-radius: 50%; border: 2px solid var(--rule); color: var(--ink-faint); font-size: 13px; }
227
278
  .gr-main { min-width: 0; }
228
- .gr-title { display: inline-block; font-size: 15px; font-weight: 650; letter-spacing: -.01em; color: var(--ink); line-height: 1.3; }
229
- .gr-title:hover { color: var(--accent-text); }
230
- .gr-meta { font-size: 12px; color: var(--ink-faint); margin-top: 3px; font-variant-numeric: tabular-nums; }
231
- .gr-roll { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 8px; }
279
+ /* The goal's name is the way into the goal, so it is a control and owes the
280
+ 24px floor on BOTH axes. Its 15px/1.3 line box measured 20px tall (the kit's
281
+ controls-24px finding, 26 rows at 1440); the padding buys the height and the
282
+ equal negative margin hands the space back so the row does not re-space. */
283
+ /* The name at the archetype's weight: 17px/500, not 15px/650. A heavy small
284
+ title reads as a label; this reads as the thing itself. It is also the way
285
+ into the goal, so it owes the 24px floor on both axes — the padding buys the
286
+ height and the equal negative margin hands the space back. */
287
+ .gr-title {
288
+ display: inline-block; font-size: 17px; font-weight: 500; letter-spacing: -.014em;
289
+ color: var(--ink); line-height: 1.3; text-decoration: none;
290
+ min-height: 24px; min-width: 24px; padding: 3px 4px; margin: 0 -4px;
291
+ }
292
+ .gr-title:hover { color: var(--accent-ink); text-decoration: underline; text-underline-offset: 3px; }
293
+ /* The id rides INSIDE the title rather than on the meta line below it, so every
294
+ row's name starts at the same x and the id never competes for the second line
295
+ the subtitle now wants. */
296
+ .gr-title__id { font-family: var(--font-mono); font-size: 12px; font-variant-numeric: tabular-nums; color: var(--ink-faint); margin-right: 9px; }
297
+
298
+ /* The goal's own one-line explanation. Task 1003224 made this a tooltip; task
299
+ 1003307 gives it the line back on the owner's call, because 35 of 72 goals
300
+ carry one and a tooltip does not exist on a touch screen. Empty goals render
301
+ no element at all, so a row without a subtitle simply closes up. */
302
+ .gr-sub { margin: 5px 0 0; color: var(--ink-soft); font-size: 14px; line-height: 1.5; max-width: var(--measure); }
303
+
304
+ /* The fact line: the state, then what the goal is scoped to. The pill and the
305
+ chip themselves are the shell's .fact-pill / .fact-chip — this row only says
306
+ how they sit together. */
307
+ .gr-facts { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 10px; margin: 12px 0 0; }
308
+ /* What is left of the old meta run-on: the sort stamp, and only while a date
309
+ sort is active. The id moved into the title, the version became a chip and the
310
+ status became a pill. */
311
+ .gr-meta { font-size: 12px; color: var(--ink-faint); margin-top: 8px; font-variant-numeric: tabular-nums; }
312
+ .gr-roll { display: flex; flex-wrap: wrap; gap: 8px 18px; margin-top: 12px; }
232
313
  .gr-d { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; color: var(--ink-soft); font-variant-numeric: tabular-nums; }
233
314
  .gr-d i { width: 7px; height: 7px; border-radius: 50%; }
234
315
  .gr-d b { color: var(--ink); font-weight: 600; }
235
- .gr-right { text-align: right; min-width: 150px; display: flex; flex-direction: column; align-items: flex-end; gap: 8px; }
316
+ .gr-right { text-align: right; min-width: 150px; max-width: 244px; display: flex; flex-direction: column; align-items: flex-end; gap: 10px; }
236
317
  .gr-next { display: flex; flex-direction: column; align-items: flex-end; gap: 8px; max-width: 230px; }
237
318
  .gr-next__t { font-size: 12.5px; color: var(--ink-soft); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 230px; }
238
- .gr-claim { background: var(--accent); color: #fff; border-radius: 8px; padding: 6px 14px; font-size: 12.5px; font-weight: 650; white-space: nowrap; }
319
+ .gr-claim { background: var(--accent); color: var(--accent-on); border-radius: var(--radius-sm); padding: 6px 14px; font-size: 12.5px; font-weight: 650; white-space: nowrap; }
239
320
  .gr-claim:hover { background: var(--accent-deep); }
240
- .gr-drill { font-size: 12.5px; color: var(--ink-faint); display: inline-flex; align-items: center; gap: 5px; }
241
- .gr-drill:hover { color: var(--accent-text); }
321
+ .gr-drill { font-size: 12.5px; color: var(--ink-faint); display: inline-flex; align-items: center; min-height: 24px; gap: 5px; }
322
+ .gr-drill:hover { color: var(--accent-ink); }
242
323
  .gr-met { font-size: 12.5px; font-weight: 600; color: var(--ok); }
243
324
  .gr-quiet { font-size: 12.5px; color: var(--ink-faint); }
244
325
 
245
326
  .gr-pills { display: flex; flex-wrap: wrap; gap: 8px; }
246
- .gr-pill { display: inline-flex; align-items: center; gap: 8px; background: var(--bg-card); border: 1px solid var(--rule); border-radius: 20px; padding: 6px 13px 6px 8px; color: var(--ink-soft); font-size: 12.5px; }
247
- .gr-pill:hover { border-color: var(--border-strong); }
327
+ .gr-pill { display: inline-flex; align-items: center; gap: 8px; background: var(--bg-card); border: var(--line) solid var(--rule); border-radius: var(--radius-pill); padding: 6px 13px 6px 8px; color: var(--ink-soft); font-size: 12.5px; min-height: 24px; }
328
+ .gr-pill:hover { background: var(--glass); }
248
329
  .gr-pill b { color: var(--ink); font-weight: 600; }
249
330
  .gr-pill__ok { width: 17px; height: 17px; border-radius: 50%; background: var(--ok-weak); color: var(--ok); display: grid; place-items: center; font-size: 10px; font-weight: 800; }
250
331
  .gr-pill__id { color: var(--ink-faint); font-variant-numeric: tabular-nums; }
@@ -266,25 +347,26 @@ a.goal-card:hover { text-decoration: none; border-color: var(--border-strong); b
266
347
  subordinate; the bulk prose Claude writes is behind a disclosure and absent
267
348
  from the default reading path until someone asks for it.
268
349
  Tokens only from style.css's real set (--ink-soft, --ink-faint, --rule,
269
- --surface, --radius-sm) — inventing one renders as nothing, which is how
350
+ --glass, --radius-sm) — inventing one renders as nothing, which is how
270
351
  copy-desk.css ended up with invisible fallbacks (idea 1000821). */
271
352
  .goal-detail__subtitle {
272
353
  color: var(--ink-soft);
273
354
  font-size: 13px;
274
355
  font-weight: 400;
275
356
  line-height: 1.45;
276
- max-width: 72ch;
357
+ max-width: var(--measure);
277
358
  margin: 3px 0 0;
278
359
  }
279
360
 
280
361
  /* The disclosure is deliberately quiet: a row someone can ignore. */
281
362
  .claude-text {
282
363
  margin: 10px 0 0;
283
- max-width: 72ch;
284
- border-top: 1px solid var(--rule);
364
+ max-width: var(--measure);
365
+ border-top: var(--line) solid var(--rule);
285
366
  padding-top: 8px;
286
367
  }
287
368
 
369
+ /* A <summary> is a control: the floor applies. It measured 162x19. */
288
370
  .claude-text__toggle {
289
371
  color: var(--ink-faint);
290
372
  font-size: 12px;
@@ -293,6 +375,7 @@ a.goal-card:hover { text-decoration: none; border-color: var(--border-strong); b
293
375
  user-select: none;
294
376
  display: inline-flex;
295
377
  align-items: center;
378
+ min-height: 24px;
296
379
  gap: 6px;
297
380
  }
298
381
 
@@ -305,18 +388,16 @@ a.goal-card:hover { text-decoration: none; border-color: var(--border-strong); b
305
388
  }
306
389
  .claude-text[open] > .claude-text__toggle::before { transform: rotate(90deg); }
307
390
  .claude-text__toggle:hover { color: var(--ink-soft); }
308
- .claude-text__toggle:focus-visible {
309
- outline: 2px solid var(--accent);
310
- outline-offset: 2px;
311
- border-radius: var(--radius-sm);
312
- }
391
+ /* The shell already rings :focus-visible in the world's two-tone recipe; a
392
+ page-local ring here would be a second, thinner one. Removed with the
393
+ re-skin — style.css:...:focus-visible owns it. */
313
394
 
314
395
  /* Set apart once opened, so it reads as a machine's notes rather than as the
315
396
  goal's own definition. */
316
397
  .claude-text__body {
317
398
  margin: 8px 0 0;
318
399
  padding: 8px 10px;
319
- background: var(--surface);
400
+ background: var(--glass);
320
401
  border-radius: var(--radius-sm);
321
402
  color: var(--ink-soft);
322
403
  font-size: 13px;
@@ -30,7 +30,14 @@
30
30
  <div class="app-body">
31
31
  <header class="app-topbar" id="app-topbar"></header>
32
32
  <div class="app-content">
33
- <div class="page-head">
33
+ <!-- task 1003307: the board page head. goals.html shipped with NO <h1>
34
+ at all (the platform floor one-header-main-h1 measured 0), so the
35
+ re-skin carries the structural fix rather than porting the hole. The
36
+ heading is the label voice, not a display line: the goals ARE the
37
+ page, and a 22px title above them would be the loudest thing on a
38
+ surface whose content is rows. -->
39
+ <div class="page-head page-head--board">
40
+ <h1 class="page-head__h">Goals</h1>
34
41
  <p class="page-head__sub" id="goals-sub">Loading goals…</p>
35
42
  </div>
36
43
 
@@ -0,0 +1,74 @@
1
+ {
2
+ "_": "The hall's Goals list + goal detail through modules/ui-design/kit/render.js (task 1003307). Goals is the LIST ARCHETYPE the governance-and-lists re-skin applies across thirteen pages, so its floors are measured first and the rest are held against them. Populated look: node scripts/hall-preview/server.js --port 4620 --fixture-me, then --base-in/--base-out at that origin.",
3
+ "page": "/builders/goals",
4
+ "surface": "hall-ui",
5
+ "stub": {
6
+ "prefix": "/builders/"
7
+ },
8
+ "modeQuery": false,
9
+ "_feeds": "The kit's own stub carries no goal feed, so against it the page renders its EMPTY and SKELETON states — which is deliberate: an empty board is a state the floors must hold in. Against the hall-preview harness the same states render populated. The feed 404s are declared here, never hidden. work-categories and goals/rollups have no checked-in fixture, so the harness answers 404: declared here, not hidden.",
10
+ "ignoreRequests": [
11
+ "/api/(gds|bongos)/me$",
12
+ "/api/(gds|bongos)/me/",
13
+ "/api/(gds|bongos)/goals",
14
+ "/api/(gds|bongos)/tasks",
15
+ "/api/(gds|bongos)/versions",
16
+ "/api/(gds|bongos)/inbox/",
17
+ "/api/(gds|bongos)/work-categories"
18
+ ],
19
+ "ignoreConsole": [
20
+ "/api/(gds|bongos)/",
21
+ "\b401\b",
22
+ "\b404\b",
23
+ "Unauthorized",
24
+ "Not Found",
25
+ "load failed"
26
+ ],
27
+ "states": {
28
+ "list": {
29
+ "auth": true,
30
+ "actions": [
31
+ [
32
+ "wait",
33
+ 600
34
+ ]
35
+ ],
36
+ "expect": {
37
+ "visible": [
38
+ "#goals-list-view",
39
+ "#goals-filters"
40
+ ],
41
+ "hidden": [
42
+ "#goal-detail-view"
43
+ ]
44
+ }
45
+ },
46
+ "detail": {
47
+ "auth": true,
48
+ "url": "/builders/goals#/goal/1000081",
49
+ "actions": [
50
+ [
51
+ "wait",
52
+ 800
53
+ ]
54
+ ],
55
+ "expect": {
56
+ "visible": [
57
+ "#goal-detail-view"
58
+ ]
59
+ }
60
+ },
61
+ "out": {
62
+ "auth": false
63
+ }
64
+ },
65
+ "reducedMotion": {
66
+ "auth": true,
67
+ "actions": [
68
+ [
69
+ "wait",
70
+ 600
71
+ ]
72
+ ]
73
+ }
74
+ }
@@ -19,40 +19,39 @@
19
19
  .gov-rank-list { display: flex; flex-direction: column; gap: 8px; }
20
20
  .gov-rank {
21
21
  text-align: left; font: inherit; cursor: pointer;
22
- border: 1px solid var(--border); border-radius: var(--radius-sm);
23
- background: var(--surface); padding: 10px 12px;
22
+ border: var(--line) solid var(--rule-soft); border-radius: var(--radius-sm);
23
+ background: var(--bg-card); padding: 10px 12px;
24
24
  display: flex; flex-direction: column; gap: 4px;
25
25
  }
26
- .gov-rank:hover { background: var(--surface-2); }
26
+ .gov-rank:hover { background: var(--glass); }
27
27
  .gov-rank[aria-pressed="true"] { border-color: var(--accent); box-shadow: inset 2px 0 0 var(--accent); }
28
28
  .gov-rank__head { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; }
29
29
  .gov-rank__label { font-weight: 600; color: var(--ink); font-size: 13.5px; }
30
30
  .gov-rank__meta { color: var(--ink-faint); font-size: 11.5px; }
31
31
 
32
- .gov-pill {
33
- font-size: 10.5px; font-weight: 600;
34
- letter-spacing: 0.04em; text-transform: uppercase;
35
- padding: 1px 7px; border-radius: 999px; white-space: nowrap;
36
- border: 1px solid var(--border); color: var(--ink-soft); background: var(--surface-2);
37
- }
38
- .gov-pill--seeded { background: var(--info-weak); border-color: color-mix(in srgb, var(--info) 30%, transparent); color: var(--info); }
39
- .gov-pill--custom { background: var(--ok-weak, var(--surface-2)); border-color: color-mix(in srgb, var(--ok) 30%, transparent); color: var(--ok); }
40
- .gov-pill--locked { background: var(--danger-weak); border-color: color-mix(in srgb, var(--danger) 30%, transparent); color: var(--danger); }
32
+ /* The base is the shell's .fact-pill (task 1003307) — this sheet's copy spelled
33
+ the label voice as literals, so it never flipped to the body face in dark.
34
+ Only the states are the page's own, and a state is a HAIRLINE in its own
35
+ colour: the archetype's .status carries no fill, so the pill never competes
36
+ with the row it sits on. */
37
+ .gov-pill--seeded { color: var(--info); }
38
+ .gov-pill--custom { color: var(--ok); }
39
+ .gov-pill--locked { color: var(--danger); }
41
40
  .gov-pill--floor { font-variant-numeric: tabular-nums; }
42
41
 
43
42
  /* ---- permission grid ---------------------------------------------------- */
44
- .gov-section { margin: 0 0 18px; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); overflow: hidden; }
43
+ .gov-section { margin: 0 0 18px; border: var(--line) solid var(--rule-soft); border-radius: var(--radius); background: var(--bg-card); overflow: hidden; }
45
44
  .gov-section__head {
46
45
  padding: 8px 14px; font-size: 11.5px; font-weight: 600;
47
46
  letter-spacing: 0.04em; text-transform: uppercase; color: var(--ink-soft);
48
- background: var(--surface-2); border-bottom: 1px solid var(--border);
47
+ background: var(--glass); border-bottom: var(--line) solid var(--rule-soft);
49
48
  }
50
- .gov-perm { display: flex; align-items: center; gap: 10px; padding: 8px 14px; border-bottom: 1px solid var(--border); }
49
+ .gov-perm { display: flex; align-items: center; gap: 10px; padding: 8px 14px; border-bottom: var(--line) solid var(--rule-soft); }
51
50
  .gov-perm:last-child { border-bottom: 0; }
52
51
  .gov-perm__main { flex: 1 1 auto; min-width: 0; }
53
52
  .gov-perm__key {
54
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12.5px;
55
- color: var(--accent-text); background: var(--surface-2);
53
+ font-family: var(--font-mono); font-size: 12.5px;
54
+ color: var(--accent-ink); background: var(--glass);
56
55
  padding: 1px 5px; border-radius: 4px;
57
56
  }
58
57
  .gov-perm__guards { color: var(--ink-soft); font-size: 12px; margin-top: 2px; overflow-wrap: anywhere; }
@@ -60,10 +59,10 @@
60
59
  /* The toggle: a small pill button. Held = filled; not held = outline. */
61
60
  .gov-toggle {
62
61
  font: inherit; font-size: 12px; font-weight: 600; cursor: pointer;
63
- padding: 4px 12px; border-radius: 999px; white-space: nowrap;
64
- border: 1px solid var(--border-strong); background: var(--surface); color: var(--ink-soft);
62
+ padding: 4px 12px; border-radius: var(--radius-pill); white-space: nowrap;
63
+ border: var(--line) solid var(--rule); background: var(--bg-card); color: var(--ink-soft);
65
64
  }
66
- .gov-toggle[aria-pressed="true"] { background: var(--accent); border-color: var(--accent); color: #fff; }
65
+ .gov-toggle[aria-pressed="true"] { background: var(--accent); border-color: var(--accent); color: var(--accent-on); }
67
66
  .gov-toggle:hover:not(:disabled) { border-color: var(--accent); }
68
67
  .gov-toggle:disabled { opacity: 0.55; cursor: default; }
69
68
  .gov-held-note { color: var(--ok); font-size: 12px; white-space: nowrap; }
@@ -73,33 +72,33 @@
73
72
  .gov-assign { flex-direction: row; flex-wrap: wrap; align-items: center; margin-bottom: 14px; }
74
73
  .gov-input {
75
74
  font: inherit; font-size: 13px; color: var(--ink);
76
- background: var(--surface); border: 1px solid var(--border-strong);
75
+ background: var(--bg-card); border: var(--line) solid var(--rule);
77
76
  border-radius: var(--radius-sm); padding: 7px 10px;
78
77
  }
79
78
  .gov-input:focus { outline: none; border-color: var(--accent); }
80
79
  .gov-input--id { width: 110px; }
81
80
  .gov-btn {
82
81
  font: inherit; font-size: 13px; font-weight: 600;
83
- padding: 7px 16px; border: 1px solid var(--accent);
84
- background: var(--accent); color: #fff;
82
+ padding: 7px 16px; border: var(--line) solid var(--accent);
83
+ background: var(--accent); color: var(--accent-on);
85
84
  border-radius: var(--radius-sm); cursor: pointer; align-self: flex-start;
86
85
  }
87
- .gov-btn:hover:not(:disabled) { background: var(--accent-deep); border-color: var(--accent-deep); }
86
+ .gov-btn:hover:not(:disabled) { background: var(--accent-lift); border-color: var(--accent-lift); }
88
87
  .gov-btn:disabled { opacity: 0.45; cursor: default; }
89
- .gov-btn--ghost { background: var(--surface); color: var(--ink); border-color: var(--border-strong); }
90
- .gov-btn--ghost:hover:not(:disabled) { background: var(--surface-2); }
88
+ .gov-btn--ghost { background: var(--bg-card); color: var(--ink); border-color: var(--rule); }
89
+ .gov-btn--ghost:hover:not(:disabled) { background: var(--glass); }
91
90
  .gov-btn--small { font-size: 12px; padding: 4px 10px; }
92
91
 
93
92
  /* ---- assignments + principals ------------------------------------------ */
94
- .gov-assign-row { display: flex; align-items: center; gap: 10px; padding: 8px 14px; border-bottom: 1px solid var(--border); }
93
+ .gov-assign-row { display: flex; align-items: center; gap: 10px; padding: 8px 14px; border-bottom: var(--line) solid var(--rule-soft); }
95
94
  .gov-assign-row:last-child { border-bottom: 0; }
96
95
  .gov-assign-row__who { flex: 1 1 auto; color: var(--ink); font-size: 13px; min-width: 0; overflow-wrap: anywhere; }
97
96
  .gov-assign-row__who .muted { color: var(--ink-faint); }
98
- .gov-principal { padding: 8px 14px; border-bottom: 1px solid var(--border); font-size: 12.5px; color: var(--ink-soft); }
97
+ .gov-principal { padding: 8px 14px; border-bottom: var(--line) solid var(--rule-soft); font-size: 12.5px; color: var(--ink-soft); }
99
98
  .gov-principal:last-child { border-bottom: 0; }
100
99
  .gov-principal code {
101
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px;
102
- color: var(--accent-text); background: var(--surface-2); padding: 1px 5px; border-radius: 4px;
100
+ font-family: var(--font-mono); font-size: 12px;
101
+ color: var(--accent-ink); background: var(--glass); padding: 1px 5px; border-radius: 4px;
103
102
  }
104
103
 
105
104
  /* ---- the Board Room: one sitting, one decision (task 1003270) -------------
@@ -109,8 +108,8 @@
109
108
  title, the ballot sits directly under it, the idea's own words are body text,
110
109
  and the constitutional metadata is the only thing behind a click. */
111
110
  .gov-item {
112
- margin: 0 0 18px; border: 1px solid var(--border); border-radius: var(--radius);
113
- background: var(--surface); overflow: hidden;
111
+ margin: 0 0 18px; border: var(--line) solid var(--rule-soft); border-radius: var(--radius);
112
+ background: var(--bg-card); overflow: hidden;
114
113
  }
115
114
  .gov-item__head {
116
115
  display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between;
@@ -129,7 +128,7 @@
129
128
  .gov-item__cast { margin: 0; color: var(--ink-soft); font-size: 12.5px; }
130
129
 
131
130
  /* The idea itself: open, and set as prose rather than as permission rows. */
132
- .gov-idea { padding: 12px 14px 2px; border-top: 1px solid var(--border); }
131
+ .gov-idea { padding: 12px 14px 2px; border-top: var(--line) solid var(--rule-soft); }
133
132
  .gov-idea__part { margin: 0 0 12px; }
134
133
  .gov-idea__label { margin: 0 0 3px; font-size: 12px; font-weight: 600; color: var(--ink-soft); }
135
134
  .gov-idea__body {
@@ -139,14 +138,14 @@
139
138
 
140
139
  /* Secondary: the tally rides the summary (visible without a click — ADR 0175
141
140
  §9), the rules and the open ballot sit inside it. */
142
- .gov-item__meta { border-top: 1px solid var(--border); }
141
+ .gov-item__meta { border-top: var(--line) solid var(--rule-soft); }
143
142
  .gov-item__summary {
144
143
  padding: 8px 14px; cursor: pointer; color: var(--ink-soft); font-size: 12px;
145
144
  list-style-position: inside;
146
145
  }
147
146
  .gov-item__summary:hover { color: var(--ink); }
148
- .gov-item__metabody { padding: 10px 14px 2px; background: var(--surface-2); }
149
- .gov-item__metabody .gov-section { margin: 0 0 12px; background: var(--surface); }
147
+ .gov-item__metabody { padding: 10px 14px 2px; background: var(--glass); }
148
+ .gov-item__metabody .gov-section { margin: 0 0 12px; background: var(--bg-card); }
150
149
  .gov-item__metabody .gov-empty { padding: 0 0 12px; }
151
150
 
152
151
  /* ---- the ballot controls ------------------------------------------------- */