@bongos/core 1.24.81 → 1.24.82
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 +85 -70
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +4 -0
- package/clients/bongos-client/index.cjs +4 -0
- package/clients/bongos-client/index.d.ts +5 -0
- package/clients/bongos-client/index.mjs +4 -0
- package/docs/api/openapi.json +86 -2
- package/docs/api-reference.md +4 -2
- package/docs/copy-inventory.md +38 -32
- package/docs/copy-registry.json +107 -52
- package/docs/module-api-changelog.md +2 -0
- package/docs/page-inventory.json +1 -0
- package/docs/page-readings.json +202 -196
- package/modules/builder-settings/hall-view-prefs.js +50 -0
- package/modules/builder-settings/routes/settings.js +32 -0
- package/modules/hall-ui/public/ai-studio.html +3 -3
- package/modules/hall-ui/public/atlas.html +3 -3
- package/modules/hall-ui/public/blockers.html +3 -3
- package/modules/hall-ui/public/board-room.html +3 -3
- package/modules/hall-ui/public/city.html +4 -4
- package/modules/hall-ui/public/collab.html +3 -3
- package/modules/hall-ui/public/commands.html +3 -3
- package/modules/hall-ui/public/copy-desk.html +3 -3
- package/modules/hall-ui/public/deploy.html +3 -3
- package/modules/hall-ui/public/goal-map.html +4 -4
- package/modules/hall-ui/public/goals.html +3 -3
- package/modules/hall-ui/public/government.html +3 -3
- package/modules/hall-ui/public/idea.html +3 -3
- package/modules/hall-ui/public/ideas.html +3 -3
- package/modules/hall-ui/public/index.html +5 -5
- package/modules/hall-ui/public/market-watch-item.html +3 -3
- package/modules/hall-ui/public/market-watch-rules.html +3 -3
- package/modules/hall-ui/public/market-watch.html +3 -3
- package/modules/hall-ui/public/modules.html +3 -3
- package/modules/hall-ui/public/money.html +3 -3
- package/modules/hall-ui/public/my-agents.html +3 -3
- package/modules/hall-ui/public/options-menu.js +2 -1
- package/modules/hall-ui/public/primer.html +3 -3
- package/modules/hall-ui/public/profile.html +3 -3
- package/modules/hall-ui/public/project-settings.html +3 -3
- package/modules/hall-ui/public/roster.html +3 -3
- package/modules/hall-ui/public/settings-view.js +75 -0
- package/modules/hall-ui/public/settings.html +17 -4
- package/modules/hall-ui/public/shell-game.css +10 -0
- package/modules/hall-ui/public/shell-game.js +98 -33
- package/modules/hall-ui/public/shell.js +4 -3
- package/modules/hall-ui/public/street.html +3 -3
- package/modules/hall-ui/public/studio.html +3 -3
- package/modules/hall-ui/public/style.css +2 -0
- package/modules/hall-ui/public/task.html +3 -3
- package/modules/hall-ui/public/thinking.html +4 -4
- package/modules/hall-ui/public/tweak-editor.html +3 -3
- package/modules/hall-ui/public/visor.js +7 -1
- package/modules/hall-ui/public/watch.html +3 -3
- package/modules/hall-ui/public/work.html +3 -3
- package/modules/hall-ui/records/game-mode.md +5 -4
- package/modules/hall-ui/records/start-screen.md +4 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +6 -0
- package/scripts/hall-preview/pref-writes.js +8 -1
- package/src/module-api.js +1 -1
- package/tests/hall_fullscreen.mjs +42 -21
- package/tests/hall_start_screen.mjs +38 -3
- package/tests/hall_view_prefs.mjs +42 -0
- package/tests/hall_visor.mjs +3 -2
- package/tests/nav_permission_atoms.mjs +1 -1
|
@@ -66,7 +66,8 @@
|
|
|
66
66
|
] },
|
|
67
67
|
] },
|
|
68
68
|
{ head: 'Preferences', items: [
|
|
69
|
-
{ id: 'preferences', label: 'Preferences', native: true, gate: 'signed', words: 'usage reports'
|
|
69
|
+
{ id: 'preferences', label: 'Preferences', native: true, gate: 'signed', words: 'usage reports view game classic mode sidebar',
|
|
70
|
+
anchors: [{ label: 'View: game or classic', anchor: 'view-scroll', words: 'game classic mode full screen sidebar' }] },
|
|
70
71
|
{ id: 'sound', label: 'Sound', native: true, gate: 'signed', words: 'sounds audio chime event volume mute' },
|
|
71
72
|
] },
|
|
72
73
|
{ head: 'The project', items: [
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
|
|
9
9
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
10
10
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
11
|
-
<link rel="stylesheet" href="/builders/style.css?v=2026-11-11-
|
|
11
|
+
<link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
|
|
12
12
|
<link rel="stylesheet" href="/builders/room.css">
|
|
13
13
|
<link rel="stylesheet" href="/builders/primer.css?v=2026-07-02-shell1">
|
|
14
14
|
<link rel="stylesheet" href="/builders/diagram-viewer.css?v=2026-11-04-reading-room">
|
|
@@ -111,10 +111,10 @@
|
|
|
111
111
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
112
112
|
|
|
113
113
|
<script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
|
|
114
|
-
<script src="/builders/shell-game.js?v=2026-11-11-
|
|
114
|
+
<script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
|
|
115
115
|
<script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
|
|
116
116
|
<script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
|
|
117
|
-
<script src="/builders/shell.js?v=2026-11-11-
|
|
117
|
+
<script src="/builders/shell.js?v=2026-11-11-view2"></script>
|
|
118
118
|
<script src="/builders/hall-dialog.js"></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>
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
<link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
|
|
15
15
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
16
16
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
17
|
-
<link rel="stylesheet" href="/builders/style.css?v=2026-11-11-
|
|
17
|
+
<link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
|
|
18
18
|
<!-- The PANEL archetype (task 1003308) before the page's own sheet. -->
|
|
19
19
|
<link rel="stylesheet" href="/builders/panel.css">
|
|
20
20
|
<link rel="stylesheet" href="/builders/hall-ask.css">
|
|
@@ -248,10 +248,10 @@
|
|
|
248
248
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
249
249
|
chrome exists before the page script runs. -->
|
|
250
250
|
<script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
|
|
251
|
-
<script src="/builders/shell-game.js?v=2026-11-11-
|
|
251
|
+
<script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
|
|
252
252
|
<script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
|
|
253
253
|
<script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
|
|
254
|
-
<script src="/builders/shell.js?v=2026-11-11-
|
|
254
|
+
<script src="/builders/shell.js?v=2026-11-11-view2"></script>
|
|
255
255
|
<script src="/builders/hall-dialog.js"></script>
|
|
256
256
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
257
257
|
<script src="/builders/palette.js" defer></script>
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
|
|
9
9
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
10
10
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
11
|
-
<link rel="stylesheet" href="/builders/style.css?v=2026-11-11-
|
|
11
|
+
<link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
|
|
12
12
|
<link rel="stylesheet" href="/builders/oversight.css">
|
|
13
13
|
<link rel="stylesheet" href="/builders/project-settings.css?v=2026-11-02-outflow">
|
|
14
14
|
</head>
|
|
@@ -75,10 +75,10 @@
|
|
|
75
75
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
76
76
|
|
|
77
77
|
<script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
|
|
78
|
-
<script src="/builders/shell-game.js?v=2026-11-11-
|
|
78
|
+
<script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
|
|
79
79
|
<script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
|
|
80
80
|
<script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
|
|
81
|
-
<script src="/builders/shell.js?v=2026-11-11-
|
|
81
|
+
<script src="/builders/shell.js?v=2026-11-11-view2"></script>
|
|
82
82
|
<script src="/builders/hall-dialog.js"></script>
|
|
83
83
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
84
84
|
<script src="/builders/palette.js" defer></script>
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
|
|
9
9
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
10
10
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
11
|
-
<link rel="stylesheet" href="/builders/style.css?v=2026-11-11-
|
|
11
|
+
<link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
|
|
12
12
|
<!-- task 1003441: the identity cell (avatar, name, login). It was shared with
|
|
13
13
|
the cross-project /people page until task 1003444 deleted it. -->
|
|
14
14
|
<link rel="stylesheet" href="/builders/roster.css">
|
|
@@ -57,10 +57,10 @@
|
|
|
57
57
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
58
58
|
chrome exists before the page script runs. -->
|
|
59
59
|
<script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
|
|
60
|
-
<script src="/builders/shell-game.js?v=2026-11-11-
|
|
60
|
+
<script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
|
|
61
61
|
<script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
|
|
62
62
|
<script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
|
|
63
|
-
<script src="/builders/shell.js?v=2026-11-11-
|
|
63
|
+
<script src="/builders/shell.js?v=2026-11-11-view2"></script>
|
|
64
64
|
<script src="/builders/hall-dialog.js"></script>
|
|
65
65
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
66
66
|
<script src="/builders/palette.js" defer></script>
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// modules/hall-ui/public/settings-view.js — Options → Preferences → View: game or
|
|
2
|
+
// classic (task 1005200; owner, 2026-11-11). The one place the view is switched after
|
|
3
|
+
// sign-in. The two never mix: classic is the hall with its sidebar, game is the city
|
|
4
|
+
// full screen with only the game's places (shell-game.js).
|
|
5
|
+
//
|
|
6
|
+
// The account holds the choice (GET/PATCH /api/bongos/me/hall-view, builder-settings
|
|
7
|
+
// hall-view-prefs.js), so it follows the builder to any browser. This panel saves it
|
|
8
|
+
// there first and only then switches the page, so a failed save never leaves the page
|
|
9
|
+
// in one view and the account in the other.
|
|
10
|
+
//
|
|
11
|
+
// Own file on the settings-usage-reports.js precedent: it shares nothing with the rest
|
|
12
|
+
// of the page.
|
|
13
|
+
|
|
14
|
+
(() => {
|
|
15
|
+
'use strict';
|
|
16
|
+
|
|
17
|
+
const PATH = '/api/bongos/me/hall-view';
|
|
18
|
+
const { $ } = window.OTB;
|
|
19
|
+
const toast = (msg) => window.OTB.toast(msg);
|
|
20
|
+
const api = window.BongosClient.createClient({ baseUrl: '', credentials: 'same-origin', throwOnError: false });
|
|
21
|
+
const game = () => window.OTBShellGame;
|
|
22
|
+
|
|
23
|
+
const CHOICES = [
|
|
24
|
+
{ value: 'game', label: 'Game', desc: 'The project city, full screen. Only the game’s places: the city, the skies and the atlas.' },
|
|
25
|
+
{ value: 'classic', label: 'Classic', desc: 'The hall with its sidebar and every page.' },
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
function render(view) {
|
|
29
|
+
const wrap = $('#view-rows');
|
|
30
|
+
if (!wrap) return;
|
|
31
|
+
wrap.innerHTML =
|
|
32
|
+
'<fieldset class="pgroup" id="view-group">' +
|
|
33
|
+
'<legend class="prow__label">How you see the project</legend>' +
|
|
34
|
+
CHOICES.map((c) => {
|
|
35
|
+
const id = `view-${c.value}`;
|
|
36
|
+
return (
|
|
37
|
+
`<label class="prow prow--pick" for="${id}">` +
|
|
38
|
+
`<input class="pradio" type="radio" name="hall-view" id="${id}" value="${c.value}"${view === c.value ? ' checked' : ''}>` +
|
|
39
|
+
'<span class="prow__main">' +
|
|
40
|
+
`<span class="prow__label">${c.label}</span>` +
|
|
41
|
+
`<span class="prow__desc">${c.desc}</span>` +
|
|
42
|
+
'</span></label>'
|
|
43
|
+
);
|
|
44
|
+
}).join('') +
|
|
45
|
+
'</fieldset>';
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async function save(view) {
|
|
49
|
+
const status = $('#view-status');
|
|
50
|
+
if (status) status.textContent = 'Saving…';
|
|
51
|
+
const res = await api.request('PATCH', PATH, { body: { view } });
|
|
52
|
+
if (!res.ok) {
|
|
53
|
+
render(game() && game().on() ? 'game' : 'classic');
|
|
54
|
+
if (status) status.textContent = 'Could not save. Try again.';
|
|
55
|
+
toast('Could not switch the view. Try again.');
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const msg = view === 'game' ? 'Saved. You are in the game view.' : 'Saved. You are in the classic view.';
|
|
59
|
+
if (status) status.textContent = msg;
|
|
60
|
+
if (game()) game().set(view === 'game', { local: true });
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function setup() {
|
|
64
|
+
const section = $('#view-scroll');
|
|
65
|
+
if (!section || !game()) return;
|
|
66
|
+
render(game().on() ? 'game' : 'classic');
|
|
67
|
+
section.hidden = false;
|
|
68
|
+
$('#view-rows').addEventListener('change', (e) => {
|
|
69
|
+
if (e.target && e.target.name === 'hall-view') save(e.target.value);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', setup);
|
|
74
|
+
else setup();
|
|
75
|
+
})();
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
<link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
|
|
12
12
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
13
13
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
14
|
-
<link rel="stylesheet" href="/builders/style.css?v=2026-11-11-
|
|
14
|
+
<link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
|
|
15
15
|
<!-- The PANEL archetype (task 1003308): the row, the switch, the field, the
|
|
16
16
|
chip control and the family's voices, shared with profile and pair.
|
|
17
17
|
settings.css then holds only what this page
|
|
@@ -287,6 +287,18 @@
|
|
|
287
287
|
on the same routes. They live on My agents only now; this line is where
|
|
288
288
|
they were. Old deep links (#interaction, #wandering, #rendering, …) are
|
|
289
289
|
sent there by settings-moved.js. -->
|
|
290
|
+
<!-- VIEW — game or classic (task 1005200): the one place the view is switched
|
|
291
|
+
after sign-in. Kept on the account (GET/PATCH /me/hall-view); drawn by
|
|
292
|
+
settings-view.js. -->
|
|
293
|
+
<section class="scroll" id="view-scroll" aria-labelledby="view-h" data-group="preferences" hidden>
|
|
294
|
+
<h2 id="view-h" class="scroll__h">View</h2>
|
|
295
|
+
<p class="scroll__lede">
|
|
296
|
+
Game or classic, never both. You also choose each time you sign in.
|
|
297
|
+
</p>
|
|
298
|
+
<div class="sound-rows" id="view-rows"></div>
|
|
299
|
+
<p class="settings-status" id="view-status" role="status" aria-live="polite"></p>
|
|
300
|
+
</section>
|
|
301
|
+
|
|
290
302
|
<section class="scroll" id="agents-moved-preferences" aria-labelledby="agents-moved-preferences-h" data-group="preferences">
|
|
291
303
|
<h2 id="agents-moved-preferences-h" class="scroll__h">Your agents</h2>
|
|
292
304
|
<p class="scroll__lede">
|
|
@@ -405,10 +417,10 @@
|
|
|
405
417
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
406
418
|
chrome exists before the page scripts run. -->
|
|
407
419
|
<script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
|
|
408
|
-
<script src="/builders/shell-game.js?v=2026-11-11-
|
|
420
|
+
<script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
|
|
409
421
|
<script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
|
|
410
422
|
<script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
|
|
411
|
-
<script src="/builders/shell.js?v=2026-11-11-
|
|
423
|
+
<script src="/builders/shell.js?v=2026-11-11-view2"></script>
|
|
412
424
|
<script src="/builders/hall-dialog.js"></script>
|
|
413
425
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
414
426
|
<script src="/builders/palette.js" defer></script>
|
|
@@ -420,7 +432,7 @@
|
|
|
420
432
|
<!-- task 1005044: the old deep links to the agent settings that moved to My agents -->
|
|
421
433
|
<script src="/builders/settings-moved.js?v=2026-11-03-moved"></script>
|
|
422
434
|
<!-- task 1005144: the ONE options menu — the rail, its search, and the screens it opens in a frame. -->
|
|
423
|
-
<script src="/builders/options-menu.js?v=2026-11-
|
|
435
|
+
<script src="/builders/options-menu.js?v=2026-11-11-view2"></script>
|
|
424
436
|
<script src="/builders/settings.js?v=2026-11-10-options"></script>
|
|
425
437
|
<!-- task 1003341: the Active sessions panel. Its own file rather than more of
|
|
426
438
|
settings.js, which sits close to the 1500-line size ratchet. -->
|
|
@@ -437,6 +449,7 @@
|
|
|
437
449
|
<script src="/builders/runner-button.js"></script>
|
|
438
450
|
<script src="/builders/settings-autobongos.js?v=2026-11-09-run-button"></script>
|
|
439
451
|
<!-- task 1003793: Settings → Module install reports. Own file on the same precedent. -->
|
|
452
|
+
<script src="/builders/settings-view.js?v=2026-11-11-view"></script>
|
|
440
453
|
<script src="/builders/settings-usage-reports.js?v=2026-10-08-usage-reports"></script>
|
|
441
454
|
</body>
|
|
442
455
|
</html>
|
|
@@ -85,6 +85,16 @@ html.gs-open { overflow: hidden; }
|
|
|
85
85
|
.gs__foot { padding: var(--ds-space-md) var(--ds-space-lg) 0; border-top: var(--line-strong) solid var(--rule); }
|
|
86
86
|
.gs__line, .gs__note { margin: 0; font-size: var(--ds-text-lg); line-height: 1.5; text-wrap: pretty; color: var(--ink-soft); }
|
|
87
87
|
.gs__note { margin-top: var(--ds-space-xs); color: var(--ink); }
|
|
88
|
+
/* the view chooser in front of the menu (task 1005200): Game or Classic as two rows in the
|
|
89
|
+
panel's own voice, each with one line saying what it is; the view chosen last time is lit
|
|
90
|
+
with the accent on its edge and says so */
|
|
91
|
+
.gs__ask { margin: 0; padding: 0 var(--ds-space-lg) var(--ds-space-sm); font-size: var(--ds-text-lg); color: var(--ink-soft); }
|
|
92
|
+
.gs__ask[hidden] { display: none; }
|
|
93
|
+
.gs__item--view { flex-direction: column; align-items: flex-start; justify-content: center; gap: var(--ds-space-hair); padding-top: var(--ds-space-sm); padding-bottom: var(--ds-space-sm); }
|
|
94
|
+
.gs__item--last { box-shadow: inset var(--line-strong) 0 0 var(--accent); }
|
|
95
|
+
.gs__view { display: inline-flex; align-items: baseline; gap: var(--ds-space-sm); }
|
|
96
|
+
.gs__sub { font-family: var(--font-body); font-size: var(--ds-text-md); letter-spacing: 0; text-transform: none; color: var(--ink-soft); }
|
|
97
|
+
.gs__last { font-family: var(--font-body); font-size: var(--label-size); letter-spacing: var(--label-space); text-transform: uppercase; color: var(--accent); }
|
|
88
98
|
.gs__note[hidden] { display: none; }
|
|
89
99
|
|
|
90
100
|
/* the load screen: the week it is showing, a segment per week, the city, and the tip under it */
|
|
@@ -7,18 +7,25 @@
|
|
|
7
7
|
// the same html[data-fullscreen="on"] state, the same corner button and the same
|
|
8
8
|
// Escape hand-off (a page listener that calls preventDefault keeps the press).
|
|
9
9
|
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
10
|
+
// GAME OR CLASSIC, never both (task 1005200; owner, 2026-11-11). Classic is the hall
|
|
11
|
+
// as it always was; game is full screen with NO way back to the bars inside it (no
|
|
12
|
+
// corner button, no Escape-to-leave: shell.js) and only the game PLACES below, so any
|
|
13
|
+
// other hall page sends you to the city. The view is chosen at every sign-in (the
|
|
14
|
+
// chooser in front of the start screen) and switched only in Options → Preferences →
|
|
15
|
+
// View. It is kept on the ACCOUNT (GET/PATCH /api/bongos/me/hall-view, builder-settings
|
|
16
|
+
// hall-view-prefs.js) so it follows the builder to any browser; one localStorage key
|
|
17
|
+
// (`hall-game`) is only the copy a page paints from before that read answers, and one
|
|
18
|
+
// attribute, html[data-game="on"], is what a sheet or script reads.
|
|
16
19
|
// Loaded BEFORE shell.js on every hall page; a page without this file is simply
|
|
17
20
|
// never in game mode.
|
|
18
21
|
(function () {
|
|
19
22
|
'use strict';
|
|
20
23
|
var KEY = 'hall-game';
|
|
21
|
-
var
|
|
24
|
+
var VIEW_API = '/api/bongos/me/hall-view';
|
|
25
|
+
// The game's places, by page id (body data-page). Every other page is classic and is
|
|
26
|
+
// not reachable in game mode; a page joins this list when it has a game version.
|
|
27
|
+
var PLACES = ['home', 'city', 'goal-map', 'thinking', 'atlas', 'settings', 'profile'];
|
|
28
|
+
var embedded = false; // set below, once: inside the options menu's frame
|
|
22
29
|
function read(store, key) { try { return window[store].getItem(key); } catch (_) { return null; } }
|
|
23
30
|
function write(store, key, value) { try { window[store].setItem(key, value); } catch (_) { /* private mode */ } }
|
|
24
31
|
function on() { return read('localStorage', KEY) === 'on'; }
|
|
@@ -26,21 +33,57 @@
|
|
|
26
33
|
var root = document.documentElement;
|
|
27
34
|
if (on()) root.dataset.game = 'on'; else delete root.dataset.game;
|
|
28
35
|
}
|
|
29
|
-
//
|
|
30
|
-
function
|
|
36
|
+
// '/builders' on the apex, '' on the builders host: the hall's own base.
|
|
37
|
+
function base() {
|
|
38
|
+
var p = String((window.location && window.location.pathname) || '');
|
|
39
|
+
return p.indexOf('/builders/') === 0 || p === '/builders' ? '/builders' : '';
|
|
40
|
+
}
|
|
41
|
+
// The page id an in-hall path names ('/city' → 'city', '/' → 'home'), or null.
|
|
42
|
+
function pageOf(path) {
|
|
43
|
+
var p = String(path || '').split(/[?#]/)[0].replace(/^\/builders(?=\/|$)/, '').replace(/\.html$/, '');
|
|
44
|
+
p = p.replace(/^\/+|\/+$/g, '');
|
|
45
|
+
if (p === '' || p === 'index') return 'home';
|
|
46
|
+
return p.indexOf('/') >= 0 ? null : p;
|
|
47
|
+
}
|
|
48
|
+
function isPlace(path) { return PLACES.indexOf(pageOf(path)) >= 0; }
|
|
49
|
+
function herePage() {
|
|
50
|
+
var b = document.body;
|
|
51
|
+
return (b && b.getAttribute && b.getAttribute('data-page')) || pageOf(window.location.pathname);
|
|
52
|
+
}
|
|
53
|
+
// In game mode a classic page is not there: go to the city. True when leaving.
|
|
54
|
+
function keepToPlaces() {
|
|
55
|
+
if (!on() || embedded) return false;
|
|
56
|
+
var page = herePage();
|
|
57
|
+
if (!page || PLACES.indexOf(page) >= 0) return false;
|
|
58
|
+
window.location.replace(base() + '/');
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
function save(view) {
|
|
62
|
+
if (typeof fetch !== 'function') return;
|
|
63
|
+
fetch(VIEW_API, { method: 'PATCH', credentials: 'same-origin', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ view: view }) })
|
|
64
|
+
.catch(function () { /* the browser's copy stands; the next choice saves again */ });
|
|
65
|
+
}
|
|
66
|
+
// Switch views: the browser's copy, the account (unless o.local: the account said so),
|
|
67
|
+
// then what this page shows. A classic page switched to game goes to the city.
|
|
68
|
+
function set(value, o) {
|
|
31
69
|
write('localStorage', KEY, value ? 'on' : 'off');
|
|
70
|
+
if (!(o && o.local)) save(value ? 'game' : 'classic');
|
|
32
71
|
stamp();
|
|
72
|
+
if (keepToPlaces()) return;
|
|
33
73
|
if (window.OTBShell && window.OTBShell.setFullscreen) window.OTBShell.setFullscreen(null);
|
|
34
74
|
}
|
|
35
|
-
//
|
|
36
|
-
//
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
75
|
+
// The account's view wins over the browser's copy (another browser may have switched).
|
|
76
|
+
// Never chosen (null), signed out, or no answer: the copy stands.
|
|
77
|
+
function sync() {
|
|
78
|
+
if (embedded || typeof fetch !== 'function') return;
|
|
79
|
+
fetch(VIEW_API, { credentials: 'same-origin' }).then(function (r) { return r.ok ? r.json() : null; }).then(function (d) {
|
|
80
|
+
var view = d && d.view;
|
|
81
|
+
if (view !== 'game' && view !== 'classic') return;
|
|
82
|
+
if ((view === 'game') !== on()) set(view === 'game', { local: true });
|
|
83
|
+
}, function () { /* offline: the copy stands */ });
|
|
43
84
|
}
|
|
85
|
+
// The shell's "how to leave full screen" line. Game mode has no way to leave it.
|
|
86
|
+
function hint() { return !on(); }
|
|
44
87
|
|
|
45
88
|
// ---------- the start screen and the load screen (task 1005143, BONGOS-V3 R03) ----------
|
|
46
89
|
// A fresh sign-in opens on the start screen: Start, Options, Achievements, Extras, Quit over a
|
|
@@ -58,7 +101,6 @@
|
|
|
58
101
|
var EXTRAS = [
|
|
59
102
|
{ label: 'The thinking sky', href: '/thinking' },
|
|
60
103
|
{ label: 'The atlas', href: '/atlas' },
|
|
61
|
-
{ label: 'The docs', href: '/docs' },
|
|
62
104
|
];
|
|
63
105
|
var TIPS = [
|
|
64
106
|
'Escape opens the options menu, where every setting lives.',
|
|
@@ -91,6 +133,19 @@
|
|
|
91
133
|
if (m.href) return '<li><a' + inner + ' href="' + esc(m.href) + '">' + esc(m.label) + '</a></li>';
|
|
92
134
|
return '<li><button type="button"' + inner + (m.id === 'extras' ? ' aria-expanded="false" aria-controls="gs-extras"' : '') + '>' + esc(m.label) + '</button></li>';
|
|
93
135
|
}
|
|
136
|
+
// The chooser in front of the start screen (task 1005200): game or classic, the view
|
|
137
|
+
// chosen last time marked and focused, so Enter keeps it.
|
|
138
|
+
var VIEWS = [
|
|
139
|
+
{ id: 'game', label: 'Game', sub: 'The city, full screen' },
|
|
140
|
+
{ id: 'classic', label: 'Classic', sub: 'The hall with its sidebar' },
|
|
141
|
+
];
|
|
142
|
+
function lastView() { var v = read('localStorage', KEY); return v === 'on' ? 'game' : v === 'off' ? 'classic' : null; }
|
|
143
|
+
function viewHtml(v) {
|
|
144
|
+
var last = lastView() === v.id;
|
|
145
|
+
return '<li><button type="button" class="gs__item gs__item--view' + (last ? ' gs__item--last' : '') + '" data-gs="view-' + v.id + '">' +
|
|
146
|
+
'<span class="gs__view">' + esc(v.label) + (last ? '<span class="gs__last">Last time</span>' : '') + '</span>' +
|
|
147
|
+
'<span class="gs__sub">' + esc(v.sub) + '</span></button></li>';
|
|
148
|
+
}
|
|
94
149
|
// The project's own logo where it has one (ADR 0358), else the shared mark, as the sidebar draws it.
|
|
95
150
|
function markHtml() {
|
|
96
151
|
var theme = (window.__BRANDING__ && window.__BRANDING__.theme) || {};
|
|
@@ -106,7 +161,9 @@
|
|
|
106
161
|
'<h2 class="gs__title" id="gs-title">' + esc(o.name || 'This project') + '</h2>' +
|
|
107
162
|
'</div>' +
|
|
108
163
|
'<div class="gs__list">' +
|
|
109
|
-
'<
|
|
164
|
+
'<p class="gs__ask" id="gs-ask">How do you want to see it?</p>' +
|
|
165
|
+
'<ul class="gs__items" id="gs-views">' + VIEWS.map(viewHtml).join('') + '</ul>' +
|
|
166
|
+
'<ul class="gs__items" id="gs-items" hidden>' + MENU.map(itemHtml).join('') + '</ul>' +
|
|
110
167
|
'<ul class="gs__items gs__items--extras" id="gs-extras" hidden>' + EXTRAS.map(function (x) {
|
|
111
168
|
return '<li><a class="gs__item gs__item--extra" href="' + esc(x.href) + '">' + esc(x.label) + '</a></li>';
|
|
112
169
|
}).join('') + '</ul>' +
|
|
@@ -244,10 +301,24 @@
|
|
|
244
301
|
btn.setAttribute('aria-expanded', open ? 'true' : 'false');
|
|
245
302
|
if (open) box.querySelector('a').focus();
|
|
246
303
|
}
|
|
304
|
+
// Game: on to the start screen. Classic: the screen goes and the hall is as it always was.
|
|
305
|
+
function choose(view) {
|
|
306
|
+
if (phase !== 'choose') return;
|
|
307
|
+
if (view === 'classic') { set(false); close(); return; }
|
|
308
|
+
set(true);
|
|
309
|
+
phase = 'menu';
|
|
310
|
+
root.querySelector('#gs-ask').hidden = true;
|
|
311
|
+
root.querySelector('#gs-views').hidden = true;
|
|
312
|
+
root.querySelector('#gs-items').hidden = false;
|
|
313
|
+
var first = root.querySelector('[data-gs="start"]');
|
|
314
|
+
if (first && first.focus) first.focus();
|
|
315
|
+
}
|
|
247
316
|
function onClick(e) {
|
|
248
317
|
var el = e.target.closest && e.target.closest('.gs__item');
|
|
249
|
-
if (!el
|
|
318
|
+
if (!el) return;
|
|
250
319
|
var id = el.getAttribute('data-gs');
|
|
320
|
+
if (id === 'view-game' || id === 'view-classic') { choose(id.slice(5)); return; }
|
|
321
|
+
if (phase !== 'menu') return;
|
|
251
322
|
if (id === 'start') load();
|
|
252
323
|
else if (id === 'extras') toggleExtras(el);
|
|
253
324
|
else if (id === 'quit') quit();
|
|
@@ -262,7 +333,7 @@
|
|
|
262
333
|
if (phase === 'menu' && !box.hidden) { var b = root.querySelector('[data-gs="extras"]'); toggleExtras(b); b.focus(); }
|
|
263
334
|
return;
|
|
264
335
|
}
|
|
265
|
-
if (phase !== 'menu') return;
|
|
336
|
+
if (phase !== 'menu' && phase !== 'choose') return;
|
|
266
337
|
var f = items(), at = f.indexOf(document.activeElement), step = 0;
|
|
267
338
|
if (e.key === 'ArrowDown') step = 1;
|
|
268
339
|
else if (e.key === 'ArrowUp') step = -1;
|
|
@@ -277,7 +348,7 @@
|
|
|
277
348
|
function start(o) {
|
|
278
349
|
if (root || !document.body) return !!root;
|
|
279
350
|
opts = o || {};
|
|
280
|
-
phase = '
|
|
351
|
+
phase = 'choose';
|
|
281
352
|
root = document.createElement('div');
|
|
282
353
|
root.className = 'gs';
|
|
283
354
|
root.id = 'game-start';
|
|
@@ -289,15 +360,11 @@
|
|
|
289
360
|
document.addEventListener('keydown', onKey, true);
|
|
290
361
|
document.body.appendChild(root);
|
|
291
362
|
document.documentElement.classList.add('gs-open');
|
|
292
|
-
var first = root.querySelector('.gs__item');
|
|
363
|
+
var first = root.querySelector('.gs__item--last') || root.querySelector('.gs__item');
|
|
293
364
|
if (first && first.focus) first.focus();
|
|
294
365
|
return true;
|
|
295
366
|
}
|
|
296
367
|
|
|
297
|
-
try {
|
|
298
|
-
var asked = new URLSearchParams(window.location.search || '').get('game');
|
|
299
|
-
if (asked === 'on' || asked === 'off') write('localStorage', KEY, asked);
|
|
300
|
-
} catch (_) { /* old engine: the stored value stands */ }
|
|
301
368
|
stamp();
|
|
302
369
|
|
|
303
370
|
// ---------- the options menu (task 1005144, BONGOS-V3 R04, ADR 0401) ----------
|
|
@@ -309,7 +376,6 @@
|
|
|
309
376
|
// Escape nobody used goes to the menu. Only inside a frame: the same URL opened
|
|
310
377
|
// on its own is the page with its chrome (the server sends a plain visit of the
|
|
311
378
|
// old address to the menu, serve-internal.js).
|
|
312
|
-
var embedded = false;
|
|
313
379
|
try {
|
|
314
380
|
embedded = new URLSearchParams(window.location.search || '').get('embed') === '1'
|
|
315
381
|
&& !!window.parent && window.parent !== window;
|
|
@@ -320,10 +386,9 @@
|
|
|
320
386
|
if (document.body && document.body.setAttribute) document.body.setAttribute('data-fullscreen-switch', 'off');
|
|
321
387
|
}
|
|
322
388
|
// The hall's address for the menu: '/settings' on the builders host, '/builders/settings' on the apex.
|
|
323
|
-
function menuPath() {
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
}
|
|
389
|
+
function menuPath() { return base() + '/settings'; }
|
|
390
|
+
keepToPlaces();
|
|
391
|
+
sync();
|
|
327
392
|
function inField(el) {
|
|
328
393
|
var tag = el && el.tagName ? String(el.tagName).toLowerCase() : '';
|
|
329
394
|
return tag === 'input' || tag === 'textarea' || tag === 'select' || !!(el && el.isContentEditable);
|
|
@@ -359,5 +424,5 @@
|
|
|
359
424
|
}, true);
|
|
360
425
|
}
|
|
361
426
|
window.OTBShellGame = { on: on, set: set, hint: hint, start: start, tipAt: tipAt, historySteps: historySteps, whenLabel: whenLabel, segsDone: segsDone, MENU: MENU, TIPS: TIPS,
|
|
362
|
-
embedded: function () { return embedded; }, menuPath: menuPath };
|
|
427
|
+
embedded: function () { return embedded; }, menuPath: menuPath, PLACES: PLACES, pageOf: pageOf, isPlace: isPlace };
|
|
363
428
|
})();
|
|
@@ -560,7 +560,8 @@
|
|
|
560
560
|
// button and Escape bring them back. Opt out with <body data-fullscreen-switch="off">;
|
|
561
561
|
// the bare attribute means the page lays itself out for it, else it is `plain`.
|
|
562
562
|
// State: html[data-fullscreen="on"], remembered PER PAGE (`hall-fullscreen:<data-page>`).
|
|
563
|
-
// task 1005142: in game mode (shell-game.js) EVERY page opens in it, whatever it remembers
|
|
563
|
+
// task 1005142: in game mode (shell-game.js) EVERY page opens in it, whatever it remembers,
|
|
564
|
+
// and since task 1005200 it STAYS in it: no button (style.css), no Escape-to-leave.
|
|
564
565
|
var GAME = window.OTBShellGame || { on: function () { return false; }, hint: function () { return true; } };
|
|
565
566
|
var FULLSCREEN_KEY = 'hall-fullscreen:';
|
|
566
567
|
function fullscreenAttr() {
|
|
@@ -604,7 +605,7 @@
|
|
|
604
605
|
leave: '<svg viewBox="0 0 18 18" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 3v4H3M15 7h-4V3M11 15v-4h4M3 11h4v4"/></svg>',
|
|
605
606
|
};
|
|
606
607
|
function applyFullscreen(on) {
|
|
607
|
-
if (!fullscreenPage()) on = false;
|
|
608
|
+
if (!fullscreenPage()) on = false; else if (GAME.on()) on = true;
|
|
608
609
|
var root = document.documentElement;
|
|
609
610
|
if (on) root.dataset.fullscreen = 'on'; else delete root.dataset.fullscreen;
|
|
610
611
|
if (on && fullscreenAttr() === null) root.dataset.fullscreenPlain = 'on'; else delete root.dataset.fullscreenPlain;
|
|
@@ -641,7 +642,7 @@
|
|
|
641
642
|
// a text field, where Escape belongs to the field. Page listeners may be on
|
|
642
643
|
// the window AFTER this one, so the verdict waits for the dispatch to finish.
|
|
643
644
|
function onFullscreenKey(e) {
|
|
644
|
-
if (e.key !== 'Escape' || !isFullscreen() || e.defaultPrevented || inTextField(e.target)) return;
|
|
645
|
+
if (e.key !== 'Escape' || !isFullscreen() || GAME.on() || e.defaultPrevented || inTextField(e.target)) return;
|
|
645
646
|
window.setTimeout(function () { if (!e.defaultPrevented && isFullscreen()) setFullscreen(false); }, 0);
|
|
646
647
|
}
|
|
647
648
|
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
<!-- The faces (Manrope, JetBrains Mono) come from the branding pack's font
|
|
11
11
|
links, injected into this head by the server like every hall page's
|
|
12
12
|
(tests/hall_tokens.mjs: no hall page hardcodes a web-font stylesheet). -->
|
|
13
|
-
<link rel="stylesheet" href="/builders/style.css?v=2026-11-11-
|
|
13
|
+
<link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
|
|
14
14
|
<link rel="stylesheet" href="/builders/street.css?v=2026-11-11-helm">
|
|
15
15
|
<link rel="stylesheet" href="/builders/street-card.css?v=2026-10-04-record1">
|
|
16
16
|
<link rel="stylesheet" href="/builders/street-deck.css?v=2026-10-17-tidy">
|
|
@@ -225,10 +225,10 @@
|
|
|
225
225
|
</div>
|
|
226
226
|
|
|
227
227
|
<script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
|
|
228
|
-
<script src="/builders/shell-game.js?v=2026-11-11-
|
|
228
|
+
<script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
|
|
229
229
|
<script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
|
|
230
230
|
<script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
|
|
231
|
-
<script src="/builders/shell.js?v=2026-11-11-
|
|
231
|
+
<script src="/builders/shell.js?v=2026-11-11-view2"></script>
|
|
232
232
|
<script src="/builders/hall-dialog.js"></script>
|
|
233
233
|
<script src="/builders/palette.js" defer></script>
|
|
234
234
|
<script src="/builders/gov-living.js?v=2026-10-09-positions1"></script>
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
<link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
|
|
13
13
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
14
14
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
15
|
-
<link rel="stylesheet" href="/builders/style.css?v=2026-11-11-
|
|
15
|
+
<link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
|
|
16
16
|
<link rel="stylesheet" href="/builders/studio.css?v=2026-10-09-day">
|
|
17
17
|
<link rel="stylesheet" href="/builders/approval-queue.css?v=2026-09-29-aqfix">
|
|
18
18
|
<link rel="stylesheet" href="/builders/home-gallery.css?v=2026-11-04-studio">
|
|
@@ -222,10 +222,10 @@
|
|
|
222
222
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
223
223
|
|
|
224
224
|
<script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
|
|
225
|
-
<script src="/builders/shell-game.js?v=2026-11-11-
|
|
225
|
+
<script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
|
|
226
226
|
<script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
|
|
227
227
|
<script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
|
|
228
|
-
<script src="/builders/shell.js?v=2026-11-11-
|
|
228
|
+
<script src="/builders/shell.js?v=2026-11-11-view2"></script>
|
|
229
229
|
<script src="/builders/hall-dialog.js"></script>
|
|
230
230
|
<script src="/builders/palette.js" defer></script>
|
|
231
231
|
<!-- The kit, for its ONE renderer: the full-size ship-time visual figure
|
|
@@ -1323,6 +1323,8 @@ html[data-fullscreen="on"] .app-topbar {
|
|
|
1323
1323
|
}
|
|
1324
1324
|
html[data-fullscreen="on"] .app-topbar > :not(.topbar-side),
|
|
1325
1325
|
html[data-fullscreen="on"] .topbar-side > :not(.fullscreen-toggle):not(.upd-pill) { display: none; }
|
|
1326
|
+
/* Game mode keeps its full screen: no way back to the bars inside it (task 1005200). */
|
|
1327
|
+
html[data-game="on"] .fullscreen-toggle { display: none; }
|
|
1326
1328
|
/* task 1005191: the Update pill stays with the bars away. Game mode opens every page
|
|
1327
1329
|
this way, and an update nobody can see is an update nobody takes. */
|
|
1328
1330
|
html[data-fullscreen="on"] .upd-pill {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
|
|
9
9
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
10
10
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
11
|
-
<link rel="stylesheet" href="/builders/style.css?v=2026-11-11-
|
|
11
|
+
<link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
|
|
12
12
|
<!-- The record archetype (shared with idea.html) and this page's own two
|
|
13
13
|
shapes. Promoted out of an inline <style> by task 1003305 — the block was
|
|
14
14
|
the hall's last substantive one and sat at its hall_audit ratchet. -->
|
|
@@ -57,10 +57,10 @@
|
|
|
57
57
|
<!-- The app shell (sidebar + top bar + footer). Dependency-free; runs at parse
|
|
58
58
|
time so the chrome exists before the deferred page scripts execute. -->
|
|
59
59
|
<script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
|
|
60
|
-
<script src="/builders/shell-game.js?v=2026-11-11-
|
|
60
|
+
<script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
|
|
61
61
|
<script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
|
|
62
62
|
<script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
|
|
63
|
-
<script src="/builders/shell.js?v=2026-11-11-
|
|
63
|
+
<script src="/builders/shell.js?v=2026-11-11-view2"></script>
|
|
64
64
|
<script src="/builders/hall-dialog.js"></script>
|
|
65
65
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
66
66
|
<script src="/builders/palette.js" defer></script>
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
links, injected into this head by the server like every hall page's
|
|
13
13
|
(tests/hall_tokens.mjs: no hall page hardcodes a web-font stylesheet).
|
|
14
14
|
The template carried its own Google Fonts link for the same two faces. -->
|
|
15
|
-
<link rel="stylesheet" href="/builders/style.css?v=2026-11-11-
|
|
15
|
+
<link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
|
|
16
16
|
<link rel="stylesheet" href="/builders/visor.css?v=2026-11-10-visor">
|
|
17
17
|
<link rel="stylesheet" href="/builders/thinking.css?v=2026-11-10-visor">
|
|
18
18
|
</head>
|
|
@@ -140,13 +140,13 @@
|
|
|
140
140
|
</div>
|
|
141
141
|
|
|
142
142
|
<script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
|
|
143
|
-
<script src="/builders/shell-game.js?v=2026-11-11-
|
|
143
|
+
<script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
|
|
144
144
|
<script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
|
|
145
145
|
<script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
|
|
146
|
-
<script src="/builders/shell.js?v=2026-11-11-
|
|
146
|
+
<script src="/builders/shell.js?v=2026-11-11-view2"></script>
|
|
147
147
|
<script src="/builders/hall-dialog.js"></script>
|
|
148
148
|
<!-- task 1005148: the visor (glass over the scene, game mode only; ADR 0399), after the shell and hall-dialog.js -->
|
|
149
|
-
<script src="/builders/visor.js?v=2026-11-
|
|
149
|
+
<script src="/builders/visor.js?v=2026-11-11-view2"></script>
|
|
150
150
|
<script src="/builders/palette.js" defer></script>
|
|
151
151
|
|
|
152
152
|
<script src="/builders/idea-objects.js?v=2026-09-27-split"></script>
|