@bongos/core 1.24.40 → 1.24.42
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 -103
- package/docs/canonical-permissions.md +2 -1
- package/docs/copy-inventory.md +198 -223
- package/docs/copy-registry.json +316 -580
- package/docs/module-api-changelog.md +4 -0
- package/docs/page-inventory.json +11 -69
- package/docs/page-readings.json +348 -728
- package/modules/hall-ui/public/ai-studio.html +2 -2
- package/modules/hall-ui/public/atlas.html +2 -2
- package/modules/hall-ui/public/blockers.html +2 -2
- package/modules/hall-ui/public/board-room.html +2 -2
- package/modules/hall-ui/public/builders.js +17 -262
- package/modules/hall-ui/public/city.html +2 -2
- package/modules/hall-ui/public/collab.html +2 -2
- package/modules/hall-ui/public/commands.html +2 -2
- package/modules/hall-ui/public/copy-desk.html +2 -2
- package/modules/hall-ui/public/craft-mode.js +1 -1
- package/modules/hall-ui/public/deploy.html +2 -2
- package/modules/hall-ui/public/gate.js +12 -5
- package/modules/hall-ui/public/goal-map.html +2 -2
- package/modules/hall-ui/public/goals.html +2 -2
- package/modules/hall-ui/public/government.html +2 -2
- package/modules/hall-ui/public/hall-render.js +3 -248
- package/modules/hall-ui/public/hall-widgets.js +3 -14
- package/modules/hall-ui/public/idea.html +2 -2
- package/modules/hall-ui/public/ideas.html +2 -2
- package/modules/hall-ui/public/index.html +4 -5
- package/modules/hall-ui/public/market-watch-item.html +2 -2
- package/modules/hall-ui/public/market-watch-rules.html +2 -2
- package/modules/hall-ui/public/market-watch.html +2 -2
- package/modules/hall-ui/public/modules.html +2 -2
- package/modules/hall-ui/public/money.html +2 -2
- package/modules/hall-ui/public/my-agents.html +2 -2
- package/modules/hall-ui/public/palette.js +10 -0
- package/modules/hall-ui/public/primer.html +2 -2
- package/modules/hall-ui/public/profile.html +2 -2
- package/modules/hall-ui/public/project-settings.html +2 -2
- package/modules/hall-ui/public/roadmap.html +2 -2
- package/modules/hall-ui/public/roster.html +2 -2
- package/modules/hall-ui/public/sessions.js +21 -10
- package/modules/hall-ui/public/settings.html +2 -2
- package/modules/hall-ui/public/setup-gate.js +156 -0
- package/modules/hall-ui/public/shell.js +17 -3
- package/modules/hall-ui/public/street.html +2 -2
- package/modules/hall-ui/public/studio.html +2 -2
- package/modules/hall-ui/public/style.css +85 -117
- package/modules/hall-ui/public/task.html +2 -2
- package/modules/hall-ui/public/thinking.html +2 -2
- package/modules/hall-ui/public/tweak-editor.html +2 -2
- package/modules/hall-ui/public/watch.html +120 -7
- package/modules/hall-ui/public/watch.js +11 -0
- package/modules/hall-ui/public/watch.states.json +49 -1
- package/modules/hall-ui/public/work.html +2 -2
- package/modules/hall-ui/records/setup-gate.md +43 -0
- package/modules/lifecycle/routes/tasks.js +2 -2
- package/modules/onboarding/onboarding-state.js +41 -20
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +12 -0
- package/scripts/bongos/gen-hall-sitemap.js +2 -0
- package/src/bongos/routes/me.js +2 -2
- package/src/bongos/serve-internal.js +15 -22
- package/src/module-api.js +1 -1
- package/tests/autonomy_builder_scope.mjs +2 -1
- package/tests/hall_audit.mjs +1 -1
- package/tests/hall_board_world.mjs +1 -1
- package/tests/hall_landing_boot.mjs +2 -3
- package/tests/hall_loading.mjs +13 -2
- package/tests/hall_nav.mjs +5 -2
- package/tests/hall_onboarding_bongos_setup.mjs +14 -14
- package/tests/hall_oversight_tabs.mjs +162 -0
- package/tests/hall_oversight_world.mjs +23 -9
- package/tests/hall_page_gate_map.mjs +7 -2
- package/tests/hall_roster_world.mjs +14 -9
- package/tests/hall_sessions_ledger.mjs +2 -1
- package/tests/module_contributions.mjs +4 -2
- package/tests/nav_permission_atoms.mjs +4 -2
- package/tests/onboarding_state.mjs +33 -0
- package/tests/sessions_kit_pager.mjs +8 -4
- package/tests/setup_flow.mjs +242 -0
- package/tests/welcome_boot.mjs +3 -2
- package/modules/hall-ui/public/gate.html +0 -76
- package/modules/hall-ui/public/gate.states.json +0 -60
- package/modules/hall-ui/public/sessions.html +0 -128
- package/modules/hall-ui/public/sessions.states.json +0 -59
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
// modules/hall-ui/public/setup-gate.js — the setup flow a new builder finishes once (task 1005076).
|
|
2
|
+
//
|
|
3
|
+
// THE SERVER DECIDES, THIS ONLY DRAWS. GET /me carries `onboarding.setup`
|
|
4
|
+
// ({ complete, steps[] }, modules/onboarding/onboarding-state.js setupForApi). While
|
|
5
|
+
// `complete` is false the hall is held behind this one screen on every page: the steps
|
|
6
|
+
// in order, each ticking itself from a signal the server records (a linked machine, a
|
|
7
|
+
// chosen role, /builder-start run from Claude). Once complete the builder is in for
|
|
8
|
+
// good: the screen never draws again, and Home carries no setup banner (owner,
|
|
9
|
+
// 2026-11-05: "once they're in, they're in").
|
|
10
|
+
//
|
|
11
|
+
// Its own file, loaded by shell.js only when setup is not complete (the core-move-notice.js
|
|
12
|
+
// way): shell.js sits at the 1500-line ratchet, and a set-up builder never pays for it.
|
|
13
|
+
// The role step saves through PATCH /me/disciplines, the route Settings' preferred roles use.
|
|
14
|
+
|
|
15
|
+
(function () {
|
|
16
|
+
'use strict';
|
|
17
|
+
|
|
18
|
+
var POLL_MS = 8000;
|
|
19
|
+
var el = null, timer = null, api = null, state = null, picked = [], repo = null;
|
|
20
|
+
|
|
21
|
+
function esc(s) { return window.OTB.escapeHtml(s); }
|
|
22
|
+
|
|
23
|
+
var CHECK = '<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12.5l4.5 4.5L19 7.5" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/></svg>';
|
|
24
|
+
|
|
25
|
+
function stepDetail(step) {
|
|
26
|
+
if (step.id === 'cli_setup') {
|
|
27
|
+
// This project's own repository (GET /instance), never a hardcoded one (ADR 0062 §3).
|
|
28
|
+
var getCode = repo
|
|
29
|
+
? '<pre class="setup-gate__code">git clone ' + esc(repo.url) + '.git\ncd ' + esc(repo.repo) + '\nnpm install\nnpx bongos setup</pre>'
|
|
30
|
+
: '';
|
|
31
|
+
return '<ol class="setup-gate__how">' +
|
|
32
|
+
'<li>Install <a href="https://nodejs.org" target="_blank" rel="noopener">Node</a> (version 22 or newer) and ' +
|
|
33
|
+
'<a href="https://claude.com/download" target="_blank" rel="noopener">Claude</a> (the desktop app, or Claude Code in a terminal).</li>' +
|
|
34
|
+
'<li>Clone the project to your machine and run <code>npm install</code> in it.' + (repo ? '' : ' The project’s README says where it lives.') + '</li>' +
|
|
35
|
+
'<li>In the project folder, run <code>npx bongos setup</code> and sign in when it asks.</li>' +
|
|
36
|
+
'</ol>' + getCode;
|
|
37
|
+
}
|
|
38
|
+
if (step.id === 'pick_disciplines') {
|
|
39
|
+
var crafts = window.OTB.disciplines();
|
|
40
|
+
return '<div class="setup-gate__crafts" role="group" aria-label="' + esc(window.OTB.roleAxisLabel()) + '">' +
|
|
41
|
+
crafts.map(function (c) {
|
|
42
|
+
var on = picked.indexOf(c) !== -1;
|
|
43
|
+
return '<button type="button" class="setup-gate__craft" data-craft="' + esc(c) + '" aria-pressed="' + on + '">' + esc(window.OTB.roleLabel(c)) + '</button>';
|
|
44
|
+
}).join('') +
|
|
45
|
+
'</div>' +
|
|
46
|
+
'<button type="button" class="setup-gate__save" data-save-crafts' + (picked.length ? '' : ' disabled') + '>Save my role</button>' +
|
|
47
|
+
'<p class="setup-gate__err" data-craft-err hidden></p>';
|
|
48
|
+
}
|
|
49
|
+
if (step.id === 'first_start') {
|
|
50
|
+
return '<p class="setup-gate__hint">In Claude, open the project folder and type <code>/builder-start</code>.</p>';
|
|
51
|
+
}
|
|
52
|
+
return '';
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function render() {
|
|
56
|
+
if (!el || !state) return;
|
|
57
|
+
var steps = state.steps || [];
|
|
58
|
+
var current = steps.filter(function (s) { return !s.cleared; })[0] || null;
|
|
59
|
+
var done = steps.filter(function (s) { return s.cleared; }).length;
|
|
60
|
+
el.querySelector('.setup-gate__count').textContent = done + ' of ' + steps.length + ' done';
|
|
61
|
+
el.querySelector('.setup-gate__steps').innerHTML = steps.map(function (s, i) {
|
|
62
|
+
var isCurrent = current && s.id === current.id;
|
|
63
|
+
var cls = 'setup-gate__step' + (s.cleared ? ' is-done' : '') + (isCurrent ? ' is-current' : '');
|
|
64
|
+
return '<li class="' + cls + '"' + (isCurrent ? ' aria-current="step"' : '') + '>' +
|
|
65
|
+
'<span class="setup-gate__mark">' + (s.cleared ? CHECK : String(i + 1)) + '</span>' +
|
|
66
|
+
'<div class="setup-gate__body">' +
|
|
67
|
+
'<h3 class="setup-gate__label">' + esc(s.label) + '</h3>' +
|
|
68
|
+
(isCurrent ? '<p class="setup-gate__hint">' + esc(s.hint) + '</p>' + stepDetail(s) : '') +
|
|
69
|
+
'</div></li>';
|
|
70
|
+
}).join('');
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function check() {
|
|
74
|
+
return api.request('GET', '/api/bongos/me').then(function (res) {
|
|
75
|
+
var setup = res && res.ok && res.data && res.data.onboarding && res.data.onboarding.setup;
|
|
76
|
+
if (!setup) return;
|
|
77
|
+
if (setup.complete) { finish(); return; }
|
|
78
|
+
state = setup;
|
|
79
|
+
if (!el.contains(document.activeElement) || !document.activeElement.closest('.setup-gate__step.is-current')) render();
|
|
80
|
+
}, function () { /* offline a moment: keep the screen, try again */ });
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function saveCrafts(btn) {
|
|
84
|
+
var err = el.querySelector('[data-craft-err]');
|
|
85
|
+
btn.disabled = true;
|
|
86
|
+
api.request('PATCH', '/api/bongos/me/disciplines', { body: { preferred_disciplines: picked.slice() } }).then(function (res) {
|
|
87
|
+
if (res && res.ok) { check(); return; }
|
|
88
|
+
btn.disabled = false;
|
|
89
|
+
if (err) { err.textContent = 'That did not save. Try again.'; err.hidden = false; }
|
|
90
|
+
}, function () {
|
|
91
|
+
btn.disabled = false;
|
|
92
|
+
if (err) { err.textContent = 'That did not save. Check your connection and try again.'; err.hidden = false; }
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function onClick(e) {
|
|
97
|
+
var craft = e.target.closest('[data-craft]');
|
|
98
|
+
if (craft) {
|
|
99
|
+
var id = craft.getAttribute('data-craft');
|
|
100
|
+
var at = picked.indexOf(id);
|
|
101
|
+
if (at === -1) picked.push(id); else picked.splice(at, 1);
|
|
102
|
+
craft.setAttribute('aria-pressed', String(at === -1));
|
|
103
|
+
var save = el.querySelector('[data-save-crafts]');
|
|
104
|
+
if (save) save.disabled = !picked.length;
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
var save2 = e.target.closest('[data-save-crafts]');
|
|
108
|
+
if (save2) saveCrafts(save2);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function finish() {
|
|
112
|
+
if (timer) { clearInterval(timer); timer = null; }
|
|
113
|
+
if (el) el.remove();
|
|
114
|
+
el = null;
|
|
115
|
+
document.documentElement.classList.remove('setup-gate-open');
|
|
116
|
+
window.location.reload();
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** Hold the hall behind the setup screen. `setup` is /me's onboarding.setup; `opts.api` the shell's client. */
|
|
120
|
+
function show(setup, opts) {
|
|
121
|
+
if (!setup || setup.complete) return;
|
|
122
|
+
api = opts && opts.api;
|
|
123
|
+
state = setup;
|
|
124
|
+
if (el) { render(); return; }
|
|
125
|
+
var name = opts && opts.builder && (opts.builder.display_name || opts.builder.github_login);
|
|
126
|
+
el = document.createElement('div');
|
|
127
|
+
el.className = 'setup-gate';
|
|
128
|
+
el.id = 'setup-gate';
|
|
129
|
+
el.setAttribute('role', 'dialog');
|
|
130
|
+
el.setAttribute('aria-modal', 'true');
|
|
131
|
+
el.setAttribute('aria-labelledby', 'setup-gate-h');
|
|
132
|
+
el.innerHTML =
|
|
133
|
+
'<div class="setup-gate__panel">' +
|
|
134
|
+
'<p class="setup-gate__count" aria-live="polite"></p>' +
|
|
135
|
+
'<h2 class="setup-gate__title" id="setup-gate-h">' + (name ? 'Welcome, ' + esc(name) + '. ' : '') + 'Let’s get you set up</h2>' +
|
|
136
|
+
'<p class="setup-gate__lede">Finish these steps once and you’re in. Each one ticks itself as you go.</p>' +
|
|
137
|
+
'<ol class="setup-gate__steps"></ol>' +
|
|
138
|
+
'<p class="setup-gate__foot"><a href="/api/bongos/auth/logout" id="setup-gate-signout">Sign out</a></p>' +
|
|
139
|
+
'</div>';
|
|
140
|
+
el.addEventListener('click', onClick);
|
|
141
|
+
document.body.appendChild(el);
|
|
142
|
+
document.documentElement.classList.add('setup-gate-open');
|
|
143
|
+
render();
|
|
144
|
+
var h = document.getElementById('setup-gate-h');
|
|
145
|
+
if (h) { h.setAttribute('tabindex', '-1'); h.focus(); }
|
|
146
|
+
if (api) {
|
|
147
|
+
timer = setInterval(check, POLL_MS);
|
|
148
|
+
api.request('GET', '/api/bongos/instance').then(function (res) {
|
|
149
|
+
var r = res && res.ok && res.data && res.data.repo;
|
|
150
|
+
if (r && !r.error && r.url) { repo = r; render(); }
|
|
151
|
+
}, function () { /* no repo coords: the README line stands in */ });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
window.OTBSetupGate = { show: show };
|
|
156
|
+
})();
|
|
@@ -356,8 +356,7 @@
|
|
|
356
356
|
// Metic+ oversight could not honestly hold it. Everything below IS a rank
|
|
357
357
|
// surface, so this group's gate and audience are unchanged.
|
|
358
358
|
{ id: 'watch', label: 'Watch', icon: 'watch', href: '/watch', gate: 'government', position: true },
|
|
359
|
-
|
|
360
|
-
{ id: 'sessions', label: 'Sessions', icon: 'sessions', href: '/sessions', gate: 'government', position: true },
|
|
359
|
+
// task 1005049: Sessions and Autobongos (/gate) are tabs on Watch; both URLs redirect there.
|
|
361
360
|
// The project's own fundamentals (task 1003280, goal 1000072). Mirrors the
|
|
362
361
|
// server's requireGovernmentPage floor; cosmetic only, as every item here is.
|
|
363
362
|
{ id: 'project-settings', label: 'Project settings', icon: 'settings', href: '/project-settings', gate: 'government', position: true },
|
|
@@ -805,6 +804,16 @@
|
|
|
805
804
|
}
|
|
806
805
|
if (data && data.moved) renderCoreMoveNotice(data.moved); // task 1004731: loads core-move-notice.js, which draws it
|
|
807
806
|
}
|
|
807
|
+
// task 1005076: a builder whose setup is not complete sees only the setup screen (setup-gate.js),
|
|
808
|
+
// loaded once: applyAccess runs again before the first load lands, and a second copy drew a second screen.
|
|
809
|
+
var setupGateLoading = false;
|
|
810
|
+
function holdForSetup(builder) {
|
|
811
|
+
if (access.authed !== true || !access.setup || access.setup.complete !== false) return false;
|
|
812
|
+
var go = function () { if (window.OTBSetupGate) window.OTBSetupGate.show(access.setup, { api: api, builder: builder }); };
|
|
813
|
+
if (window.OTBSetupGate) go();
|
|
814
|
+
else if (!setupGateLoading) { setupGateLoading = true; loadHallScript('setup-gate.js', go); }
|
|
815
|
+
return true;
|
|
816
|
+
}
|
|
808
817
|
// One hall script on demand, stamped with the shell's own ?v= (task 1004996 made it one helper).
|
|
809
818
|
function loadHallScript(file, onload, onerror) {
|
|
810
819
|
var head = document.head, tag = head && head.appendChild && document.createElement ? document.createElement('script') : null;
|
|
@@ -1137,6 +1146,8 @@
|
|
|
1137
1146
|
if ('founding' in state) {
|
|
1138
1147
|
access.founding = (state.founding && typeof state.founding === 'object') ? state.founding : null;
|
|
1139
1148
|
}
|
|
1149
|
+
// task 1005076: /me's onboarding.setup; incomplete holds the hall behind setup-gate.js.
|
|
1150
|
+
if ('setup' in state) access.setup = (state.setup && typeof state.setup === 'object') ? state.setup : null;
|
|
1140
1151
|
if (state.builder) { renderUser(state.builder); applyCraftEmphasis(state.builder); }
|
|
1141
1152
|
// task 1004713: which seats this builder holds — /me's server-resolved block.
|
|
1142
1153
|
if (state.builder && access.authed === true) { loadPositions(state.builder, state.positions); loadGithubChip(state.builder); }
|
|
@@ -1163,7 +1174,8 @@
|
|
|
1163
1174
|
// permission map, which the loop above is what the shell has just been told.
|
|
1164
1175
|
maybeRenderCoreUpdate();
|
|
1165
1176
|
// task 1004492: a builder with no mode yet this session is asked once — unless Home's welcome (task 1004785, welcome-boot.js) greets the day's first visit instead; it marks the picker asked.
|
|
1166
|
-
|
|
1177
|
+
// task 1005076: neither is drawn over the setup screen; setup comes first.
|
|
1178
|
+
if (!holdForSetup(state && state.builder) && !(window.OTBWelcome && window.OTBWelcome.onAccess(access, state && state.builder)) && CRAFT) CRAFT.onAccess(access, state && state.builder);
|
|
1167
1179
|
var signin = document.getElementById('shell-signin');
|
|
1168
1180
|
if (signin) signin.hidden = access.authed !== false;
|
|
1169
1181
|
var user = document.getElementById('shell-user');
|
|
@@ -1407,6 +1419,8 @@
|
|
|
1407
1419
|
founding: me.founding_mode || null,
|
|
1408
1420
|
// task 1004713: the government positions this builder holds (server-resolved).
|
|
1409
1421
|
positions: me.positions || null,
|
|
1422
|
+
// task 1005076: whether setup is complete; incomplete shows setup-gate.js.
|
|
1423
|
+
setup: (me.onboarding && me.onboarding.setup) || null,
|
|
1410
1424
|
builder: me.builder,
|
|
1411
1425
|
});
|
|
1412
1426
|
}).catch(function () { /* cosmetic only */ });
|
|
@@ -230,8 +230,8 @@
|
|
|
230
230
|
|
|
231
231
|
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
232
232
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
233
|
-
<script src="/builders/craft-mode.js?v=2026-11-05-
|
|
234
|
-
<script src="/builders/shell.js?v=2026-11-05-
|
|
233
|
+
<script src="/builders/craft-mode.js?v=2026-11-05-oversight"></script>
|
|
234
|
+
<script src="/builders/shell.js?v=2026-11-05-setup-gate"></script>
|
|
235
235
|
<script src="/builders/palette.js" defer></script>
|
|
236
236
|
<script src="/builders/gov-living.js?v=2026-10-09-positions1"></script>
|
|
237
237
|
<script src="/builders/gov-feeds.js?v=2026-10-09-living3"></script>
|
|
@@ -224,8 +224,8 @@
|
|
|
224
224
|
|
|
225
225
|
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
226
226
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
227
|
-
<script src="/builders/craft-mode.js?v=2026-11-05-
|
|
228
|
-
<script src="/builders/shell.js?v=2026-11-05-
|
|
227
|
+
<script src="/builders/craft-mode.js?v=2026-11-05-oversight"></script>
|
|
228
|
+
<script src="/builders/shell.js?v=2026-11-05-setup-gate"></script>
|
|
229
229
|
<script src="/builders/palette.js" defer></script>
|
|
230
230
|
<!-- The kit, for its ONE renderer: the full-size ship-time visual figure
|
|
231
231
|
(task 1003829), which the older reviews still show. -->
|
|
@@ -1356,6 +1356,88 @@ html[data-fullscreen="on"][data-fullscreen-plain="on"] .app-content { padding-to
|
|
|
1356
1356
|
"ask me again" box. Each door carries its scene from the approved prototype,
|
|
1357
1357
|
which is night-dark in either theme because every scene is a night one. */
|
|
1358
1358
|
html.craft-picker-open { overflow: hidden; }
|
|
1359
|
+
/* The setup flow (setup-gate.js, task 1005076): the one screen a new builder sees until set up. */
|
|
1360
|
+
html.setup-gate-open { overflow: hidden; }
|
|
1361
|
+
.setup-gate {
|
|
1362
|
+
position: fixed;
|
|
1363
|
+
inset: 0;
|
|
1364
|
+
z-index: calc(var(--z-modal) + 1);
|
|
1365
|
+
display: flex;
|
|
1366
|
+
justify-content: center;
|
|
1367
|
+
align-items: flex-start;
|
|
1368
|
+
padding: max(24px, 6vh) 16px 24px;
|
|
1369
|
+
overflow-y: auto;
|
|
1370
|
+
background: var(--bg);
|
|
1371
|
+
}
|
|
1372
|
+
.setup-gate__panel {
|
|
1373
|
+
width: min(640px, 100%);
|
|
1374
|
+
box-sizing: border-box;
|
|
1375
|
+
padding: 36px 40px 28px;
|
|
1376
|
+
border-radius: 22px;
|
|
1377
|
+
background: var(--bg-card);
|
|
1378
|
+
color: var(--ink);
|
|
1379
|
+
}
|
|
1380
|
+
.setup-gate__count { margin: 0; font-size: 13px; color: var(--ink-faint); }
|
|
1381
|
+
.setup-gate__title { margin: 6px 0 8px; font-family: var(--font-display); font-size: clamp(26px, 4vw, 34px); font-weight: 300; letter-spacing: -0.02em; line-height: 1.2; }
|
|
1382
|
+
.setup-gate__lede { margin: 0 0 24px; font-size: 16px; line-height: 1.5; color: var(--ink-soft); }
|
|
1383
|
+
.setup-gate__steps { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
|
|
1384
|
+
.setup-gate__step { display: flex; gap: 14px; padding: 12px 0; border-top: 1px solid var(--rule-soft); }
|
|
1385
|
+
.setup-gate__step:first-child { border-top: 0; }
|
|
1386
|
+
.setup-gate__mark {
|
|
1387
|
+
flex: none;
|
|
1388
|
+
display: inline-flex;
|
|
1389
|
+
align-items: center;
|
|
1390
|
+
justify-content: center;
|
|
1391
|
+
width: 28px;
|
|
1392
|
+
height: 28px;
|
|
1393
|
+
border-radius: var(--radius-pill);
|
|
1394
|
+
border: 1px solid var(--rule);
|
|
1395
|
+
font-size: 13px;
|
|
1396
|
+
color: var(--ink-soft);
|
|
1397
|
+
}
|
|
1398
|
+
.setup-gate__mark svg { width: 16px; height: 16px; }
|
|
1399
|
+
.setup-gate__step.is-done .setup-gate__mark { border-color: transparent; background: var(--ok-weak); color: var(--ok); }
|
|
1400
|
+
.setup-gate__step.is-current .setup-gate__mark { border-color: var(--accent); color: var(--ink); }
|
|
1401
|
+
.setup-gate__body { min-width: 0; flex: 1; }
|
|
1402
|
+
.setup-gate__label { margin: 4px 0 0; font-size: 16px; font-weight: 500; }
|
|
1403
|
+
.setup-gate__step.is-done .setup-gate__label { color: var(--ink-soft); font-weight: 400; }
|
|
1404
|
+
.setup-gate__hint { margin: 6px 0 0; font-size: 15px; line-height: 1.5; color: var(--ink-soft); }
|
|
1405
|
+
.setup-gate__how { margin: 10px 0 0; padding-left: 20px; font-size: 15px; line-height: 1.6; }
|
|
1406
|
+
/* The clone block is several commands, one per line: `pre` keeps the breaks on screen and in
|
|
1407
|
+
copy-on-click (it copies innerText). Both axes named: the one-axis-strip rule. */
|
|
1408
|
+
.setup-gate__code {
|
|
1409
|
+
display: block;
|
|
1410
|
+
margin: 12px 0 0;
|
|
1411
|
+
padding: 10px 14px;
|
|
1412
|
+
border-radius: var(--radius-sm);
|
|
1413
|
+
background: var(--glass);
|
|
1414
|
+
font-family: var(--font-mono);
|
|
1415
|
+
font-size: 13px;
|
|
1416
|
+
white-space: pre;
|
|
1417
|
+
overflow-x: auto;
|
|
1418
|
+
overflow-y: hidden;
|
|
1419
|
+
}
|
|
1420
|
+
.setup-gate code { font-family: var(--font-mono); font-size: 14px; padding: 1px 6px; border-radius: 6px; background: var(--glass); }
|
|
1421
|
+
.setup-gate__crafts { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; }
|
|
1422
|
+
.setup-gate__craft,
|
|
1423
|
+
.setup-gate__save {
|
|
1424
|
+
min-height: 36px;
|
|
1425
|
+
padding: 0 16px;
|
|
1426
|
+
border-radius: var(--radius-pill);
|
|
1427
|
+
border: 1px solid var(--rule);
|
|
1428
|
+
background: none;
|
|
1429
|
+
color: var(--ink);
|
|
1430
|
+
font: inherit;
|
|
1431
|
+
font-size: 14px;
|
|
1432
|
+
cursor: pointer;
|
|
1433
|
+
}
|
|
1434
|
+
.setup-gate__craft[aria-pressed="true"] { border-color: var(--accent); background: var(--accent-tint); }
|
|
1435
|
+
.setup-gate__save { margin-top: 12px; background: var(--accent); border-color: var(--accent); color: var(--accent-on); }
|
|
1436
|
+
.setup-gate__save:disabled { opacity: .5; cursor: default; }
|
|
1437
|
+
.setup-gate__err { margin: 8px 0 0; font-size: 14px; color: var(--danger); }
|
|
1438
|
+
.setup-gate__foot { margin: 24px 0 0; font-size: 14px; }
|
|
1439
|
+
.setup-gate__foot a { color: var(--ink-soft); }
|
|
1440
|
+
@media (max-width: 640px) { .setup-gate__panel { padding: 28px 20px 20px; border-radius: 18px; } }
|
|
1359
1441
|
.craft-picker {
|
|
1360
1442
|
position: fixed;
|
|
1361
1443
|
inset: 0;
|
|
@@ -2116,8 +2198,7 @@ html.pb-editing main { padding-bottom: 180px; }
|
|
|
2116
2198
|
text-align: center;
|
|
2117
2199
|
}
|
|
2118
2200
|
|
|
2119
|
-
.pill-link
|
|
2120
|
-
#welcome-reopen a {
|
|
2201
|
+
.pill-link {
|
|
2121
2202
|
display: inline-flex;
|
|
2122
2203
|
align-items: center;
|
|
2123
2204
|
min-height: 28px;
|
|
@@ -2129,7 +2210,6 @@ html.pb-editing main { padding-bottom: 180px; }
|
|
|
2129
2210
|
border-radius: var(--radius-pill);
|
|
2130
2211
|
padding: 0 12px;
|
|
2131
2212
|
}
|
|
2132
|
-
#welcome-reopen { margin: 0; }
|
|
2133
2213
|
.pill-link:hover { color: var(--ink); text-decoration: none; border-color: var(--ink-faint); }
|
|
2134
2214
|
|
|
2135
2215
|
/* ---------- stat tiles (Home) ----------
|
|
@@ -3166,119 +3246,8 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
|
|
|
3166
3246
|
|
|
3167
3247
|
.curve__kinds { display: flex; flex-direction: column; gap: 6px; margin-top: 16px; }
|
|
3168
3248
|
|
|
3169
|
-
/* ----------
|
|
3170
|
-
|
|
3171
|
-
.onboarding-list {
|
|
3172
|
-
list-style: none;
|
|
3173
|
-
margin: 0;
|
|
3174
|
-
padding: 0;
|
|
3175
|
-
display: flex;
|
|
3176
|
-
flex-direction: column;
|
|
3177
|
-
}
|
|
3178
|
-
.onboarding-item {
|
|
3179
|
-
display: grid;
|
|
3180
|
-
grid-template-columns: 26px minmax(0, 1fr) auto;
|
|
3181
|
-
gap: 4px 12px;
|
|
3182
|
-
align-items: start;
|
|
3183
|
-
padding: 12px 4px;
|
|
3184
|
-
border-bottom: 1px solid var(--rule-soft);
|
|
3185
|
-
}
|
|
3186
|
-
.onboarding-item:last-child { border-bottom: none; }
|
|
3187
|
-
.onboarding-item--placeholder { color: var(--ink-faint); }
|
|
3188
|
-
.onboarding-item__mark {
|
|
3189
|
-
width: 22px; height: 22px;
|
|
3190
|
-
border-radius: 50%;
|
|
3191
|
-
border: 1.5px solid var(--border-strong);
|
|
3192
|
-
display: flex;
|
|
3193
|
-
align-items: center;
|
|
3194
|
-
justify-content: center;
|
|
3195
|
-
font-size: 12px;
|
|
3196
|
-
color: var(--ink-faint);
|
|
3197
|
-
background: var(--surface);
|
|
3198
|
-
}
|
|
3199
|
-
.onboarding-item--cleared .onboarding-item__mark {
|
|
3200
|
-
background: var(--ok);
|
|
3201
|
-
border-color: var(--ok);
|
|
3202
|
-
color: #fff;
|
|
3203
|
-
}
|
|
3204
|
-
.onboarding-item--current .onboarding-item__mark { border-color: var(--accent); color: var(--accent-text); }
|
|
3205
|
-
.onboarding-item--current { background: var(--accent-weak); border-radius: var(--radius-sm); padding-left: 10px; padding-right: 10px; border-bottom-color: transparent; }
|
|
3206
|
-
.onboarding-item--locked { opacity: 0.6; }
|
|
3207
|
-
.onboarding-item__body { min-width: 0; }
|
|
3208
|
-
.onboarding-item__label { font-weight: 600; font-size: 13.5px; }
|
|
3209
|
-
.onboarding-item--cleared .onboarding-item__label { color: var(--ink-soft); font-weight: 500; }
|
|
3210
|
-
.onboarding-item__hint { font-size: 12.5px; color: var(--ink-soft); margin-top: 1px; }
|
|
3211
|
-
.onboarding-item__detail { font-size: 12.5px; color: var(--ink-soft); margin-top: 6px; }
|
|
3212
|
-
.onboarding-item__detail code { background: var(--surface-2); padding: 1px 5px; border-radius: 4px; }
|
|
3213
|
-
.onboarding-item__action { align-self: center; }
|
|
3214
|
-
.onboarding-item__disc-pick { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
|
|
3215
|
-
.onboarding-item__disc {
|
|
3216
|
-
border: 1px solid var(--border-strong);
|
|
3217
|
-
background: var(--surface);
|
|
3218
|
-
color: var(--ink-soft);
|
|
3219
|
-
border-radius: 999px;
|
|
3220
|
-
font-size: 12.5px;
|
|
3221
|
-
font-weight: 500;
|
|
3222
|
-
padding: 4px 12px;
|
|
3223
|
-
cursor: pointer;
|
|
3224
|
-
}
|
|
3225
|
-
.onboarding-item__disc:hover { background: var(--surface-2); }
|
|
3226
|
-
.onboarding-item__disc--on {
|
|
3227
|
-
background: var(--accent-weak);
|
|
3228
|
-
color: var(--accent-text);
|
|
3229
|
-
border-color: color-mix(in srgb, var(--accent) 40%, transparent);
|
|
3230
|
-
}
|
|
3231
|
-
.onboarding-item__discord { font-weight: 600; }
|
|
3232
|
-
|
|
3233
|
-
@media (max-width: 560px) {
|
|
3234
|
-
.onboarding-item { grid-template-columns: 26px minmax(0, 1fr); }
|
|
3235
|
-
.onboarding-item__action { grid-column: 2; justify-self: start; }
|
|
3236
|
-
}
|
|
3237
|
-
|
|
3238
|
-
/* ---------- welcome panel + setup selector ---------- */
|
|
3239
|
-
|
|
3240
|
-
.scroll--welcome {
|
|
3241
|
-
position: relative;
|
|
3242
|
-
border-left: 3px solid var(--accent);
|
|
3243
|
-
}
|
|
3244
|
-
.scroll--welcome--minimized .welcome { display: none; }
|
|
3245
|
-
.welcome__minimize {
|
|
3246
|
-
position: absolute;
|
|
3247
|
-
top: 12px; right: 12px;
|
|
3248
|
-
width: 26px; height: 26px;
|
|
3249
|
-
border: 1px solid var(--border);
|
|
3250
|
-
border-radius: var(--radius-sm);
|
|
3251
|
-
background: var(--surface);
|
|
3252
|
-
color: var(--ink-soft);
|
|
3253
|
-
font-size: 14px;
|
|
3254
|
-
line-height: 1;
|
|
3255
|
-
cursor: pointer;
|
|
3256
|
-
}
|
|
3257
|
-
.welcome__minimize:hover { background: var(--surface-2); }
|
|
3258
|
-
.welcome__lede { font-size: 13.5px; color: var(--ink-soft); max-width: 70ch; }
|
|
3259
|
-
.welcome__unlocks { margin: 8px 0; padding-left: 18px; font-size: 13px; color: var(--ink-soft); }
|
|
3260
|
-
.welcome__cmd, .welcome__paste {
|
|
3261
|
-
font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
|
|
3262
|
-
font-size: 12.5px;
|
|
3263
|
-
background: var(--surface-2);
|
|
3264
|
-
border: 1px solid var(--border);
|
|
3265
|
-
border-radius: var(--radius-sm);
|
|
3266
|
-
padding: 8px 12px;
|
|
3267
|
-
overflow-x: auto;
|
|
3268
|
-
}
|
|
3269
|
-
/* The get-the-code block is several commands, one per line. Without `pre` the
|
|
3270
|
-
line breaks collapse on screen AND in copy-on-click (it copies innerText),
|
|
3271
|
-
so a builder pasted every command onto one line. Both axes named: see the
|
|
3272
|
-
one-axis-strip rule in this module's CLAUDE.md. */
|
|
3273
|
-
.setup__getcode .welcome__paste {
|
|
3274
|
-
display: block;
|
|
3275
|
-
white-space: pre;
|
|
3276
|
-
overflow-y: hidden;
|
|
3277
|
-
}
|
|
3249
|
+
/* ---------- setup selector (the tab strip; .setup__tab is the kit's tab idiom) ---------- */
|
|
3278
3250
|
|
|
3279
|
-
.setup { margin-top: 12px; }
|
|
3280
|
-
.setup__intro { font-size: 13px; color: var(--ink-soft); }
|
|
3281
|
-
.setup__toggle { display: flex; border: 0; border-bottom: 1px solid var(--rule); margin: 8px 0 12px; flex-wrap: wrap; }
|
|
3282
3251
|
/* An open tab is the live thing in the strip, so it is what the accent lights:
|
|
3283
3252
|
a 2px underline sitting on the strip’s own hairline. */
|
|
3284
3253
|
.setup__tab {
|
|
@@ -3366,8 +3335,7 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
|
|
|
3366
3335
|
html[data-door="out"] .app-sidebar,
|
|
3367
3336
|
html[data-door="out"] .app-scrim,
|
|
3368
3337
|
html[data-door="out"] .app-topbar,
|
|
3369
|
-
html[data-door="out"] .app-foot
|
|
3370
|
-
html[data-door="out"] #welcome-reopen { display: none; }
|
|
3338
|
+
html[data-door="out"] .app-foot { display: none; }
|
|
3371
3339
|
html[data-door="out"] .app-body { margin-left: 0; }
|
|
3372
3340
|
/* body in the selector outranks Home's own body[data-page="home"] .page-head--hall. */
|
|
3373
3341
|
html[data-door="out"] body .page-head {
|
|
@@ -58,8 +58,8 @@
|
|
|
58
58
|
time so the chrome exists before the deferred page scripts execute. -->
|
|
59
59
|
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
60
60
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
61
|
-
<script src="/builders/craft-mode.js?v=2026-11-05-
|
|
62
|
-
<script src="/builders/shell.js?v=2026-11-05-
|
|
61
|
+
<script src="/builders/craft-mode.js?v=2026-11-05-oversight"></script>
|
|
62
|
+
<script src="/builders/shell.js?v=2026-11-05-setup-gate"></script>
|
|
63
63
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
64
64
|
<script src="/builders/palette.js" defer></script>
|
|
65
65
|
<!-- task-detail.js still owns the #/idea/N and #/blocker/N deep-link overlay
|
|
@@ -140,8 +140,8 @@
|
|
|
140
140
|
|
|
141
141
|
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
142
142
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
143
|
-
<script src="/builders/craft-mode.js?v=2026-11-05-
|
|
144
|
-
<script src="/builders/shell.js?v=2026-11-05-
|
|
143
|
+
<script src="/builders/craft-mode.js?v=2026-11-05-oversight"></script>
|
|
144
|
+
<script src="/builders/shell.js?v=2026-11-05-setup-gate"></script>
|
|
145
145
|
<script src="/builders/palette.js" defer></script>
|
|
146
146
|
|
|
147
147
|
<script src="/builders/idea-objects.js?v=2026-09-27-split"></script>
|
|
@@ -144,8 +144,8 @@
|
|
|
144
144
|
|
|
145
145
|
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
146
146
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
147
|
-
<script src="/builders/craft-mode.js?v=2026-11-05-
|
|
148
|
-
<script src="/builders/shell.js?v=2026-11-05-
|
|
147
|
+
<script src="/builders/craft-mode.js?v=2026-11-05-oversight"></script>
|
|
148
|
+
<script src="/builders/shell.js?v=2026-11-05-setup-gate"></script>
|
|
149
149
|
<script src="/builders/palette.js" defer></script>
|
|
150
150
|
<script src="/builders/brand-holes.js?v=2026-09-29-aqfix"></script>
|
|
151
151
|
<script src="/builders/tweak-editor-lib.js?v=2026-09-29-tw27"></script>
|