@bongos/core 1.24.81 → 1.24.83

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 (77) hide show
  1. package/.bongos-core.json +95 -80
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +4 -0
  4. package/clients/bongos-client/index.cjs +4 -0
  5. package/clients/bongos-client/index.d.ts +5 -0
  6. package/clients/bongos-client/index.mjs +4 -0
  7. package/docs/adr/0402-helm-is-the-halls-look-and-the-hall-is-dark-only.md +4 -0
  8. package/docs/api/openapi.json +86 -2
  9. package/docs/api-reference.md +4 -2
  10. package/docs/copy-inventory.md +39 -33
  11. package/docs/copy-registry.json +107 -52
  12. package/docs/module-api-changelog.md +4 -0
  13. package/docs/page-inventory.json +1 -0
  14. package/docs/page-readings.json +207 -201
  15. package/modules/builder-settings/hall-view-prefs.js +50 -0
  16. package/modules/builder-settings/routes/settings.js +32 -0
  17. package/modules/hall-ui/public/ai-studio.html +3 -3
  18. package/modules/hall-ui/public/atlas.html +3 -3
  19. package/modules/hall-ui/public/blockers.html +3 -3
  20. package/modules/hall-ui/public/board-room.html +3 -3
  21. package/modules/hall-ui/public/city.html +5 -5
  22. package/modules/hall-ui/public/collab.html +3 -3
  23. package/modules/hall-ui/public/commands.html +3 -3
  24. package/modules/hall-ui/public/controls.css +10 -2
  25. package/modules/hall-ui/public/copy-desk.html +3 -3
  26. package/modules/hall-ui/public/deploy.html +3 -3
  27. package/modules/hall-ui/public/goal-map.html +5 -5
  28. package/modules/hall-ui/public/goals.html +3 -3
  29. package/modules/hall-ui/public/government.html +3 -3
  30. package/modules/hall-ui/public/idea.html +3 -3
  31. package/modules/hall-ui/public/ideas.html +3 -3
  32. package/modules/hall-ui/public/index.html +6 -6
  33. package/modules/hall-ui/public/market-watch-item.html +3 -3
  34. package/modules/hall-ui/public/market-watch-rules.html +3 -3
  35. package/modules/hall-ui/public/market-watch.html +3 -3
  36. package/modules/hall-ui/public/modules.html +3 -3
  37. package/modules/hall-ui/public/money.html +3 -3
  38. package/modules/hall-ui/public/my-agents.html +3 -3
  39. package/modules/hall-ui/public/options-menu.js +22 -1
  40. package/modules/hall-ui/public/primer.html +3 -3
  41. package/modules/hall-ui/public/profile.html +3 -3
  42. package/modules/hall-ui/public/project-settings.html +3 -3
  43. package/modules/hall-ui/public/roster.html +3 -3
  44. package/modules/hall-ui/public/settings-view.js +75 -0
  45. package/modules/hall-ui/public/settings.css +113 -46
  46. package/modules/hall-ui/public/settings.html +18 -5
  47. package/modules/hall-ui/public/shell-game.css +10 -0
  48. package/modules/hall-ui/public/shell-game.js +98 -33
  49. package/modules/hall-ui/public/shell.js +4 -3
  50. package/modules/hall-ui/public/street.html +3 -3
  51. package/modules/hall-ui/public/studio.html +3 -3
  52. package/modules/hall-ui/public/style.css +149 -61
  53. package/modules/hall-ui/public/task.html +3 -3
  54. package/modules/hall-ui/public/thinking.html +5 -5
  55. package/modules/hall-ui/public/tweak-editor.html +3 -3
  56. package/modules/hall-ui/public/visor.css +2 -2
  57. package/modules/hall-ui/public/visor.js +7 -1
  58. package/modules/hall-ui/public/watch.html +3 -3
  59. package/modules/hall-ui/public/work.html +3 -3
  60. package/modules/hall-ui/records/craft-mode.md +9 -0
  61. package/modules/hall-ui/records/game-mode.md +5 -4
  62. package/modules/hall-ui/records/options-menu.md +11 -0
  63. package/modules/hall-ui/records/start-screen.md +4 -0
  64. package/package-lock.json +2 -2
  65. package/package.json +1 -1
  66. package/release-notes.json +12 -0
  67. package/scripts/hall-preview/pref-writes.js +8 -1
  68. package/src/module-api.js +1 -1
  69. package/tests/design_tokens_shared.mjs +5 -1
  70. package/tests/hall_controls.mjs +1 -1
  71. package/tests/hall_fullscreen.mjs +42 -21
  72. package/tests/hall_helm.mjs +103 -1
  73. package/tests/hall_start_screen.mjs +38 -3
  74. package/tests/hall_topbar_320.mjs +7 -4
  75. package/tests/hall_view_prefs.mjs +42 -0
  76. package/tests/hall_visor.mjs +3 -2
  77. package/tests/nav_permission_atoms.mjs +1 -1
@@ -182,7 +182,12 @@
182
182
  --line: var(--ds-line);
183
183
  --radius: var(--ds-radius-panel);
184
184
  --radius-sm: var(--ds-radius-tile);
185
- --radius-pill: var(--ds-radius-pill);
185
+ /* HELM DRAWS NO PILL (task 1005194, ADR 0402). The name stays, because some
186
+ seventy rules across the page sheets spell it, but in the hall it is a
187
+ square corner: a field, a tag, a chip, a toggle and a toast are square
188
+ inside one hairline, and only what you press is cut (--cut-path). A thing
189
+ that must be round (a portrait in the visor) says --ds-radius-pill. */
190
+ --radius-pill: 0px;
186
191
 
187
192
  /* ---- the shell's metrics. --topbar-h stays under the kit's 80px top-bar
188
193
  floor; --sidebar-w IS the rail, because v3 pins the rail at every
@@ -1126,19 +1131,26 @@ html[data-theme="dark"] .gplate__light { display: none; }
1126
1131
  min-width: 28px;
1127
1132
  padding: 0 11px 0 9px;
1128
1133
  border: 1px solid var(--rule);
1129
- border-radius: var(--radius-pill);
1130
- background: var(--bg-card);
1134
+ border-radius: var(--press-radius);
1135
+ /* Helm (task 1005194): it is pressed, so it is cut, in the name voice; the cut
1136
+ clips an outline, so its focus is the inset ring */
1137
+ clip-path: var(--cut-path-sm);
1138
+ --focus-ring: var(--press-focus);
1139
+ background: var(--press-fill);
1131
1140
  color: var(--ink);
1132
1141
  font: inherit;
1133
- font-size: 12px;
1134
- font-weight: 500;
1142
+ font-family: var(--name-face);
1143
+ font-size: var(--ds-text-xs);
1144
+ font-weight: var(--name-weight);
1145
+ letter-spacing: var(--name-space-tight);
1146
+ text-transform: var(--name-case);
1135
1147
  line-height: 1;
1136
1148
  white-space: nowrap;
1137
1149
  flex-shrink: 0;
1138
1150
  cursor: pointer;
1139
1151
  }
1140
1152
  .upd-pill:hover { border-color: var(--ink-faint); }
1141
- .upd-pill:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
1153
+ .upd-pill:focus-visible { outline: 0; border-radius: var(--press-radius); }
1142
1154
  .upd-pill__dot { width: 7px; height: 7px; border-radius: 50%; background: var(--accent); flex-shrink: 0; }
1143
1155
  .upd-pill[data-face="held"] .upd-pill__dot { background: var(--ink-faint); }
1144
1156
  .upd-pill[data-face="done"] { background: var(--accent); border-color: var(--accent); color: var(--accent-on); }
@@ -1323,13 +1335,14 @@ html[data-fullscreen="on"] .app-topbar {
1323
1335
  }
1324
1336
  html[data-fullscreen="on"] .app-topbar > :not(.topbar-side),
1325
1337
  html[data-fullscreen="on"] .topbar-side > :not(.fullscreen-toggle):not(.upd-pill) { display: none; }
1338
+ /* Game mode keeps its full screen: no way back to the bars inside it (task 1005200). */
1339
+ html[data-game="on"] .fullscreen-toggle { display: none; }
1326
1340
  /* task 1005191: the Update pill stays with the bars away. Game mode opens every page
1327
1341
  this way, and an update nobody can see is an update nobody takes. */
1328
1342
  html[data-fullscreen="on"] .upd-pill {
1329
1343
  pointer-events: auto;
1330
1344
  min-height: 36px;
1331
1345
  margin-right: 8px;
1332
- box-shadow: var(--shadow-pop);
1333
1346
  }
1334
1347
  /* task 1004430: the way back must read on ANY ground. The hall's glass is
1335
1348
  near-clear, so over the black sky in the light theme it was a dark glyph on
@@ -1341,13 +1354,22 @@ html[data-fullscreen="on"] .fullscreen-toggle {
1341
1354
  gap: 6px;
1342
1355
  padding: 0 14px 0 10px;
1343
1356
  color: var(--ink);
1344
- background: var(--bg-card);
1345
- box-shadow: 0 0 0 1px var(--rule), 0 4px 16px rgba(0, 0, 0, .35);
1346
- font-size: 13px;
1347
- font-weight: 500;
1357
+ /* Helm (task 1005194): the cut corner on the press fill inside one hairline, in
1358
+ the name voice. The fill is opaque, so it still reads on any ground. */
1359
+ background: var(--press-fill);
1360
+ border: var(--line) solid var(--rule);
1361
+ border-radius: var(--press-radius);
1362
+ clip-path: var(--cut-path-sm);
1363
+ --focus-ring: var(--press-focus);
1364
+ font-family: var(--name-face);
1365
+ font-size: var(--ds-text-xs);
1366
+ font-weight: var(--name-weight);
1367
+ letter-spacing: var(--name-space-tight);
1368
+ text-transform: var(--name-case);
1348
1369
  white-space: nowrap;
1349
1370
  }
1350
- /* A phone has no room for the words; the round button keeps its card tone. */
1371
+ html[data-fullscreen="on"] .fullscreen-toggle:focus-visible { outline: 0; border-radius: var(--press-radius); }
1372
+ /* A phone has no room for the words; the button keeps its fill. */
1351
1373
  @media (max-width: 640px) {
1352
1374
  html[data-fullscreen="on"] .fullscreen-toggle { width: 36px; padding: 0; }
1353
1375
  .fullscreen-toggle__label { display: none; }
@@ -1374,7 +1396,7 @@ html[data-embed="on"] .app-content { padding-top: 0; }
1374
1396
  z-index: var(--z-topbar);
1375
1397
  max-width: min(320px, calc(100vw - 24px));
1376
1398
  padding: 8px 12px;
1377
- border-radius: 10px;
1399
+ border-radius: var(--press-radius);
1378
1400
  background: var(--bg-card);
1379
1401
  color: var(--ink);
1380
1402
  font-size: 13px;
@@ -1441,12 +1463,12 @@ html[data-embed="on"] .app-content { padding-top: 0; }
1441
1463
  (signing out). The sprites are pixel art, so they scale by whole pixels. */
1442
1464
  .craft-sprite { display: block; image-rendering: pixelated; object-fit: contain; }
1443
1465
  .craft-switch__me { padding: 0 10px 0 4px; color: var(--ink); }
1444
- /* The chip is the figure's head: the portrait cropped round its top third. */
1466
+ /* The chip is the figure's head: the portrait cropped to its top third. */
1445
1467
  .craft-sprite--chip { width: 26px; height: 26px; border-radius: var(--radius-pill); object-fit: cover; object-position: 50% 22%; }
1446
1468
  /* Character creation: each door is the owner's portrait — the figure on its plinth
1447
1469
  in the torch-lit hall — filling the top of the door, the words beneath it. */
1448
1470
  .craft-plinth { display: block; overflow: hidden; }
1449
- .craft-sprite--door { width: 100%; height: auto; aspect-ratio: 250 / 290; transition: transform 200ms cubic-bezier(.2, .7, .3, 1); }
1471
+ .craft-sprite--door { width: 100%; height: auto; aspect-ratio: 250 / 290; transition: transform var(--ds-dur-base) var(--ds-ease); }
1450
1472
  .craft-door--character:hover .craft-sprite--door,
1451
1473
  .craft-door--character:focus-visible .craft-sprite--door { transform: scale(1.03); }
1452
1474
 
@@ -1536,6 +1558,12 @@ html.setup-gate-open { overflow: hidden; }
1536
1558
  .setup-gate__foot { margin: 24px 0 0; font-size: 14px; }
1537
1559
  .setup-gate__foot a { color: var(--ink-soft); }
1538
1560
  @media (max-width: 640px) { .setup-gate__panel { padding: 28px 20px 20px; border-radius: 18px; } }
1561
+ /* THE PICKER IN HELM (task 1005194, ADR 0402). Two screens share these rules. The session
1562
+ picker ("What are you doing now?") is a square night panel over the scrim. Character
1563
+ creation (.craft-picker--create) is a whole screen, not a box: the night itself, the
1564
+ title centred in the name voice, three tall doors, the one line at the foot. A door is
1565
+ pressable, so it is cut; the door the hall suggests is the one thing lit. A cut clips an
1566
+ outline, so a door's focus is the inset ring (--press-focus). */
1539
1567
  .craft-picker {
1540
1568
  position: fixed;
1541
1569
  inset: 0;
@@ -1543,27 +1571,36 @@ html.setup-gate-open { overflow: hidden; }
1543
1571
  display: flex;
1544
1572
  align-items: flex-start;
1545
1573
  justify-content: center;
1546
- padding: max(24px, 8vh) 16px 24px;
1574
+ padding: max(var(--ds-space-md), 8vh) var(--ds-space-sm) var(--ds-space-md);
1547
1575
  overflow-y: auto;
1548
1576
  background: var(--scrim);
1549
1577
  }
1578
+ .craft-picker--create { background: var(--bg); }
1550
1579
  .craft-picker__panel {
1551
1580
  position: relative;
1552
1581
  width: min(1120px, 100%);
1553
1582
  box-sizing: border-box;
1554
1583
  display: flex;
1555
1584
  flex-direction: column;
1556
- gap: 12px;
1557
- padding: 40px 44px 30px;
1558
- border-radius: 22px;
1585
+ gap: var(--ds-space-xs);
1586
+ padding: var(--ds-space-lg) var(--ds-space-lg) var(--ds-space-md);
1559
1587
  background: var(--bg-card);
1560
1588
  color: var(--ink);
1561
- box-shadow: 0 0 0 1px var(--glass-edge), 0 24px 64px rgba(0, 0, 0, .35);
1589
+ border: var(--line-strong) solid var(--rule);
1590
+ box-shadow: var(--ds-shadow-pop);
1591
+ }
1592
+ .craft-picker__panel--create {
1593
+ padding: 0;
1594
+ gap: var(--ds-space-sm);
1595
+ background: none;
1596
+ border: 0;
1597
+ box-shadow: none;
1598
+ text-align: center;
1562
1599
  }
1563
1600
  .craft-picker__close {
1564
1601
  position: absolute;
1565
- top: 14px;
1566
- right: 14px;
1602
+ top: var(--ds-space-sm);
1603
+ right: var(--ds-space-sm);
1567
1604
  display: inline-flex;
1568
1605
  align-items: center;
1569
1606
  justify-content: center;
@@ -1585,44 +1622,88 @@ html.setup-gate-open { overflow: hidden; }
1585
1622
  text-transform: var(--label-case);
1586
1623
  color: var(--ink-faint);
1587
1624
  }
1625
+ .craft-picker__panel--create .craft-picker__eyebrow { color: var(--ink-soft); }
1588
1626
  .craft-picker__title {
1589
1627
  margin: 0;
1590
- font-family: var(--font-display);
1591
- font-size: clamp(28px, 4vw, 40px);
1592
- font-weight: 300;
1593
- letter-spacing: -0.03em;
1628
+ font-family: var(--name-face);
1629
+ font-size: var(--ds-text-headline);
1630
+ font-weight: var(--name-weight);
1631
+ letter-spacing: var(--name-space-tight);
1632
+ text-transform: var(--name-case);
1594
1633
  line-height: 1.15;
1634
+ text-wrap: balance;
1635
+ color: var(--ink);
1595
1636
  }
1596
- .craft-picker__lede { margin: 0 0 16px; font-size: 16px; line-height: 1.5; color: var(--ink-soft); }
1637
+ .craft-picker__panel--create .craft-picker__title { letter-spacing: var(--name-space-wide); text-shadow: var(--name-glow); }
1638
+ .craft-picker__lede { margin: 0 0 var(--ds-space-sm); font-size: var(--ds-text-xl); line-height: 1.5; color: var(--ink-soft); }
1639
+ /* character creation says its one line at the foot, under the doors; the words and the
1640
+ dialog's aria-describedby are where they were */
1641
+ .craft-picker__panel--create .craft-picker__lede { order: 3; margin: var(--ds-space-sm) 0 0; }
1642
+ .craft-picker__panel--create .craft-picker__error { order: 4; }
1597
1643
  .craft-picker__doors {
1598
1644
  display: grid;
1599
1645
  grid-template-columns: repeat(4, minmax(0, 1fr));
1600
- gap: 16px;
1646
+ gap: var(--ds-space-sm);
1601
1647
  }
1648
+ .craft-picker__panel--create .craft-picker__doors { gap: var(--ds-space-md); margin-top: var(--ds-space-md); }
1602
1649
  .craft-door {
1603
1650
  display: flex;
1604
1651
  flex-direction: column;
1605
1652
  align-items: stretch;
1606
- gap: 8px;
1607
- padding: 0 0 20px;
1653
+ gap: var(--ds-space-hair);
1654
+ padding: 0 0 var(--ds-space-md);
1608
1655
  overflow: hidden;
1609
1656
  border: 0;
1610
- border-radius: 14px;
1611
- background: var(--bg);
1612
- color: var(--ink);
1657
+ border-radius: var(--press-radius);
1658
+ clip-path: var(--cut-path);
1659
+ position: relative;
1660
+ background: var(--night-glass);
1661
+ color: var(--ink-soft);
1613
1662
  font: inherit;
1614
1663
  text-align: left;
1615
1664
  cursor: pointer;
1616
- box-shadow: inset 0 0 0 1px var(--glass-edge);
1617
- transition: transform 200ms cubic-bezier(.2, .7, .3, 1), box-shadow 200ms;
1618
- }
1619
- .craft-door:hover { transform: translateY(-3px); box-shadow: inset 0 0 0 1px var(--rule); }
1620
- .craft-door:focus-visible { outline: 2px solid var(--focus); outline-offset: 3px; }
1621
- .craft-door--pre { box-shadow: inset 0 0 0 2px var(--accent); }
1622
- .craft-door__head { display: flex; align-items: center; gap: 10px; padding: 10px 20px 0; }
1623
- .craft-door__icon { width: 20px; height: 20px; flex-shrink: 0; }
1624
- .craft-door__name { font-size: 20px; font-weight: 500; letter-spacing: -0.02em; }
1625
- .craft-door__line { padding: 0 20px; font-size: 14px; line-height: 1.45; color: var(--ink-soft); }
1665
+ box-shadow: inset 0 0 0 var(--line-strong) var(--rule);
1666
+ transition: background-color var(--ds-dur-fast) var(--ds-ease), box-shadow var(--ds-dur-fast) var(--ds-ease);
1667
+ }
1668
+ /* the door's edge again, over what it holds: an inset shadow sits under a portrait
1669
+ that fills the door, so the hairline, the suggested door's edge and the focus ring
1670
+ would all stop at the picture */
1671
+ .craft-door::after { content: ""; position: absolute; inset: 0; pointer-events: none; box-shadow: inherit; }
1672
+ .craft-door:hover { background: var(--glass); box-shadow: inset 0 0 0 var(--line-strong) var(--ink-faint); }
1673
+ /* the door the hall suggests: the accent's wash inside the accent's edge */
1674
+ .craft-door--pre, .craft-door--pre:hover { background: var(--accent-tint); box-shadow: inset 0 0 0 2px var(--accent); }
1675
+ .craft-door:focus-visible { outline: 0; border-radius: var(--press-radius); box-shadow: var(--press-focus); }
1676
+ .craft-door__head { display: flex; align-items: center; gap: var(--ds-space-xs); padding: var(--ds-space-xs) var(--ds-space-md) 0; }
1677
+ .craft-door__icon { width: 20px; height: 20px; flex-shrink: 0; color: var(--ink); }
1678
+ .craft-door__name {
1679
+ font-family: var(--name-face);
1680
+ font-size: var(--ds-text-4xl);
1681
+ font-weight: var(--name-weight);
1682
+ letter-spacing: var(--name-space-tight);
1683
+ text-transform: var(--name-case);
1684
+ line-height: 1;
1685
+ color: var(--ink);
1686
+ }
1687
+ .craft-door--pre .craft-door__name { font-weight: var(--name-weight-lit); }
1688
+ .craft-door__line { padding: 0 var(--ds-space-md); font-size: var(--ds-text-lg); line-height: 1.45; color: var(--ink-soft); }
1689
+ /* a character's door: the portrait fills the top under the cut, the name is the largest
1690
+ thing on it, and the door under the keyboard names the key that takes it */
1691
+ .craft-door--character { gap: var(--ds-space-xs); }
1692
+ .craft-door--character .craft-door__head { flex-wrap: wrap; padding-top: var(--ds-space-sm); }
1693
+ .craft-door--character .craft-door__name { font-size: var(--ds-text-headline); letter-spacing: var(--name-space); }
1694
+ .craft-door--character .craft-door__line { font-size: var(--ds-text-2xl); }
1695
+ .craft-door--character:focus-visible .craft-door__head::after {
1696
+ content: "Enter";
1697
+ padding: 2px var(--ds-space-hair);
1698
+ background: var(--accent);
1699
+ color: var(--accent-on);
1700
+ font-family: var(--name-face);
1701
+ font-size: var(--ds-text-md);
1702
+ font-weight: var(--name-weight-lit);
1703
+ letter-spacing: var(--label-space);
1704
+ text-transform: var(--name-case);
1705
+ line-height: 1.2;
1706
+ }
1626
1707
  .craft-art {
1627
1708
  position: relative;
1628
1709
  display: block;
@@ -1662,22 +1743,22 @@ html.setup-gate-open { overflow: hidden; }
1662
1743
  flex-wrap: wrap;
1663
1744
  align-items: center;
1664
1745
  justify-content: space-between;
1665
- gap: 12px 24px;
1666
- margin-top: 14px;
1667
- padding-top: 18px;
1668
- border-top: 1px solid var(--rule-soft);
1746
+ gap: var(--ds-space-xs) var(--ds-space-md);
1747
+ margin-top: var(--ds-space-sm);
1748
+ padding-top: var(--ds-space-sm);
1749
+ border-top: var(--line) solid var(--rule-soft);
1669
1750
  }
1670
1751
  .craft-picker__again {
1671
1752
  display: inline-flex;
1672
1753
  align-items: center;
1673
- gap: 10px;
1754
+ gap: var(--ds-space-xs);
1674
1755
  min-height: 24px;
1675
- font-size: 14px;
1756
+ font-size: var(--ds-text-md);
1676
1757
  color: var(--ink-soft);
1677
1758
  cursor: pointer;
1678
1759
  }
1679
1760
  .craft-picker__again input { width: 18px; height: 18px; margin: 0; accent-color: var(--accent); }
1680
- .craft-picker__hint { font-size: 13px; color: var(--ink-faint); }
1761
+ .craft-picker__hint { font-size: var(--ds-text-sm); color: var(--ink-faint); }
1681
1762
  .craft-picker__close:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
1682
1763
  /* task 1004685 (prototype): Governing is a held seat, so a builder with none sees
1683
1764
  three doors, not four (craft-mode.js stamps the count). */
@@ -1688,20 +1769,22 @@ html.setup-gate-open { overflow: hidden; }
1688
1769
  .craft-picker__doors { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1689
1770
  }
1690
1771
  @media (max-width: 640px) {
1691
- .craft-picker { padding: 12px; }
1692
- .craft-picker__panel { padding: 28px 18px 20px; gap: 8px; border-radius: 18px; }
1693
- .craft-picker__doors { grid-template-columns: minmax(0, 1fr); gap: 10px; }
1694
- .craft-door { flex-direction: row; flex-wrap: wrap; align-items: center; gap: 4px 0; padding: 0 0 14px; }
1772
+ .craft-picker { padding: var(--ds-space-xs); }
1773
+ .craft-picker--create { padding: var(--ds-space-md) var(--ds-space-xs); }
1774
+ .craft-picker__panel { padding: var(--ds-space-md) var(--ds-space-sm) var(--ds-space-sm); gap: var(--ds-space-hair); }
1775
+ .craft-picker__panel--create { padding: 0; }
1776
+ .craft-picker__doors, .craft-picker__panel--create .craft-picker__doors { grid-template-columns: minmax(0, 1fr); gap: var(--ds-space-xs); }
1777
+ .craft-door { flex-direction: row; flex-wrap: wrap; align-items: center; gap: 4px 0; padding: 0 0 var(--ds-space-sm); clip-path: var(--cut-path-sm); }
1695
1778
  .craft-art { flex: 0 0 100%; height: 96px; }
1696
1779
  .craft-art__city { top: -8px; }
1697
- .craft-door__head { padding: 10px 16px 0; }
1698
- .craft-door__name { font-size: 18px; }
1699
- .craft-door__line { flex: 0 0 100%; padding: 0 16px; box-sizing: border-box; }
1780
+ .craft-door__head { padding: var(--ds-space-xs) var(--ds-space-sm) 0; }
1781
+ .craft-door__line { flex: 0 0 100%; padding: 0 var(--ds-space-sm); box-sizing: border-box; }
1700
1782
  /* A phone stacks the three as rows: the portrait on the left, the words beside it. */
1701
- .craft-door.craft-door--character { display: grid; grid-template-columns: 86px minmax(0, 1fr); grid-template-rows: auto 1fr; align-content: start; gap: 4px 14px; padding: 0; }
1783
+ .craft-door.craft-door--character { display: grid; grid-template-columns: 86px minmax(0, 1fr); grid-template-rows: auto 1fr; align-content: start; gap: 4px var(--ds-space-sm); padding: 0; }
1702
1784
  .craft-plinth { grid-row: 1 / span 2; width: 86px; }
1703
- .craft-door.craft-door--character > .craft-door__head { padding: 12px 14px 0 0; }
1704
- .craft-door.craft-door--character > .craft-door__line { padding: 0 14px 12px 0; }
1785
+ .craft-door.craft-door--character > .craft-door__head { padding: var(--ds-space-xs) var(--ds-space-sm) 0 0; }
1786
+ .craft-door.craft-door--character > .craft-door__line { padding: 0 var(--ds-space-sm) var(--ds-space-xs) 0; font-size: var(--ds-text-lg); }
1787
+ .craft-door--character .craft-door__name { font-size: var(--ds-text-5xl); letter-spacing: var(--name-space-tight); }
1705
1788
  }
1706
1789
 
1707
1790
  /* THE CRAFT MODE LOOKS (task 1004495; direction docs/design/craft-mode-direction.md).
@@ -4218,10 +4301,15 @@ html[data-door="out"] #hall-main { width: 100%; }
4218
4301
  color: var(--accent-ink);
4219
4302
  background: var(--accent-tint);
4220
4303
  border: 0;
4221
- border-radius: var(--radius-pill);
4304
+ border-radius: var(--press-radius);
4305
+ /* Helm (task 1005194): a chip is pressed, so it takes the small cut and the
4306
+ inset focus ring */
4307
+ clip-path: var(--cut-path-sm);
4308
+ --focus-ring: var(--press-focus);
4222
4309
  cursor: pointer;
4223
4310
  }
4224
4311
  .chip:hover { color: var(--ink); }
4312
+ .chip:focus-visible { outline: 0; border-radius: var(--press-radius); }
4225
4313
 
4226
4314
  /* tab strip — the .setup__tab idiom in the .setup__toggle frame, promoted */
4227
4315
  /* A tab strip is hairlines, not a segmented box: one rule under the row and a
@@ -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-helm">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm2">
12
12
  <!-- The record archetype (shared with idea.html) and this page's own two
13
13
  shapes. Promoted out of an inline <style> by task 1003305 — the block was
14
14
  the hall's last substantive one and sat at its hall_audit ratchet. -->
@@ -57,10 +57,10 @@
57
57
  <!-- The app shell (sidebar + top bar + footer). Dependency-free; runs at parse
58
58
  time so the chrome exists before the deferred page scripts execute. -->
59
59
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
60
- <script src="/builders/shell-game.js?v=2026-11-11-helm"></script>
60
+ <script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
61
61
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
62
62
  <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
63
- <script src="/builders/shell.js?v=2026-11-11-helm"></script>
63
+ <script src="/builders/shell.js?v=2026-11-11-view2"></script>
64
64
  <script src="/builders/hall-dialog.js"></script>
65
65
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
66
66
  <script src="/builders/palette.js" defer></script>
@@ -12,8 +12,8 @@
12
12
  links, injected into this head by the server like every hall page's
13
13
  (tests/hall_tokens.mjs: no hall page hardcodes a web-font stylesheet).
14
14
  The template carried its own Google Fonts link for the same two faces. -->
15
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm">
16
- <link rel="stylesheet" href="/builders/visor.css?v=2026-11-10-visor">
15
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm2">
16
+ <link rel="stylesheet" href="/builders/visor.css?v=2026-11-11-helm2">
17
17
  <link rel="stylesheet" href="/builders/thinking.css?v=2026-11-10-visor">
18
18
  </head>
19
19
  <!-- THE SKY (task 1004231 / sky part 3 of 5, goal 1000095; ADR 0331, ADR 0227
@@ -140,13 +140,13 @@
140
140
  </div>
141
141
 
142
142
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
143
- <script src="/builders/shell-game.js?v=2026-11-11-helm"></script>
143
+ <script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
144
144
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
145
145
  <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
146
- <script src="/builders/shell.js?v=2026-11-11-helm"></script>
146
+ <script src="/builders/shell.js?v=2026-11-11-view2"></script>
147
147
  <script src="/builders/hall-dialog.js"></script>
148
148
  <!-- task 1005148: the visor (glass over the scene, game mode only; ADR 0399), after the shell and hall-dialog.js -->
149
- <script src="/builders/visor.js?v=2026-11-10-visor"></script>
149
+ <script src="/builders/visor.js?v=2026-11-11-view2"></script>
150
150
  <script src="/builders/palette.js" defer></script>
151
151
 
152
152
  <script src="/builders/idea-objects.js?v=2026-09-27-split"></script>
@@ -10,7 +10,7 @@
10
10
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
11
11
  <link rel="preconnect" href="https://fonts.googleapis.com">
12
12
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
13
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm">
13
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm2">
14
14
  <link rel="stylesheet" href="/builders/tweak-editor.css?v=2026-09-29-tw27-aqfix">
15
15
  </head>
16
16
  <!-- THE TWEAK EDITOR (task 1004321 / BV2.TW10, goal 1000095; ADR 0341 D4 and
@@ -143,10 +143,10 @@
143
143
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
144
144
 
145
145
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
146
- <script src="/builders/shell-game.js?v=2026-11-11-helm"></script>
146
+ <script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
147
147
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
148
148
  <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
149
- <script src="/builders/shell.js?v=2026-11-11-helm"></script>
149
+ <script src="/builders/shell.js?v=2026-11-11-view2"></script>
150
150
  <script src="/builders/hall-dialog.js"></script>
151
151
  <script src="/builders/palette.js" defer></script>
152
152
  <script src="/builders/brand-holes.js?v=2026-09-29-aqfix"></script>
@@ -38,7 +38,7 @@ html[data-game="on"] .visor:not([hidden]) {
38
38
  .visor__pill:hover { border-color: var(--ink-faint); }
39
39
  .visor__pill:focus-visible, .visor__row:focus-visible, .visor__close:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
40
40
  .visor__pill--main { left: var(--visor-inset-left); bottom: var(--visor-inset-bottom); background: var(--accent); color: var(--accent-on); border-color: var(--accent); font-weight: 500; }
41
- .visor__pill--main:hover { border-color: var(--accent-deep); }
41
+ .visor__pill--main:hover { border-color: var(--accent-lift); }
42
42
  .visor__pill--actions { right: var(--visor-inset-right); top: var(--visor-inset-top); }
43
43
  .visor__pill[hidden] { display: none; }
44
44
  .visor__dots { width: 14px; height: 4px; background: radial-gradient(circle, currentColor 1.5px, transparent 2px) 0 0 / 5px 4px repeat-x; }
@@ -72,7 +72,7 @@ html[data-game="on"] .visor:not([hidden]) {
72
72
  background: none; border: 0; border-top: var(--ds-line) solid var(--rule-soft);
73
73
  color: var(--ink); font: inherit; font-size: var(--ds-text-sm); text-align: left; text-decoration: none; cursor: pointer;
74
74
  }
75
- .visor__row:hover { color: var(--accent-deep); }
75
+ .visor__row:hover { color: var(--accent-ink); }
76
76
  .visor__row--hint { cursor: default; color: var(--ink-soft); }
77
77
  .visor__row--hint:hover { color: var(--ink-soft); }
78
78
 
@@ -69,7 +69,13 @@
69
69
  var mode = typeof C.current === 'function' ? C.current() : null;
70
70
  return ACTIONS[mode] ? mode : null;
71
71
  }
72
- function actionsFor(id) { return ACTIONS[id] ? ACTIONS[id].slice() : []; }
72
+ // Game mode reaches only the game's places (task 1005200): an action that opens a classic
73
+ // page is off the glass until that page has a game version. A tool is always this page's.
74
+ function inGame(a) {
75
+ var G = window.OTBShellGame;
76
+ return !a.href || !G || typeof G.isPlace !== 'function' || G.isPlace(a.href);
77
+ }
78
+ function actionsFor(id) { return ACTIONS[id] ? ACTIONS[id].filter(inGame) : []; }
73
79
  function credits() {
74
80
  var C = craft();
75
81
  var me = C && typeof C.me === 'function' ? C.me() : null;
@@ -11,7 +11,7 @@
11
11
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
12
12
  <link rel="preconnect" href="https://fonts.googleapis.com">
13
13
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
14
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm">
14
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm2">
15
15
  <!-- The oversight family's sheet (task 1003469): the figure band, the group
16
16
  head, the row, the form. Then the page's own: severities, the report
17
17
  reader, the grade trend. The attention tiles + tabs come from style.css's
@@ -269,10 +269,10 @@
269
269
  <!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
270
270
  chrome exists before the page script runs. -->
271
271
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
272
- <script src="/builders/shell-game.js?v=2026-11-11-helm"></script>
272
+ <script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
273
273
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
274
274
  <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
275
- <script src="/builders/shell.js?v=2026-11-11-helm"></script>
275
+ <script src="/builders/shell.js?v=2026-11-11-view2"></script>
276
276
  <script src="/builders/hall-dialog.js"></script>
277
277
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
278
278
  <script src="/builders/palette.js" defer></script>
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm2">
12
12
  <!-- Page-local styles (task 2170) — extracted from the old inline <style>
13
13
  block per the hall placement rules; shared pager/count-pill styles now
14
14
  live in style.css's hall-kit section. -->
@@ -172,10 +172,10 @@
172
172
  <!-- The app shell (sidebar + top bar + footer). Dependency-free; runs at parse
173
173
  time so the chrome exists before the deferred page scripts execute. -->
174
174
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
175
- <script src="/builders/shell-game.js?v=2026-11-11-helm"></script>
175
+ <script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
176
176
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
177
177
  <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
178
- <script src="/builders/shell.js?v=2026-11-11-helm"></script>
178
+ <script src="/builders/shell.js?v=2026-11-11-view2"></script>
179
179
  <script src="/builders/hall-dialog.js"></script>
180
180
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
181
181
  <script src="/builders/palette.js" defer></script>
@@ -38,6 +38,15 @@ Covers: every shelled hall page (`craft-mode.js`, `shell.js`, `style.css`), and
38
38
  - **Always-present tabs widened** (owner, 2026-10-03): `ALWAYS_TABS` is Builders, Collab and Profile, so every mode keeps the You and Community groups.
39
39
  - **Governing's header tallies** (task 1004563): `applyTallies()` draws "needs you N · moving M" right after the eyebrow, Governing only, hidden at <=960px (below that they squeezed the jump button under its own label, measured at 800px). Needs you is `GET /blockers?limit=1`'s `page.total`; moving is `GET /moving` (lifecycle, tasks `active` + `confirmed`, owner 2026-10-08), a count in SQL so the page never pulls task rows. Read once per page; a figure that cannot be read is LEFT OUT, never drawn as 0. The warm dot marks needs-you only above zero. It toggles the `hidden` ATTRIBUTE, never `.hidden =` (the nav gate owns that property; `tests/craft_mode_nav.mjs`). Pinned by `tests/craft_mode_tallies.mjs`.
40
40
 
41
+ ## The pickers in Helm (task 1005194, ADR 0402)
42
+
43
+ - **Character creation is a screen, not a box**: the night itself (`.craft-picker--create` on `--bg`), the title centred in the name voice, three tall doors, and the one line at the foot. The line is the same `#craft-picker-lede` the dialog is described by; CSS `order` moves it under the doors, the markup and words are unchanged.
44
+ - **A door is pressed, so it is cut** (`--cut-path`; the small cut on a phone, where the three stack as rows). The owner's portrait fills the top of the door under the cut; the name is the largest thing on it, in the name voice. The door the hall suggests (`.craft-door--pre`) is the one thing lit: the accent wash inside the accent edge. The door under the keyboard shows the inset ring and names its key ("Enter", a CSS label, as the start screen's Start does).
45
+ - **The edge is drawn twice.** A door's hairline, the suggested edge and the focus ring are inset shadows, and a portrait that fills the door would cover them, so `.craft-door::after` repeats the door's `box-shadow` over its contents.
46
+ - **The session picker** ("What are you doing now?") shares the rules: a square night panel with the strong hairline over the scrim, the title in the name voice, cut doors. Its four scenes (`.craft-art`) are untouched.
47
+ - **Not taken from the mock:** the two outer doors' perspective tilt (pixel art resamples badly under a 3D transform), the mark above the title, and the "Lands in …" line (no such words exist; the line under each name is still `CHARACTER_LINES`).
48
+ - **Tests:** `tests/hall_helm.mjs` ("character select is a Helm screen"); `tests/character_creation.mjs` still runs the behaviour.
49
+
41
50
  ## The paintbrush (task 1004497)
42
51
 
43
52
  - **Artist carries the palette and the paintbrush** (and the lightbulb, below): the palette (a feedback doc, `page-notes.js`, record `page-notes.md`) and the paintbrush (`paintbrush.js`). Both are `TOOLS` entries in `craft-mode.js` and load their own script on first press.
@@ -7,14 +7,15 @@ Covers: every shelled hall page (`shell-game.js`, `shell.js`). Spec: `docs/specs
7
7
  - **Game mode is the existing full-screen switch, made hall-wide. There is no second full-screen mode.** The switch was already on every page (task 1004430) but remembered per page, so a reader had to turn it on 33 times. Game mode is one `localStorage` key, `hall-game`; while it is `on`, `shell.js` `storedFullscreen()` answers yes for every page, whatever that page remembers. What hides, the corner button and the Escape hand-off are the shell's, unchanged.
8
8
  - **`shell-game.js` holds the mode and nothing else**: `window.OTBShellGame` = `on()`, `set(bool)`, `hint()`. It stamps `html[data-game="on"]` for a sheet or script that wants to read the mode. `shell.js` reads it through a fallback object, so a page without the file is never in game mode. It is its own file because `shell.js` sits on the 1,500-line ratchet; the start screen and options menu (R03, R04) are expected to grow here, not in `shell.js`.
9
9
  - **Load order**: `shell-game.js` before `shell-trail.js` / `craft-mode.js` / `shell.js`, loaded the same way (deferred or not) as the shell on that page. Test-pinned.
10
- - **Leaving is for this page load only.** In game mode the corner button brings the bars back (Escape did too until task 1005144; it opens the options menu now), and nothing is written: the next page opens without them again, and a page's own `hall-fullscreen:<page>` memory is never overwritten. Turning game mode off (`set(false)`) hands each page back what it remembered. `OTBShell.setFullscreen(null)` is the "re-read what should show" call `set()` uses.
10
+ - **Game or classic, never both (task 1005200, owner 2026-11-11).** Inside game mode there is no way back to the bars: the corner button is hidden (`style.css`) and does nothing if pressed, Escape opens the options menu, and the "how to leave" line is never shown. The only switch is Options → Preferences → View (`settings-view.js`), plus the chooser at every sign-in (`records/start-screen.md`). A page's own `hall-fullscreen:<page>` memory is still never overwritten, so switching to classic hands each page back what it remembered.
11
+ - **Game mode reaches only the game's places** (`shell-game.js` `PLACES`: home, city, goal-map, thinking, atlas, settings, profile). Any other hall page `location.replace`s to the city on load, and so does switching to game on one. A screen embedded in the options menu is exempt. The visor drops an action whose `href` is not a place (`visor.js` `inGame`). A page joins `PLACES` when it has a game version.
12
+ - **The choice is kept on the account**: `GET/PATCH /api/bongos/me/hall-view` (`modules/builder-settings/hall-view-prefs.js`, key `hall_view` in `behavior_prefs`, null = never chosen). `hall-game` in localStorage is only the copy a page paints from; `sync()` reads the account on every page load and switches if another browser changed it.
11
13
  - **No page may opt out.** `<body data-fullscreen-switch="off">` would keep that page's sidebar in game mode; the test fails on one. A new hall page needs `#app-topbar` and the `shell-game.js` tag, like the rest.
12
- - **The "how to leave" line shows once per tab in game mode** (`sessionStorage 'hall-game-hint'`), not on every page load. Outside game mode the shell's rule is unchanged.
13
- - **How it is turned on today**: `?game=on` / `?game=off` on any hall URL, or `OTBShellGame.set()`. Nothing in the hall's interface sets it yet; the start screen (R03) is where that lands.
14
+ - **`?game=on` / `?game=off` are gone** (task 1005200): the address no longer switches the view.
14
15
 
15
16
  ## For the tasks after this one
16
17
 
17
18
  - A HUD or options menu that wants Escape must call `preventDefault()` on the press. `shell.js` `onFullscreenKey` waits one tick before leaving so a listener added after it still wins.
18
- - Since R04 (task 1005144, ADR 0401) the last Escape in game mode opens the options menu (`shell-game.js` `onEscape`), and on the menu it closes it again. The corner button is still the way back to the bars.
19
+ - Since R04 (task 1005144, ADR 0401) the last Escape in game mode opens the options menu (`shell-game.js` `onEscape`), and on the menu it closes it again. Since task 1005200 there is no way back to the bars inside game mode.
19
20
 
20
21
  Tests: `tests/hall_fullscreen.mjs` (the eight `game mode:` cases run the real `shell-game.js` + `shell.js`), and the script lists in `tests/hall_city.mjs`, `tests/hall_street.mjs`, `tests/hall_my_agents.mjs`, `tests/goal_map_page.mjs`.
@@ -13,3 +13,14 @@ Every setting and configuration is reached from one vertical, grouped menu with
13
13
  - **Left the sidebar:** My agents, Project settings, Permissions, Modules (and their glyphs). The palette's agent rows open the menu; its Government rows are gone.
14
14
  - **Tests:** `tests/hall_options_menu.mjs` (the catalogue, gates, search, addresses, both redirect maps, the embedded page, game-mode Escape); `tests/hall_fullscreen.mjs` (Escape in game mode); `tests/market_watch_pages.mjs` (the settings panel in the frame).
15
15
  - **Known:** sounds are switched off (task 1004554), so the Sound entry shows its note, not a toggle.
16
+
17
+ ## The Helm look (task 1005194, ADR 0402)
18
+
19
+ The menu is a Helm screen, written from the hall tier's tokens alone (`settings.css` types in no colour or corner for it). Words, order, addresses, keys and aria are unchanged.
20
+
21
+ - **The menu** is one night panel (`--night-glass`) closed left and right by the strong ice hairline. The search is the hall's one field (`controls.css`), on the glass. An entry is a full-width row in the name voice on a soft hairline; the open entry is the accent bar under its dark ink; a group head is an ice label. Focus is the inset ring (`--press-focus`), so it reads on the accent bar too.
22
+ - **The open screen** carries its name over the strong hairline: `options-menu.js` `nameScreen()` writes the open entry's own label into `#opt-screen` (a `<p aria-hidden="true">`; the rail's `aria-current` link and each frame's `aria-label` already say it). Settings' own sections are rows on soft hairlines, not cards, with their titles in the name voice. A frame sits under the name and still fills the column to the window's foot.
23
+ - **Full screen and game mode:** the panel runs the window's full height from the top edge and names itself (`.opt-title`, the nav's own label, hidden while the top bar is up because the bar already says it). The pull to the top edge is the 60px the shell leaves a plain page above its content (`style.css`, `data-fullscreen-plain`); if that changes, change `.opt-rail`'s `margin-top` with it.
24
+ - **Widths:** the panel is `min(--helm-panel-w, 32%)` of the content column; below 860px it stacks above the screen as before. A long label wraps inside its row.
25
+ - **Not built** (the mock shows them on a Controls screen the hall does not have): the key-binding rows, "Reset all keys", and a visible "Back to the city" button. Escape still closes the menu in game mode.
26
+ - **Tests:** `tests/hall_helm.mjs` ("the options menu is a Helm screen"); the kit states in `settings.states.json` render clean at 1440, 390 and 320.
@@ -23,3 +23,7 @@ Covers: Home (`shell-game.js` `start()`, `shell-game.css`, the hand-off in `welc
23
23
  - New art for the start screen (the city in the clouds) is task 1005196; `welcome-boot.js` still hands in the welcome's painting.
24
24
 
25
25
  Tests: `tests/hall_start_screen.mjs` (the hand-off and pure parts in a vm; both screens, the panel's place at desk and phone widths, the segments, Quit, the no-city and reduced-motion paths in a real browser).
26
+
27
+ ## The view chooser (task 1005200, owner 2026-11-11)
28
+
29
+ Every sign-in now opens on a chooser before the start screen: **Game** or **Classic**, each with one line saying what it is. The view chosen last time (the browser's `hall-game` copy) is marked "Last time", lit with the accent on its edge, and focused, so Enter keeps it. Game goes on to the start screen as before; Classic closes the screen and the hall is as it always was. Either choice is saved to the account (`PATCH /api/bongos/me/hall-view`). The Extras list lost The docs: it is not a game place. Tests: `tests/hall_start_screen.mjs`.
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.24.81",
3
+ "version": "1.24.83",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.24.81",
9
+ "version": "1.24.83",
10
10
  "license": "AGPL-3.0-or-later",
11
11
  "dependencies": {
12
12
  "express": "^4.21.2",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.24.81",
3
+ "version": "1.24.83",
4
4
  "description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "main": "src/platform-server.js",