@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.
- package/.bongos-core.json +116 -51
- package/docs/adr/0047-discord-bugs-intake-anti-abuse.md +1 -0
- package/docs/copy-inventory.md +231 -228
- package/docs/copy-registry.json +352 -312
- package/docs/module-api-changelog.md +4 -0
- package/modules/discord/db.js +0 -3
- package/modules/discord/discord-bot.js +8 -1
- package/modules/discord/discord-bugs.js +133 -74
- package/modules/discord/module.json +1 -1
- package/modules/hall-ui/public/atlas.css +41 -32
- package/modules/hall-ui/public/atlas.html +8 -0
- package/modules/hall-ui/public/atlas.states.json +60 -0
- package/modules/hall-ui/public/collab.css +2 -2
- package/modules/hall-ui/public/collab.html +7 -1
- package/modules/hall-ui/public/collab.states.json +60 -0
- package/modules/hall-ui/public/copy-desk.css +21 -16
- package/modules/hall-ui/public/copy-desk.html +9 -1
- package/modules/hall-ui/public/copy-desk.states.json +59 -0
- package/modules/hall-ui/public/drachmae.html +38 -5
- package/modules/hall-ui/public/drachmae.js +20 -2
- package/modules/hall-ui/public/drachmae.states.json +64 -0
- package/modules/hall-ui/public/gate.css +20 -25
- package/modules/hall-ui/public/gate.html +9 -1
- package/modules/hall-ui/public/gate.states.json +60 -0
- package/modules/hall-ui/public/goals-lib.js +22 -5
- package/modules/hall-ui/public/goals-render.js +27 -5
- package/modules/hall-ui/public/goals.css +141 -60
- package/modules/hall-ui/public/goals.html +8 -1
- package/modules/hall-ui/public/goals.states.json +74 -0
- package/modules/hall-ui/public/government.css +35 -36
- package/modules/hall-ui/public/government.html +9 -1
- package/modules/hall-ui/public/government.states.json +59 -0
- package/modules/hall-ui/public/harbor.css +23 -26
- package/modules/hall-ui/public/harbor.html +9 -1
- package/modules/hall-ui/public/harbor.states.json +59 -0
- package/modules/hall-ui/public/modules.css +22 -21
- package/modules/hall-ui/public/modules.html +9 -1
- package/modules/hall-ui/public/modules.states.json +73 -0
- package/modules/hall-ui/public/people.html +7 -1
- package/modules/hall-ui/public/people.states.json +59 -0
- package/modules/hall-ui/public/scouting.html +7 -1
- package/modules/hall-ui/public/scouting.states.json +54 -0
- package/modules/hall-ui/public/sessions.css +1 -1
- package/modules/hall-ui/public/sessions.html +9 -1
- package/modules/hall-ui/public/sessions.states.json +58 -0
- package/modules/hall-ui/public/style.css +125 -5
- package/modules/hall-ui/public/watch.css +36 -39
- package/modules/hall-ui/public/watch.html +9 -1
- package/modules/hall-ui/public/watch.states.json +60 -0
- package/modules/lifecycle/goal-suggest.js +70 -2
- package/modules/lifecycle/lifecycle.js +7 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/src/module-api.js +1 -1
- package/tests/discord_bugs.mjs +110 -31
- package/tests/filing_abuse_matrix.mjs +59 -20
- package/tests/goal_subtitle.mjs +14 -8
- 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:
|
|
23
|
-
background: var(--
|
|
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(--
|
|
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
|
-
.
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
.gov-pill--
|
|
39
|
-
.gov-pill--
|
|
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:
|
|
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(--
|
|
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:
|
|
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:
|
|
55
|
-
color: var(--accent-
|
|
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:
|
|
64
|
-
border:
|
|
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:
|
|
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(--
|
|
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:
|
|
84
|
-
background: var(--accent); color:
|
|
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-
|
|
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(--
|
|
90
|
-
.gov-btn--ghost:hover:not(:disabled) { background: var(--
|
|
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:
|
|
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:
|
|
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:
|
|
102
|
-
color: var(--accent-
|
|
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:
|
|
113
|
-
background: var(--
|
|
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:
|
|
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:
|
|
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(--
|
|
149
|
-
.gov-item__metabody .gov-section { margin: 0 0 12px; background: var(--
|
|
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
|
-
|
|
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:
|
|
16
|
+
border: var(--line) solid var(--rule-soft);
|
|
17
17
|
border-radius: var(--radius);
|
|
18
|
-
background: var(--
|
|
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:
|
|
38
|
-
background: var(--
|
|
37
|
+
border: var(--line) solid var(--rule-soft);
|
|
38
|
+
background: var(--glass);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
.harbor-container {
|
|
42
|
-
border:
|
|
42
|
+
border: var(--line) solid var(--rule-soft);
|
|
43
43
|
border-radius: var(--radius);
|
|
44
|
-
background: var(--
|
|
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(--
|
|
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
|
-
.
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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:
|
|
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:
|
|
93
|
-
background: var(--
|
|
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(--
|
|
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-
|
|
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:
|
|
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(--
|
|
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:
|
|
119
|
-
background: var(--
|
|
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
|
-
|
|
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:
|
|
15
|
+
border: var(--line) solid var(--rule-soft);
|
|
16
16
|
border-radius: var(--radius-sm);
|
|
17
|
-
background: var(--
|
|
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:
|
|
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
|
-
.
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
.mod-chip--
|
|
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:
|
|
43
|
-
border:
|
|
44
|
-
background: var(--
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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:
|
|
82
|
-
background: var(--
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|