@bongos/core 1.25.5 → 1.25.7
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 +69 -49
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +2 -0
- package/clients/bongos-client/index.cjs +2 -0
- package/clients/bongos-client/index.d.ts +4 -1
- package/clients/bongos-client/index.mjs +2 -0
- package/docs/api/openapi.json +56 -2
- package/docs/api-reference.md +4 -3
- package/docs/copy-inventory.md +20 -19
- package/docs/copy-registry.json +32 -23
- package/docs/module-api-changelog.md +2 -0
- package/docs/page-readings.json +49 -52
- package/modules/hall-ui/public/shell-game.js +132 -5
- package/modules/hall-ui/public/style.css +59 -0
- package/modules/hall-ui/public/visor.css +11 -0
- package/modules/hall-ui/public/visor.js +14 -5
- package/modules/hall-ui/public/welcome-boot.js +27 -11
- package/modules/hall-ui/records/game-menu.md +22 -0
- package/modules/hall-ui/records/game-mode.md +2 -2
- package/modules/hall-ui/records/options-menu.md +1 -1
- package/modules/hall-ui/records/start-screen.md +12 -2
- package/modules/hall-ui/records/visor.md +4 -0
- package/modules/onboarding/genesis-home.js +35 -1
- package/modules/onboarding/routes/onboarding.js +7 -2
- package/modules/provisioning/catalog-bridge.js +3 -0
- package/modules/provisioning/paid-shape-gate.js +3 -1
- package/modules/provisioning/provisioning.js +3 -3
- package/modules/provisioning/routes/provisioning.js +7 -4
- package/modules/provisioning/test-project.js +65 -0
- package/modules/ui-design/public/brand.html +1 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +25 -0
- package/scripts/bongos/government-walk.js +2 -2
- package/src/branding.js +7 -0
- package/src/module-api.js +1 -1
- package/tests/currency_label.mjs +3 -1
- package/tests/hall_game_menu.mjs +195 -0
- package/tests/hall_options_menu.mjs +4 -1
- package/tests/hall_start_screen.mjs +62 -8
- package/tests/hall_visor.mjs +40 -5
- package/tests/provision_settings_apply.mjs +2 -1
- package/tests/provisioning_paid_shape_gate.mjs +16 -0
- package/tests/provisioning_settings_env.mjs +2 -2
- package/tests/test_project.mjs +122 -0
- package/tests/wizard_demo.mjs +25 -4
package/docs/page-readings.json
CHANGED
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
"adr": "0341 D3",
|
|
6
6
|
"reread": "node scripts/bongos/page-reader.js --stale",
|
|
7
7
|
"how": ["Generated by node scripts/bongos/page-reader.js (BV2.TW04, task 1004315; ADR 0341 D3). Do not hand-edit.","One entry per page of docs/page-inventory.json. Lines are in page order: the default state first, and a line only another state shows sits where that state shows it, with its state named.","placement: placed = a docs/copy-registry.json row renders it (file, line, string_id); shared = shell text every page of the surface carries (top bar, sidebar, footer), with its row when the registry has one; unplaced = the registry cannot place it (a rewrite becomes an engineer task, ADR 0341 D4).","text keeps {…} where the registry row has a hole, or where a value the page read from its API was filled in. A string that is only such data is counted under omitted.data, not listed.","reading_hash is over the non-shared lines (key, section, text); files_hash is over the page's inventory files. --check compares files_hash only and never opens a browser.","Rendered through the hall-preview harness (hall) and the ui-design kit stub (landing, status), at 1280x800 with the clock pinned, so a reading is the fixture world's page."],
|
|
8
|
-
"counts": {"pages":45,"lines":
|
|
8
|
+
"counts": {"pages":45,"lines":4408,"placed":1634,"shared":369,"unplaced":2405,"omitted_data":2980},
|
|
9
9
|
"pages": [
|
|
10
10
|
{
|
|
11
11
|
"id": "builders:ai-studio",
|
|
12
12
|
"surface": "builders",
|
|
13
13
|
"title": "Studio",
|
|
14
14
|
"states_read": ["pick","describe","make","waiting","result","result-own","failed","balance","balance-all","out"],
|
|
15
|
-
"files_hash": "
|
|
15
|
+
"files_hash": "3d35f6429c350fff",
|
|
16
16
|
"reading_hash": "d9e0e85bcee4aff4",
|
|
17
17
|
"counts": {"lines":106,"placed":41,"shared":7,"unplaced":58},
|
|
18
18
|
"omitted": {"data":17},
|
|
@@ -131,7 +131,7 @@
|
|
|
131
131
|
"surface": "builders",
|
|
132
132
|
"title": "Repo Atlas",
|
|
133
133
|
"states_read": ["map","truth","detail","index","out"],
|
|
134
|
-
"files_hash": "
|
|
134
|
+
"files_hash": "edfe4cc950edf0d4",
|
|
135
135
|
"reading_hash": "6934dead335b2507",
|
|
136
136
|
"counts": {"lines":25,"placed":14,"shared":7,"unplaced":4},
|
|
137
137
|
"omitted": {"data":5},
|
|
@@ -169,7 +169,7 @@
|
|
|
169
169
|
"surface": "builders",
|
|
170
170
|
"title": "Blockers",
|
|
171
171
|
"states_read": ["default"],
|
|
172
|
-
"files_hash": "
|
|
172
|
+
"files_hash": "f922e0329e8eb75f",
|
|
173
173
|
"reading_hash": "60d73d854ced958a",
|
|
174
174
|
"counts": {"lines":36,"placed":17,"shared":7,"unplaced":12},
|
|
175
175
|
"omitted": {"data":51},
|
|
@@ -218,7 +218,7 @@
|
|
|
218
218
|
"surface": "builders",
|
|
219
219
|
"title": "Board Room",
|
|
220
220
|
"states_read": ["room","out","sitting-meta","objection-form"],
|
|
221
|
-
"files_hash": "
|
|
221
|
+
"files_hash": "4e378a78e17d9366",
|
|
222
222
|
"reading_hash": "0260b797b8dc1526",
|
|
223
223
|
"counts": {"lines":52,"placed":21,"shared":7,"unplaced":24},
|
|
224
224
|
"omitted": {"data":17},
|
|
@@ -283,7 +283,7 @@
|
|
|
283
283
|
"surface": "builders",
|
|
284
284
|
"title": "The city",
|
|
285
285
|
"states_read": ["city","fullscreen","focus","pins","living","card","card-ask"],
|
|
286
|
-
"files_hash": "
|
|
286
|
+
"files_hash": "914cb0dece28a131",
|
|
287
287
|
"reading_hash": "277096d903879a57",
|
|
288
288
|
"counts": {"lines":26,"placed":9,"shared":6,"unplaced":11},
|
|
289
289
|
"omitted": {"data":7},
|
|
@@ -322,7 +322,7 @@
|
|
|
322
322
|
"surface": "builders",
|
|
323
323
|
"title": "Collab",
|
|
324
324
|
"states_read": ["board","out"],
|
|
325
|
-
"files_hash": "
|
|
325
|
+
"files_hash": "3a06128fed49c33c",
|
|
326
326
|
"reading_hash": "e6452bf92231656f",
|
|
327
327
|
"counts": {"lines":82,"placed":36,"shared":6,"unplaced":40},
|
|
328
328
|
"omitted": {"data":23},
|
|
@@ -417,7 +417,7 @@
|
|
|
417
417
|
"surface": "builders",
|
|
418
418
|
"title": "Commands",
|
|
419
419
|
"states_read": ["in","out"],
|
|
420
|
-
"files_hash": "
|
|
420
|
+
"files_hash": "706fcc645c941fde",
|
|
421
421
|
"reading_hash": "ecc452689a8ee9d7",
|
|
422
422
|
"counts": {"lines":71,"placed":49,"shared":7,"unplaced":15},
|
|
423
423
|
"omitted": {"data":177},
|
|
@@ -501,7 +501,7 @@
|
|
|
501
501
|
"surface": "builders",
|
|
502
502
|
"title": "Copy desk",
|
|
503
503
|
"states_read": ["queue","out","search","composer","closer","proposer"],
|
|
504
|
-
"files_hash": "
|
|
504
|
+
"files_hash": "d9a01382c115a92a",
|
|
505
505
|
"reading_hash": "3819ef6fa8f6fb7c",
|
|
506
506
|
"counts": {"lines":72,"placed":36,"shared":7,"unplaced":29},
|
|
507
507
|
"omitted": {"data":94},
|
|
@@ -586,7 +586,7 @@
|
|
|
586
586
|
"surface": "builders",
|
|
587
587
|
"title": "Deploy",
|
|
588
588
|
"states_read": ["work","out"],
|
|
589
|
-
"files_hash": "
|
|
589
|
+
"files_hash": "b39bb32c17c12975",
|
|
590
590
|
"reading_hash": "3770e8b2fa56bee1",
|
|
591
591
|
"counts": {"lines":14,"placed":5,"shared":7,"unplaced":2},
|
|
592
592
|
"omitted": {"data":5},
|
|
@@ -613,7 +613,7 @@
|
|
|
613
613
|
"surface": "builders",
|
|
614
614
|
"title": "The sky",
|
|
615
615
|
"states_read": ["tour","sky","wells","ledger","full","full-back","out"],
|
|
616
|
-
"files_hash": "
|
|
616
|
+
"files_hash": "c8473c8bd6bfcff3",
|
|
617
617
|
"reading_hash": "4a879397a84631e3",
|
|
618
618
|
"counts": {"lines":50,"placed":25,"shared":6,"unplaced":19},
|
|
619
619
|
"omitted": {"data":10},
|
|
@@ -676,7 +676,7 @@
|
|
|
676
676
|
"surface": "builders",
|
|
677
677
|
"title": "Goals",
|
|
678
678
|
"states_read": ["list","filters","cards","detail","dependencies","out","uat","uat-panel","author"],
|
|
679
|
-
"files_hash": "
|
|
679
|
+
"files_hash": "ac39a09e8a923863",
|
|
680
680
|
"reading_hash": "13a5d07b3804b627",
|
|
681
681
|
"counts": {"lines":187,"placed":61,"shared":7,"unplaced":119},
|
|
682
682
|
"omitted": {"data":315},
|
|
@@ -876,7 +876,7 @@
|
|
|
876
876
|
"surface": "builders",
|
|
877
877
|
"title": "Government",
|
|
878
878
|
"states_read": ["constitution","out","permissions","board","constitution-tab"],
|
|
879
|
-
"files_hash": "
|
|
879
|
+
"files_hash": "ea32e1399fe5b394",
|
|
880
880
|
"reading_hash": "37c6878d60447fd6",
|
|
881
881
|
"counts": {"lines":65,"placed":27,"shared":7,"unplaced":31},
|
|
882
882
|
"omitted": {"data":276},
|
|
@@ -954,9 +954,9 @@
|
|
|
954
954
|
"surface": "builders",
|
|
955
955
|
"title": "Builders' Hall",
|
|
956
956
|
"states_read": ["home","out","founding","genesis","decide","demo","votes"],
|
|
957
|
-
"files_hash": "
|
|
958
|
-
"reading_hash": "
|
|
959
|
-
"counts": {"lines":
|
|
957
|
+
"files_hash": "db319ffd04ab0951",
|
|
958
|
+
"reading_hash": "c5f4986bd90e2a2a",
|
|
959
|
+
"counts": {"lines":29,"placed":8,"shared":8,"unplaced":13},
|
|
960
960
|
"omitted": {"data":4},
|
|
961
961
|
"notes": ["founding: an action failed (page.focus: Timeout 6000ms exceeded.); read as it stood"],
|
|
962
962
|
"lines": [
|
|
@@ -967,7 +967,7 @@
|
|
|
967
967
|
{"key":"L0005","section":"top bar","text":"Jump to…","placement":"shared","file":"modules/hall-ui/public/shell.js","line":536,"string_id":"eba610d25523"},
|
|
968
968
|
{"key":"L0006","section":"top bar","text":"Ctrl K","placement":"shared"},
|
|
969
969
|
{"key":"L0007","section":"top bar","text":"Artist","placement":"shared"},
|
|
970
|
-
{"key":"L0008","section":"Good morning, {…}","text":"Good morning, {…}","placement":"unplaced"
|
|
970
|
+
{"key":"L0008","section":"Good morning, {…}","text":"Good morning, {…}","placement":"unplaced"},
|
|
971
971
|
{"key":"L0009","section":"Good morning, {…}","text":"B","placement":"unplaced","occurrences":9},
|
|
972
972
|
{"key":"L0010","section":"Good morning, {…}","text":"Aug","placement":"unplaced"},
|
|
973
973
|
{"key":"L0011","section":"Good morning, {…}","text":"Oct","placement":"unplaced"},
|
|
@@ -977,21 +977,18 @@
|
|
|
977
977
|
{"key":"L0015","section":"Needs your attention13","text":"Ideas awaiting triage","placement":"placed","file":"modules/hall-ui/public/builders.js","line":320,"string_id":"e181637c5a5e"},
|
|
978
978
|
{"key":"L0016","section":"Needs your attention13","text":"Requires project {…} fix","placement":"unplaced"},
|
|
979
979
|
{"key":"L0017","section":"footer","text":"Sign out","placement":"shared","file":"modules/hall-ui/public/shell.js","line":514,"string_id":"1883ad7f07fc"},
|
|
980
|
-
{"key":"L0018","section":"
|
|
981
|
-
{"key":"L0019","section":"
|
|
982
|
-
{"key":"L0020","section":"
|
|
983
|
-
{"key":"L0021","section":"
|
|
984
|
-
{"key":"L0022","section":"
|
|
985
|
-
{"key":"L0023","section":"
|
|
986
|
-
{"key":"L0024","section":"
|
|
987
|
-
{"key":"L0025","section":"
|
|
988
|
-
{"key":"L0026","section":"
|
|
989
|
-
{"key":"L0027","section":"Update the builders hall?","text":"
|
|
990
|
-
{"key":"L0028","section":"Update the builders hall?","text":"
|
|
991
|
-
{"key":"L0029","section":"Update the builders hall?","text":"
|
|
992
|
-
{"key":"L0030","section":"Update the builders hall?","text":"Closed a security hole where a builder's branch could choose the program the server runs while auto-resolving merge…","placement":"unplaced"},
|
|
993
|
-
{"key":"L0031","section":"Update the builders hall?","text":"Later","placement":"unplaced"},
|
|
994
|
-
{"key":"L0032","section":"Update the builders hall?","text":"Update now","placement":"placed","file":"modules/hall-ui/public/update-pill.js","line":288,"string_id":"5fe7d2d395be"}
|
|
980
|
+
{"key":"L0018","section":"{…}","text":"How do you want to see it?","placement":"placed","file":"modules/hall-ui/public/shell-game.js","line":165,"string_id":"1e8da0baf421"},
|
|
981
|
+
{"key":"L0019","section":"{…}","text":"Game","placement":"unplaced"},
|
|
982
|
+
{"key":"L0020","section":"{…}","text":"The city, {…} screen","placement":"unplaced"},
|
|
983
|
+
{"key":"L0021","section":"{…}","text":"Classic","placement":"unplaced"},
|
|
984
|
+
{"key":"L0022","section":"{…}","text":"The hall with its sidebar","placement":"unplaced"},
|
|
985
|
+
{"key":"L0023","section":"{…}","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232"},
|
|
986
|
+
{"key":"L0024","section":"Update the builders hall?","text":"Update the builders hall?","placement":"unplaced"},
|
|
987
|
+
{"key":"L0025","section":"Update the builders hall?","text":"A newer version of Bongos is ready, with the latest changes and bug fixes.","placement":"placed","file":"modules/hall-ui/public/update-pill.js","line":604,"string_id":"105876fd9038"},
|
|
988
|
+
{"key":"L0026","section":"Update the builders hall?","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","occurrences":3},
|
|
989
|
+
{"key":"L0027","section":"Update the builders hall?","text":"Closed a security hole where a builder's branch could choose the program the server runs while auto-resolving merge…","placement":"unplaced"},
|
|
990
|
+
{"key":"L0028","section":"Update the builders hall?","text":"Later","placement":"unplaced"},
|
|
991
|
+
{"key":"L0029","section":"Update the builders hall?","text":"Update now","placement":"placed","file":"modules/hall-ui/public/update-pill.js","line":288,"string_id":"5fe7d2d395be"}
|
|
995
992
|
]
|
|
996
993
|
},
|
|
997
994
|
{
|
|
@@ -999,7 +996,7 @@
|
|
|
999
996
|
"surface": "builders",
|
|
1000
997
|
"title": "Idea",
|
|
1001
998
|
"states_read": ["record","missing"],
|
|
1002
|
-
"files_hash": "
|
|
999
|
+
"files_hash": "3f72b14ed91b7803",
|
|
1003
1000
|
"reading_hash": "f7d644748c87e426",
|
|
1004
1001
|
"counts": {"lines":52,"placed":25,"shared":8,"unplaced":19},
|
|
1005
1002
|
"omitted": {"data":25},
|
|
@@ -1064,7 +1061,7 @@
|
|
|
1064
1061
|
"surface": "builders",
|
|
1065
1062
|
"title": "Ideas",
|
|
1066
1063
|
"states_read": ["compose","full","develop"],
|
|
1067
|
-
"files_hash": "
|
|
1064
|
+
"files_hash": "69f7665f4d823b05",
|
|
1068
1065
|
"reading_hash": "a62c05dcef3bf87f",
|
|
1069
1066
|
"counts": {"lines":68,"placed":34,"shared":7,"unplaced":27},
|
|
1070
1067
|
"omitted": {"data":118},
|
|
@@ -1145,7 +1142,7 @@
|
|
|
1145
1142
|
"surface": "builders",
|
|
1146
1143
|
"title": "Market Watch",
|
|
1147
1144
|
"states_read": ["desk","settings","out"],
|
|
1148
|
-
"files_hash": "
|
|
1145
|
+
"files_hash": "d85500e69e188b5f",
|
|
1149
1146
|
"reading_hash": "30512dda207b5ea6",
|
|
1150
1147
|
"counts": {"lines":23,"placed":11,"shared":7,"unplaced":5},
|
|
1151
1148
|
"omitted": {"data":5},
|
|
@@ -1181,7 +1178,7 @@
|
|
|
1181
1178
|
"surface": "builders",
|
|
1182
1179
|
"title": "Market Watch",
|
|
1183
1180
|
"states_read": ["dossier","out","propose","correct","filtered"],
|
|
1184
|
-
"files_hash": "
|
|
1181
|
+
"files_hash": "ea3c71cb05717cc8",
|
|
1185
1182
|
"reading_hash": "129bff28c4e4ed6d",
|
|
1186
1183
|
"counts": {"lines":24,"placed":12,"shared":7,"unplaced":5},
|
|
1187
1184
|
"omitted": {"data":5},
|
|
@@ -1218,7 +1215,7 @@
|
|
|
1218
1215
|
"surface": "builders",
|
|
1219
1216
|
"title": "Market Watch rules",
|
|
1220
1217
|
"states_read": ["in","scoring","names","propose","out"],
|
|
1221
|
-
"files_hash": "
|
|
1218
|
+
"files_hash": "6f513cf7cdfe92ae",
|
|
1222
1219
|
"reading_hash": "ca0c62e8dce51c8b",
|
|
1223
1220
|
"counts": {"lines":36,"placed":12,"shared":7,"unplaced":17},
|
|
1224
1221
|
"omitted": {"data":20},
|
|
@@ -1267,7 +1264,7 @@
|
|
|
1267
1264
|
"surface": "builders",
|
|
1268
1265
|
"title": "Modules",
|
|
1269
1266
|
"states_read": ["browse","search-empty","lens","details","out"],
|
|
1270
|
-
"files_hash": "
|
|
1267
|
+
"files_hash": "2d24a52c632cde42",
|
|
1271
1268
|
"reading_hash": "6a12e9306bba5622",
|
|
1272
1269
|
"counts": {"lines":59,"placed":29,"shared":7,"unplaced":23},
|
|
1273
1270
|
"omitted": {"data":107},
|
|
@@ -1339,7 +1336,7 @@
|
|
|
1339
1336
|
"surface": "builders",
|
|
1340
1337
|
"title": "Money",
|
|
1341
1338
|
"states_read": ["money","hosting","out"],
|
|
1342
|
-
"files_hash": "
|
|
1339
|
+
"files_hash": "6096846da3462763",
|
|
1343
1340
|
"reading_hash": "e355d5466b123e07",
|
|
1344
1341
|
"counts": {"lines":83,"placed":28,"shared":7,"unplaced":48},
|
|
1345
1342
|
"omitted": {"data":27},
|
|
@@ -1435,7 +1432,7 @@
|
|
|
1435
1432
|
"surface": "builders",
|
|
1436
1433
|
"title": "My agents",
|
|
1437
1434
|
"states_read": ["desk","factory","saved","what-it-knows","speciality-walk","speciality-forms","nobody"],
|
|
1438
|
-
"files_hash": "
|
|
1435
|
+
"files_hash": "9c2b1b8aaf468c84",
|
|
1439
1436
|
"reading_hash": "5347e0496b38727d",
|
|
1440
1437
|
"counts": {"lines":100,"placed":33,"shared":7,"unplaced":60},
|
|
1441
1438
|
"omitted": {"data":38},
|
|
@@ -1548,7 +1545,7 @@
|
|
|
1548
1545
|
"surface": "builders",
|
|
1549
1546
|
"title": "Primer",
|
|
1550
1547
|
"states_read": ["in","toc-open","jump","out"],
|
|
1551
|
-
"files_hash": "
|
|
1548
|
+
"files_hash": "40d793bc1f676419",
|
|
1552
1549
|
"reading_hash": "85790bd421e5c387",
|
|
1553
1550
|
"counts": {"lines":487,"placed":57,"shared":7,"unplaced":423},
|
|
1554
1551
|
"omitted": {"data":18},
|
|
@@ -2048,7 +2045,7 @@
|
|
|
2048
2045
|
"surface": "builders",
|
|
2049
2046
|
"title": "Profile",
|
|
2050
2047
|
"states_read": ["own","works","activity","yours","activity-artist","activity-artist-ideas","other","artist","artist-ideas","out"],
|
|
2051
|
-
"files_hash": "
|
|
2048
|
+
"files_hash": "2e5aad6962c3c8b3",
|
|
2052
2049
|
"reading_hash": "3ff8d703d17e8c2a",
|
|
2053
2050
|
"counts": {"lines":232,"placed":84,"shared":7,"unplaced":141},
|
|
2054
2051
|
"omitted": {"data":263},
|
|
@@ -2293,7 +2290,7 @@
|
|
|
2293
2290
|
"surface": "builders",
|
|
2294
2291
|
"title": "Project settings",
|
|
2295
2292
|
"states_read": ["default"],
|
|
2296
|
-
"files_hash": "
|
|
2293
|
+
"files_hash": "3dde20d38f2c06da",
|
|
2297
2294
|
"reading_hash": "283df27d0d5bfc1b",
|
|
2298
2295
|
"counts": {"lines":43,"placed":25,"shared":7,"unplaced":11},
|
|
2299
2296
|
"omitted": {"data":33},
|
|
@@ -2349,7 +2346,7 @@
|
|
|
2349
2346
|
"surface": "builders",
|
|
2350
2347
|
"title": "Builders",
|
|
2351
2348
|
"states_read": ["roster","artists","search","out"],
|
|
2352
|
-
"files_hash": "
|
|
2349
|
+
"files_hash": "fd4aafc69104eed7",
|
|
2353
2350
|
"reading_hash": "665ac2e36339f5d3",
|
|
2354
2351
|
"counts": {"lines":56,"placed":17,"shared":7,"unplaced":32},
|
|
2355
2352
|
"omitted": {"data":137},
|
|
@@ -2418,7 +2415,7 @@
|
|
|
2418
2415
|
"surface": "builders",
|
|
2419
2416
|
"title": "Options",
|
|
2420
2417
|
"states_read": ["account","access","preferences","install-reports","sound","update"],
|
|
2421
|
-
"files_hash": "
|
|
2418
|
+
"files_hash": "6f61674891ca294c",
|
|
2422
2419
|
"reading_hash": "898a13fda24c3c90",
|
|
2423
2420
|
"counts": {"lines":162,"placed":104,"shared":7,"unplaced":51},
|
|
2424
2421
|
"omitted": {"data":23},
|
|
@@ -2593,7 +2590,7 @@
|
|
|
2593
2590
|
"surface": "builders",
|
|
2594
2591
|
"title": "The street",
|
|
2595
2592
|
"states_read": ["street","fullscreen","card","focus","here","inside-rules","inside-disputes","inside-people","inside-planning","inside-automation","inside-review","inside-release","inside-treasury","floor","amend","district","desk","desk-facts","desk-quiet","desk-people-builders","desk-people-tier","desk-disputes","desk-automation-goals","desk-release-core","desk-rules","desk-rules-category","desk-planning-priorities","desk-planning-ideas","desk-planning-blockers","pins","pins-pager","living","deck","deck-treasury","sitting","object","voted","admission","settled","blocker","blocker-more","report","report-more","core","core-more","recheck","recheck-more","idea","idea-more","queue","queue-more","automation","automation-more"],
|
|
2596
|
-
"files_hash": "
|
|
2593
|
+
"files_hash": "0824158dfe86879b",
|
|
2597
2594
|
"reading_hash": "e788e6bf4be8d68c",
|
|
2598
2595
|
"counts": {"lines":325,"placed":54,"shared":6,"unplaced":265},
|
|
2599
2596
|
"omitted": {"data":240},
|
|
@@ -2931,7 +2928,7 @@
|
|
|
2931
2928
|
"surface": "builders",
|
|
2932
2929
|
"title": "Studio",
|
|
2933
2930
|
"states_read": ["home","out","flow","flow-pick","status","words-offer","words-edit","reviews","full","full-back","approvals","approvals-before","approvals-phone","approvals-note","approved","sent-back","approvals-page"],
|
|
2934
|
-
"files_hash": "
|
|
2931
|
+
"files_hash": "b5217f22546d2ca2",
|
|
2935
2932
|
"reading_hash": "c4e3b4188c1db755",
|
|
2936
2933
|
"counts": {"lines":51,"placed":29,"shared":7,"unplaced":15},
|
|
2937
2934
|
"omitted": {"data":23},
|
|
@@ -2995,7 +2992,7 @@
|
|
|
2995
2992
|
"surface": "builders",
|
|
2996
2993
|
"title": "Task",
|
|
2997
2994
|
"states_read": ["record","from-goal","missing"],
|
|
2998
|
-
"files_hash": "
|
|
2995
|
+
"files_hash": "9a949acc81a483c6",
|
|
2999
2996
|
"reading_hash": "8dd803b6934e6388",
|
|
3000
2997
|
"counts": {"lines":151,"placed":46,"shared":9,"unplaced":96},
|
|
3001
2998
|
"omitted": {"data":111},
|
|
@@ -3159,7 +3156,7 @@
|
|
|
3159
3156
|
"surface": "builders",
|
|
3160
3157
|
"title": "Your thinking",
|
|
3161
3158
|
"states_read": ["tour","sky","list","simple","full-idea","full","full-list","full-back","out"],
|
|
3162
|
-
"files_hash": "
|
|
3159
|
+
"files_hash": "109968f4f22ab7b4",
|
|
3163
3160
|
"reading_hash": "b73f848b46b0f9b8",
|
|
3164
3161
|
"counts": {"lines":50,"placed":25,"shared":6,"unplaced":19},
|
|
3165
3162
|
"omitted": {"data":10},
|
|
@@ -3222,7 +3219,7 @@
|
|
|
3222
3219
|
"surface": "builders",
|
|
3223
3220
|
"title": "Tweak a page",
|
|
3224
3221
|
"states_read": ["doc","typed","chrome","submitted","picking","out"],
|
|
3225
|
-
"files_hash": "
|
|
3222
|
+
"files_hash": "a9131745a366382f",
|
|
3226
3223
|
"reading_hash": "f521f8d9a7147557",
|
|
3227
3224
|
"counts": {"lines":26,"placed":18,"shared":2,"unplaced":6},
|
|
3228
3225
|
"omitted": {"data":19},
|
|
@@ -3261,7 +3258,7 @@
|
|
|
3261
3258
|
"surface": "builders",
|
|
3262
3259
|
"title": "Watch",
|
|
3263
3260
|
"states_read": ["board","out","operations","security","sessions","autobongos"],
|
|
3264
|
-
"files_hash": "
|
|
3261
|
+
"files_hash": "b6a3ff14b1b63837",
|
|
3265
3262
|
"reading_hash": "1961a0c06b9d8477",
|
|
3266
3263
|
"counts": {"lines":72,"placed":33,"shared":7,"unplaced":32},
|
|
3267
3264
|
"omitted": {"data":52},
|
|
@@ -3346,7 +3343,7 @@
|
|
|
3346
3343
|
"surface": "builders",
|
|
3347
3344
|
"title": "Tasks",
|
|
3348
3345
|
"states_read": ["ready","in-progress","backlog","completed","filters-open","out","founding"],
|
|
3349
|
-
"files_hash": "
|
|
3346
|
+
"files_hash": "fb251657db11b790",
|
|
3350
3347
|
"reading_hash": "e9b412d1ec59ceee",
|
|
3351
3348
|
"counts": {"lines":122,"placed":49,"shared":7,"unplaced":66},
|
|
3352
3349
|
"omitted": {"data":323},
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
{ label: 'The atlas', href: '/atlas' },
|
|
104
104
|
];
|
|
105
105
|
var TIPS = [
|
|
106
|
-
'Escape opens the
|
|
106
|
+
'Escape opens the game menu: options, log out and exit.',
|
|
107
107
|
'Every tower is a goal. It gains a floor each time work ships under it.',
|
|
108
108
|
'A crane marks a site someone worked on this week.',
|
|
109
109
|
'A salmon dot on a tower means something there is waiting on you.',
|
|
@@ -303,9 +303,19 @@
|
|
|
303
303
|
if (open) box.querySelector('a').focus();
|
|
304
304
|
}
|
|
305
305
|
// Game: on to the start screen. Classic: the screen goes and the hall is as it always was.
|
|
306
|
+
// Signed out (task 1005219): the pick is kept for the trip, the visitor signs in, and the
|
|
307
|
+
// return opens the picked menu without asking again (start() reads PENDING_KEY).
|
|
306
308
|
function choose(view) {
|
|
307
309
|
if (phase !== 'choose') return;
|
|
310
|
+
if (opts && typeof opts.signIn === 'function') {
|
|
311
|
+
write('localStorage', PENDING_KEY, view);
|
|
312
|
+
opts.signIn();
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
308
315
|
if (view === 'classic') { set(false); close(); return; }
|
|
316
|
+
toMenu();
|
|
317
|
+
}
|
|
318
|
+
function toMenu() {
|
|
309
319
|
set(true);
|
|
310
320
|
phase = 'menu';
|
|
311
321
|
root.querySelector('#gs-ask').hidden = true;
|
|
@@ -344,10 +354,30 @@
|
|
|
344
354
|
f[(at + step + f.length) % f.length].focus();
|
|
345
355
|
}
|
|
346
356
|
|
|
347
|
-
//
|
|
348
|
-
//
|
|
357
|
+
// The hall's front opens on the chooser once each time the site is opened (task 1005219;
|
|
358
|
+
// owner, 2026-11-12: "every visit"): one sessionStorage mark per tab, so moving about the
|
|
359
|
+
// hall (game mode sends a classic page Home) never asks again. Storage that throws: never asked twice.
|
|
360
|
+
var SEEN_KEY = 'hall-chooser-seen';
|
|
361
|
+
var PENDING_KEY = 'hall-view-pending';
|
|
362
|
+
function seen() {
|
|
363
|
+
try { return window.sessionStorage.getItem(SEEN_KEY) === '1'; } catch (_) { return true; }
|
|
364
|
+
}
|
|
365
|
+
// The view a visitor picked before signing in, read once.
|
|
366
|
+
function takePending() {
|
|
367
|
+
var v = read('localStorage', PENDING_KEY);
|
|
368
|
+
try { window.localStorage.removeItem(PENDING_KEY); } catch (_) { /* nothing kept */ }
|
|
369
|
+
return v === 'game' || v === 'classic' ? v : null;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// Put the start screen up. `o`: { name, art, done, signIn } — the project's name, the still to
|
|
373
|
+
// stand behind both screens, what to do once the world is showing, and (signed out) how to sign
|
|
374
|
+
// in once a view is picked. True when it is up; false for a classic pick made before sign-in,
|
|
375
|
+
// which goes straight to the hall.
|
|
349
376
|
function start(o) {
|
|
350
377
|
if (root || !document.body) return !!root;
|
|
378
|
+
write('sessionStorage', SEEN_KEY, '1');
|
|
379
|
+
var pending = o && o.signIn ? null : takePending();
|
|
380
|
+
if (pending === 'classic') { set(false); return false; }
|
|
351
381
|
opts = o || {};
|
|
352
382
|
phase = 'choose';
|
|
353
383
|
root = document.createElement('div');
|
|
@@ -361,6 +391,7 @@
|
|
|
361
391
|
document.addEventListener('keydown', onKey, true);
|
|
362
392
|
document.body.appendChild(root);
|
|
363
393
|
document.documentElement.classList.add('gs-open');
|
|
394
|
+
if (pending === 'game') { toMenu(); return true; }
|
|
364
395
|
var first = root.querySelector('.gs__item--lit') || root.querySelector('.gs__item');
|
|
365
396
|
if (first && first.focus) first.focus();
|
|
366
397
|
return true;
|
|
@@ -409,10 +440,103 @@
|
|
|
409
440
|
if (host && host.OTBOptions && typeof host.OTBOptions.escape === 'function') { host.OTBOptions.escape(); return; }
|
|
410
441
|
if (host && host.OTBOptionsOverlay && host.OTBOptionsOverlay.isOpen()) { host.OTBOptionsOverlay.close(); return; }
|
|
411
442
|
if (embedded) return;
|
|
412
|
-
|
|
443
|
+
if (menuOpen()) { closeMenu(); return; }
|
|
444
|
+
openMenu();
|
|
413
445
|
}, 0);
|
|
414
446
|
}
|
|
415
447
|
|
|
448
|
+
// ---------- the game menu (task 1005250) ----------
|
|
449
|
+
// Game mode has no sidebar, so it had no way to sign out or to quit. The last Escape (and
|
|
450
|
+
// the visor's Menu hint and the Actions sheet's last row) now opens ONE small menu over the
|
|
451
|
+
// place, as a game does: Options (the options window below), Change character, Log out,
|
|
452
|
+
// Exit game, Return to game. It is the hall's shared dialog (OTBDialog.bind): Escape, the
|
|
453
|
+
// scrim, the focus trap and the focus return are its. A new advanced action is one row in
|
|
454
|
+
// GAME_MENU and one line in onMenuClick. Rules: modules/hall-ui/records/game-menu.md.
|
|
455
|
+
var GAME_MENU = [
|
|
456
|
+
{ id: 'options', label: 'Options' },
|
|
457
|
+
{ id: 'character', label: 'Change character' },
|
|
458
|
+
// shell.js turns a click on any link to the logout address into the real sign-out
|
|
459
|
+
{ id: 'logout', label: 'Log out', href: '/api/bongos/auth/logout', gap: true },
|
|
460
|
+
{ id: 'exit', label: 'Exit game' },
|
|
461
|
+
{ id: 'return', label: 'Return to game', gap: true },
|
|
462
|
+
];
|
|
463
|
+
var menuEl = null, menuDlg = null;
|
|
464
|
+
function menuOpen() { return !!(menuDlg && menuDlg.isOpen()); }
|
|
465
|
+
function closeMenu() { if (menuOpen()) menuDlg.close(); }
|
|
466
|
+
// Change character is craft-mode.js's; a page without it shows no such row.
|
|
467
|
+
function menuRows() {
|
|
468
|
+
var C = window.OTBCraftMode;
|
|
469
|
+
return GAME_MENU.filter(function (m) { return m.id !== 'character' || !!(C && typeof C.changeCharacter === 'function'); });
|
|
470
|
+
}
|
|
471
|
+
function menuRowHtml(m) {
|
|
472
|
+
var attrs = ' class="game-menu__item' + (m.id === 'return' ? ' game-menu__item--lit' : '') + '" data-gm="' + m.id + '"';
|
|
473
|
+
return '<li' + (m.gap ? ' class="game-menu__gap"' : '') + '>' +
|
|
474
|
+
(m.href ? '<a' + attrs + ' href="' + esc(m.href) + '">' + esc(m.label) + '</a>' : '<button type="button"' + attrs + '>' + esc(m.label) + '</button>') + '</li>';
|
|
475
|
+
}
|
|
476
|
+
var exitTimer = 0;
|
|
477
|
+
// Any new word in the note (a fresh opening clears it) drops a pending Exit check, so an
|
|
478
|
+
// Exit pressed just before the menu was shut cannot speak into the next opening.
|
|
479
|
+
function menuSay(text) {
|
|
480
|
+
clearTimeout(exitTimer); exitTimer = 0;
|
|
481
|
+
var note = menuEl && menuEl.querySelector('.game-menu__note');
|
|
482
|
+
if (!note) return;
|
|
483
|
+
note.textContent = text;
|
|
484
|
+
note.hidden = !text;
|
|
485
|
+
}
|
|
486
|
+
// Exit closes the tab. A browser only lets a script close a tab a script opened, so when
|
|
487
|
+
// the tab is still here a moment later the menu says so (the start screen's Quit, again).
|
|
488
|
+
function exitGame() {
|
|
489
|
+
try { window.close(); } catch (_) { /* refused */ }
|
|
490
|
+
clearTimeout(exitTimer);
|
|
491
|
+
exitTimer = setTimeout(function () { exitTimer = 0; if (menuOpen()) menuSay('Your browser kept this tab open. Close it to quit.'); }, 300);
|
|
492
|
+
}
|
|
493
|
+
function onMenuClick(e) {
|
|
494
|
+
var el = e.target && e.target.closest ? e.target.closest('[data-gm]') : null;
|
|
495
|
+
var id = el ? el.getAttribute('data-gm') : '';
|
|
496
|
+
if (id === 'return') closeMenu();
|
|
497
|
+
else if (id === 'options') { closeMenu(); openOverlay(); }
|
|
498
|
+
else if (id === 'character') { closeMenu(); window.OTBCraftMode.changeCharacter(); }
|
|
499
|
+
else if (id === 'exit') exitGame();
|
|
500
|
+
else if (id === 'logout') menuSay('Logging out');
|
|
501
|
+
}
|
|
502
|
+
// The arrows walk the rows, as on the start screen (Tab is the dialog's own trap).
|
|
503
|
+
function onMenuKey(e) {
|
|
504
|
+
var step = e.key === 'ArrowDown' ? 1 : e.key === 'ArrowUp' ? -1 : 0;
|
|
505
|
+
if (!step || !menuEl) return;
|
|
506
|
+
var rows = Array.prototype.slice.call(menuEl.querySelectorAll('[data-gm]'));
|
|
507
|
+
if (!rows.length) return;
|
|
508
|
+
e.preventDefault();
|
|
509
|
+
var at = rows.indexOf(document.activeElement);
|
|
510
|
+
rows[(at + step + rows.length) % rows.length].focus();
|
|
511
|
+
}
|
|
512
|
+
function openMenu() {
|
|
513
|
+
try { buildMenu(); } catch (_) {
|
|
514
|
+
// No menu can be drawn here: the options, as before the game menu existed.
|
|
515
|
+
menuEl = null; menuDlg = null;
|
|
516
|
+
openOverlay();
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
function buildMenu() {
|
|
520
|
+
if (!menuEl) {
|
|
521
|
+
if (!window.OTBDialog || typeof window.OTBDialog.bind !== 'function') throw new Error('no dialog');
|
|
522
|
+
menuEl = document.createElement('div');
|
|
523
|
+
menuEl.className = 'game-menu';
|
|
524
|
+
menuEl.hidden = true;
|
|
525
|
+
menuEl.addEventListener('click', onMenuClick);
|
|
526
|
+
menuEl.addEventListener('keydown', onMenuKey);
|
|
527
|
+
menuEl.innerHTML = '<div class="game-menu__box" aria-labelledby="game-menu-title">' +
|
|
528
|
+
'<h2 class="game-menu__title" id="game-menu-title">Game menu</h2>' +
|
|
529
|
+
'<ul class="game-menu__items"></ul>' +
|
|
530
|
+
'<p class="game-menu__note" role="status" hidden></p></div>';
|
|
531
|
+
document.body.appendChild(menuEl);
|
|
532
|
+
menuDlg = window.OTBDialog.bind(menuEl, { panel: menuEl.querySelector('.game-menu__box'), lockClass: 'game-menu-open' });
|
|
533
|
+
}
|
|
534
|
+
// The rows are drawn at each opening: they follow what the page has, and the note starts empty.
|
|
535
|
+
menuEl.querySelector('.game-menu__items').innerHTML = menuRows().map(menuRowHtml).join('');
|
|
536
|
+
menuSay('');
|
|
537
|
+
menuDlg.open();
|
|
538
|
+
}
|
|
539
|
+
|
|
416
540
|
// ---------- the options window (game mode) ----------
|
|
417
541
|
// In game mode the options menu opens as a window OVER the place you are in, not
|
|
418
542
|
// as a page of its own, so the place stays drawn behind it and its colours show
|
|
@@ -496,6 +620,7 @@
|
|
|
496
620
|
function overlayHere() { return on() && !(document.body && document.body.getAttribute('data-page') === 'settings'); }
|
|
497
621
|
if (!embedded) {
|
|
498
622
|
window.OTBOptionsOverlay = { open: openOverlay, openProfile: openProfile, close: closeOverlay, isOpen: overlayOpen };
|
|
623
|
+
window.OTBGameMenu = { open: openMenu, close: closeMenu, isOpen: menuOpen };
|
|
499
624
|
// A link to the menu (the visor's Options row, the profile chip, the start
|
|
500
625
|
// screen's Options) opens the window in game mode instead of leaving the place.
|
|
501
626
|
if (document.addEventListener) document.addEventListener('click', function (e) {
|
|
@@ -506,6 +631,8 @@
|
|
|
506
631
|
try { to = new URL(a.getAttribute('href'), window.location.href); } catch (_) { return; }
|
|
507
632
|
if (to.origin !== window.location.origin || to.pathname.replace(/\.html$/, '') !== menuPath()) return;
|
|
508
633
|
e.preventDefault();
|
|
634
|
+
// the visor's Menu hint and the Actions sheet's last row: the game menu, not the options
|
|
635
|
+
if (a.getAttribute('data-game-menu') !== null) { openMenu(); return; }
|
|
509
636
|
var q = to.search.replace(/([?&])from=[^&#]*&?/, '$1').replace(/[?&]$/, '');
|
|
510
637
|
openOverlay(q + to.hash);
|
|
511
638
|
}, true);
|
|
@@ -522,6 +649,6 @@
|
|
|
522
649
|
} catch (_) { /* a href the browser cannot read: leave it alone */ }
|
|
523
650
|
}, true);
|
|
524
651
|
}
|
|
525
|
-
window.OTBShellGame = { on: on, set: set, hint: hint, start: start, tipAt: tipAt, historySteps: historySteps, whenLabel: whenLabel, segsDone: segsDone, MENU: MENU, TIPS: TIPS,
|
|
652
|
+
window.OTBShellGame = { on: on, set: set, hint: hint, start: start, seen: seen,tipAt: tipAt, historySteps: historySteps, whenLabel: whenLabel, segsDone: segsDone, MENU: MENU, TIPS: TIPS,
|
|
526
653
|
embedded: function () { return embedded; }, menuPath: menuPath, PLACES: PLACES, pageOf: pageOf, isPlace: isPlace };
|
|
527
654
|
})();
|