@bongos/core 1.21.20 → 1.21.22
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 +63 -63
- package/docs/adr/0361-merges-publish-as-candidates-release-decides-what-others-are-offered.md +1 -0
- package/docs/copy-inventory.md +29 -25
- package/docs/copy-registry.json +87 -30
- package/docs/module-api-changelog.md +4 -0
- package/docs/page-inventory.json +9 -3
- package/docs/page-readings.json +402 -390
- package/modules/hall-ui/public/atlas.html +1 -1
- package/modules/hall-ui/public/blockers.html +1 -1
- package/modules/hall-ui/public/board-room.html +1 -1
- package/modules/hall-ui/public/city.css +16 -2
- package/modules/hall-ui/public/city.html +29 -9
- package/modules/hall-ui/public/city.js +25 -2
- package/modules/hall-ui/public/city.states.json +7 -1
- package/modules/hall-ui/public/collab.html +1 -1
- package/modules/hall-ui/public/commands.html +1 -1
- package/modules/hall-ui/public/copy-desk.html +1 -1
- package/modules/hall-ui/public/deploy.html +1 -1
- package/modules/hall-ui/public/diagrams.html +1 -1
- package/modules/hall-ui/public/drachmae.html +1 -1
- package/modules/hall-ui/public/fleet.html +1 -1
- package/modules/hall-ui/public/gate.html +1 -1
- package/modules/hall-ui/public/goal-map.html +1 -1
- package/modules/hall-ui/public/goals.html +1 -1
- package/modules/hall-ui/public/government.html +1 -1
- package/modules/hall-ui/public/idea.html +1 -1
- package/modules/hall-ui/public/ideas.html +1 -1
- package/modules/hall-ui/public/index.html +1 -1
- package/modules/hall-ui/public/modules.html +1 -1
- package/modules/hall-ui/public/primer.html +1 -1
- package/modules/hall-ui/public/profile.html +1 -1
- package/modules/hall-ui/public/project-settings.html +1 -1
- package/modules/hall-ui/public/ranks.html +1 -1
- package/modules/hall-ui/public/roadmap.html +1 -1
- package/modules/hall-ui/public/roster.html +1 -1
- package/modules/hall-ui/public/sessions.html +1 -1
- package/modules/hall-ui/public/settings.html +1 -1
- package/modules/hall-ui/public/shell.js +3 -0
- package/modules/hall-ui/public/street.css +17 -4
- package/modules/hall-ui/public/street.html +26 -8
- package/modules/hall-ui/public/street.js +16 -2
- package/modules/hall-ui/public/street.states.json +17 -1
- package/modules/hall-ui/public/studio.html +1 -1
- package/modules/hall-ui/public/task.html +1 -1
- package/modules/hall-ui/public/thinking.html +1 -1
- package/modules/hall-ui/public/tweak-editor.html +1 -1
- package/modules/hall-ui/public/watch.html +1 -1
- package/modules/hall-ui/public/work.html +1 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +12 -0
- package/scripts/gds/provision-repo.js +9 -2
- package/src/module-api.js +1 -1
- package/tests/hall_audit.mjs +7 -12
- package/tests/hall_city.mjs +44 -4
- package/tests/hall_street.mjs +37 -5
- package/tests/hall_tweak_editor.mjs +1 -1
- package/tests/nav_permission_atoms.mjs +1 -1
- package/tests/provision.mjs +7 -2
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
|
|
92
92
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
93
93
|
|
|
94
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
94
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
95
95
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
96
96
|
<script src="/builders/palette.js" defer></script>
|
|
97
97
|
<script src="/builders/atlas.js?v=2026-09-02-index" defer></script>
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
|
|
51
51
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
52
52
|
chrome exists before the page script runs. -->
|
|
53
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
53
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
54
54
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
55
55
|
<script src="/builders/palette.js" defer></script>
|
|
56
56
|
<!-- shared frontend toolkit (window.OTB — rank labels, number formats) + the
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
|
|
61
61
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
62
62
|
|
|
63
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
63
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
64
64
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
65
65
|
<script src="/builders/palette.js" defer></script>
|
|
66
66
|
<script src="/builders/dom-utils.js?v=2026-06-16-board"></script>
|
|
@@ -47,10 +47,24 @@ html:has(body[data-page="city"]) { height: 100%; }
|
|
|
47
47
|
.city-mode { background: none; border: 1px solid var(--rule); border-radius: 999px; height: 36px; padding: 0 11px; display: flex; align-items: center; gap: 8px; cursor: pointer; color: var(--ink); font-family: var(--font-body); }
|
|
48
48
|
.city-mode svg { display: block; stroke-width: 1.4; }
|
|
49
49
|
|
|
50
|
-
/*
|
|
50
|
+
/* THE STAGE IN THE HALL (task 1004544, the sky's mechanism from task 1004327).
|
|
51
|
+
<main class="city-main"> is the box under the hall's top bar and beside its
|
|
52
|
+
64px rail (the drawer's phone width has no rail) and, in full screen
|
|
53
|
+
(html[data-fullscreen="on"], shell.js), the whole window. `contain: layout
|
|
54
|
+
paint` makes it the containing block of every positioned layer inside, so
|
|
55
|
+
the home above and below measures from the stage instead of the window. */
|
|
56
|
+
.city-main { position: fixed; top: var(--topbar-h, 56px); left: var(--sidebar-w-rail, 64px); right: 0; bottom: 0; max-width: none; margin: 0; contain: layout paint; z-index: 1; }
|
|
57
|
+
html[data-fullscreen="on"] .city-main { top: 0; left: 0; }
|
|
58
|
+
@media (max-width: 768px) { .city-main { left: 0; } }
|
|
59
|
+
/* The full-screen switch floats top right over the stage, where the sun/moon
|
|
60
|
+
switch sits; the strip steps in by the button's width so nothing sits under it.
|
|
61
|
+
Under 640 the exit is the round button (style.css). */
|
|
62
|
+
html[data-fullscreen="on"] .city-top { right: 184px; }
|
|
63
|
+
@media (max-width: 640px) { html[data-fullscreen="on"] .city-top { right: 60px; } }
|
|
64
|
+
|
|
65
|
+
/* the stage: the prototype's 1440 x 900 artboard, scaled to the stage by
|
|
51
66
|
city.js (--city-scale) and centred, so 1440 x 900 is the prototype pixel
|
|
52
67
|
for pixel */
|
|
53
|
-
.city-main { position: fixed; inset: 0; z-index: 1; }
|
|
54
68
|
.city-frame { position: absolute; inset: 0; overflow: hidden; }
|
|
55
69
|
.city-stage { position: absolute; left: 50%; top: 50%; width: 1440px; height: 900px; transform: translate(-50%, -50%) scale(var(--city-scale, 1)); transform-origin: 50% 50%; }
|
|
56
70
|
.city-zoom, .city-drift { position: absolute; left: 0; top: 0; width: 1440px; height: 900px; }
|
|
@@ -20,7 +20,17 @@
|
|
|
20
20
|
/api/bongos/government/docket, task 1004523) and the open goals with their
|
|
21
21
|
task rollups. The markup below is the prototype's home: the wordmark and
|
|
22
22
|
the sun/moon switch in the header, the city, one button and one line.
|
|
23
|
-
|
|
23
|
+
|
|
24
|
+
IN THE HALL (task 1004544, owner decision 2026-10-02). The city sits in
|
|
25
|
+
the hall's sidebar and top bar like every hall page, the way the sky has
|
|
26
|
+
since task 1004327, and the shell's full-screen switch
|
|
27
|
+
(data-fullscreen-switch) hides both so the city fills the window again,
|
|
28
|
+
remembered for this page. The whole home lives inside
|
|
29
|
+
<main class="city-main">, the stage under the top bar and beside the
|
|
30
|
+
rail (city.css), so what is drawn inside is unchanged and simply measures
|
|
31
|
+
from the stage instead of the window. The wordmark strip is a <div>, not
|
|
32
|
+
a <header>: the shell's top bar is the page's one <header>. There is still
|
|
33
|
+
no menu link to the city (owner: leave it off the sidebar).
|
|
24
34
|
|
|
25
35
|
The drawing is city-draw.js (the prototype's iso kit, verbatim, as pure
|
|
26
36
|
data); city.js reads the three feeds and turns the lists into SVG paths
|
|
@@ -34,16 +44,22 @@
|
|
|
34
44
|
The page is gated on board.vote.cast (src/bongos/serve-internal.js), the
|
|
35
45
|
same atom the docket read checks, so whoever reaches the city can read
|
|
36
46
|
what it draws. -->
|
|
37
|
-
<body data-page="city" class="city">
|
|
47
|
+
<body data-page="city" data-page-title="The city" class="city" data-fullscreen-switch>
|
|
48
|
+
|
|
49
|
+
<div class="app">
|
|
50
|
+
<aside class="app-sidebar" id="app-sidebar" aria-label="Primary"></aside>
|
|
51
|
+
<div class="app-scrim" id="app-scrim" hidden></div>
|
|
52
|
+
<div class="app-body">
|
|
53
|
+
<header class="app-topbar" id="app-topbar"></header>
|
|
38
54
|
|
|
39
|
-
<
|
|
40
|
-
<
|
|
41
|
-
|
|
42
|
-
<
|
|
43
|
-
|
|
44
|
-
</
|
|
55
|
+
<main id="hall-main" class="city-main">
|
|
56
|
+
<div class="city-top">
|
|
57
|
+
<span class="city-mark">{{productName}}</span>
|
|
58
|
+
<button type="button" class="city-mode" id="cityMode" aria-label="Switch to light mode" title="Switch to light mode">
|
|
59
|
+
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" aria-hidden="true"><path id="cityModeIcon" d=""></path></svg>
|
|
60
|
+
</button>
|
|
61
|
+
</div>
|
|
45
62
|
|
|
46
|
-
<main class="city-main" id="cityMain">
|
|
47
63
|
<div class="city-frame" id="cityFrame">
|
|
48
64
|
<div class="city-stage" id="cityStage" role="img" aria-label="The governor city">
|
|
49
65
|
<div class="city-zoom">
|
|
@@ -64,7 +80,11 @@
|
|
|
64
80
|
<h1 class="city-line" id="cityLine" aria-live="polite">reading the docket</h1>
|
|
65
81
|
</div>
|
|
66
82
|
</main>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
67
85
|
|
|
86
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
87
|
+
<script src="/builders/palette.js" defer></script>
|
|
68
88
|
<script src="/builders/city-draw.js?v=2026-10-02-city1"></script>
|
|
69
89
|
<script src="/builders/city.js?v=2026-10-02-city1"></script>
|
|
70
90
|
</body>
|
|
@@ -65,6 +65,24 @@
|
|
|
65
65
|
chosen = next;
|
|
66
66
|
try { window.localStorage.setItem(THEME_KEY, next); } catch (_) { /* private mode: this page only */ }
|
|
67
67
|
draw(applyTheme());
|
|
68
|
+
syncShell();
|
|
69
|
+
}
|
|
70
|
+
// IN THE HALL (task 1004544) the shell's top bar carries the hall's own theme
|
|
71
|
+
// switch beside this one. Both write the same 'hall-theme' preference and the
|
|
72
|
+
// same html[data-theme]; each repaints when the other flips it, so the two
|
|
73
|
+
// icons and the drawing's faces never disagree.
|
|
74
|
+
var painted = null;
|
|
75
|
+
function syncShell() {
|
|
76
|
+
var shell = window.OTBShell;
|
|
77
|
+
painted = effectiveTheme();
|
|
78
|
+
if (shell && typeof shell.applyTheme === 'function' && storedTheme() === painted) shell.applyTheme();
|
|
79
|
+
}
|
|
80
|
+
function watchShellTheme() {
|
|
81
|
+
if (typeof MutationObserver !== 'function') return;
|
|
82
|
+
new MutationObserver(function () {
|
|
83
|
+
var t = document.documentElement.getAttribute('data-theme');
|
|
84
|
+
if ((t === 'dark' || t === 'light') && t !== painted) { painted = t; chosen = t; draw(applyTheme()); }
|
|
85
|
+
}).observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] });
|
|
68
86
|
}
|
|
69
87
|
|
|
70
88
|
// ---------- fit the 1440 x 900 artboard to the window ----------
|
|
@@ -73,7 +91,10 @@
|
|
|
73
91
|
function fit() {
|
|
74
92
|
var stage = $('cityStage');
|
|
75
93
|
if (!stage) return;
|
|
76
|
-
|
|
94
|
+
// The stage is <main class="city-main">, the box the hall's chrome leaves
|
|
95
|
+
// (task 1004544); the full-screen switch resizes it and fires a resize.
|
|
96
|
+
var main = $('hall-main');
|
|
97
|
+
var w = (main && main.clientWidth) || window.innerWidth || 1440, h = (main && main.clientHeight) || window.innerHeight || 900;
|
|
77
98
|
var s = Math.min(w / 1000, h / 900);
|
|
78
99
|
stage.style.setProperty('--city-scale', String(Math.round(s * 1000) / 1000));
|
|
79
100
|
}
|
|
@@ -168,7 +189,9 @@
|
|
|
168
189
|
if (media && media.addEventListener) media.addEventListener('change', function () { if (!storedTheme()) draw(applyTheme()); });
|
|
169
190
|
window.addEventListener('resize', fit);
|
|
170
191
|
fit();
|
|
171
|
-
|
|
192
|
+
painted = applyTheme();
|
|
193
|
+
draw(painted);
|
|
194
|
+
watchShellTheme();
|
|
172
195
|
return load();
|
|
173
196
|
}
|
|
174
197
|
|
|
@@ -11,7 +11,13 @@
|
|
|
11
11
|
"auth": true,
|
|
12
12
|
"_": "The home: the wordmark, the switch, the city, start governing and the one line.",
|
|
13
13
|
"actions": [["wait", 900]],
|
|
14
|
-
"expect": { "visible": ["#cityStage", "#cityStart", "#cityLine", "#cityMode"], "href": [["#cityStart", "/builders/street"]] }
|
|
14
|
+
"expect": { "visible": ["#cityStage", "#cityStart", "#cityLine", "#cityMode", "#app-topbar", "#fullscreen-toggle"], "href": [["#cityStart", "/builders/street"]] }
|
|
15
|
+
},
|
|
16
|
+
"fullscreen": {
|
|
17
|
+
"auth": true,
|
|
18
|
+
"_": "In the hall since task 1004544: the shell's full-screen switch pressed, the sidebar and the top bar gone, the city filling the window and the one exit in the corner (the sky's mechanism, task 1004327).",
|
|
19
|
+
"actions": [["wait", 900], ["click", "#fullscreen-toggle"], ["wait", 500]],
|
|
20
|
+
"expect": { "visible": ["#cityStage", "#cityStart", "#cityMode", "#fullscreen-toggle"], "hidden": ["#app-sidebar", "#topbar-title"], "attr": [["#fullscreen-toggle", "aria-pressed", "true"]] }
|
|
15
21
|
},
|
|
16
22
|
"switched": {
|
|
17
23
|
"auth": true,
|
|
@@ -148,7 +148,7 @@
|
|
|
148
148
|
|
|
149
149
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
150
150
|
|
|
151
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
151
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
152
152
|
<script src="/builders/palette.js" defer></script>
|
|
153
153
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
154
154
|
<script src="/builders/collab-lib.js?v=2026-09-24-archive"></script>
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
|
|
55
55
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
56
56
|
|
|
57
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
57
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
58
58
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
59
59
|
<script src="/builders/palette.js" defer></script>
|
|
60
60
|
<script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
|
|
@@ -177,7 +177,7 @@
|
|
|
177
177
|
|
|
178
178
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
179
179
|
|
|
180
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
180
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
181
181
|
<script src="/builders/palette.js" defer></script>
|
|
182
182
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
183
183
|
<script src="/builders/hall-kit.js"></script>
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
|
|
75
75
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
76
76
|
|
|
77
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
77
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
78
78
|
<script src="/builders/palette.js" defer></script>
|
|
79
79
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
80
80
|
<script src="/builders/hall-kit.js"></script>
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
|
|
98
98
|
<!-- The app shell (sidebar + top bar + footer). Dependency-free; runs at parse
|
|
99
99
|
time so the chrome exists before the deferred page scripts execute. -->
|
|
100
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
100
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
101
101
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
102
102
|
<script src="/builders/palette.js" defer></script>
|
|
103
103
|
<script src="/builders/diagram-viewer.js?v=2026-06-14-diagviewer-1" defer></script>
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
|
|
99
99
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
100
100
|
|
|
101
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
101
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
102
102
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
103
103
|
<script src="/builders/palette.js" defer></script>
|
|
104
104
|
<script src="/builders/md-reader.js?v=2026-09-02-mdreader-2"></script>
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
|
|
55
55
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
56
56
|
|
|
57
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
57
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
58
58
|
<script src="/builders/palette.js" defer></script>
|
|
59
59
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
60
60
|
<script src="/builders/hall-kit.js"></script>
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
<div id="gate-modal-root"></div>
|
|
78
78
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
79
79
|
|
|
80
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
80
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
81
81
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
82
82
|
<script src="/builders/palette.js" defer></script>
|
|
83
83
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
@@ -137,7 +137,7 @@
|
|
|
137
137
|
</div>
|
|
138
138
|
</div>
|
|
139
139
|
|
|
140
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
140
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
141
141
|
<script src="/builders/palette.js" defer></script>
|
|
142
142
|
|
|
143
143
|
<script src="/builders/idea-objects.js?v=2026-09-27-split"></script>
|
|
@@ -230,7 +230,7 @@
|
|
|
230
230
|
|
|
231
231
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
232
232
|
|
|
233
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
233
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
234
234
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
235
235
|
<script src="/builders/palette.js" defer></script>
|
|
236
236
|
<script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
|
|
@@ -134,7 +134,7 @@
|
|
|
134
134
|
|
|
135
135
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
136
136
|
|
|
137
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
137
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
138
138
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
139
139
|
<script src="/builders/palette.js" defer></script>
|
|
140
140
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
|
|
53
53
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
54
54
|
|
|
55
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
55
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
56
56
|
<script src="/builders/palette.js" defer></script>
|
|
57
57
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib" defer></script>
|
|
58
58
|
<!-- task-detail.js still owns the #/idea/N and #/blocker/N overlay, so a ref
|
|
@@ -225,7 +225,7 @@
|
|
|
225
225
|
|
|
226
226
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
227
227
|
|
|
228
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
228
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
229
229
|
<script src="/builders/palette.js" defer></script>
|
|
230
230
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
231
231
|
<!-- task 1003069 (R08) — the quick-filing form's routed result links a task
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
<script src="/builders/brand-apply.js?v=2026-06-27-r75" defer></script>
|
|
107
107
|
<!-- The app shell (sidebar + top bar + view router). Dependency-free; loaded
|
|
108
108
|
BEFORE builders.js so the chrome ids exist when events are wired. -->
|
|
109
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
109
|
+
<script src="/builders/shell.js?v=2026-10-02-theme" defer></script>
|
|
110
110
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
111
111
|
<script src="/builders/palette.js" defer></script>
|
|
112
112
|
<!-- task 2166: the shared component kit (window.OTBKit) — pager/ledger/rail.
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
|
|
102
102
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
103
103
|
|
|
104
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
104
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
105
105
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
106
106
|
<script src="/builders/palette.js" defer></script>
|
|
107
107
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
|
|
116
116
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
117
117
|
|
|
118
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
118
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
119
119
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
120
120
|
<script src="/builders/palette.js" defer></script>
|
|
121
121
|
<!-- the shared markdown reader (window.OTBMdReader) — primer.js renders through
|
|
@@ -206,7 +206,7 @@
|
|
|
206
206
|
|
|
207
207
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
208
208
|
chrome exists before the page script runs. -->
|
|
209
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
209
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
210
210
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
211
211
|
<script src="/builders/palette.js" defer></script>
|
|
212
212
|
<!-- shared frontend toolkit (window.OTB) — loaded before profile.js, which pulls from it. -->
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
|
|
59
59
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
60
60
|
|
|
61
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
61
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
62
62
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
63
63
|
<script src="/builders/palette.js" defer></script>
|
|
64
64
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
|
|
78
78
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
79
79
|
chrome exists before the page script runs. -->
|
|
80
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
80
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
81
81
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
82
82
|
<script src="/builders/palette.js" defer></script>
|
|
83
83
|
<!-- shared frontend toolkit (window.OTB) — loaded before ranks.js, which pulls from it. -->
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
|
|
42
42
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
43
43
|
|
|
44
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
44
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
45
45
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
46
46
|
<script src="/builders/palette.js" defer></script>
|
|
47
47
|
<script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
|
|
54
54
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
55
55
|
chrome exists before the page script runs. -->
|
|
56
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
56
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
57
57
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
58
58
|
<script src="/builders/palette.js" defer></script>
|
|
59
59
|
<!-- shared frontend toolkit (window.OTB — rank labels, number formats) + the
|
|
@@ -99,7 +99,7 @@
|
|
|
99
99
|
|
|
100
100
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
101
101
|
chrome exists before the page script runs. -->
|
|
102
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
102
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
103
103
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
104
104
|
<script src="/builders/palette.js" defer></script>
|
|
105
105
|
<!-- shared frontend toolkit (window.OTB) — loaded BEFORE sessions.js so it can pull from it. -->
|
|
@@ -435,7 +435,7 @@
|
|
|
435
435
|
|
|
436
436
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
437
437
|
chrome exists before the page scripts run. -->
|
|
438
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
438
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
439
439
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
440
440
|
<script src="/builders/palette.js" defer></script>
|
|
441
441
|
<!-- shared frontend toolkit (window.OTB) — loaded before consuming IIFEs. -->
|
|
@@ -1404,5 +1404,8 @@
|
|
|
1404
1404
|
closeDrawer: closeDrawer,
|
|
1405
1405
|
isFullscreen: isFullscreen,
|
|
1406
1406
|
setFullscreen: setFullscreen,
|
|
1407
|
+
// task 1004544: a page with its own light/dark switch (the governor city
|
|
1408
|
+
// and street) repaints the top bar's after writing 'hall-theme'.
|
|
1409
|
+
applyTheme: applyTheme,
|
|
1407
1410
|
};
|
|
1408
1411
|
})();
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
#edecee, ink, ink-soft, ink-faint, the rules, the accent #fb9569 and its
|
|
10
10
|
dark ink #2a1305). The drawing's own faces are drawing data in
|
|
11
11
|
street-draw.js (the prototype's front-on palette).
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
In the hall's sidebar and top bar since task 1004544, behind the shell's
|
|
13
|
+
full-screen switch, as the city; the stage is the box the chrome leaves.
|
|
14
14
|
No :root here (tests/hall_reading_world.mjs): page tokens live on the body.
|
|
15
15
|
The two dark blocks below are byte-identical twins. */
|
|
16
16
|
|
|
@@ -51,8 +51,21 @@ html[data-theme="dark"] body[data-page="street"] {
|
|
|
51
51
|
|
|
52
52
|
html:has(body[data-page="street"]) { height: 100%; }
|
|
53
53
|
|
|
54
|
-
/*
|
|
55
|
-
|
|
54
|
+
/* THE STAGE IN THE HALL (task 1004544, the sky's mechanism from task 1004327).
|
|
55
|
+
<main class="street-stage"> is the box under the hall's top bar and beside
|
|
56
|
+
its 64px rail (the drawer's phone width has no rail) and, in full screen
|
|
57
|
+
(html[data-fullscreen="on"], shell.js), the whole window. `contain: layout
|
|
58
|
+
paint` makes it the containing block of the card and every positioned
|
|
59
|
+
layer, so the street measures from the stage instead of the window. */
|
|
60
|
+
.street-stage { position: fixed; top: var(--topbar-h, 56px); left: var(--sidebar-w-rail, 64px); right: 0; bottom: 0; max-width: none; contain: layout paint; margin: 0; padding: 0; display: flex; flex-direction: column; background: var(--bg); color: var(--ink); font-family: var(--font-body); overflow: hidden; }
|
|
61
|
+
html[data-fullscreen="on"] .street-stage { top: 0; left: 0; }
|
|
62
|
+
@media (max-width: 768px) { .street-stage { left: 0; } }
|
|
63
|
+
/* The full-screen switch floats top right over the stage, where the strip's
|
|
64
|
+
light/dark switch ends; the strip steps in by the button's width so nothing
|
|
65
|
+
sits under it. Under 640 the exit is the round button (style.css). */
|
|
66
|
+
html[data-fullscreen="on"] .street-top { padding-right: 184px; }
|
|
67
|
+
@media (max-width: 900px) { html[data-fullscreen="on"] .street-top { padding-right: 168px; } }
|
|
68
|
+
@media (max-width: 640px) { html[data-fullscreen="on"] .street-top { padding-right: 60px; } }
|
|
56
69
|
|
|
57
70
|
.street-label { font-size: 11.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-faint); white-space: nowrap; }
|
|
58
71
|
|
|
@@ -20,8 +20,16 @@
|
|
|
20
20
|
docket (GET /api/bongos/government/docket, task 1004523), the open goals
|
|
21
21
|
with their task rollups, and the viewer's earnings this month.
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
IN THE HALL (task 1004544, owner decision 2026-10-02), as the city: the
|
|
24
|
+
street sits in the hall's sidebar and top bar, the way the sky has since
|
|
25
|
+
task 1004327, and the shell's full-screen switch (data-fullscreen-switch)
|
|
26
|
+
hides both so the street fills the window again, remembered for this
|
|
27
|
+
page. The whole street lives inside <main class="street-stage">, the
|
|
28
|
+
stage under the top bar and beside the rail (street.css), so what is
|
|
29
|
+
drawn inside is unchanged. The prototype's header strip is a <div>, not a
|
|
30
|
+
<header>, and the street band is a <div>, not a <main>: the shell's top
|
|
31
|
+
bar is the page's one <header> and the stage its one <main>. It still has
|
|
32
|
+
no menu link of its own (owner: leave it off the sidebar): the way in is
|
|
25
33
|
the city's start governing, and the wordmark is the way back.
|
|
26
34
|
|
|
27
35
|
The markup is the prototype's: its header (the wordmark back to the city,
|
|
@@ -43,11 +51,17 @@
|
|
|
43
51
|
The page is gated on board.vote.cast (src/bongos/serve-internal.js), the
|
|
44
52
|
same atom the docket read checks, so whoever reaches the street can read
|
|
45
53
|
what it draws. -->
|
|
46
|
-
<body data-page="street" class="street">
|
|
54
|
+
<body data-page="street" data-page-title="The street" class="street" data-fullscreen-switch>
|
|
47
55
|
|
|
48
|
-
<div class="
|
|
56
|
+
<div class="app">
|
|
57
|
+
<aside class="app-sidebar" id="app-sidebar" aria-label="Primary"></aside>
|
|
58
|
+
<div class="app-scrim" id="app-scrim" hidden></div>
|
|
59
|
+
<div class="app-body">
|
|
60
|
+
<header class="app-topbar" id="app-topbar"></header>
|
|
49
61
|
|
|
50
|
-
<
|
|
62
|
+
<main id="hall-main" class="street-stage">
|
|
63
|
+
|
|
64
|
+
<div class="street-top">
|
|
51
65
|
<div class="street-top__brand">
|
|
52
66
|
<a class="street-mark" id="streetHome" href="/builders/city" aria-label="Back to the city overview">{{productName}}</a>
|
|
53
67
|
<h1 class="street-kicker">the street</h1>
|
|
@@ -71,9 +85,9 @@
|
|
|
71
85
|
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" aria-hidden="true"><path id="streetModeIcon" d=""></path></svg>
|
|
72
86
|
<span id="streetModeWord">light</span>
|
|
73
87
|
</button>
|
|
74
|
-
</
|
|
88
|
+
</div>
|
|
75
89
|
|
|
76
|
-
<
|
|
90
|
+
<div class="street-window" id="streetWindow">
|
|
77
91
|
<div class="street-sizer" id="streetSizer">
|
|
78
92
|
<div class="street-board" id="streetBoard" role="group" aria-label="The street">
|
|
79
93
|
<p class="street-hint" id="streetHint"></p>
|
|
@@ -165,7 +179,7 @@
|
|
|
165
179
|
</div>
|
|
166
180
|
</div>
|
|
167
181
|
</section>
|
|
168
|
-
</
|
|
182
|
+
</div>
|
|
169
183
|
|
|
170
184
|
<nav class="street-signs" id="streetSigns" aria-label="The six readings"></nav>
|
|
171
185
|
|
|
@@ -185,8 +199,12 @@
|
|
|
185
199
|
|
|
186
200
|
<div class="street-toast" id="streetToast" role="status" aria-live="polite" hidden></div>
|
|
187
201
|
|
|
202
|
+
</main>
|
|
203
|
+
</div>
|
|
188
204
|
</div>
|
|
189
205
|
|
|
206
|
+
<script src="/builders/shell.js?v=2026-10-02-theme"></script>
|
|
207
|
+
<script src="/builders/palette.js" defer></script>
|
|
190
208
|
<script src="/builders/city-draw.js?v=2026-10-02-street1"></script>
|
|
191
209
|
<script src="/builders/street-draw.js?v=2026-10-02-street1"></script>
|
|
192
210
|
<script src="/builders/street-card.js?v=2026-10-02-amend1"></script>
|
|
@@ -97,8 +97,21 @@
|
|
|
97
97
|
var next = effectiveTheme() === 'dark' ? 'light' : 'dark';
|
|
98
98
|
chosen = next;
|
|
99
99
|
try { window.localStorage.setItem(THEME_KEY, next); } catch (_) { /* private mode: this page only */ }
|
|
100
|
-
applyTheme();
|
|
100
|
+
painted = applyTheme();
|
|
101
101
|
draw();
|
|
102
|
+
var shell = window.OTBShell;
|
|
103
|
+
if (shell && typeof shell.applyTheme === 'function' && storedTheme() === painted) shell.applyTheme();
|
|
104
|
+
}
|
|
105
|
+
// IN THE HALL (task 1004544) the shell's top bar carries the hall's own theme
|
|
106
|
+
// switch beside this one, as on the city. Both write the same 'hall-theme'
|
|
107
|
+
// preference and html[data-theme]; each repaints when the other flips it.
|
|
108
|
+
var painted = null;
|
|
109
|
+
function watchShellTheme() {
|
|
110
|
+
if (typeof MutationObserver !== 'function') return;
|
|
111
|
+
new MutationObserver(function () {
|
|
112
|
+
var t = document.documentElement.getAttribute('data-theme');
|
|
113
|
+
if ((t === 'dark' || t === 'light') && t !== painted) { painted = t; chosen = t; paintSwitch(t); draw(); }
|
|
114
|
+
}).observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] });
|
|
102
115
|
}
|
|
103
116
|
function currentMode() {
|
|
104
117
|
var t = document.documentElement.getAttribute('data-theme');
|
|
@@ -915,8 +928,9 @@
|
|
|
915
928
|
var win = $('streetWindow');
|
|
916
929
|
if (win) win.addEventListener('scroll', placeCard);
|
|
917
930
|
if (media && media.addEventListener) media.addEventListener('change', function () { if (!storedTheme()) { applyTheme(); draw(); } });
|
|
918
|
-
applyTheme();
|
|
931
|
+
painted = applyTheme();
|
|
919
932
|
draw();
|
|
933
|
+
watchShellTheme();
|
|
920
934
|
return load();
|
|
921
935
|
}
|
|
922
936
|
|
|
@@ -39,7 +39,9 @@
|
|
|
39
39
|
"#streetBoard",
|
|
40
40
|
"#streetSigns",
|
|
41
41
|
"#streetMode",
|
|
42
|
-
"#streetHome"
|
|
42
|
+
"#streetHome",
|
|
43
|
+
"#app-topbar",
|
|
44
|
+
"#fullscreen-toggle"
|
|
43
45
|
],
|
|
44
46
|
"href": [
|
|
45
47
|
[
|
|
@@ -49,6 +51,20 @@
|
|
|
49
51
|
]
|
|
50
52
|
}
|
|
51
53
|
},
|
|
54
|
+
"fullscreen": {
|
|
55
|
+
"auth": true,
|
|
56
|
+
"_": "In the hall since task 1004544: the shell's full-screen switch pressed, the sidebar and the top bar gone, the street filling the window and the one exit in the corner (the sky's mechanism, task 1004327).",
|
|
57
|
+
"actions": [
|
|
58
|
+
["wait", 900],
|
|
59
|
+
["click", "#fullscreen-toggle"],
|
|
60
|
+
["wait", 500]
|
|
61
|
+
],
|
|
62
|
+
"expect": {
|
|
63
|
+
"visible": ["#streetBoard", "#streetSigns", "#streetMode", "#fullscreen-toggle"],
|
|
64
|
+
"hidden": ["#app-sidebar", "#topbar-title"],
|
|
65
|
+
"attr": [["#fullscreen-toggle", "aria-pressed", "true"]]
|
|
66
|
+
}
|
|
67
|
+
},
|
|
52
68
|
"card": {
|
|
53
69
|
"auth": true,
|
|
54
70
|
"_": "A pin pressed: the matter's short card over the street.",
|