@bongos/core 1.20.46 → 1.20.48
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 +103 -68
- package/docs/copy-inventory.md +230 -225
- package/docs/copy-registry.json +371 -286
- package/docs/module-api-changelog.md +4 -0
- package/docs/page-inventory.json +7 -4
- package/docs/page-readings.json +248 -249
- 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/bulk-toolbar.js +291 -0
- 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/goals-page.js +29 -44
- package/modules/hall-ui/public/goals-render.js +33 -21
- package/modules/hall-ui/public/goals.html +13 -17
- package/modules/hall-ui/public/government.html +1 -1
- package/modules/hall-ui/public/hall-render.js +3 -0
- 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 +82 -1
- package/modules/hall-ui/public/studio.html +1 -1
- package/modules/hall-ui/public/style.css +110 -3
- 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-founding.states.json +39 -0
- package/modules/hall-ui/public/work.css +4 -66
- package/modules/hall-ui/public/work.html +3 -2
- package/modules/hall-ui/public/work.js +17 -236
- package/modules/hall-ui/records/founding-mode.md +31 -0
- package/modules/onboarding/founding-mode.js +185 -0
- package/modules/onboarding/port.js +7 -0
- package/modules/ui-design/kit/fixtures/me-founding.json +24 -0
- package/modules/ui-design/kit/serve.js +3 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +12 -0
- package/src/bongos/routes/me.js +18 -1
- package/src/module-api.js +1 -1
- package/tests/bulk_toolbar.mjs +202 -0
- package/tests/claim_action.mjs +13 -4
- package/tests/founding_mode.mjs +294 -0
- package/tests/goal_category_ui.mjs +1 -0
- package/tests/goal_criterion_confirm_ui.mjs +2 -0
- package/tests/goal_forest_page.mjs +1 -0
- package/tests/goal_invite_consent.mjs +1 -1
- package/tests/goal_mine_lens.mjs +1 -0
- package/tests/hall_board_world.mjs +1 -1
- package/tests/hall_mine_lens.mjs +1 -0
- package/tests/hall_tweak_editor.mjs +1 -1
- package/tests/nav_permission_atoms.mjs +1 -1
|
@@ -16,14 +16,6 @@
|
|
|
16
16
|
block per the hall placement rules; shared pager/filter/tab/count-pill
|
|
17
17
|
styles now live in style.css's hall-kit section. -->
|
|
18
18
|
<link rel="stylesheet" href="/builders/goals.css">
|
|
19
|
-
<!-- task 1002425 — the goal-detail "Tasks" pane mirrors the Tasks board's
|
|
20
|
-
claimable cards + bulk toolbar, so it needs the board's page-local card /
|
|
21
|
-
.task__claim / .bulk-toolbar styling. That styling lives in work.css (the
|
|
22
|
-
shared base .task grid is already in style.css above); linking it here is
|
|
23
|
-
the no-duplication way to give both surfaces identical cards. (Follow-up:
|
|
24
|
-
promote the shared card/toolbar rules into style.css so work.css can go
|
|
25
|
-
back to being board-only — idea captured at ship.) -->
|
|
26
|
-
<link rel="stylesheet" href="/builders/work.css">
|
|
27
19
|
</head>
|
|
28
20
|
<body data-page="goals" data-page-title="Goals">
|
|
29
21
|
|
|
@@ -178,16 +170,19 @@
|
|
|
178
170
|
</div>
|
|
179
171
|
|
|
180
172
|
<!-- task 1002425 — bulk-action toolbar for the goal's task cards,
|
|
181
|
-
mirroring the Tasks board's toolbar
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
173
|
+
mirroring the Tasks board's toolbar (task 1003141: the same shared
|
|
174
|
+
toolbar, bulk-toolbar.js, so every button the board offers is here).
|
|
175
|
+
Hidden until 1+ cards are selected; position:fixed (via
|
|
176
|
+
.bulk-toolbar in style.css) so its DOM location here is immaterial.
|
|
177
|
+
It lives inside the detail view so it's scoped to this route and
|
|
178
|
+
cleared on route change. -->
|
|
187
179
|
<div id="goal-bulk-toolbar" class="bulk-toolbar" hidden role="region" aria-label="Bulk actions">
|
|
188
180
|
<span class="bulk-toolbar__count" id="goal-bulk-count"></span>
|
|
189
181
|
<div class="bulk-toolbar__actions">
|
|
190
182
|
<button type="button" class="bulk-toolbar__btn" id="goal-bulk-claim-btn">Bulk claim</button>
|
|
183
|
+
<button type="button" class="bulk-toolbar__btn" id="goal-bulk-release-btn">Bulk release</button>
|
|
184
|
+
<button type="button" class="bulk-toolbar__btn" id="goal-bulk-parallel-btn">Copy parallel prompt</button>
|
|
185
|
+
<button type="button" class="bulk-toolbar__btn" id="goal-bulk-sequential-btn">Copy sequential prompt</button>
|
|
191
186
|
</div>
|
|
192
187
|
<button type="button" class="bulk-toolbar__clear" id="goal-bulk-clear-btn">Clear</button>
|
|
193
188
|
</div>
|
|
@@ -235,7 +230,7 @@
|
|
|
235
230
|
|
|
236
231
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
237
232
|
|
|
238
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
233
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
239
234
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
240
235
|
<script src="/builders/palette.js" defer></script>
|
|
241
236
|
<script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
|
|
@@ -261,7 +256,8 @@
|
|
|
261
256
|
<!-- task 1003206: the page RENDERERS, the second half of the carve goals-lib.js
|
|
262
257
|
began — goals-lib took the pure helpers, this takes the view painters.
|
|
263
258
|
Loaded BEFORE goals-page.js, which calls window.OTBGoalsRender(ctx). -->
|
|
264
|
-
<script src="/builders/
|
|
265
|
-
<script src="/builders/goals-
|
|
259
|
+
<script src="/builders/bulk-toolbar.js"></script>
|
|
260
|
+
<script src="/builders/goals-render.js?v=2026-09-30-bulktoolbar"></script>
|
|
261
|
+
<script src="/builders/goals-page.js?v=2026-09-30-bulktoolbar"></script>
|
|
266
262
|
</body>
|
|
267
263
|
</html>
|
|
@@ -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-09-30-commands"></script>
|
|
137
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></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>
|
|
@@ -221,6 +221,9 @@
|
|
|
221
221
|
// same reason: the index is where a builder lands, so omitting it here
|
|
222
222
|
// would mean the badge appeared everywhere EXCEPT the page they open first.
|
|
223
223
|
needs: (ctx.lastMeState && ctx.lastMeState.needs) || null,
|
|
224
|
+
// task 1004422: project founding mode — passed here for the same reason as the
|
|
225
|
+
// three above, or the index would be the one page the band never appears on.
|
|
226
|
+
founding: (ctx.lastMeState && ctx.lastMeState.founding_mode) || null,
|
|
224
227
|
builder,
|
|
225
228
|
});
|
|
226
229
|
|
|
@@ -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-09-30-commands"></script>
|
|
55
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></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-09-30-commands"></script>
|
|
228
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></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-09-30-commands" defer></script>
|
|
109
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands" 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-09-30-commands"></script>
|
|
104
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></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-09-30-commands"></script>
|
|
118
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></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
|
|
@@ -187,7 +187,7 @@
|
|
|
187
187
|
|
|
188
188
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
189
189
|
chrome exists before the page script runs. -->
|
|
190
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
190
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
191
191
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
192
192
|
<script src="/builders/palette.js" defer></script>
|
|
193
193
|
<!-- 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-09-30-commands"></script>
|
|
61
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></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>
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
|
|
69
69
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
70
70
|
chrome exists before the page script runs. -->
|
|
71
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
71
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
72
72
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
73
73
|
<script src="/builders/palette.js" defer></script>
|
|
74
74
|
<!-- 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-09-30-commands"></script>
|
|
44
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></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>
|
|
@@ -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-09-30-commands"></script>
|
|
53
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></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
|
|
@@ -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-09-30-commands"></script>
|
|
102
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></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. -->
|
|
@@ -400,7 +400,7 @@
|
|
|
400
400
|
|
|
401
401
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
402
402
|
chrome exists before the page scripts run. -->
|
|
403
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
403
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
404
404
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
405
405
|
<script src="/builders/palette.js" defer></script>
|
|
406
406
|
<!-- shared frontend toolkit (window.OTB) — loaded before consuming IIFEs. -->
|
|
@@ -788,7 +788,7 @@
|
|
|
788
788
|
// not establish authority. null is NOT "holds nothing that matters": it is
|
|
789
789
|
// unreadable, and unreadable hides the link, the same call gateAllows()'s
|
|
790
790
|
// `default: false` and the social mode's OFF-is-the-fallback rule make.
|
|
791
|
-
var access = { authed: null, rank: null, graduated: false, showWork: false, permissions: null, needs: null };
|
|
791
|
+
var access = { authed: null, rank: null, graduated: false, showWork: false, permissions: null, needs: null, founding: null };
|
|
792
792
|
|
|
793
793
|
function gateAllows(gate) {
|
|
794
794
|
var authed = access.authed === true;
|
|
@@ -840,6 +840,79 @@
|
|
|
840
840
|
else delete root.dataset.social;
|
|
841
841
|
}
|
|
842
842
|
|
|
843
|
+
// PROJECT FOUNDING MODE (task 1004422 / BV2.PS03, goal 1000121). While a project is
|
|
844
|
+
// being founded, its EXISTING hall wears this mode — the owner's blend rule
|
|
845
|
+
// (docs/design/project-startup-direction.md): genesis never becomes a second hall.
|
|
846
|
+
// It adds exactly two things here and changes nothing else:
|
|
847
|
+
// - the founding band, a strip created ABOVE the topbar inside .app-body;
|
|
848
|
+
// - the asleep state on today's nav items, each saying which stage wakes it.
|
|
849
|
+
// The server decides which rooms sleep (/me.founding_mode.asleep, keyed by NAV id)
|
|
850
|
+
// and this never re-derives it — the social-mode precedent.
|
|
851
|
+
//
|
|
852
|
+
// OFF is the default and the fallback, and OFF REMOVES rather than hides: the band
|
|
853
|
+
// element and every asleep class and tag are taken out of the DOM, so a hall that
|
|
854
|
+
// is not founding is byte-for-byte the hall it was (tests/founding_mode.mjs pins
|
|
855
|
+
// it). Cosmetic only — an asleep room still opens; nothing is enforced (ADR 0016).
|
|
856
|
+
// The asleep tag in words a person would say, never a raw stage slug.
|
|
857
|
+
var WAKE_TEXT = {
|
|
858
|
+
scope: 'opens after scope', strategize: 'opens after strategy', charter: 'opens after the charter',
|
|
859
|
+
legalize: 'opens after legal setup', legislation: 'opens after legislation', alive: 'opens when alive'
|
|
860
|
+
};
|
|
861
|
+
function applyFounding() {
|
|
862
|
+
var f = access.founding;
|
|
863
|
+
var on = !!(f && f.active === true && f.asleep && typeof f.asleep === 'object');
|
|
864
|
+
var root = document.documentElement;
|
|
865
|
+
// The common case — a project that is not founding, on a page that never wore the
|
|
866
|
+
// mode — returns before touching a single node. That is the strongest form of the
|
|
867
|
+
// no-hijack condition: nothing is read, created, classed or removed.
|
|
868
|
+
if (!on && root.dataset.founding !== 'on') return;
|
|
869
|
+
document.querySelectorAll('#app-sidebar .nav-item--asleep').forEach(function (el) {
|
|
870
|
+
el.classList.remove('nav-item--asleep');
|
|
871
|
+
delete el.dataset.wakes;
|
|
872
|
+
var tag = el.querySelector('[data-wakes-tag]');
|
|
873
|
+
if (tag && tag.parentNode) tag.parentNode.removeChild(tag);
|
|
874
|
+
});
|
|
875
|
+
var band = document.getElementById('founding-band');
|
|
876
|
+
if (!on) {
|
|
877
|
+
delete root.dataset.founding;
|
|
878
|
+
if (band && band.parentNode) band.parentNode.removeChild(band);
|
|
879
|
+
return;
|
|
880
|
+
}
|
|
881
|
+
root.dataset.founding = 'on';
|
|
882
|
+
Object.keys(f.asleep).forEach(function (id) {
|
|
883
|
+
var el = document.getElementById('nav-' + id);
|
|
884
|
+
if (!el) return;
|
|
885
|
+
var stage = String(f.asleep[id]);
|
|
886
|
+
el.classList.add('nav-item--asleep');
|
|
887
|
+
el.dataset.wakes = stage;
|
|
888
|
+
var tag = document.createElement('span');
|
|
889
|
+
tag.className = 'nav-item__wakes';
|
|
890
|
+
tag.setAttribute('data-wakes-tag', '');
|
|
891
|
+
tag.textContent = WAKE_TEXT[stage] || 'opens later';
|
|
892
|
+
el.appendChild(tag);
|
|
893
|
+
});
|
|
894
|
+
if (!band) {
|
|
895
|
+
var body = document.querySelector('.app-body');
|
|
896
|
+
if (!body) return;
|
|
897
|
+
band = document.createElement('div');
|
|
898
|
+
band.id = 'founding-band';
|
|
899
|
+
band.className = 'founding-band';
|
|
900
|
+
band.setAttribute('role', 'status');
|
|
901
|
+
body.insertBefore(band, body.firstChild);
|
|
902
|
+
}
|
|
903
|
+
var name = (brand.identity && (brand.identity.productName || brand.identity.worldName)) || 'This project';
|
|
904
|
+
var stageText = f.stage === 'decide'
|
|
905
|
+
? 'deciding the plan'
|
|
906
|
+
: 'stage ' + f.stage_number + ' of ' + f.stage_count + ' \u00b7 ' + f.stage;
|
|
907
|
+
band.innerHTML =
|
|
908
|
+
'<span class="founding-band__dot" aria-hidden="true"></span>' +
|
|
909
|
+
'<span class="founding-band__title">Project founding mode</span>' +
|
|
910
|
+
'<span class="founding-band__desc">' + esc(name) + ' is still being founded. Rooms open as each stage finishes, and everyone who joins now becomes a founding builder.</span>' +
|
|
911
|
+
'<span class="founding-band__stage">' + esc(stageText) + (f.day ? ' \u00b7 day ' + esc(String(f.day)) : '') +
|
|
912
|
+
(Array.isArray(f.waiting_on) && f.waiting_on.length ? ' \u00b7 waiting on ' + esc(f.waiting_on.join(', ')) : '') + '</span>' +
|
|
913
|
+
'<a class="founding-band__link" href="/">What\u2019s this?</a>';
|
|
914
|
+
}
|
|
915
|
+
|
|
843
916
|
// task 1003117 (R06 of goal 1000074): EMPHASISE the Studio nav entry for a
|
|
844
917
|
// builder whose craft includes artist — the "emphasized entry for artist-craft
|
|
845
918
|
// builders" half of artist mode. Cosmetic only (the page is open to every rank,
|
|
@@ -917,6 +990,10 @@
|
|
|
917
990
|
access.needs = (state.needs && typeof state.needs === 'object') ? state.needs : null;
|
|
918
991
|
}
|
|
919
992
|
if ('social' in state) applySocial(state.social);
|
|
993
|
+
// task 1004422: stored as given — the object, or null (OFF).
|
|
994
|
+
if ('founding' in state) {
|
|
995
|
+
access.founding = (state.founding && typeof state.founding === 'object') ? state.founding : null;
|
|
996
|
+
}
|
|
920
997
|
if (state.builder) { renderUser(state.builder); applyCraftEmphasis(state.builder); }
|
|
921
998
|
}
|
|
922
999
|
document.querySelectorAll('#app-sidebar [data-gate]').forEach(function (el) {
|
|
@@ -930,6 +1007,8 @@
|
|
|
930
1007
|
// what settles. Reversing the order would badge an item still hidden from
|
|
931
1008
|
// the previous state.
|
|
932
1009
|
applyCounts();
|
|
1010
|
+
// task 1004422: after the gate loop, so the asleep tags land on the settled items.
|
|
1011
|
+
applyFounding();
|
|
933
1012
|
// AFTER the gate loop for the same reason applyCounts is: it reads the settled
|
|
934
1013
|
// permission map, which the loop above is what the shell has just been told.
|
|
935
1014
|
maybeRenderCoreUpdate();
|
|
@@ -1153,6 +1232,8 @@
|
|
|
1153
1232
|
// hall's Standing card and the CLI nudge read — no new route, no extra
|
|
1154
1233
|
// poll, and the badge cannot disagree with the roster it came from.
|
|
1155
1234
|
needs: me.needs || null,
|
|
1235
|
+
// task 1004422: project founding mode, for the band and the asleep rooms.
|
|
1236
|
+
founding: me.founding_mode || null,
|
|
1156
1237
|
builder: me.builder,
|
|
1157
1238
|
});
|
|
1158
1239
|
}).catch(function () { /* cosmetic only */ });
|
|
@@ -176,7 +176,7 @@
|
|
|
176
176
|
|
|
177
177
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
178
178
|
|
|
179
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
179
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
180
180
|
<script src="/builders/palette.js" defer></script>
|
|
181
181
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
182
182
|
<!-- The kit, for its ONE renderer: the full-size ship-time visual figure
|
|
@@ -667,6 +667,42 @@ main:focus { outline: none; }
|
|
|
667
667
|
.nav-item--craft .nav-icon,
|
|
668
668
|
.nav-item--craft .nav-item__label { color: var(--accent-ink); }
|
|
669
669
|
|
|
670
|
+
/* task 1004422 (BV2.PS03): PROJECT FOUNDING MODE. The hall wears it; it never
|
|
671
|
+
becomes a second hall (the blend rule, docs/design/project-startup-direction.md).
|
|
672
|
+
Two additions only, both created by shell.js while /me says founding and REMOVED
|
|
673
|
+
when it does not: the band above the topbar, and today's nav items dimmed with
|
|
674
|
+
the stage that wakes them. The band is live state, so its dot takes the accent;
|
|
675
|
+
the wake tag reads only in the open rail, like the labels. */
|
|
676
|
+
.founding-band {
|
|
677
|
+
display: flex;
|
|
678
|
+
align-items: center;
|
|
679
|
+
gap: 12px;
|
|
680
|
+
min-height: 44px;
|
|
681
|
+
padding: 0 22px;
|
|
682
|
+
background: color-mix(in srgb, var(--accent) 14%, var(--bg));
|
|
683
|
+
border-bottom: 1px solid color-mix(in srgb, var(--accent) 36%, transparent);
|
|
684
|
+
font-size: 13px;
|
|
685
|
+
color: var(--ink-soft);
|
|
686
|
+
}
|
|
687
|
+
.founding-band__dot { width: 8px; height: 8px; border-radius: 50%; background: var(--accent); flex: none; }
|
|
688
|
+
.founding-band__title { font-size: 11.5px; font-weight: 600; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink); white-space: nowrap; }
|
|
689
|
+
.founding-band__desc { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
690
|
+
.founding-band__stage { margin-left: auto; font-size: 12px; color: var(--accent-ink); white-space: nowrap; }
|
|
691
|
+
/* The prose-link 24px floor convention: width bought with padding, handed back with
|
|
692
|
+
an equal negative margin, so the target grows and the row does not re-space. */
|
|
693
|
+
.founding-band__link { padding: 10px 6px; margin: 0 -6px; color: var(--ink); text-decoration: underline; text-underline-offset: 3px; white-space: nowrap; }
|
|
694
|
+
/* Phone: the row wraps instead of widening the page (the no-sideways rule the kit
|
|
695
|
+
measured), and the long sentence steps aside for the stage and the link. */
|
|
696
|
+
@media (max-width: 640px) {
|
|
697
|
+
.founding-band { flex-wrap: wrap; row-gap: 2px; padding: 8px 16px; }
|
|
698
|
+
.founding-band__desc { display: none; }
|
|
699
|
+
.founding-band__stage { margin-left: 0; white-space: normal; }
|
|
700
|
+
}
|
|
701
|
+
.nav-item--asleep { opacity: 0.55; }
|
|
702
|
+
.nav-item__wakes { display: none; margin-left: auto; font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-faint); }
|
|
703
|
+
.app-sidebar:hover .nav-item__wakes,
|
|
704
|
+
.app-sidebar:focus-within .nav-item__wakes { display: inline; }
|
|
705
|
+
|
|
670
706
|
/* task 1003737: the nav count badge — the hall's only badge mechanism, built
|
|
671
707
|
once and generically (shell.js `count:` names a need id; see the NAV model).
|
|
672
708
|
ABSOLUTE, not inline, because the rail has two shapes: it is a 64px icon strip
|
|
@@ -2876,16 +2912,87 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
|
|
|
2876
2912
|
}
|
|
2877
2913
|
.bulk-toolbar__clear:hover { color: var(--ink); }
|
|
2878
2914
|
|
|
2915
|
+
/* ---- shared by the Tasks board AND the goal board's cards (task 1003141) ----
|
|
2916
|
+
These three used to live in work.css, which goals.html borrowed whole. They
|
|
2917
|
+
are single-class rules no other sheet restates, so moving them earlier in the
|
|
2918
|
+
cascade changes nothing — checked by computed style on both pages. */
|
|
2919
|
+
|
|
2920
|
+
/* Filtered-count line under the filter bar — the label voice, with the number
|
|
2921
|
+
itself stepping up to ink so the count reads before the words. */
|
|
2922
|
+
.claim-count-line {
|
|
2923
|
+
margin: 0 0 12px;
|
|
2924
|
+
font-family: var(--label-face);
|
|
2925
|
+
font-size: var(--label-size);
|
|
2926
|
+
letter-spacing: var(--label-space);
|
|
2927
|
+
text-transform: var(--label-case);
|
|
2928
|
+
color: var(--ink-faint);
|
|
2929
|
+
}
|
|
2930
|
+
|
|
2931
|
+
.wip__release {
|
|
2932
|
+
display: inline-flex;
|
|
2933
|
+
align-items: center;
|
|
2934
|
+
justify-content: center;
|
|
2935
|
+
min-height: 30px;
|
|
2936
|
+
padding: 0 14px;
|
|
2937
|
+
background: none;
|
|
2938
|
+
border: var(--line) solid var(--rule);
|
|
2939
|
+
color: var(--ink-soft);
|
|
2940
|
+
border-radius: var(--radius-pill);
|
|
2941
|
+
font-size: 13px;
|
|
2942
|
+
text-transform: lowercase;
|
|
2943
|
+
cursor: pointer;
|
|
2944
|
+
transition: background 150ms, color 150ms, border-color 150ms;
|
|
2945
|
+
}
|
|
2946
|
+
.wip__release:hover:not(:disabled) {
|
|
2947
|
+
background: var(--danger-weak);
|
|
2948
|
+
color: var(--danger);
|
|
2949
|
+
border-color: color-mix(in srgb, var(--danger) 40%, transparent);
|
|
2950
|
+
}
|
|
2951
|
+
.wip__release:disabled { opacity: 0.55; cursor: default; }
|
|
2952
|
+
|
|
2953
|
+
.wip__select {
|
|
2954
|
+
appearance: none;
|
|
2955
|
+
-webkit-appearance: none;
|
|
2956
|
+
position: relative;
|
|
2957
|
+
width: 24px;
|
|
2958
|
+
height: 24px;
|
|
2959
|
+
margin: 0;
|
|
2960
|
+
cursor: pointer;
|
|
2961
|
+
}
|
|
2962
|
+
.wip__select::before {
|
|
2963
|
+
content: "";
|
|
2964
|
+
position: absolute;
|
|
2965
|
+
left: 5px;
|
|
2966
|
+
top: 5px;
|
|
2967
|
+
width: 14px;
|
|
2968
|
+
height: 14px;
|
|
2969
|
+
border: var(--line) solid var(--rule);
|
|
2970
|
+
border-radius: 3px;
|
|
2971
|
+
}
|
|
2972
|
+
.wip__select:checked::before { background: var(--accent); border-color: var(--accent); }
|
|
2973
|
+
.wip__select:checked::after {
|
|
2974
|
+
content: "";
|
|
2975
|
+
position: absolute;
|
|
2976
|
+
left: 9px;
|
|
2977
|
+
top: 8px;
|
|
2978
|
+
width: 4px;
|
|
2979
|
+
height: 8px;
|
|
2980
|
+
border: solid var(--accent-on);
|
|
2981
|
+
border-width: 0 1.5px 1.5px 0;
|
|
2982
|
+
transform: rotate(42deg);
|
|
2983
|
+
}
|
|
2984
|
+
|
|
2879
2985
|
/* The shell's .app-content already ends in 108px of bottom air at desktop
|
|
2880
2986
|
width, which is what clears the bar — but at 768 it drops to 48px for the
|
|
2881
2987
|
phone, and there the bar is TALLER (its actions wrap to their own row). So
|
|
2882
|
-
the phone width buys the room back, scoped to
|
|
2883
|
-
|
|
2988
|
+
the phone width buys the room back, scoped to the two pages that carry the
|
|
2989
|
+
toolbar (the goal board gained the full one in task 1003141). */
|
|
2884
2990
|
@media (max-width: 768px) {
|
|
2885
2991
|
/* At the drawer breakpoint the sidebar leaves the flow, so the bar spans. */
|
|
2886
2992
|
.bulk-toolbar { left: 0; padding: 10px 14px; gap: 10px; }
|
|
2887
2993
|
.bulk-toolbar__actions { margin-left: 0; width: 100%; }
|
|
2888
|
-
body[data-page="work"] .app-content
|
|
2994
|
+
body[data-page="work"] .app-content,
|
|
2995
|
+
body[data-page="goals"] .app-content { padding-bottom: 200px; }
|
|
2889
2996
|
}
|
|
2890
2997
|
|
|
2891
2998
|
.task__credits { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; padding-top: 2px; }
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
|
|
58
58
|
<!-- The app shell (sidebar + top bar + footer). Dependency-free; runs at parse
|
|
59
59
|
time so the chrome exists before the deferred page scripts execute. -->
|
|
60
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
60
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
61
61
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
62
62
|
<script src="/builders/palette.js" defer></script>
|
|
63
63
|
<!-- shared frontend toolkit (window.OTB) — loaded FIRST so task.js can pull from it. -->
|
|
@@ -138,7 +138,7 @@
|
|
|
138
138
|
</div>
|
|
139
139
|
</div>
|
|
140
140
|
|
|
141
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
141
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
142
142
|
<script src="/builders/palette.js" defer></script>
|
|
143
143
|
|
|
144
144
|
<script src="/builders/idea-objects.js?v=2026-09-27-split"></script>
|
|
@@ -140,7 +140,7 @@
|
|
|
140
140
|
|
|
141
141
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
142
142
|
|
|
143
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
143
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
144
144
|
<script src="/builders/palette.js" defer></script>
|
|
145
145
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
146
146
|
<script src="/builders/brand-holes.js?v=2026-09-29-aqfix"></script>
|
|
@@ -162,7 +162,7 @@
|
|
|
162
162
|
|
|
163
163
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
164
164
|
chrome exists before the page script runs. -->
|
|
165
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
165
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
166
166
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
167
167
|
<script src="/builders/palette.js" defer></script>
|
|
168
168
|
<!-- shared frontend toolkit (window.OTB) — loaded before watch.js, which pulls from it. -->
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_": "Project founding mode (task 1004422) on an ordinary hall page: the founding band above the topbar and today's nav items asleep, rendered from a /me that says founding (kit fixture me-founding.json, the real server shaper's output at stage strategize). The page itself is work.states.json's; only the identity differs. The no-founding case is every other hall states file.",
|
|
3
|
+
"page": "/builders/work",
|
|
4
|
+
"surface": "hall-ui",
|
|
5
|
+
"stub": {
|
|
6
|
+
"prefix": "/builders/",
|
|
7
|
+
"fixtures": {
|
|
8
|
+
"me": "me-founding"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"modeQuery": false,
|
|
12
|
+
"ignoreRequests": [
|
|
13
|
+
"/api/(gds|bongos)/me$",
|
|
14
|
+
"/api/(gds|bongos)/me/",
|
|
15
|
+
"/api/(gds|bongos)/tasks",
|
|
16
|
+
"/api/(gds|bongos)/claims",
|
|
17
|
+
"/api/(gds|bongos)/goals",
|
|
18
|
+
"/api/(gds|bongos)/inbox/",
|
|
19
|
+
"/api/(gds|bongos)/versions"
|
|
20
|
+
],
|
|
21
|
+
"ignoreConsole": [
|
|
22
|
+
"/api/(gds|bongos)/",
|
|
23
|
+
"\\b401\\b",
|
|
24
|
+
"\\b404\\b",
|
|
25
|
+
"Unauthorized",
|
|
26
|
+
"Not Found",
|
|
27
|
+
"load failed"
|
|
28
|
+
],
|
|
29
|
+
"states": {
|
|
30
|
+
"founding": {
|
|
31
|
+
"auth": true,
|
|
32
|
+
"expect": {
|
|
33
|
+
"visible": [
|
|
34
|
+
"#founding-band"
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|