@bongos/core 1.21.72 → 1.21.74
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 +87 -72
- package/bin/bongos.js +1 -0
- 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 +7 -0
- package/clients/bongos-client/index.mjs +4 -0
- package/docs/adr/0369-ship-mode-decides-who-starts-a-ship-not-how-it-lands.md +44 -0
- package/docs/adr/README.md +1 -0
- package/docs/api/openapi.json +139 -3
- package/docs/api-reference.md +4 -2
- package/docs/copy-inventory.md +40 -36
- package/docs/copy-registry.json +97 -51
- package/docs/module-api-changelog.md +4 -0
- package/docs/page-readings.json +329 -330
- 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 +3 -3
- 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/craft-mode.js +69 -1
- package/modules/hall-ui/public/deploy.html +3 -3
- package/modules/hall-ui/public/diagrams.html +3 -3
- package/modules/hall-ui/public/drachmae.html +3 -3
- package/modules/hall-ui/public/fleet.html +3 -3
- package/modules/hall-ui/public/gate.html +3 -3
- package/modules/hall-ui/public/goal-map.html +3 -3
- 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 +3 -3
- package/modules/hall-ui/public/modules.html +3 -3
- 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.css +15 -0
- package/modules/hall-ui/public/project-settings.html +7 -7
- package/modules/hall-ui/public/project-settings.js +42 -0
- package/modules/hall-ui/public/ranks.html +3 -3
- package/modules/hall-ui/public/roadmap.html +3 -3
- package/modules/hall-ui/public/roster.html +3 -3
- package/modules/hall-ui/public/sessions.html +3 -3
- package/modules/hall-ui/public/settings.html +3 -3
- package/modules/hall-ui/public/shell.js +9 -0
- package/modules/hall-ui/public/street.html +3 -3
- package/modules/hall-ui/public/studio.html +3 -3
- package/modules/hall-ui/public/task.html +3 -3
- package/modules/hall-ui/public/thinking.html +3 -3
- package/modules/hall-ui/public/tweak-editor.html +3 -3
- package/modules/hall-ui/public/watch.html +3 -3
- package/modules/hall-ui/public/work.html +3 -3
- package/modules/lifecycle/routes/project-settings.js +65 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +12 -0
- package/scripts/gds/shipping-mode.js +71 -0
- package/src/bongos/project-settings.js +67 -0
- package/src/module-api.js +7 -1
- package/tests/craft_mode_nav.mjs +117 -1
- package/tests/hall_city.mjs +5 -3
- package/tests/hall_nav.mjs +3 -1
- package/tests/hall_street.mjs +2 -1
- package/tests/hall_tweak_editor.mjs +1 -1
- package/tests/nav_permission_atoms.mjs +1 -1
- package/tests/project_settings_page.mjs +8 -5
- package/tests/ship_mode.mjs +171 -0
|
@@ -91,9 +91,9 @@
|
|
|
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-trail.js?v=2026-10-
|
|
95
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
96
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
94
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
95
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
96
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
97
97
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
98
98
|
<script src="/builders/palette.js" defer></script>
|
|
99
99
|
<script src="/builders/atlas.js?v=2026-09-02-index" defer></script>
|
|
@@ -50,9 +50,9 @@
|
|
|
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-trail.js?v=2026-10-
|
|
54
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
55
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
53
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
54
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
55
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
56
56
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
57
57
|
<script src="/builders/palette.js" defer></script>
|
|
58
58
|
<!-- shared frontend toolkit (window.OTB — rank labels, number formats) + the
|
|
@@ -60,9 +60,9 @@
|
|
|
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-trail.js?v=2026-10-
|
|
64
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
65
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
63
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
64
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
65
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
66
66
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
67
67
|
<script src="/builders/palette.js" defer></script>
|
|
68
68
|
<script src="/builders/dom-utils.js?v=2026-06-16-board"></script>
|
|
@@ -83,9 +83,9 @@
|
|
|
83
83
|
</div>
|
|
84
84
|
</div>
|
|
85
85
|
|
|
86
|
-
<script src="/builders/shell-trail.js?v=2026-10-
|
|
87
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
88
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
86
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
87
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
88
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
89
89
|
<script src="/builders/palette.js" defer></script>
|
|
90
90
|
<script src="/builders/city-draw.js?v=2026-10-04-pins1"></script>
|
|
91
91
|
<script src="/builders/city.js?v=2026-10-04-pins1"></script>
|
|
@@ -148,9 +148,9 @@
|
|
|
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-trail.js?v=2026-10-
|
|
152
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
153
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
151
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
152
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
153
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
154
154
|
<script src="/builders/palette.js" defer></script>
|
|
155
155
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
156
156
|
<script src="/builders/collab-lib.js?v=2026-09-24-archive"></script>
|
|
@@ -54,9 +54,9 @@
|
|
|
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-trail.js?v=2026-10-
|
|
58
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
59
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
57
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
58
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
59
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
60
60
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
61
61
|
<script src="/builders/palette.js" defer></script>
|
|
62
62
|
<script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
|
|
@@ -177,9 +177,9 @@
|
|
|
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-trail.js?v=2026-10-
|
|
181
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
182
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
180
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
181
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
182
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
183
183
|
<script src="/builders/palette.js" defer></script>
|
|
184
184
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
185
185
|
<script src="/builders/hall-kit.js"></script>
|
|
@@ -58,9 +58,16 @@
|
|
|
58
58
|
'primer', 'ranks', 'economy', 'commands', 'diagrams', 'atlas', 'modules', 'apidocs'],
|
|
59
59
|
artistry: ['studio', 'goals', 'thinking'],
|
|
60
60
|
ideating: ['goal-map', 'thinking', 'goals'],
|
|
61
|
-
governing: ['blockers', 'board-room',
|
|
61
|
+
governing: ['city', 'blockers', 'board-room',
|
|
62
62
|
'watch', 'gate', 'sessions', 'project-settings', 'deploy', 'fleet', 'government'],
|
|
63
63
|
};
|
|
64
|
+
// A mode can lead with ONE tab and fold the rest of its own under a dropdown
|
|
65
|
+
// (owner, 2026-10-08: the city is Governing's tab, everything else under it).
|
|
66
|
+
// The folded items are MOVED into the dropdown, never copied, so the ids, the
|
|
67
|
+
// gate attributes and the active mark the shell set all travel with them; a
|
|
68
|
+
// placeholder keeps each one's place so leaving the mode puts it back exactly.
|
|
69
|
+
var MODE_LEAD = { governing: { lead: 'city', label: 'More governing' } };
|
|
70
|
+
var FOLD_ID = 'craft-fold';
|
|
64
71
|
// The tab ids a mode shows, or null for every tab.
|
|
65
72
|
function tabsFor(mode) {
|
|
66
73
|
var own = Object.prototype.hasOwnProperty.call(MODE_TABS, mode) ? MODE_TABS[mode] : null;
|
|
@@ -71,9 +78,70 @@
|
|
|
71
78
|
// shell's access gate: the gate owns `hidden`, a mode only ever takes away, and
|
|
72
79
|
// switching back simply drops the attribute. A group head goes too once
|
|
73
80
|
// nothing under it is left showing. shell.js calls this after every gate pass.
|
|
81
|
+
// The fold (MODE_LEAD): a collapsible group placed right under the lead tab,
|
|
82
|
+
// holding the mode's other own tabs. shell.js's group-head click handler opens
|
|
83
|
+
// and closes it like any other group. Leaving the mode puts every tab back.
|
|
84
|
+
var slots = {};
|
|
85
|
+
function unfold() {
|
|
86
|
+
var fold = document.getElementById(FOLD_ID);
|
|
87
|
+
for (var id in slots) {
|
|
88
|
+
var slot = slots[id], el = document.getElementById('nav-' + id);
|
|
89
|
+
if (el && slot.parentNode) slot.parentNode.insertBefore(el, slot);
|
|
90
|
+
remove(slot);
|
|
91
|
+
}
|
|
92
|
+
slots = {};
|
|
93
|
+
remove(fold);
|
|
94
|
+
}
|
|
95
|
+
function applyFold(mode) {
|
|
96
|
+
var spec = Object.prototype.hasOwnProperty.call(MODE_LEAD, mode) ? MODE_LEAD[mode] : null;
|
|
97
|
+
var fold = document.getElementById(FOLD_ID);
|
|
98
|
+
if (fold && (!spec || fold.getAttribute('data-fold') !== mode)) { unfold(); fold = null; }
|
|
99
|
+
var lead = spec && document.getElementById('nav-' + spec.lead);
|
|
100
|
+
if (!lead || !lead.parentNode || !document.createComment) return;
|
|
101
|
+
var list;
|
|
102
|
+
if (!fold) {
|
|
103
|
+
fold = document.createElement('div');
|
|
104
|
+
fold.id = FOLD_ID;
|
|
105
|
+
fold.className = 'nav-group nav-group--collapsible nav-group--collapsed craft-fold';
|
|
106
|
+
fold.setAttribute('data-group', FOLD_ID);
|
|
107
|
+
fold.setAttribute('data-fold', mode);
|
|
108
|
+
var head = document.createElement('button');
|
|
109
|
+
head.type = 'button';
|
|
110
|
+
head.className = 'nav-group__head';
|
|
111
|
+
head.setAttribute('data-group', FOLD_ID);
|
|
112
|
+
head.setAttribute('aria-expanded', 'false');
|
|
113
|
+
head.setAttribute('aria-controls', 'nav-items-' + FOLD_ID);
|
|
114
|
+
head.innerHTML = '<span class="nav-group__head-label">' + esc(spec.label) + '</span>' +
|
|
115
|
+
'<svg class="nav-group__chevron" viewBox="0 0 18 18" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 7l4 4 4-4"/></svg>';
|
|
116
|
+
list = document.createElement('div');
|
|
117
|
+
list.className = 'nav-items';
|
|
118
|
+
list.id = 'nav-items-' + FOLD_ID;
|
|
119
|
+
fold.appendChild(head);
|
|
120
|
+
fold.appendChild(list);
|
|
121
|
+
lead.parentNode.insertBefore(fold, lead.nextSibling);
|
|
122
|
+
} else {
|
|
123
|
+
list = document.getElementById('nav-items-' + FOLD_ID);
|
|
124
|
+
}
|
|
125
|
+
if (!list) return;
|
|
126
|
+
MODE_TABS[mode].forEach(function (id) {
|
|
127
|
+
var el = id !== spec.lead && document.getElementById('nav-' + id);
|
|
128
|
+
if (!el || el.parentNode === list) return;
|
|
129
|
+
var slot = document.createComment('craft-fold:' + id);
|
|
130
|
+
el.parentNode.insertBefore(slot, el);
|
|
131
|
+
slots[id] = slot;
|
|
132
|
+
list.appendChild(el);
|
|
133
|
+
});
|
|
134
|
+
// A dropdown starts closed, except when the page you are on is inside it.
|
|
135
|
+
if (list.querySelector && list.querySelector('.nav-item--active')) {
|
|
136
|
+
fold.classList.remove('nav-group--collapsed');
|
|
137
|
+
var h = fold.querySelector && fold.querySelector('.nav-group__head');
|
|
138
|
+
if (h) h.setAttribute('aria-expanded', 'true');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
74
141
|
function applyNav() {
|
|
75
142
|
var nav = document.getElementById('app-sidebar');
|
|
76
143
|
if (!nav || !nav.querySelectorAll) return;
|
|
144
|
+
applyFold(document.documentElement.dataset.craft);
|
|
77
145
|
var keep = tabsFor(document.documentElement.dataset.craft);
|
|
78
146
|
var items = nav.querySelectorAll('.nav-item');
|
|
79
147
|
for (var i = 0; i < items.length; i++) {
|
|
@@ -74,9 +74,9 @@
|
|
|
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-trail.js?v=2026-10-
|
|
78
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
79
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
77
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
78
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
79
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
80
80
|
<script src="/builders/palette.js" defer></script>
|
|
81
81
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
82
82
|
<script src="/builders/hall-kit.js"></script>
|
|
@@ -97,9 +97,9 @@
|
|
|
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-trail.js?v=2026-10-
|
|
101
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
102
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
100
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
101
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
102
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></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
|
<script src="/builders/diagram-viewer.js?v=2026-06-14-diagviewer-1" defer></script>
|
|
@@ -98,9 +98,9 @@
|
|
|
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-trail.js?v=2026-10-
|
|
102
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
103
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
101
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
102
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
103
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
104
104
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
105
105
|
<script src="/builders/palette.js" defer></script>
|
|
106
106
|
<script src="/builders/md-reader.js?v=2026-09-02-mdreader-2"></script>
|
|
@@ -54,9 +54,9 @@
|
|
|
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-trail.js?v=2026-10-
|
|
58
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
59
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
57
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
58
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
59
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
60
60
|
<script src="/builders/palette.js" defer></script>
|
|
61
61
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
62
62
|
<script src="/builders/hall-kit.js"></script>
|
|
@@ -77,9 +77,9 @@
|
|
|
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-trail.js?v=2026-10-
|
|
81
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
82
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
80
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
81
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
82
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></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>
|
|
85
85
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
@@ -137,9 +137,9 @@
|
|
|
137
137
|
</div>
|
|
138
138
|
</div>
|
|
139
139
|
|
|
140
|
-
<script src="/builders/shell-trail.js?v=2026-10-
|
|
141
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
142
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
140
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
141
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
142
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
143
143
|
<script src="/builders/palette.js" defer></script>
|
|
144
144
|
|
|
145
145
|
<script src="/builders/idea-objects.js?v=2026-09-27-split"></script>
|
|
@@ -230,9 +230,9 @@
|
|
|
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-trail.js?v=2026-10-
|
|
234
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
235
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
233
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
234
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
235
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
236
236
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
237
237
|
<script src="/builders/palette.js" defer></script>
|
|
238
238
|
<script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
|
|
@@ -134,9 +134,9 @@
|
|
|
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-trail.js?v=2026-10-
|
|
138
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
139
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
137
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
138
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
139
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
140
140
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
141
141
|
<script src="/builders/palette.js" defer></script>
|
|
142
142
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
@@ -50,9 +50,9 @@
|
|
|
50
50
|
|
|
51
51
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
52
52
|
|
|
53
|
-
<script src="/builders/shell-trail.js?v=2026-10-
|
|
54
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
55
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
53
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
54
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
55
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></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,9 +225,9 @@
|
|
|
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-trail.js?v=2026-10-
|
|
229
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
230
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
228
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
229
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
230
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
231
231
|
<script src="/builders/palette.js" defer></script>
|
|
232
232
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
233
233
|
<!-- task 1003069 (R08) — the quick-filing form's routed result links a task
|
|
@@ -106,9 +106,9 @@
|
|
|
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-trail.js?v=2026-10-
|
|
110
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
111
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
109
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab" defer></script>
|
|
110
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab" defer></script>
|
|
111
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab" defer></script>
|
|
112
112
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
113
113
|
<script src="/builders/palette.js" defer></script>
|
|
114
114
|
<!-- task 2166: the shared component kit (window.OTBKit) — pager/ledger/rail.
|
|
@@ -101,9 +101,9 @@
|
|
|
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-trail.js?v=2026-10-
|
|
105
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
106
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
104
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
105
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
106
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
107
107
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
108
108
|
<script src="/builders/palette.js" defer></script>
|
|
109
109
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
@@ -115,9 +115,9 @@
|
|
|
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-trail.js?v=2026-10-
|
|
119
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
120
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
118
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
119
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
120
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
121
121
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
122
122
|
<script src="/builders/palette.js" defer></script>
|
|
123
123
|
<!-- the shared markdown reader (window.OTBMdReader) — primer.js renders through
|
|
@@ -207,9 +207,9 @@
|
|
|
207
207
|
|
|
208
208
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
209
209
|
chrome exists before the page script runs. -->
|
|
210
|
-
<script src="/builders/shell-trail.js?v=2026-10-
|
|
211
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
212
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
210
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
211
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
212
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
213
213
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
214
214
|
<script src="/builders/palette.js" defer></script>
|
|
215
215
|
<!-- shared frontend toolkit (window.OTB) — loaded before profile.js, which pulls from it. -->
|
|
@@ -219,3 +219,18 @@
|
|
|
219
219
|
one sentence saying what it does. Plain list, the lede's measure. */
|
|
220
220
|
.ps-danger__list { margin: 10px 0 0; padding-left: 18px; line-height: 1.6; max-width: var(--measure); }
|
|
221
221
|
.ps-danger__list li + li { margin-top: 8px; }
|
|
222
|
+
|
|
223
|
+
/* Ship mode (task 1004628): two radio choices, each a full-width row whose whole
|
|
224
|
+
line is the hit target, so the 24px floor holds on a phone without a bigger dot. */
|
|
225
|
+
.ps-ship { margin: 10px 0 0; padding: 0; border: 0; }
|
|
226
|
+
.ps-ship__legend { padding: 0; font-size: 12px; color: var(--ink-soft); }
|
|
227
|
+
.ps-ship__choice {
|
|
228
|
+
display: flex;
|
|
229
|
+
align-items: flex-start;
|
|
230
|
+
gap: 8px;
|
|
231
|
+
min-height: 24px;
|
|
232
|
+
padding: 6px 0;
|
|
233
|
+
line-height: 1.5;
|
|
234
|
+
cursor: pointer;
|
|
235
|
+
}
|
|
236
|
+
.ps-ship__choice input { margin-top: 4px; flex: 0 0 auto; }
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="utf-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
6
|
<title>Project settings — {{worldName}}</title>
|
|
7
|
-
<meta name="description" content="The fundamentals of this project in one place — the stale timer, the category set, how credits are calculated, whether equity is real, and what share of upmarket revenue is paid on credits.">
|
|
7
|
+
<meta name="description" content="The fundamentals of this project in one place — how tasks ship, the stale timer, the category set, how credits are calculated, whether equity is real, and what share of upmarket revenue is paid on credits.">
|
|
8
8
|
<link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><text x='16' y='24' font-size='24' text-anchor='middle' font-family='sans-serif'>⌂</text></svg>">
|
|
9
9
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
10
10
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
@@ -39,11 +39,11 @@
|
|
|
39
39
|
<section class="scroll" id="ps-body" aria-labelledby="ps-body-h" hidden>
|
|
40
40
|
<h2 class="scroll__h" id="ps-body-h">The fundamentals</h2>
|
|
41
41
|
<p class="scroll__lede">
|
|
42
|
-
|
|
42
|
+
Six things every project settles. Three of them are knobs you can turn here;
|
|
43
43
|
the other three are decided in committed configuration, and each says which
|
|
44
44
|
file decides it.
|
|
45
45
|
</p>
|
|
46
|
-
<!-- One mount,
|
|
46
|
+
<!-- One mount, six rows, written by project-settings.js. The rows are NOT
|
|
47
47
|
authored in this file: each carries a value plus the provenance the
|
|
48
48
|
server resolved it through, and markup that could drift from that is the
|
|
49
49
|
thing this page exists to end. -->
|
|
@@ -70,13 +70,13 @@
|
|
|
70
70
|
|
|
71
71
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
72
72
|
|
|
73
|
-
<script src="/builders/shell-trail.js?v=2026-10-
|
|
74
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
75
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
73
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
74
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
75
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
76
76
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
77
77
|
<script src="/builders/palette.js" defer></script>
|
|
78
78
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
79
79
|
<script src="/builders/hall-kit.js"></script>
|
|
80
|
-
<script src="/builders/project-settings.js?v=2026-
|
|
80
|
+
<script src="/builders/project-settings.js?v=2026-10-08-ship-mode"></script>
|
|
81
81
|
</body>
|
|
82
82
|
</html>
|
|
@@ -122,6 +122,30 @@
|
|
|
122
122
|
${sib}`;
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
+
// Ship mode (task 1004628): two choices, each with the sentence the SERVER wrote,
|
|
126
|
+
// so the page never re-types what Auto or Manual means.
|
|
127
|
+
function shipBodyHtml(row) {
|
|
128
|
+
const v = row.value || {};
|
|
129
|
+
const choices = Array.isArray(row.choices) ? row.choices : [];
|
|
130
|
+
const invalid = row.invalid
|
|
131
|
+
? `<p class="ps-invalid">A configured value could not be used: <code>${escapeHtml(String(row.invalid.raw))}</code>
|
|
132
|
+
— ${escapeHtml(String(row.invalid.reason))}. The mode above is the fallback that is actually in force.</p>`
|
|
133
|
+
: '';
|
|
134
|
+
return `
|
|
135
|
+
${invalid}
|
|
136
|
+
<fieldset class="ps-ship">
|
|
137
|
+
<legend class="ps-ship__legend">How tasks ship</legend>
|
|
138
|
+
${choices.map((c) => `
|
|
139
|
+
<label class="ps-ship__choice">
|
|
140
|
+
<input type="radio" name="ps-ship-mode" value="${escapeHtml(String(c.mode))}" ${c.mode === v.mode ? 'checked' : ''}>
|
|
141
|
+
<span><strong>${escapeHtml(String(c.label))}</strong> — ${escapeHtml(String(c.sentence))}</span>
|
|
142
|
+
</label>`).join('')}
|
|
143
|
+
</fieldset>
|
|
144
|
+
<div class="ps-controls">
|
|
145
|
+
<button type="button" class="btn" id="ps-ship-save">Save</button>
|
|
146
|
+
</div>`;
|
|
147
|
+
}
|
|
148
|
+
|
|
125
149
|
function catsBodyHtml(row) {
|
|
126
150
|
const v = row.value || {};
|
|
127
151
|
const cats = Array.isArray(v.categories) ? v.categories : [];
|
|
@@ -150,6 +174,7 @@
|
|
|
150
174
|
function render() {
|
|
151
175
|
const mount = $('ps-rows');
|
|
152
176
|
mount.innerHTML = `<ul class="ov-rows">${rows.map((row) => {
|
|
177
|
+
if (row.key === 'ship_mode' && row.editable) return rowHtml(row, shipBodyHtml(row));
|
|
153
178
|
if (row.key === 'rot_timer' && row.editable) return rowHtml(row, rotBodyHtml(row));
|
|
154
179
|
if (row.key === 'work_categories' && row.editable) return rowHtml(row, catsBodyHtml(row));
|
|
155
180
|
return rowHtml(row, '');
|
|
@@ -166,6 +191,23 @@
|
|
|
166
191
|
}
|
|
167
192
|
|
|
168
193
|
function wire() {
|
|
194
|
+
const shipSave = $('ps-ship-save');
|
|
195
|
+
if (shipSave) {
|
|
196
|
+
shipSave.addEventListener('click', async () => {
|
|
197
|
+
const picked = document.querySelector('input[name="ps-ship-mode"]:checked');
|
|
198
|
+
if (!picked) { toast('Pick Auto or Manual.'); return; }
|
|
199
|
+
setBusy(true);
|
|
200
|
+
try {
|
|
201
|
+
const out = await sendJson('PATCH', '/project-settings/ship-mode', { mode: picked.value });
|
|
202
|
+
toast(out.mode === 'manual' ? 'Ship mode is now Manual.' : 'Ship mode is now Auto.');
|
|
203
|
+
await load();
|
|
204
|
+
} catch (err) {
|
|
205
|
+
toast(err.message || 'Could not save the ship mode.');
|
|
206
|
+
setBusy(false);
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
|
|
169
211
|
const rotSave = $('ps-rot-save');
|
|
170
212
|
if (rotSave) {
|
|
171
213
|
rotSave.addEventListener('click', async () => {
|
|
@@ -77,9 +77,9 @@
|
|
|
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-trail.js?v=2026-10-
|
|
81
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
82
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
80
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
81
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
82
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></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>
|
|
85
85
|
<!-- shared frontend toolkit (window.OTB) — loaded before ranks.js, which pulls from it. -->
|
|
@@ -41,9 +41,9 @@
|
|
|
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-trail.js?v=2026-10-
|
|
45
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
46
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
44
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
45
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
46
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
47
47
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
48
48
|
<script src="/builders/palette.js" defer></script>
|
|
49
49
|
<script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
|
|
@@ -53,9 +53,9 @@
|
|
|
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-trail.js?v=2026-10-
|
|
57
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
58
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
56
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
57
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
58
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
59
59
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
60
60
|
<script src="/builders/palette.js" defer></script>
|
|
61
61
|
<!-- shared frontend toolkit (window.OTB — rank labels, number formats) + the
|
|
@@ -111,9 +111,9 @@
|
|
|
111
111
|
|
|
112
112
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
113
113
|
chrome exists before the page script runs. -->
|
|
114
|
-
<script src="/builders/shell-trail.js?v=2026-10-
|
|
115
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
116
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
114
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
115
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
116
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
117
117
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
118
118
|
<script src="/builders/palette.js" defer></script>
|
|
119
119
|
<!-- shared frontend toolkit (window.OTB) — loaded BEFORE sessions.js so it can pull from it. -->
|
|
@@ -435,9 +435,9 @@
|
|
|
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-trail.js?v=2026-10-
|
|
439
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
440
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
438
|
+
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
439
|
+
<script src="/builders/craft-mode.js?v=2026-10-08-city-tab"></script>
|
|
440
|
+
<script src="/builders/shell.js?v=2026-10-08-city-tab"></script>
|
|
441
441
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
442
442
|
<script src="/builders/palette.js" defer></script>
|
|
443
443
|
<!-- shared frontend toolkit (window.OTB) — loaded before consuming IIFEs. -->
|