@bongos/core 1.24.82 → 1.24.84

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.
Files changed (59) hide show
  1. package/.bongos-core.json +63 -63
  2. package/docs/adr/0402-helm-is-the-halls-look-and-the-hall-is-dark-only.md +4 -0
  3. package/docs/copy-inventory.md +4 -4
  4. package/docs/copy-registry.json +6 -6
  5. package/docs/module-api-changelog.md +4 -0
  6. package/docs/page-readings.json +42 -42
  7. package/modules/hall-ui/public/ai-studio.html +1 -1
  8. package/modules/hall-ui/public/atlas.html +1 -1
  9. package/modules/hall-ui/public/blockers.html +1 -1
  10. package/modules/hall-ui/public/board-room.html +1 -1
  11. package/modules/hall-ui/public/city.css +3 -2
  12. package/modules/hall-ui/public/city.html +4 -4
  13. package/modules/hall-ui/public/collab.html +1 -1
  14. package/modules/hall-ui/public/commands.html +1 -1
  15. package/modules/hall-ui/public/controls.css +10 -2
  16. package/modules/hall-ui/public/copy-desk.html +1 -1
  17. package/modules/hall-ui/public/deploy.html +1 -1
  18. package/modules/hall-ui/public/goal-map.html +3 -3
  19. package/modules/hall-ui/public/goals.html +1 -1
  20. package/modules/hall-ui/public/government.html +1 -1
  21. package/modules/hall-ui/public/home-city.css +0 -4
  22. package/modules/hall-ui/public/idea.html +1 -1
  23. package/modules/hall-ui/public/ideas.html +1 -1
  24. package/modules/hall-ui/public/index.html +4 -4
  25. package/modules/hall-ui/public/market-watch-item.html +1 -1
  26. package/modules/hall-ui/public/market-watch-rules.html +1 -1
  27. package/modules/hall-ui/public/market-watch.html +1 -1
  28. package/modules/hall-ui/public/modules.html +1 -1
  29. package/modules/hall-ui/public/money.html +1 -1
  30. package/modules/hall-ui/public/my-agents.html +1 -1
  31. package/modules/hall-ui/public/options-menu.js +20 -0
  32. package/modules/hall-ui/public/primer.html +1 -1
  33. package/modules/hall-ui/public/profile.html +1 -1
  34. package/modules/hall-ui/public/project-settings.html +1 -1
  35. package/modules/hall-ui/public/roster.html +1 -1
  36. package/modules/hall-ui/public/settings.css +113 -46
  37. package/modules/hall-ui/public/settings.html +3 -3
  38. package/modules/hall-ui/public/street.html +1 -1
  39. package/modules/hall-ui/public/studio.html +1 -1
  40. package/modules/hall-ui/public/style.css +167 -71
  41. package/modules/hall-ui/public/task.html +1 -1
  42. package/modules/hall-ui/public/thinking.html +3 -3
  43. package/modules/hall-ui/public/tweak-editor.html +1 -1
  44. package/modules/hall-ui/public/visor.css +109 -48
  45. package/modules/hall-ui/public/visor.js +50 -33
  46. package/modules/hall-ui/public/watch.html +1 -1
  47. package/modules/hall-ui/public/work.html +1 -1
  48. package/modules/hall-ui/records/craft-mode.md +9 -0
  49. package/modules/hall-ui/records/options-menu.md +11 -0
  50. package/modules/hall-ui/records/visor.md +14 -2
  51. package/package-lock.json +2 -2
  52. package/package.json +1 -1
  53. package/release-notes.json +12 -0
  54. package/src/module-api.js +1 -1
  55. package/tests/design_tokens_shared.mjs +5 -1
  56. package/tests/hall_controls.mjs +1 -1
  57. package/tests/hall_helm.mjs +103 -1
  58. package/tests/hall_topbar_320.mjs +7 -4
  59. package/tests/hall_visor.mjs +128 -10
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm3">
12
12
  <link rel="stylesheet" href="/builders/hall-ask.css">
13
13
  <link rel="stylesheet" href="/builders/market-watch-rules.css">
14
14
  </head>
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm3">
12
12
  <link rel="stylesheet" href="/builders/market-watch.css">
13
13
  <link rel="stylesheet" href="/builders/market-watch-settings.css">
14
14
  </head>
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm3">
12
12
  <!-- task 1004366: a store version's how-to reads as a document, so it borrows the
13
13
  reading room's article card (room.css is scoped to its own primer- classes). -->
14
14
  <link rel="stylesheet" href="/builders/room.css">
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm3">
12
12
  <link rel="stylesheet" href="/builders/oversight.css">
13
13
  <link rel="stylesheet" href="/builders/project-settings.css?v=2026-11-02-outflow">
14
14
  </head>
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm3">
12
12
  <!-- The oversight family's archetype: a titled row with facts and actions, the
13
13
  group head and the foot line (records/oversight-family.md). This page's
14
14
  repeated thing is that row at the desk's one-line density. -->
@@ -254,6 +254,7 @@
254
254
  if (!state.menu.some(function (g) { return g.items.some(function (it) { return it.id === id; }); })) return false;
255
255
  state.active = id;
256
256
  groupsEl.dataset.active = id;
257
+ nameScreen(e);
257
258
  Array.prototype.forEach.call(groupsEl.querySelectorAll('.opt-embed'), function (s) { s.classList.remove('opt-embed--on'); });
258
259
  if (e.embed) frameFor(e, anchor).classList.add('opt-embed--on');
259
260
  else if (state.onNative) state.onNative(id, anchor);
@@ -271,6 +272,22 @@
271
272
  return true;
272
273
  }
273
274
 
275
+ // The open screen's name, over the screen (Helm, task 1005194): the entry's own
276
+ // label, so no new words. Drawn for the eye only: the rail's aria-current link
277
+ // and each frame's aria-label already say which screen is open.
278
+ function nameScreen(e) {
279
+ if (!groupsEl || !groupsEl.insertBefore || typeof document === 'undefined') return;
280
+ var h = document.getElementById('opt-screen');
281
+ if (!h) {
282
+ h = document.createElement('p');
283
+ h.id = 'opt-screen';
284
+ h.className = 'opt-screen';
285
+ h.setAttribute('aria-hidden', 'true');
286
+ groupsEl.insertBefore(h, groupsEl.firstChild);
287
+ }
288
+ h.textContent = e.label;
289
+ }
290
+
274
291
  function markActive() {
275
292
  if (!railEl) return;
276
293
  Array.prototype.forEach.call(railEl.querySelectorAll('.opt-link'), function (a) {
@@ -306,7 +323,10 @@
306
323
  // The rail: the search box, then the groups. Typing filters; Enter opens the first match.
307
324
  function draw() {
308
325
  railEl.classList.add('opt-rail');
326
+ // The panel's own name shows only where the top bar is away (settings.css); the
327
+ // <nav> already carries the same word as its aria-label.
309
328
  railEl.innerHTML =
329
+ '<p class="opt-title" aria-hidden="true">Options</p>' +
310
330
  '<label class="opt-search"><span class="sr-only">Search settings</span>' +
311
331
  '<input type="search" id="opt-search" placeholder="Search settings" autocomplete="off" spellcheck="false"></label>' +
312
332
  '<div class="opt-list"></div>';
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm3">
12
12
  <link rel="stylesheet" href="/builders/room.css">
13
13
  <link rel="stylesheet" href="/builders/primer.css?v=2026-07-02-shell1">
14
14
  <link rel="stylesheet" href="/builders/diagram-viewer.css?v=2026-11-04-reading-room">
@@ -14,7 +14,7 @@
14
14
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
15
15
  <link rel="preconnect" href="https://fonts.googleapis.com">
16
16
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
17
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
17
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm3">
18
18
  <!-- The PANEL archetype (task 1003308) before the page's own sheet. -->
19
19
  <link rel="stylesheet" href="/builders/panel.css">
20
20
  <link rel="stylesheet" href="/builders/hall-ask.css">
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm3">
12
12
  <link rel="stylesheet" href="/builders/oversight.css">
13
13
  <link rel="stylesheet" href="/builders/project-settings.css?v=2026-11-02-outflow">
14
14
  </head>
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm3">
12
12
  <!-- task 1003441: the identity cell (avatar, name, login). It was shared with
13
13
  the cross-project /people page until task 1003444 deleted it. -->
14
14
  <link rel="stylesheet" href="/builders/roster.css">
@@ -1,18 +1,24 @@
1
1
  /* settings.css — what Settings has and the rest of the panel family does not
2
- (task 1003308, goal 1000081; the archetype is panel.css). The grouped layout
3
- behind the section rail, the group head, the token ladder,
4
- the volume line and the image-key banner. Every colour is a `var()` of the
5
- world's tier; the one literal pair is the Discord mark, named below.
2
+ (task 1003308, goal 1000081; the archetype is panel.css). The options menu
3
+ and the screen it opens, the token ladder, the volume line and the image-key
4
+ banner. Every colour is a `var()` of the world's tier; the one literal pair
5
+ is the Discord mark, named below.
6
6
 
7
- The rail itself (.section-rail / .rail-link) is the shell's, built by
8
- OTBKit.makeSectionRail in switch mode; this sheet only widens its column to
9
- the mock's and keeps one group visible at a time. */
7
+ THE OPTIONS MENU IS A HELM SCREEN (task 1005194, ADR 0402; the menu is ADR
8
+ 0401). Left, the menu: one night panel closed left and right by the strong
9
+ ice hairline, the search over the entries, each entry a full-width row in
10
+ the name voice on a hairline, the open one the accent bar. Right, the open
11
+ screen: its name in the name voice over the strong hairline, then its
12
+ sections as plain rows on hairlines, not cards. In game mode the panel runs
13
+ the window's full height and names itself. The Helm pieces are the hall
14
+ tier's tokens (style.css); the rows' words, order and addresses are
15
+ options-menu.js's, unchanged. */
10
16
 
11
- /* ---- grouped layout: left rail + one visible group ------------------------ */
17
+ /* ---- the layout: the menu panel + the one open screen --------------------- */
12
18
  .settings-layout {
13
19
  display: grid;
14
- grid-template-columns: 206px minmax(0, 1fr);
15
- gap: 30px;
20
+ grid-template-columns: minmax(0, min(var(--helm-panel-w), 32%)) minmax(0, 1fr);
21
+ gap: var(--ds-space-xl);
16
22
  align-items: start;
17
23
  }
18
24
  .settings-layout[hidden] { display: none !important; }
@@ -30,43 +36,98 @@
30
36
  .settings-groups > [data-group][hidden] { display: none !important; }
31
37
  /* A screen opened in the menu's frame (options-menu.js): one shows at a time. */
32
38
  .settings-groups > .opt-embed.opt-embed--on { display: block; }
33
- .settings-groups .scroll { margin: 0 0 var(--sp-sm); }
39
+ /* ---- the open screen: its name, then its sections as rows on hairlines -------
40
+ options-menu.js writes the open entry's own label into .opt-screen. A section
41
+ is not a card here: no ground, no corner, one soft hairline under it, its
42
+ title in the name voice. */
43
+ .settings-groups { --opt-screen-h: calc(var(--ds-space-xl) + var(--ds-space-lg)); }
44
+ .opt-screen {
45
+ margin: 0;
46
+ padding: 0 0 var(--ds-space-sm);
47
+ border-bottom: var(--line-strong) solid var(--rule);
48
+ font-family: var(--name-face);
49
+ font-size: var(--ds-text-figure);
50
+ font-weight: var(--name-weight);
51
+ letter-spacing: var(--name-space-tight);
52
+ text-transform: var(--name-case);
53
+ line-height: 1;
54
+ overflow-wrap: anywhere;
55
+ color: var(--ink);
56
+ text-shadow: var(--name-glow);
57
+ }
58
+ .settings-groups .scroll {
59
+ margin: 0;
60
+ padding: var(--ds-space-md) 0;
61
+ background: none;
62
+ border: 0;
63
+ border-bottom: var(--line) solid var(--rule-soft);
64
+ border-radius: var(--press-radius);
65
+ }
66
+ .settings-groups .scroll__h {
67
+ font-family: var(--name-face);
68
+ font-size: var(--ds-text-2xl);
69
+ font-weight: var(--name-weight);
70
+ letter-spacing: var(--name-space-tight);
71
+ text-transform: var(--name-case);
72
+ color: var(--ink);
73
+ }
34
74
  .settings-groups .scroll__lede { font-size: 14.5px; }
35
- /* the rail's items at the mock's height: the shell's 28px rows are Standing's
36
- density, and a settings group is a destination, not a scroll-spy stop */
37
- /* ---- the options menu rail (task 1005144, ADR 0401) ------------------------
38
- A search box over a vertical list of groups. Sticky beside the open screen, so
39
- the menu stays in reach while a long screen scrolls. */
40
- .opt-rail { position: sticky; top: 72px; display: flex; flex-direction: column; gap: 2px; max-height: calc(100vh - 96px); overflow-y: auto; }
41
- html[data-fullscreen="on"] .opt-rail { top: 24px; max-height: calc(100vh - 48px); }
42
- .opt-search { display: block; margin: 0 0 var(--sp-xs); }
43
- .opt-search input { width: 100%; min-height: 38px; padding: 0 14px; border-radius: var(--radius-pill); border: var(--line) solid var(--glass-edge); background: var(--glass); color: var(--ink); font: inherit; font-size: var(--ds-text-md); }
44
- .opt-search input:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
45
- .opt-head { margin: var(--sp-sm) 0 2px; padding: 0 14px; font-family: var(--label-face); font-size: var(--label-size); letter-spacing: var(--label-space); text-transform: var(--label-case); color: var(--ink-faint); }
46
- .opt-link { position: relative; display: flex; flex-direction: column; justify-content: center; min-height: 38px; padding: 4px 14px; border-radius: var(--radius-pill); color: var(--ink-soft); font-size: var(--ds-text-md); text-decoration: none; }
47
- .opt-link:hover { color: var(--ink); background: var(--glass); }
48
- .opt-link:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
49
- .opt-link--active { color: var(--ink); background: var(--glass); }
50
- .opt-link--active::before { content: ""; position: absolute; left: 0; top: 9px; bottom: 9px; width: 3px; border-radius: var(--radius-pill); background: var(--accent); }
51
- .opt-link__where { font-size: var(--ds-text-xs); color: var(--ink-faint); }
52
- .opt-none { margin: var(--sp-xs) 0; padding: 0 14px; font-size: var(--ds-text-sm-plus); color: var(--ink-soft); }
53
- /* The frame fills the column to the bottom of the window; the screen in it scrolls itself. */
54
- .opt-embed__frame { display: block; width: 100%; height: calc(100vh - 96px); min-height: 480px; border: 0; border-radius: var(--radius); background: transparent; }
55
- html[data-fullscreen="on"] .opt-embed__frame { height: calc(100vh - 48px); }
56
75
 
57
- /* the group head: the group's name in the display voice over a hairline, with
58
- its own address in the mono face beside it (a machine's word keeps its case) */
59
- .grp__head {
60
- display: flex;
61
- align-items: baseline;
62
- justify-content: space-between;
63
- gap: var(--sp-sm);
64
- margin: 0 0 var(--sp-sm);
65
- padding-bottom: var(--sp-xs);
66
- border-bottom: var(--line) solid var(--glass-edge);
76
+ /* ---- the options menu (task 1005144, ADR 0401; Helm, task 1005194) -----------
77
+ The night panel: the search, then the entries. Sticky beside the open screen,
78
+ so the menu stays in reach while a long screen scrolls; it scrolls itself. */
79
+ .opt-rail {
80
+ position: sticky; top: 72px; box-sizing: border-box;
81
+ display: flex; flex-direction: column;
82
+ max-height: calc(100vh - 96px); overflow-y: auto;
83
+ padding: var(--ds-space-md) 0;
84
+ background: var(--night-glass);
85
+ border: 0 solid var(--rule); border-left-width: var(--line-strong); border-right-width: var(--line-strong);
86
+ }
87
+ /* the panel's own name: only where the top bar is away (full screen, game mode),
88
+ since with the bars up the top bar already says it */
89
+ .opt-title {
90
+ display: none;
91
+ margin: 0 0 var(--ds-space-md); padding: 0 var(--ds-space-lg);
92
+ font-family: var(--name-face); font-size: var(--ds-text-headline); font-weight: var(--name-weight);
93
+ letter-spacing: var(--name-space-wide); text-transform: var(--name-case); line-height: 1.15;
94
+ color: var(--ink); text-shadow: var(--name-glow);
95
+ }
96
+ html[data-fullscreen="on"] .opt-title { display: block; }
97
+ /* the search: the hall's one field (controls.css), on the glass, as wide as the panel */
98
+ .opt-search { display: block; margin: 0 0 var(--ds-space-sm); padding: 0 var(--ds-space-lg); }
99
+ .opt-search input { width: 100%; min-height: 46px; background: var(--glass); font-size: var(--ds-text-xl); }
100
+ .opt-head {
101
+ margin: var(--ds-space-sm) 0 0; padding: var(--ds-space-hair) var(--ds-space-lg);
102
+ font-family: var(--label-face); font-size: var(--label-size); letter-spacing: var(--label-space);
103
+ text-transform: var(--label-case); color: var(--ink-soft);
104
+ }
105
+ /* an entry: a full-width row in the name voice on a soft hairline. The ring sits
106
+ inside the row (the start screen's rule), so it reads on the accent bar too. */
107
+ .opt-link {
108
+ display: flex; flex-direction: column; justify-content: center; box-sizing: border-box;
109
+ min-height: var(--ds-space-xl); padding: var(--ds-space-hair) var(--ds-space-lg);
110
+ border-bottom: var(--line) solid var(--rule-soft);
111
+ color: var(--ink); text-decoration: none;
112
+ font-family: var(--name-face); font-size: var(--ds-text-3xl); font-weight: 400;
113
+ letter-spacing: var(--name-space-tight); text-transform: var(--name-case); line-height: 1.2;
114
+ transition: background-color var(--ds-dur-fast) var(--ds-ease);
115
+ }
116
+ .opt-list > .opt-link:last-child { border-bottom-color: transparent; }
117
+ .opt-link:hover { color: var(--ink); background: var(--glass); text-decoration: none; }
118
+ .opt-link:focus-visible { outline: 0; border-radius: var(--press-radius); box-shadow: var(--press-focus); }
119
+ /* the open entry is the one thing lit: the accent bar under its dark ink */
120
+ .opt-link--active, .opt-link--active:hover {
121
+ color: var(--accent-on); background: var(--accent); border-bottom-color: transparent;
122
+ font-weight: var(--name-weight-lit); box-shadow: var(--accent-glow);
67
123
  }
68
- .grp__h { margin: 0; font-family: var(--font-display); font-weight: 300; font-size: clamp(22px, 2.1vw, 29px); line-height: 1.1; letter-spacing: -.03em; color: var(--ink); }
69
- .grp__eyebrow { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0; text-transform: none; color: var(--ink-faint); }
124
+ .opt-link--active:focus-visible { box-shadow: var(--press-focus), var(--accent-glow); }
125
+ /* where a search hit lives: said, not named, so it is the body voice */
126
+ .opt-link__where { font-family: var(--font-body); font-size: var(--ds-text-xs); letter-spacing: 0; text-transform: none; color: var(--ink-faint); }
127
+ .opt-none { margin: var(--ds-space-xs) 0; padding: 0 var(--ds-space-lg); font-size: var(--ds-text-sm-plus); color: var(--ink-soft); }
128
+ /* The frame fills the column to the bottom of the window, under the screen's name; the screen in it scrolls itself. */
129
+ .opt-embed__frame { display: block; width: 100%; height: calc(100vh - 96px - var(--opt-screen-h)); min-height: 480px; border: 0; border-radius: var(--press-radius); background: transparent; }
130
+ html[data-fullscreen="on"] .opt-embed__frame { height: calc(100vh - 48px - var(--opt-screen-h)); }
70
131
 
71
132
  @media (max-width: 860px) {
72
133
  /* Collapse to one column: the menu sits above the open screen, no longer sticky. */
@@ -74,8 +135,14 @@ html[data-fullscreen="on"] .opt-embed__frame { height: calc(100vh - 48px); }
74
135
  .opt-rail { position: static; max-height: none; }
75
136
  .opt-embed__frame { height: 80vh; }
76
137
  }
77
- @media (max-width: 520px) {
78
- .grp__head { flex-direction: column; align-items: flex-start; gap: 4px; }
138
+ @media (min-width: 861px) {
139
+ /* Full screen and game mode: the panel is the window's full height, from the top
140
+ edge. The pull is the room the shell leaves a plain page above its content for
141
+ the corner button (style.css, data-fullscreen-plain). */
142
+ html[data-fullscreen="on"] .opt-rail {
143
+ top: 0; height: 100vh; max-height: none;
144
+ margin-top: -60px; padding-top: var(--ds-space-xl);
145
+ }
79
146
  }
80
147
 
81
148
  /* ---- the token ladder (CLI access) ------------------------------------------
@@ -11,13 +11,13 @@
11
11
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
12
12
  <link rel="preconnect" href="https://fonts.googleapis.com">
13
13
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
14
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
14
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm3">
15
15
  <!-- The PANEL archetype (task 1003308): the row, the switch, the field, the
16
16
  chip control and the family's voices, shared with profile and pair.
17
17
  settings.css then holds only what this page
18
18
  has — the rail layout, the group head, the token ladder, the voices grid. -->
19
19
  <link rel="stylesheet" href="/builders/panel.css">
20
- <link rel="stylesheet" href="/builders/settings.css">
20
+ <link rel="stylesheet" href="/builders/settings.css?v=2026-11-11-helm2">
21
21
  <!-- task 1005094: the device cards and their Run button in Your Autobongos runner. -->
22
22
  <link rel="stylesheet" href="/builders/runner-button.css">
23
23
  </head>
@@ -432,7 +432,7 @@
432
432
  <!-- task 1005044: the old deep links to the agent settings that moved to My agents -->
433
433
  <script src="/builders/settings-moved.js?v=2026-11-03-moved"></script>
434
434
  <!-- task 1005144: the ONE options menu — the rail, its search, and the screens it opens in a frame. -->
435
- <script src="/builders/options-menu.js?v=2026-11-11-view2"></script>
435
+ <script src="/builders/options-menu.js?v=2026-11-11-helm2"></script>
436
436
  <script src="/builders/settings.js?v=2026-11-10-options"></script>
437
437
  <!-- task 1003341: the Active sessions panel. Its own file rather than more of
438
438
  settings.js, which sits close to the 1500-line size ratchet. -->
@@ -10,7 +10,7 @@
10
10
  <!-- The faces (Manrope, JetBrains Mono) come from the branding pack's font
11
11
  links, injected into this head by the server like every hall page's
12
12
  (tests/hall_tokens.mjs: no hall page hardcodes a web-font stylesheet). -->
13
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
13
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm3">
14
14
  <link rel="stylesheet" href="/builders/street.css?v=2026-11-11-helm">
15
15
  <link rel="stylesheet" href="/builders/street-card.css?v=2026-10-04-record1">
16
16
  <link rel="stylesheet" href="/builders/street-deck.css?v=2026-10-17-tidy">
@@ -12,7 +12,7 @@
12
12
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
13
13
  <link rel="preconnect" href="https://fonts.googleapis.com">
14
14
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
15
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
15
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm3">
16
16
  <link rel="stylesheet" href="/builders/studio.css?v=2026-10-09-day">
17
17
  <link rel="stylesheet" href="/builders/approval-queue.css?v=2026-09-29-aqfix">
18
18
  <link rel="stylesheet" href="/builders/home-gallery.css?v=2026-11-04-studio">