@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.
- package/.bongos-core.json +95 -80
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +4 -0
- package/clients/bongos-client/index.cjs +4 -0
- package/clients/bongos-client/index.d.ts +5 -0
- package/clients/bongos-client/index.mjs +4 -0
- package/docs/adr/0402-helm-is-the-halls-look-and-the-hall-is-dark-only.md +4 -0
- package/docs/api/openapi.json +86 -2
- package/docs/api-reference.md +4 -2
- package/docs/copy-inventory.md +39 -33
- package/docs/copy-registry.json +107 -52
- package/docs/module-api-changelog.md +4 -0
- package/docs/page-inventory.json +1 -0
- package/docs/page-readings.json +207 -201
- package/modules/builder-settings/hall-view-prefs.js +50 -0
- package/modules/builder-settings/routes/settings.js +32 -0
- package/modules/hall-ui/public/ai-studio.html +3 -3
- package/modules/hall-ui/public/atlas.html +3 -3
- package/modules/hall-ui/public/blockers.html +3 -3
- package/modules/hall-ui/public/board-room.html +3 -3
- package/modules/hall-ui/public/city.html +5 -5
- package/modules/hall-ui/public/collab.html +3 -3
- package/modules/hall-ui/public/commands.html +3 -3
- package/modules/hall-ui/public/controls.css +10 -2
- package/modules/hall-ui/public/copy-desk.html +3 -3
- package/modules/hall-ui/public/deploy.html +3 -3
- package/modules/hall-ui/public/goal-map.html +5 -5
- package/modules/hall-ui/public/goals.html +3 -3
- package/modules/hall-ui/public/government.html +3 -3
- package/modules/hall-ui/public/idea.html +3 -3
- package/modules/hall-ui/public/ideas.html +3 -3
- package/modules/hall-ui/public/index.html +6 -6
- package/modules/hall-ui/public/market-watch-item.html +3 -3
- package/modules/hall-ui/public/market-watch-rules.html +3 -3
- package/modules/hall-ui/public/market-watch.html +3 -3
- package/modules/hall-ui/public/modules.html +3 -3
- package/modules/hall-ui/public/money.html +3 -3
- package/modules/hall-ui/public/my-agents.html +3 -3
- package/modules/hall-ui/public/options-menu.js +22 -1
- package/modules/hall-ui/public/primer.html +3 -3
- package/modules/hall-ui/public/profile.html +3 -3
- package/modules/hall-ui/public/project-settings.html +3 -3
- package/modules/hall-ui/public/roster.html +3 -3
- package/modules/hall-ui/public/settings-view.js +75 -0
- package/modules/hall-ui/public/settings.css +113 -46
- package/modules/hall-ui/public/settings.html +18 -5
- package/modules/hall-ui/public/shell-game.css +10 -0
- package/modules/hall-ui/public/shell-game.js +98 -33
- package/modules/hall-ui/public/shell.js +4 -3
- package/modules/hall-ui/public/street.html +3 -3
- package/modules/hall-ui/public/studio.html +3 -3
- package/modules/hall-ui/public/style.css +149 -61
- package/modules/hall-ui/public/task.html +3 -3
- package/modules/hall-ui/public/thinking.html +5 -5
- package/modules/hall-ui/public/tweak-editor.html +3 -3
- package/modules/hall-ui/public/visor.css +2 -2
- package/modules/hall-ui/public/visor.js +7 -1
- package/modules/hall-ui/public/watch.html +3 -3
- package/modules/hall-ui/public/work.html +3 -3
- package/modules/hall-ui/records/craft-mode.md +9 -0
- package/modules/hall-ui/records/game-mode.md +5 -4
- package/modules/hall-ui/records/options-menu.md +11 -0
- package/modules/hall-ui/records/start-screen.md +4 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +12 -0
- package/scripts/hall-preview/pref-writes.js +8 -1
- package/src/module-api.js +1 -1
- package/tests/design_tokens_shared.mjs +5 -1
- package/tests/hall_controls.mjs +1 -1
- package/tests/hall_fullscreen.mjs +42 -21
- package/tests/hall_helm.mjs +103 -1
- package/tests/hall_start_screen.mjs +38 -3
- package/tests/hall_topbar_320.mjs +7 -4
- package/tests/hall_view_prefs.mjs +42 -0
- package/tests/hall_visor.mjs +3 -2
- 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
|
-
|
|
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
|
|
1130
|
-
|
|
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-
|
|
1134
|
-
font-
|
|
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:
|
|
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
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
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
|
|
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(
|
|
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:
|
|
1557
|
-
padding:
|
|
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
|
-
|
|
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:
|
|
1566
|
-
right:
|
|
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(--
|
|
1591
|
-
font-size:
|
|
1592
|
-
font-weight:
|
|
1593
|
-
letter-spacing: -
|
|
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-
|
|
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:
|
|
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:
|
|
1607
|
-
padding: 0 0
|
|
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:
|
|
1611
|
-
|
|
1612
|
-
|
|
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
|
|
1617
|
-
transition:
|
|
1618
|
-
}
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
.craft-
|
|
1623
|
-
.craft-
|
|
1624
|
-
|
|
1625
|
-
.craft-
|
|
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:
|
|
1666
|
-
margin-top:
|
|
1667
|
-
padding-top:
|
|
1668
|
-
border-top:
|
|
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:
|
|
1754
|
+
gap: var(--ds-space-xs);
|
|
1674
1755
|
min-height: 24px;
|
|
1675
|
-
font-size:
|
|
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:
|
|
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:
|
|
1692
|
-
.craft-
|
|
1693
|
-
.craft-
|
|
1694
|
-
.craft-
|
|
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:
|
|
1698
|
-
.craft-
|
|
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
|
|
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:
|
|
1704
|
-
.craft-door.craft-door--character > .craft-door__line { padding: 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
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
16
|
-
<link rel="stylesheet" href="/builders/visor.css?v=2026-11-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
- **
|
|
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
|
-
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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",
|