@bongos/core 1.19.454 → 1.19.456

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 (58) hide show
  1. package/.bongos-core.json +116 -51
  2. package/docs/adr/0047-discord-bugs-intake-anti-abuse.md +1 -0
  3. package/docs/copy-inventory.md +231 -228
  4. package/docs/copy-registry.json +352 -312
  5. package/docs/module-api-changelog.md +4 -0
  6. package/modules/discord/db.js +0 -3
  7. package/modules/discord/discord-bot.js +8 -1
  8. package/modules/discord/discord-bugs.js +133 -74
  9. package/modules/discord/module.json +1 -1
  10. package/modules/hall-ui/public/atlas.css +41 -32
  11. package/modules/hall-ui/public/atlas.html +8 -0
  12. package/modules/hall-ui/public/atlas.states.json +60 -0
  13. package/modules/hall-ui/public/collab.css +2 -2
  14. package/modules/hall-ui/public/collab.html +7 -1
  15. package/modules/hall-ui/public/collab.states.json +60 -0
  16. package/modules/hall-ui/public/copy-desk.css +21 -16
  17. package/modules/hall-ui/public/copy-desk.html +9 -1
  18. package/modules/hall-ui/public/copy-desk.states.json +59 -0
  19. package/modules/hall-ui/public/drachmae.html +38 -5
  20. package/modules/hall-ui/public/drachmae.js +20 -2
  21. package/modules/hall-ui/public/drachmae.states.json +64 -0
  22. package/modules/hall-ui/public/gate.css +20 -25
  23. package/modules/hall-ui/public/gate.html +9 -1
  24. package/modules/hall-ui/public/gate.states.json +60 -0
  25. package/modules/hall-ui/public/goals-lib.js +22 -5
  26. package/modules/hall-ui/public/goals-render.js +27 -5
  27. package/modules/hall-ui/public/goals.css +141 -60
  28. package/modules/hall-ui/public/goals.html +8 -1
  29. package/modules/hall-ui/public/goals.states.json +74 -0
  30. package/modules/hall-ui/public/government.css +35 -36
  31. package/modules/hall-ui/public/government.html +9 -1
  32. package/modules/hall-ui/public/government.states.json +59 -0
  33. package/modules/hall-ui/public/harbor.css +23 -26
  34. package/modules/hall-ui/public/harbor.html +9 -1
  35. package/modules/hall-ui/public/harbor.states.json +59 -0
  36. package/modules/hall-ui/public/modules.css +22 -21
  37. package/modules/hall-ui/public/modules.html +9 -1
  38. package/modules/hall-ui/public/modules.states.json +73 -0
  39. package/modules/hall-ui/public/people.html +7 -1
  40. package/modules/hall-ui/public/people.states.json +59 -0
  41. package/modules/hall-ui/public/scouting.html +7 -1
  42. package/modules/hall-ui/public/scouting.states.json +54 -0
  43. package/modules/hall-ui/public/sessions.css +1 -1
  44. package/modules/hall-ui/public/sessions.html +9 -1
  45. package/modules/hall-ui/public/sessions.states.json +58 -0
  46. package/modules/hall-ui/public/style.css +125 -5
  47. package/modules/hall-ui/public/watch.css +36 -39
  48. package/modules/hall-ui/public/watch.html +9 -1
  49. package/modules/hall-ui/public/watch.states.json +60 -0
  50. package/modules/lifecycle/goal-suggest.js +70 -2
  51. package/modules/lifecycle/lifecycle.js +7 -0
  52. package/package-lock.json +2 -2
  53. package/package.json +1 -1
  54. package/src/module-api.js +1 -1
  55. package/tests/discord_bugs.mjs +110 -31
  56. package/tests/filing_abuse_matrix.mjs +59 -20
  57. package/tests/goal_subtitle.mjs +14 -8
  58. package/tests/goal_suggest.mjs +107 -1
@@ -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 ------------------------------------------------- */
@@ -19,7 +19,15 @@
19
19
  <div class="app-body">
20
20
  <header class="app-topbar" id="app-topbar"></header>
21
21
  <div class="app-content">
22
- <div class="page-head"><p class="page-head__sub" id="gov-sub">Loading…</p></div>
22
+ <!-- task 1003307: the board page head. Government shipped with NO <h1> at all
23
+ (one-header-main-h1 measured 0 on every render), so the re-skin
24
+ carries the structural fix rather than porting the hole. The heading
25
+ is the LABEL voice, not a display line: on a working surface the
26
+ page's own name is the least interesting thing on it. -->
27
+ <div class="page-head page-head--board">
28
+ <h1 class="page-head__h">Government</h1>
29
+ <p class="page-head__sub" id="gov-sub">Loading…</p>
30
+ </div>
23
31
 
24
32
  <main id="hall-main">
25
33
  <p class="gov-sealed" id="gov-sealed" hidden>Archons only.</p>
@@ -0,0 +1,59 @@
1
+ {
2
+ "_": "Government — the constitution, ranks, permissions and assignments, behind requireGovernmentPage (metic+). The tabbed panels are the state vocabulary here: one render per tab is what proves the panel switch does not reflow the column. Written with the re-skin (task 1003307) so this page is MEASURED at three widths in both modes rather than looked at once.",
3
+ "page": "/builders/government",
4
+ "surface": "hall-ui",
5
+ "stub": {
6
+ "prefix": "/builders/"
7
+ },
8
+ "modeQuery": false,
9
+ "_feeds": "The kit's own stub carries no feed for this page, so against it the page renders its EMPTY and SKELETON states — which is the point: those are states the floors must hold in. Against the hall-preview harness the same states render populated. Every declared 404 below is a fixture the harness does not carry, named rather than hidden.",
10
+ "ignoreRequests": [
11
+ "/api/(gds|bongos)/me$",
12
+ "/api/(gds|bongos)/me/",
13
+ "/api/(gds|bongos)/goals",
14
+ "/api/(gds|bongos)/inbox/",
15
+ "/api/(gds|bongos)/versions",
16
+ "/api/(gds|bongos)/government"
17
+ ],
18
+ "ignoreConsole": [
19
+ "/api/(gds|bongos)/",
20
+ "\\b401\\b",
21
+ "\\b403\\b",
22
+ "\\b404\\b",
23
+ "\\b501\\b",
24
+ "Unauthorized",
25
+ "Forbidden",
26
+ "Not Found",
27
+ "Not Implemented",
28
+ "load failed"
29
+ ],
30
+ "states": {
31
+ "constitution": {
32
+ "auth": true,
33
+ "actions": [
34
+ [
35
+ "wait",
36
+ 600
37
+ ]
38
+ ],
39
+ "expect": {
40
+ "visible": [
41
+ "#gov-body",
42
+ "#gov-tabs"
43
+ ]
44
+ }
45
+ },
46
+ "out": {
47
+ "auth": false
48
+ }
49
+ },
50
+ "reducedMotion": {
51
+ "auth": true,
52
+ "actions": [
53
+ [
54
+ "wait",
55
+ 600
56
+ ]
57
+ ]
58
+ }
59
+ }
@@ -13,9 +13,9 @@
13
13
  margin: 6px 0 22px;
14
14
  }
15
15
  .harbor-stat {
16
- border: 1px solid var(--border);
16
+ border: var(--line) solid var(--rule-soft);
17
17
  border-radius: var(--radius);
18
- background: var(--surface);
18
+ background: var(--bg-card);
19
19
  padding: 12px 14px;
20
20
  }
21
21
  .harbor-stat__label {
@@ -34,14 +34,14 @@
34
34
  gap: 16px;
35
35
  padding: 18px;
36
36
  border-radius: var(--radius);
37
- border: 1px solid var(--border);
38
- background: var(--surface-2);
37
+ border: var(--line) solid var(--rule-soft);
38
+ background: var(--glass);
39
39
  }
40
40
 
41
41
  .harbor-container {
42
- border: 1px solid var(--border);
42
+ border: var(--line) solid var(--rule-soft);
43
43
  border-radius: var(--radius);
44
- background: var(--surface);
44
+ background: var(--bg-card);
45
45
  overflow: hidden;
46
46
  display: flex; flex-direction: column;
47
47
  }
@@ -52,7 +52,7 @@
52
52
  }
53
53
  .harbor-container--parked .harbor-container__roof { background-color: var(--ink-faint); }
54
54
  .harbor-container--pending .harbor-container__roof { background-color: var(--warn); }
55
- .harbor-container--gone .harbor-container__roof { background-color: var(--border-strong); }
55
+ .harbor-container--gone .harbor-container__roof { background-color: var(--rule); }
56
56
  .harbor-container--error .harbor-container__roof { background-color: var(--danger); }
57
57
  .harbor-container--blocked .harbor-container__roof { background-color: var(--danger); }
58
58
 
@@ -61,20 +61,15 @@
61
61
  .harbor-container__who { color: var(--ink); font-weight: 600; font-size: 14.5px; }
62
62
  .harbor-container__rank { color: var(--ink-faint); font-size: 12px; margin-left: 6px; font-weight: 400; }
63
63
 
64
- .harbor-pill {
65
- font-size: 11px; font-weight: 600;
66
- letter-spacing: 0.04em; text-transform: uppercase;
67
- padding: 2px 9px; border-radius: 999px; white-space: nowrap;
68
- border: 1px solid var(--border); color: var(--ink-soft); background: var(--surface-2);
69
- }
70
- .harbor-pill--active { background: var(--ok-weak); border-color: color-mix(in srgb, var(--ok) 30%, transparent); color: var(--ok); }
71
- .harbor-pill--pending { background: var(--warn-weak); border-color: color-mix(in srgb, var(--warn) 30%, transparent); color: var(--warn); }
72
- .harbor-pill--blocked { background: var(--danger-weak); border-color: color-mix(in srgb, var(--danger) 30%, transparent); color: var(--danger); }
64
+ /* Base: the shell's .fact-pill (task 1003307). States are hairlines, not fills. */
65
+ .harbor-pill--active { color: var(--ok); }
66
+ .harbor-pill--pending { color: var(--warn); }
67
+ .harbor-pill--blocked { color: var(--danger); }
73
68
 
74
69
  .harbor-rows { list-style: none; padding: 0; margin: 2px 0 0; }
75
70
  .harbor-rows li {
76
71
  display: flex; justify-content: space-between; gap: 12px;
77
- padding: 4px 0; border-bottom: 1px solid var(--border);
72
+ padding: 4px 0; border-bottom: var(--line) solid var(--rule-soft);
78
73
  font-size: 13px;
79
74
  }
80
75
  .harbor-rows li:last-child { border-bottom: none; }
@@ -89,24 +84,26 @@
89
84
  .harbor-actions { display: flex; gap: 8px; flex-wrap: wrap; margin-top: auto; padding-top: 8px; }
90
85
  .harbor-btn {
91
86
  font: inherit; font-size: 12.5px; font-weight: 500;
92
- padding: 5px 12px; border: 1px solid var(--border-strong);
93
- background: var(--surface); color: var(--ink-soft);
87
+ padding: 5px 12px; border: var(--line) solid var(--rule);
88
+ background: var(--bg-card); color: var(--ink-soft);
94
89
  border-radius: var(--radius-sm); cursor: pointer; flex: 1;
95
90
  }
96
- .harbor-btn:hover:not(:disabled) { background: var(--surface-2); color: var(--ink); }
91
+ .harbor-btn:hover:not(:disabled) { background: var(--glass); color: var(--ink); }
97
92
  .harbor-btn:disabled { opacity: 0.45; cursor: default; }
98
93
  .harbor-btn--danger { color: var(--danger); border-color: color-mix(in srgb, var(--danger) 45%, transparent); }
99
94
 
100
95
  .harbor-empty, .harbor-sealed { color: var(--ink-soft); padding: 16px 0; }
101
96
 
102
- /* Lightweight modal for confirm / block dialogs. Viewport-fixed overlay;
103
- z-index sits above the shell's sidebar/drawer layers. */
97
+ /* Lightweight modal for confirm / block dialogs. Viewport-fixed overlay on
98
+ the shell's own --z-modal layer — the bare 200 that used to be here was a
99
+ guess at "above the drawer", and gate.css guessed 50 for the same component
100
+ (task 1003307). */
104
101
  .harbor-modal-bg {
105
102
  position: fixed; inset: 0; background: color-mix(in srgb, var(--ink) 45%, transparent);
106
- display: flex; align-items: center; justify-content: center; z-index: 200; padding: 20px;
103
+ display: flex; align-items: center; justify-content: center; z-index: var(--z-modal); padding: 20px;
107
104
  }
108
105
  .harbor-modal {
109
- background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius);
106
+ background: var(--bg-card); border: var(--line) solid var(--rule-soft); border-radius: var(--radius);
110
107
  max-width: 460px; width: 100%; padding: 20px 22px;
111
108
  box-shadow: var(--shadow-pop);
112
109
  }
@@ -115,8 +112,8 @@
115
112
  .harbor-modal label { display: block; font-size: 13px; color: var(--ink-soft); margin: 10px 0 4px; }
116
113
  .harbor-modal input[type=text], .harbor-modal textarea {
117
114
  width: 100%; box-sizing: border-box; font: inherit; font-size: 13.5px;
118
- padding: 7px 9px; border: 1px solid var(--border-strong); border-radius: var(--radius-sm);
119
- background: var(--surface); color: var(--ink);
115
+ padding: 7px 9px; border: var(--line) solid var(--rule); border-radius: var(--radius-sm);
116
+ background: var(--bg-card); color: var(--ink);
120
117
  }
121
118
  .harbor-modal__check { display: flex; align-items: flex-start; gap: 8px; margin: 12px 0 0; font-size: 13px; color: var(--ink); }
122
119
  .harbor-modal__check input { margin-top: 3px; }
@@ -19,7 +19,15 @@
19
19
  <div class="app-body">
20
20
  <header class="app-topbar" id="app-topbar"></header>
21
21
  <div class="app-content">
22
- <div class="page-head"><p class="page-head__sub" id="harbor-sub">Loading dev boxes…</p></div>
22
+ <!-- task 1003307: the board page head. Harbor shipped with NO <h1> at all
23
+ (one-header-main-h1 measured 0 on every render), so the re-skin
24
+ carries the structural fix rather than porting the hole. The heading
25
+ is the LABEL voice, not a display line: on a working surface the
26
+ page's own name is the least interesting thing on it. -->
27
+ <div class="page-head page-head--board">
28
+ <h1 class="page-head__h">Harbor</h1>
29
+ <p class="page-head__sub" id="harbor-sub">Loading dev boxes…</p>
30
+ </div>
23
31
 
24
32
  <main id="hall-main">
25
33
  <p class="harbor-sealed" id="harbor-sealed" hidden>Archons only.</p>
@@ -0,0 +1,59 @@
1
+ {
2
+ "_": "Harbor — the dev-box dock behind requireGovernmentPage. Its confirm modal is the reason this page needed the shell to grow a --z-modal layer (task 1003307), so the modal is rendered, not assumed. Written with the re-skin (task 1003307) so this page is MEASURED at three widths in both modes rather than looked at once.",
3
+ "page": "/builders/harbor",
4
+ "surface": "hall-ui",
5
+ "stub": {
6
+ "prefix": "/builders/"
7
+ },
8
+ "modeQuery": false,
9
+ "_feeds": "The kit's own stub carries no feed for this page, so against it the page renders its EMPTY and SKELETON states — which is the point: those are states the floors must hold in. Against the hall-preview harness the same states render populated. Every declared 404 below is a fixture the harness does not carry, named rather than hidden.",
10
+ "ignoreRequests": [
11
+ "/api/(gds|bongos)/me$",
12
+ "/api/(gds|bongos)/me/",
13
+ "/api/(gds|bongos)/goals",
14
+ "/api/(gds|bongos)/inbox/",
15
+ "/api/(gds|bongos)/versions",
16
+ "/api/(gds|bongos)/boxes",
17
+ "/api/(gds|bongos)/provisioning"
18
+ ],
19
+ "ignoreConsole": [
20
+ "/api/(gds|bongos)/",
21
+ "\\b401\\b",
22
+ "\\b403\\b",
23
+ "\\b404\\b",
24
+ "\\b501\\b",
25
+ "Unauthorized",
26
+ "Forbidden",
27
+ "Not Found",
28
+ "Not Implemented",
29
+ "load failed"
30
+ ],
31
+ "states": {
32
+ "dock": {
33
+ "auth": true,
34
+ "actions": [
35
+ [
36
+ "wait",
37
+ 700
38
+ ]
39
+ ],
40
+ "expect": {
41
+ "visible": [
42
+ "#harbor-body"
43
+ ]
44
+ }
45
+ },
46
+ "out": {
47
+ "auth": false
48
+ }
49
+ },
50
+ "reducedMotion": {
51
+ "auth": true,
52
+ "actions": [
53
+ [
54
+ "wait",
55
+ 600
56
+ ]
57
+ ]
58
+ }
59
+ }
@@ -12,26 +12,25 @@
12
12
  margin-top: 10px;
13
13
  }
14
14
  .mod-card {
15
- border: 1px solid var(--border);
15
+ border: var(--line) solid var(--rule-soft);
16
16
  border-radius: var(--radius-sm);
17
- background: var(--surface);
17
+ background: var(--bg-card);
18
18
  padding: 14px 16px;
19
19
  }
20
20
  .mod-card__head { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
21
21
  .mod-card__title { font-weight: 650; font-size: 14.5px; color: var(--ink); }
22
- .mod-card__key { font-size: 12px; color: var(--ink-faint); font-family: ui-monospace, "SF Mono", Menlo, monospace; }
22
+ .mod-card__key { font-size: 12px; color: var(--ink-faint); font-family: var(--font-mono); }
23
23
  .mod-card__desc { font-size: 13px; color: var(--ink-soft); margin: 8px 0; }
24
24
  .mod-chips { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0; }
25
- .mod-chip {
26
- font-size: 11.5px;
27
- color: var(--ink-soft);
28
- background: var(--surface-2);
29
- border: 1px solid var(--border);
30
- border-radius: 999px;
31
- padding: 3px 10px;
32
- }
33
- .mod-chip--core { color: var(--info); border-color: color-mix(in srgb, var(--info) 45%, var(--border)); }
34
- .mod-chip--own { color: var(--accent-text); border-color: color-mix(in srgb, var(--accent) 45%, var(--border)); }
25
+ /* Base: the shell's .fact-pill (task 1003307).
26
+ One override, and it is the reason the pill is not simply reused as-is: the
27
+ archetype's chip holds a short machine word (a module key, a version id) and
28
+ is nowrap, but THIS page's chips hold prose: "by <author>", "from <origin>",
29
+ "upkeep: undeclared". Inheriting nowrap put a single 559px chip on a 320px
30
+ viewport. A chip that carries a sentence wraps. */
31
+ .mod-chip { white-space: normal; }
32
+ .mod-chip--core { color: var(--info); }
33
+ .mod-chip--own { color: var(--accent-ink); }
35
34
  .mod-card__actions { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-top: 10px; }
36
35
  button.mod-toggle {
37
36
  font-family: var(--font-body);
@@ -39,13 +38,13 @@ button.mod-toggle {
39
38
  font-weight: 600;
40
39
  padding: 5px 16px;
41
40
  min-width: 78px;
42
- border-radius: 999px;
43
- border: 1px solid var(--border-strong);
44
- background: var(--surface);
41
+ border-radius: var(--radius-pill);
42
+ border: var(--line) solid var(--rule);
43
+ background: var(--bg-card);
45
44
  color: var(--ink-soft);
46
45
  cursor: pointer;
47
46
  }
48
- button.mod-toggle[data-on="1"] { background: var(--accent); border-color: var(--accent); color: #fff; }
47
+ button.mod-toggle[data-on="1"] { background: var(--accent); border-color: var(--accent); color: var(--accent-on); }
49
48
  button.mod-toggle:disabled { opacity: 0.5; cursor: default; }
50
49
  button.mod-submit {
51
50
  font-family: var(--font-body);
@@ -53,13 +52,15 @@ button.mod-submit {
53
52
  font-weight: 600;
54
53
  padding: 5px 12px;
55
54
  border-radius: var(--radius-sm);
56
- border: 1px solid var(--border-strong);
55
+ border: var(--line) solid var(--rule);
57
56
  background: transparent;
58
57
  color: var(--ink-soft);
59
58
  cursor: pointer;
60
59
  }
61
60
  button.mod-submit:disabled { opacity: 0.45; cursor: not-allowed; }
62
- .mod-empty { color: var(--ink-faint); font-style: italic; font-size: 13px; padding: 10px 0; }
61
+ /* Italic was this sheet's alone — nothing else in the hall sets it, and an
62
+ empty state is a plain statement, not an aside (task 1003307). */
63
+ .mod-empty { color: var(--ink-faint); font-size: 13px; padding: 10px 0; }
63
64
  .mod-note { font-size: 12px; color: var(--ink-faint); margin-top: 4px; }
64
65
 
65
66
  /* Catalog browse bar (task 1001772) — one filter over both grids. */
@@ -78,8 +79,8 @@ button.mod-submit:disabled { opacity: 0.45; cursor: not-allowed; }
78
79
  max-width: 420px;
79
80
  padding: 8px 12px;
80
81
  border-radius: var(--radius-sm);
81
- border: 1px solid var(--border-strong);
82
- background: var(--surface);
82
+ border: var(--line) solid var(--rule);
83
+ background: var(--bg-card);
83
84
  color: var(--ink);
84
85
  }
85
86
  /* The marker on an inferred credit — quiet, but hoverable for the reason. */
@@ -19,7 +19,15 @@
19
19
  <div class="app-body">
20
20
  <header class="app-topbar" id="app-topbar"></header>
21
21
  <div class="app-content">
22
- <div class="page-head"><p class="page-head__sub" id="modules-sub">Loading modules…</p></div>
22
+ <!-- task 1003307: the board page head. Modules shipped with NO <h1> at all
23
+ (one-header-main-h1 measured 0 on every render), so the re-skin
24
+ carries the structural fix rather than porting the hole. The heading
25
+ is the LABEL voice, not a display line: on a working surface the
26
+ page's own name is the least interesting thing on it. -->
27
+ <div class="page-head page-head--board">
28
+ <h1 class="page-head__h">Modules</h1>
29
+ <p class="page-head__sub" id="modules-sub">Loading modules…</p>
30
+ </div>
23
31
 
24
32
  <main id="hall-main">
25
33
  <!-- Browse — one filter over both grids below (task 1001772). -->
@@ -0,0 +1,73 @@
1
+ {
2
+ "_": "Modules — the core + instance module grids under one search. The empty state matters more than the populated one: a filter that matches nothing is the state a browse page spends real time in. Written with the re-skin (task 1003307) so this page is MEASURED at three widths in both modes rather than looked at once.",
3
+ "page": "/builders/modules",
4
+ "surface": "hall-ui",
5
+ "stub": {
6
+ "prefix": "/builders/"
7
+ },
8
+ "modeQuery": false,
9
+ "_feeds": "The kit's own stub carries no feed for this page, so against it the page renders its EMPTY and SKELETON states — which is the point: those are states the floors must hold in. Against the hall-preview harness the same states render populated. Every declared 404 below is a fixture the harness does not carry, named rather than hidden.",
10
+ "ignoreRequests": [
11
+ "/api/(gds|bongos)/me$",
12
+ "/api/(gds|bongos)/me/",
13
+ "/api/(gds|bongos)/goals",
14
+ "/api/(gds|bongos)/inbox/",
15
+ "/api/(gds|bongos)/versions",
16
+ "/api/(gds|bongos)/modules"
17
+ ],
18
+ "ignoreConsole": [
19
+ "/api/(gds|bongos)/",
20
+ "\\b401\\b",
21
+ "\\b403\\b",
22
+ "\\b404\\b",
23
+ "\\b501\\b",
24
+ "Unauthorized",
25
+ "Forbidden",
26
+ "Not Found",
27
+ "Not Implemented",
28
+ "load failed"
29
+ ],
30
+ "states": {
31
+ "browse": {
32
+ "auth": true,
33
+ "actions": [
34
+ [
35
+ "wait",
36
+ 600
37
+ ]
38
+ ],
39
+ "expect": {
40
+ "visible": [
41
+ "#core-scroll",
42
+ "#core-grid"
43
+ ]
44
+ }
45
+ },
46
+ "search-empty": {
47
+ "auth": true,
48
+ "actions": [
49
+ [
50
+ "fill",
51
+ "#mod-search",
52
+ "zzzznothingmatches"
53
+ ],
54
+ [
55
+ "wait",
56
+ 400
57
+ ]
58
+ ]
59
+ },
60
+ "out": {
61
+ "auth": false
62
+ }
63
+ },
64
+ "reducedMotion": {
65
+ "auth": true,
66
+ "actions": [
67
+ [
68
+ "wait",
69
+ 600
70
+ ]
71
+ ]
72
+ }
73
+ }
@@ -18,7 +18,13 @@
18
18
  <div class="app-body">
19
19
  <header class="app-topbar" id="app-topbar"></header>
20
20
  <div class="app-content">
21
- <div class="page-head">
21
+ <!-- task 1003307: the board page head. People shipped with NO <h1> at all
22
+ (one-header-main-h1 measured 0 on every render), so the re-skin
23
+ carries the structural fix rather than porting the hole. The heading
24
+ is the LABEL voice, not a display line: on a working surface the
25
+ page's own name is the least interesting thing on it. -->
26
+ <div class="page-head page-head--board">
27
+ <h1 class="page-head__h">People</h1>
22
28
  <p class="page-head__sub">Everyone building across hosted projects, ranked by track record. Descriptive only — cross-project numbers never carry authority here.</p>
23
29
  </div>
24
30