@bongos/core 1.25.8 → 1.25.10
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 +27 -22
- package/docs/module-api-changelog.md +4 -0
- package/docs/page-readings.json +34 -34
- package/modules/hall-ui/public/controls.css +3 -0
- package/modules/hall-ui/public/style.css +50 -2
- package/modules/hall-ui/public/visor.css +33 -5
- package/modules/hall-ui/records/options-menu.md +1 -1
- package/modules/hall-ui/records/visor.md +9 -1
- package/modules/ui-design/public/brand.html +1 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +13 -1
- package/src/module-api.js +1 -1
- package/tests/hall_game_menu.mjs +29 -0
- package/tests/hall_smoke.mjs +116 -0
- package/tests/hall_visor.mjs +3 -1
- package/tests/hall_visor_profile.mjs +40 -1
package/.bongos-core.json
CHANGED
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/bongos/package-core.js",
|
|
5
|
-
"core_version": "1.25.
|
|
6
|
-
"core_contract": "1.25.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.25.10",
|
|
6
|
+
"core_contract": "1.25.10",
|
|
7
|
+
"source_commit": "b8b58dc095808f9d1af8119249091b6380324b7f",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-11-
|
|
9
|
+
"built_at": "2026-11-13T11:33:30.859Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 655,
|
|
13
13
|
"agent_docs_stubbed": 32,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 4000,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 4688,
|
|
20
|
+
"tree_sha256": "bd8efeb956a72230bf06624eecedb3fee10f05f144c9445a8948f2be25ba89b7",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -3087,7 +3087,7 @@
|
|
|
3087
3087
|
{
|
|
3088
3088
|
"path": "docs/module-api-changelog.md",
|
|
3089
3089
|
"mode": "0000644",
|
|
3090
|
-
"sha256": "
|
|
3090
|
+
"sha256": "9f423fce83be522e9dd1d621666b0bdbd938252d6184bc6f9b6f325c786c812c"
|
|
3091
3091
|
},
|
|
3092
3092
|
{
|
|
3093
3093
|
"path": "docs/modules-contract.md",
|
|
@@ -3172,7 +3172,7 @@
|
|
|
3172
3172
|
{
|
|
3173
3173
|
"path": "docs/page-readings.json",
|
|
3174
3174
|
"mode": "0000644",
|
|
3175
|
-
"sha256": "
|
|
3175
|
+
"sha256": "dfcfc3dd3c2a7fd45a8013ccad14bc035f46cb2b052b7029f34fdc1ffdad671b"
|
|
3176
3176
|
},
|
|
3177
3177
|
{
|
|
3178
3178
|
"path": "docs/project-context.template.md",
|
|
@@ -6392,7 +6392,7 @@
|
|
|
6392
6392
|
{
|
|
6393
6393
|
"path": "modules/hall-ui/public/controls.css",
|
|
6394
6394
|
"mode": "0000644",
|
|
6395
|
-
"sha256": "
|
|
6395
|
+
"sha256": "aacaa5be1f499688b68807ca8faf45c50663c5a054052ead2e620bf715cb3847"
|
|
6396
6396
|
},
|
|
6397
6397
|
{
|
|
6398
6398
|
"path": "modules/hall-ui/public/copy-desk.css",
|
|
@@ -7457,7 +7457,7 @@
|
|
|
7457
7457
|
{
|
|
7458
7458
|
"path": "modules/hall-ui/public/style.css",
|
|
7459
7459
|
"mode": "0000644",
|
|
7460
|
-
"sha256": "
|
|
7460
|
+
"sha256": "4f63546a08862793d3fe341e262644f198760bbfc604e042f39e317ec1514970"
|
|
7461
7461
|
},
|
|
7462
7462
|
{
|
|
7463
7463
|
"path": "modules/hall-ui/public/task-detail.js",
|
|
@@ -7547,7 +7547,7 @@
|
|
|
7547
7547
|
{
|
|
7548
7548
|
"path": "modules/hall-ui/public/visor.css",
|
|
7549
7549
|
"mode": "0000644",
|
|
7550
|
-
"sha256": "
|
|
7550
|
+
"sha256": "56f32d59d52af197c501ce9bb0436d03c12f318a8f1efd6ed71e8dddca303d7d"
|
|
7551
7551
|
},
|
|
7552
7552
|
{
|
|
7553
7553
|
"path": "modules/hall-ui/public/visor.js",
|
|
@@ -7787,7 +7787,7 @@
|
|
|
7787
7787
|
{
|
|
7788
7788
|
"path": "modules/hall-ui/records/options-menu.md",
|
|
7789
7789
|
"mode": "0000644",
|
|
7790
|
-
"sha256": "
|
|
7790
|
+
"sha256": "836ed92db7f6762e178b44296ad34cf79800a838bfc88cb43b47a2ee06927242"
|
|
7791
7791
|
},
|
|
7792
7792
|
{
|
|
7793
7793
|
"path": "modules/hall-ui/records/oversight-family.md",
|
|
@@ -7877,7 +7877,7 @@
|
|
|
7877
7877
|
{
|
|
7878
7878
|
"path": "modules/hall-ui/records/visor.md",
|
|
7879
7879
|
"mode": "0000644",
|
|
7880
|
-
"sha256": "
|
|
7880
|
+
"sha256": "738f83e070a328e5a29f2d43f6e8579bb27c4c5eae13cecf3a2cdf0efb1b8566"
|
|
7881
7881
|
},
|
|
7882
7882
|
{
|
|
7883
7883
|
"path": "modules/hall-ui/records/welcome-tower.md",
|
|
@@ -12052,7 +12052,7 @@
|
|
|
12052
12052
|
{
|
|
12053
12053
|
"path": "modules/ui-design/public/brand.html",
|
|
12054
12054
|
"mode": "0000644",
|
|
12055
|
-
"sha256": "
|
|
12055
|
+
"sha256": "6a785d3a85d632feaf2a2fd8d6f6d46a870023e5746acda40e16612897a57a3f"
|
|
12056
12056
|
},
|
|
12057
12057
|
{
|
|
12058
12058
|
"path": "modules/ui-design/public/brand.states.json",
|
|
@@ -12247,12 +12247,12 @@
|
|
|
12247
12247
|
{
|
|
12248
12248
|
"path": "package-lock.json",
|
|
12249
12249
|
"mode": "0000644",
|
|
12250
|
-
"sha256": "
|
|
12250
|
+
"sha256": "c3e72096d4af2d7e8fb83e5cad86339d2e545e7935586096914d521eadcdb462"
|
|
12251
12251
|
},
|
|
12252
12252
|
{
|
|
12253
12253
|
"path": "package.json",
|
|
12254
12254
|
"mode": "0000644",
|
|
12255
|
-
"sha256": "
|
|
12255
|
+
"sha256": "8427fc656e5434dfa2a4eef55f2f38a540909781870e7c013fe52c13e8a834a3"
|
|
12256
12256
|
},
|
|
12257
12257
|
{
|
|
12258
12258
|
"path": "public-docs/index.html",
|
|
@@ -12272,7 +12272,7 @@
|
|
|
12272
12272
|
{
|
|
12273
12273
|
"path": "release-notes.json",
|
|
12274
12274
|
"mode": "0000644",
|
|
12275
|
-
"sha256": "
|
|
12275
|
+
"sha256": "0073d14c2c3290cdb640962960692124c75fd4372014ee6a3730d7c59d2b0b22"
|
|
12276
12276
|
},
|
|
12277
12277
|
{
|
|
12278
12278
|
"path": "scripts/bongos/CLAUDE.md",
|
|
@@ -16282,7 +16282,7 @@
|
|
|
16282
16282
|
{
|
|
16283
16283
|
"path": "src/module-api.js",
|
|
16284
16284
|
"mode": "0000644",
|
|
16285
|
-
"sha256": "
|
|
16285
|
+
"sha256": "6af4e54b019be69cb75a0c6181df0aa9f2fcc8f64759b626b7432c56d59387e5"
|
|
16286
16286
|
},
|
|
16287
16287
|
{
|
|
16288
16288
|
"path": "src/module-loader/catalog.js",
|
|
@@ -19252,7 +19252,7 @@
|
|
|
19252
19252
|
{
|
|
19253
19253
|
"path": "tests/hall_game_menu.mjs",
|
|
19254
19254
|
"mode": "0000644",
|
|
19255
|
-
"sha256": "
|
|
19255
|
+
"sha256": "0c12b2f3b9023e9f94ae1170e22496ea16091baecaede14ea7576eb96cc0dd43"
|
|
19256
19256
|
},
|
|
19257
19257
|
{
|
|
19258
19258
|
"path": "tests/hall_game_review_tab.mjs",
|
|
@@ -19479,6 +19479,11 @@
|
|
|
19479
19479
|
"mode": "0000644",
|
|
19480
19480
|
"sha256": "ffbf1958a0d19b498ebaa7d1b3d0865252c33bc3eb7ca9f58f10bb9861d05927"
|
|
19481
19481
|
},
|
|
19482
|
+
{
|
|
19483
|
+
"path": "tests/hall_smoke.mjs",
|
|
19484
|
+
"mode": "0000644",
|
|
19485
|
+
"sha256": "2bd62197fd3741f5305986fcb001afc17527aa1613fbbe3041be49d532fc3e96"
|
|
19486
|
+
},
|
|
19482
19487
|
{
|
|
19483
19488
|
"path": "tests/hall_start_screen.mjs",
|
|
19484
19489
|
"mode": "0000644",
|
|
@@ -19562,12 +19567,12 @@
|
|
|
19562
19567
|
{
|
|
19563
19568
|
"path": "tests/hall_visor.mjs",
|
|
19564
19569
|
"mode": "0000644",
|
|
19565
|
-
"sha256": "
|
|
19570
|
+
"sha256": "4141b4c117ef5f8ca0393cc7b84ad8119aa1d0b35ac47a0628e129f33b677eac"
|
|
19566
19571
|
},
|
|
19567
19572
|
{
|
|
19568
19573
|
"path": "tests/hall_visor_profile.mjs",
|
|
19569
19574
|
"mode": "0000644",
|
|
19570
|
-
"sha256": "
|
|
19575
|
+
"sha256": "e9264f8e025155951dcf59ce33919f760893eaff5e923336a5712fc24357e353"
|
|
19571
19576
|
},
|
|
19572
19577
|
{
|
|
19573
19578
|
"path": "tests/hall_work_history_id.mjs",
|
|
@@ -3456,5 +3456,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
3456
3456
|
landed since 1.25.5 with no explicit bump. run 43408206925. (task 1002620)
|
|
3457
3457
|
1.25.8 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3458
3458
|
landed since 1.25.7 with no explicit bump. run 43412600767. (task 1002620)
|
|
3459
|
+
1.25.9 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3460
|
+
landed since 1.25.8 with no explicit bump. run 43414302004. (task 1002620)
|
|
3461
|
+
1.25.10 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3462
|
+
landed since 1.25.9 with no explicit bump. run 43417745698. (task 1002620)
|
|
3459
3463
|
---------------------------------------------------------------------------
|
|
3460
3464
|
```
|
package/docs/page-readings.json
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
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": "0b821b96e0dc0ea4",
|
|
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": "a422a4b22c18e762",
|
|
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": "33eee6590ba37f6f",
|
|
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": "7cc6b74b5dff98ec",
|
|
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": "71c3ed36a93ff43e",
|
|
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": "fb63aa9ff095bd8f",
|
|
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": "e79570a7084c9ea9",
|
|
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": "984cc790670d9a4e",
|
|
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": "903b80ecae3c2dcc",
|
|
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": "5346645dc209c049",
|
|
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": "6c4c2bc9708abc20",
|
|
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": "871f68d17f0a55c3",
|
|
880
880
|
"reading_hash": "37c6878d60447fd6",
|
|
881
881
|
"counts": {"lines":65,"placed":27,"shared":7,"unplaced":31},
|
|
882
882
|
"omitted": {"data":276},
|
|
@@ -954,7 +954,7 @@
|
|
|
954
954
|
"surface": "builders",
|
|
955
955
|
"title": "Builders' Hall",
|
|
956
956
|
"states_read": ["home","out","founding","genesis","decide","demo","votes"],
|
|
957
|
-
"files_hash": "
|
|
957
|
+
"files_hash": "ef4b97c863663d7f",
|
|
958
958
|
"reading_hash": "c5f4986bd90e2a2a",
|
|
959
959
|
"counts": {"lines":29,"placed":8,"shared":8,"unplaced":13},
|
|
960
960
|
"omitted": {"data":4},
|
|
@@ -996,7 +996,7 @@
|
|
|
996
996
|
"surface": "builders",
|
|
997
997
|
"title": "Idea",
|
|
998
998
|
"states_read": ["record","missing"],
|
|
999
|
-
"files_hash": "
|
|
999
|
+
"files_hash": "e8c40a1165f0a2e0",
|
|
1000
1000
|
"reading_hash": "f7d644748c87e426",
|
|
1001
1001
|
"counts": {"lines":52,"placed":25,"shared":8,"unplaced":19},
|
|
1002
1002
|
"omitted": {"data":25},
|
|
@@ -1061,7 +1061,7 @@
|
|
|
1061
1061
|
"surface": "builders",
|
|
1062
1062
|
"title": "Ideas",
|
|
1063
1063
|
"states_read": ["compose","full","develop"],
|
|
1064
|
-
"files_hash": "
|
|
1064
|
+
"files_hash": "b3586d8b6a42f079",
|
|
1065
1065
|
"reading_hash": "a62c05dcef3bf87f",
|
|
1066
1066
|
"counts": {"lines":68,"placed":34,"shared":7,"unplaced":27},
|
|
1067
1067
|
"omitted": {"data":118},
|
|
@@ -1142,7 +1142,7 @@
|
|
|
1142
1142
|
"surface": "builders",
|
|
1143
1143
|
"title": "Market Watch",
|
|
1144
1144
|
"states_read": ["desk","settings","out"],
|
|
1145
|
-
"files_hash": "
|
|
1145
|
+
"files_hash": "5795698220e33351",
|
|
1146
1146
|
"reading_hash": "30512dda207b5ea6",
|
|
1147
1147
|
"counts": {"lines":23,"placed":11,"shared":7,"unplaced":5},
|
|
1148
1148
|
"omitted": {"data":5},
|
|
@@ -1178,7 +1178,7 @@
|
|
|
1178
1178
|
"surface": "builders",
|
|
1179
1179
|
"title": "Market Watch",
|
|
1180
1180
|
"states_read": ["dossier","out","propose","correct","filtered"],
|
|
1181
|
-
"files_hash": "
|
|
1181
|
+
"files_hash": "eecb4247102ae1a1",
|
|
1182
1182
|
"reading_hash": "129bff28c4e4ed6d",
|
|
1183
1183
|
"counts": {"lines":24,"placed":12,"shared":7,"unplaced":5},
|
|
1184
1184
|
"omitted": {"data":5},
|
|
@@ -1215,7 +1215,7 @@
|
|
|
1215
1215
|
"surface": "builders",
|
|
1216
1216
|
"title": "Market Watch rules",
|
|
1217
1217
|
"states_read": ["in","scoring","names","propose","out"],
|
|
1218
|
-
"files_hash": "
|
|
1218
|
+
"files_hash": "f2bcee3724afccdb",
|
|
1219
1219
|
"reading_hash": "ca0c62e8dce51c8b",
|
|
1220
1220
|
"counts": {"lines":36,"placed":12,"shared":7,"unplaced":17},
|
|
1221
1221
|
"omitted": {"data":20},
|
|
@@ -1264,7 +1264,7 @@
|
|
|
1264
1264
|
"surface": "builders",
|
|
1265
1265
|
"title": "Modules",
|
|
1266
1266
|
"states_read": ["browse","search-empty","lens","details","out"],
|
|
1267
|
-
"files_hash": "
|
|
1267
|
+
"files_hash": "529af86e5fcc5f95",
|
|
1268
1268
|
"reading_hash": "6a12e9306bba5622",
|
|
1269
1269
|
"counts": {"lines":59,"placed":29,"shared":7,"unplaced":23},
|
|
1270
1270
|
"omitted": {"data":107},
|
|
@@ -1336,7 +1336,7 @@
|
|
|
1336
1336
|
"surface": "builders",
|
|
1337
1337
|
"title": "Money",
|
|
1338
1338
|
"states_read": ["money","hosting","out"],
|
|
1339
|
-
"files_hash": "
|
|
1339
|
+
"files_hash": "58ddb3a16e756457",
|
|
1340
1340
|
"reading_hash": "e355d5466b123e07",
|
|
1341
1341
|
"counts": {"lines":83,"placed":28,"shared":7,"unplaced":48},
|
|
1342
1342
|
"omitted": {"data":27},
|
|
@@ -1432,7 +1432,7 @@
|
|
|
1432
1432
|
"surface": "builders",
|
|
1433
1433
|
"title": "My agents",
|
|
1434
1434
|
"states_read": ["desk","factory","saved","what-it-knows","speciality-walk","speciality-forms","nobody"],
|
|
1435
|
-
"files_hash": "
|
|
1435
|
+
"files_hash": "fd6cd42d69a240c9",
|
|
1436
1436
|
"reading_hash": "5347e0496b38727d",
|
|
1437
1437
|
"counts": {"lines":100,"placed":33,"shared":7,"unplaced":60},
|
|
1438
1438
|
"omitted": {"data":38},
|
|
@@ -1545,7 +1545,7 @@
|
|
|
1545
1545
|
"surface": "builders",
|
|
1546
1546
|
"title": "Primer",
|
|
1547
1547
|
"states_read": ["in","toc-open","jump","out"],
|
|
1548
|
-
"files_hash": "
|
|
1548
|
+
"files_hash": "a2e5fefb3fec8141",
|
|
1549
1549
|
"reading_hash": "85790bd421e5c387",
|
|
1550
1550
|
"counts": {"lines":487,"placed":57,"shared":7,"unplaced":423},
|
|
1551
1551
|
"omitted": {"data":18},
|
|
@@ -2045,7 +2045,7 @@
|
|
|
2045
2045
|
"surface": "builders",
|
|
2046
2046
|
"title": "Profile",
|
|
2047
2047
|
"states_read": ["own","works","activity","yours","activity-artist","activity-artist-ideas","other","artist","artist-ideas","out"],
|
|
2048
|
-
"files_hash": "
|
|
2048
|
+
"files_hash": "632c8a42e7b06af7",
|
|
2049
2049
|
"reading_hash": "3ff8d703d17e8c2a",
|
|
2050
2050
|
"counts": {"lines":232,"placed":84,"shared":7,"unplaced":141},
|
|
2051
2051
|
"omitted": {"data":263},
|
|
@@ -2290,7 +2290,7 @@
|
|
|
2290
2290
|
"surface": "builders",
|
|
2291
2291
|
"title": "Project settings",
|
|
2292
2292
|
"states_read": ["default"],
|
|
2293
|
-
"files_hash": "
|
|
2293
|
+
"files_hash": "b774e400d4747139",
|
|
2294
2294
|
"reading_hash": "283df27d0d5bfc1b",
|
|
2295
2295
|
"counts": {"lines":43,"placed":25,"shared":7,"unplaced":11},
|
|
2296
2296
|
"omitted": {"data":33},
|
|
@@ -2346,7 +2346,7 @@
|
|
|
2346
2346
|
"surface": "builders",
|
|
2347
2347
|
"title": "Builders",
|
|
2348
2348
|
"states_read": ["roster","artists","search","out"],
|
|
2349
|
-
"files_hash": "
|
|
2349
|
+
"files_hash": "c7ed314e820b61f2",
|
|
2350
2350
|
"reading_hash": "665ac2e36339f5d3",
|
|
2351
2351
|
"counts": {"lines":56,"placed":17,"shared":7,"unplaced":32},
|
|
2352
2352
|
"omitted": {"data":137},
|
|
@@ -2415,7 +2415,7 @@
|
|
|
2415
2415
|
"surface": "builders",
|
|
2416
2416
|
"title": "Options",
|
|
2417
2417
|
"states_read": ["account","access","preferences","install-reports","sound","update"],
|
|
2418
|
-
"files_hash": "
|
|
2418
|
+
"files_hash": "589babd36a26959f",
|
|
2419
2419
|
"reading_hash": "898a13fda24c3c90",
|
|
2420
2420
|
"counts": {"lines":162,"placed":104,"shared":7,"unplaced":51},
|
|
2421
2421
|
"omitted": {"data":23},
|
|
@@ -2590,7 +2590,7 @@
|
|
|
2590
2590
|
"surface": "builders",
|
|
2591
2591
|
"title": "The street",
|
|
2592
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"],
|
|
2593
|
-
"files_hash": "
|
|
2593
|
+
"files_hash": "60c23fda46dd74d6",
|
|
2594
2594
|
"reading_hash": "e788e6bf4be8d68c",
|
|
2595
2595
|
"counts": {"lines":325,"placed":54,"shared":6,"unplaced":265},
|
|
2596
2596
|
"omitted": {"data":240},
|
|
@@ -2928,7 +2928,7 @@
|
|
|
2928
2928
|
"surface": "builders",
|
|
2929
2929
|
"title": "Studio",
|
|
2930
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"],
|
|
2931
|
-
"files_hash": "
|
|
2931
|
+
"files_hash": "40f7319540eb1928",
|
|
2932
2932
|
"reading_hash": "c4e3b4188c1db755",
|
|
2933
2933
|
"counts": {"lines":51,"placed":29,"shared":7,"unplaced":15},
|
|
2934
2934
|
"omitted": {"data":23},
|
|
@@ -2992,7 +2992,7 @@
|
|
|
2992
2992
|
"surface": "builders",
|
|
2993
2993
|
"title": "Task",
|
|
2994
2994
|
"states_read": ["record","from-goal","missing"],
|
|
2995
|
-
"files_hash": "
|
|
2995
|
+
"files_hash": "c1453426647f5faa",
|
|
2996
2996
|
"reading_hash": "8dd803b6934e6388",
|
|
2997
2997
|
"counts": {"lines":151,"placed":46,"shared":9,"unplaced":96},
|
|
2998
2998
|
"omitted": {"data":111},
|
|
@@ -3156,7 +3156,7 @@
|
|
|
3156
3156
|
"surface": "builders",
|
|
3157
3157
|
"title": "Your thinking",
|
|
3158
3158
|
"states_read": ["tour","sky","list","simple","full-idea","full","full-list","full-back","out"],
|
|
3159
|
-
"files_hash": "
|
|
3159
|
+
"files_hash": "4979ab2ce56be6ac",
|
|
3160
3160
|
"reading_hash": "b73f848b46b0f9b8",
|
|
3161
3161
|
"counts": {"lines":50,"placed":25,"shared":6,"unplaced":19},
|
|
3162
3162
|
"omitted": {"data":10},
|
|
@@ -3219,7 +3219,7 @@
|
|
|
3219
3219
|
"surface": "builders",
|
|
3220
3220
|
"title": "Tweak a page",
|
|
3221
3221
|
"states_read": ["doc","typed","chrome","submitted","picking","out"],
|
|
3222
|
-
"files_hash": "
|
|
3222
|
+
"files_hash": "2324289150216fa5",
|
|
3223
3223
|
"reading_hash": "f521f8d9a7147557",
|
|
3224
3224
|
"counts": {"lines":26,"placed":18,"shared":2,"unplaced":6},
|
|
3225
3225
|
"omitted": {"data":19},
|
|
@@ -3258,7 +3258,7 @@
|
|
|
3258
3258
|
"surface": "builders",
|
|
3259
3259
|
"title": "Watch",
|
|
3260
3260
|
"states_read": ["board","out","operations","security","sessions","autobongos"],
|
|
3261
|
-
"files_hash": "
|
|
3261
|
+
"files_hash": "af9d434e417f616e",
|
|
3262
3262
|
"reading_hash": "1961a0c06b9d8477",
|
|
3263
3263
|
"counts": {"lines":72,"placed":33,"shared":7,"unplaced":32},
|
|
3264
3264
|
"omitted": {"data":52},
|
|
@@ -3343,7 +3343,7 @@
|
|
|
3343
3343
|
"surface": "builders",
|
|
3344
3344
|
"title": "Tasks",
|
|
3345
3345
|
"states_read": ["ready","in-progress","backlog","completed","filters-open","out","founding"],
|
|
3346
|
-
"files_hash": "
|
|
3346
|
+
"files_hash": "4f3e37e9bf3e8a37",
|
|
3347
3347
|
"reading_hash": "e9b412d1ec59ceee",
|
|
3348
3348
|
"counts": {"lines":122,"placed":49,"shared":7,"unplaced":66},
|
|
3349
3349
|
"omitted": {"data":323},
|
|
@@ -4926,7 +4926,7 @@
|
|
|
4926
4926
|
"surface": "status",
|
|
4927
4927
|
"title": "{{productName}} — build status",
|
|
4928
4928
|
"states_read": ["loaded"],
|
|
4929
|
-
"files_hash": "
|
|
4929
|
+
"files_hash": "be28708a796de1f7",
|
|
4930
4930
|
"reading_hash": "5abba39cf5ec9226",
|
|
4931
4931
|
"counts": {"lines":66,"placed":47,"shared":9,"unplaced":10},
|
|
4932
4932
|
"omitted": {"data":90},
|
|
@@ -323,6 +323,9 @@ select option { background: var(--bg-card); color: var(--ink); }
|
|
|
323
323
|
}
|
|
324
324
|
.hall-dialog--wide { width: min(720px, calc(100vw - 2 * var(--ds-space-sm))); }
|
|
325
325
|
.hall-dialog::backdrop { background: var(--scrim); }
|
|
326
|
+
/* the smoke scrim (task 1005267): in the hall the world behind a dialog also blurs; a page
|
|
327
|
+
without the hall's tier (the status page) has no --smoke-scrim and keeps the flat scrim */
|
|
328
|
+
.hall-dialog::backdrop { -webkit-backdrop-filter: var(--smoke-scrim, none); backdrop-filter: var(--smoke-scrim, none); }
|
|
326
329
|
.hall-scrim {
|
|
327
330
|
position: fixed;
|
|
328
331
|
inset: 0;
|
|
@@ -323,6 +323,13 @@
|
|
|
323
323
|
--smoke-blur: blur(14px) saturate(.8) brightness(.85);
|
|
324
324
|
--smoke-sheen: linear-gradient(to bottom, color-mix(in srgb, var(--ink-soft) 16%, transparent), transparent 40%);
|
|
325
325
|
--smoke-edge: inset 0 1px 0 color-mix(in srgb, var(--ink-soft) 35%, transparent), inset 0 -1px 0 color-mix(in srgb, var(--bg) 60%, transparent);
|
|
326
|
+
/* THE SMOKE FAMILY (task 1005267, the owner's "all six"): the pane above is for small
|
|
327
|
+
things; a panel, the visor's sheet, a dialog and the bars take the deeper pane, so long
|
|
328
|
+
rows stay calm over any scene; a dialog's scrim blurs and dims the world instead of
|
|
329
|
+
blacking it out. A phone and "less transparency" turn every pane back to solid night. */
|
|
330
|
+
--smoke-deep: color-mix(in srgb, var(--bg) 76%, transparent);
|
|
331
|
+
--smoke-deep-blur: blur(24px) saturate(.8) brightness(.8);
|
|
332
|
+
--smoke-scrim: blur(6px) saturate(.7);
|
|
326
333
|
--line-strong: 1.5px;
|
|
327
334
|
--helm-panel-w: 400px;
|
|
328
335
|
--helm-row: 60px;
|
|
@@ -520,6 +527,44 @@ html[data-faces="helm"] {
|
|
|
520
527
|
html .visor__place, html .visor__who, html .visor__hint, html .visor__progress-words {
|
|
521
528
|
background: var(--night-plate); box-shadow: none; -webkit-backdrop-filter: none; backdrop-filter: none;
|
|
522
529
|
}
|
|
530
|
+
/* task 1005267: the whole family turns back to solid night, by its tokens */
|
|
531
|
+
html:root { --smoke: var(--night-plate); --smoke-deep: var(--bg); --smoke-sheen: none; --smoke-edge: 0 0 0 0 transparent;
|
|
532
|
+
--smoke-blur: none; --smoke-deep-blur: none; --smoke-scrim: none; }
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
/* THE SMOKE FAMILY ON THE HALL (task 1005267). Every rule spends the tokens above, so the
|
|
536
|
+
fallbacks (a phone, less transparency) are a change of tokens, not of rules. `html[data-theme]`
|
|
537
|
+
is the hall's own stamp and lifts these over the page sheets that load after this one; the
|
|
538
|
+
status page links none of this. A browser without backdrop blur keeps today's surfaces. */
|
|
539
|
+
@supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
|
|
540
|
+
/* deep smoke: the panels over art, the visor's sheet and card, a dialog */
|
|
541
|
+
html[data-theme="dark"] .game-menu__box, html[data-theme="dark"] .gs__menu, html[data-theme="dark"] .gs__load,
|
|
542
|
+
html[data-theme="dark"] .opt-rail, html[data-theme="dark"] .craft-door,
|
|
543
|
+
html[data-theme="dark"] .visor__sheet, html[data-theme="dark"] .visor__focus {
|
|
544
|
+
background: var(--smoke-sheen), var(--smoke-deep); box-shadow: var(--smoke-edge);
|
|
545
|
+
-webkit-backdrop-filter: var(--smoke-deep-blur); backdrop-filter: var(--smoke-deep-blur);
|
|
546
|
+
}
|
|
547
|
+
html[data-theme="dark"] .hall-dialog {
|
|
548
|
+
background: var(--smoke-sheen), var(--smoke-deep); box-shadow: var(--smoke-edge), var(--ds-shadow-pop);
|
|
549
|
+
-webkit-backdrop-filter: var(--smoke-deep-blur); backdrop-filter: var(--smoke-deep-blur);
|
|
550
|
+
}
|
|
551
|
+
/* the bars: deep smoke, no sheen (a thin strip), their hairline stays */
|
|
552
|
+
html[data-theme="dark"] .app-topbar, html[data-theme="dark"] .app-sidebar {
|
|
553
|
+
background: var(--smoke-deep);
|
|
554
|
+
-webkit-backdrop-filter: var(--smoke-deep-blur); backdrop-filter: var(--smoke-deep-blur);
|
|
555
|
+
}
|
|
556
|
+
/* the scrim under a div overlay: the world blurs and dims (the native dialog's is in controls.css) */
|
|
557
|
+
html[data-theme="dark"] .hall-scrim { -webkit-backdrop-filter: var(--smoke-scrim); backdrop-filter: var(--smoke-scrim); }
|
|
558
|
+
/* light smoke: a toast, and the labels the city stands on its sky */
|
|
559
|
+
html[data-theme="dark"] .toast:not([data-kind="error"]) {
|
|
560
|
+
background: var(--smoke-sheen), var(--smoke); color: var(--ink); box-shadow: var(--smoke-edge);
|
|
561
|
+
-webkit-backdrop-filter: var(--smoke-blur); backdrop-filter: var(--smoke-blur);
|
|
562
|
+
}
|
|
563
|
+
html[data-theme="dark"] .city-line, html[data-theme="dark"] .city-mark, html[data-theme="dark"] .city-plaque, html[data-theme="dark"] .city-archived,
|
|
564
|
+
html[data-theme="dark"][data-game="on"] body[data-page="home"] .page-head--hall .page-head__h, html[data-theme="dark"] .hc-ladder::before {
|
|
565
|
+
background: var(--smoke-sheen), var(--smoke); box-shadow: var(--smoke-edge);
|
|
566
|
+
-webkit-backdrop-filter: var(--smoke-blur); backdrop-filter: var(--smoke-blur);
|
|
567
|
+
}
|
|
523
568
|
}
|
|
524
569
|
|
|
525
570
|
/* The Kill Switch Rule (DESIGN.md). Nothing escapes it, and no motion is
|
|
@@ -895,7 +940,7 @@ html[data-theme="dark"] .brand-mark__mark { --mark-ink: #e2e1e4; }
|
|
|
895
940
|
and the shell’s corner buttons, so the top arc, its notch and the place all step aside. The foot row keeps its three parts in one line and nothing leans: the sprite
|
|
896
941
|
with the count over its word, the one accent button (its name may take two lines; its key is in the sheet), and of
|
|
897
942
|
the key hints only Actions, as its dots (every other hint is a row in its sheet). */
|
|
898
|
-
|
|
943
|
+
:root[data-game="on"] { --visor-inset-bottom: 52px; --visor-foot-room: 112px; }
|
|
899
944
|
html[data-game="on"] .visor__place, html[data-game="on"] .visor__progress, html[data-game="on"] .visor__notch, html[data-game="on"] .visor__frame--top, html[data-game="on"] .visor__name { display: none; }
|
|
900
945
|
html[data-game="on"] .visor__foot { grid-template-columns: auto minmax(0, 1fr) auto; column-gap: var(--ds-space-hair); }
|
|
901
946
|
html[data-game="on"] .visor__me, html[data-game="on"] .visor__hints { transform: none; }
|
|
@@ -912,9 +957,12 @@ html[data-theme="dark"] .brand-mark__mark { --mark-ink: #e2e1e4; }
|
|
|
912
957
|
/* task 1005252: a phone keeps the night plate, not the smoked pane — a live blur under a HUD
|
|
913
958
|
that the scene pans beneath is the costly kind of drawing, and a phone has the weakest GPU */
|
|
914
959
|
html[data-game="on"] .visor__who, html[data-game="on"] .visor__hint { background: var(--night-plate); box-shadow: none; -webkit-backdrop-filter: none; backdrop-filter: none; }
|
|
960
|
+
/* task 1005267: and every pane of the smoke family goes back to solid night, by its tokens */
|
|
961
|
+
html:root { --smoke: var(--night-plate); --smoke-deep: var(--bg); --smoke-sheen: none; --smoke-edge: 0 0 0 0 transparent;
|
|
962
|
+
--smoke-blur: none; --smoke-deep-blur: none; --smoke-scrim: none; }
|
|
915
963
|
html[data-game="on"] .visor__hint--sheet > :not(.visor__dots) { position: absolute; width: 1px; height: 1px; padding: 0; border: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
|
|
916
964
|
html[data-game="on"] .visor__main .visor__key { display: none; }
|
|
917
|
-
html[data-game="on"] .visor__sheet {
|
|
965
|
+
html[data-game="on"] .visor__sheet { max-height: 60vh; }
|
|
918
966
|
}
|
|
919
967
|
/* task 1004424 (BV2.PS10): THE FOUNDING MARK. A pill in .rank-badge's grammar (same
|
|
920
968
|
height, type and radius) so it sits beside a rank without competing with it; the
|
|
@@ -10,11 +10,15 @@
|
|
|
10
10
|
the night, and the place, each hint and your credits stand on a small night plate. Colours, sizes and corners
|
|
11
11
|
are the hall tier's tokens; nothing here is typed in. Record: modules/hall-ui/records/visor.md. */
|
|
12
12
|
.visor { display: none; }
|
|
13
|
+
/* where the glass sits, so a scene's pop-up, and a window the glass opens, can keep clear of
|
|
14
|
+
it (ADR 0399 §2.3). On the root, not the visor, because the options window is not inside
|
|
15
|
+
it. --visor-foot-room is the foot row's height with the hints wrapped onto a second line. */
|
|
16
|
+
html[data-game="on"] {
|
|
17
|
+
--visor-arc: 64px; --visor-inset-top: 88px; --visor-inset-bottom: 76px; --visor-foot-room: 100px;
|
|
18
|
+
--visor-inset-right: max(var(--ds-space-gutter-narrow), var(--helm-inset)); --visor-inset-left: var(--visor-inset-right);
|
|
19
|
+
}
|
|
13
20
|
html[data-game="on"] .visor:not([hidden]) {
|
|
14
21
|
display: block; position: fixed; inset: 0; z-index: 4; pointer-events: none;
|
|
15
|
-
/* where the glass sits, so a scene's pop-up can keep clear of it (ADR 0399 §2.3) */
|
|
16
|
-
--visor-arc: 64px; --visor-inset-top: 88px; --visor-inset-bottom: 76px;
|
|
17
|
-
--visor-inset-right: max(var(--ds-space-gutter-narrow), var(--helm-inset)); --visor-inset-left: var(--visor-inset-right);
|
|
18
22
|
color: var(--ink); font-family: var(--font-body);
|
|
19
23
|
}
|
|
20
24
|
|
|
@@ -187,9 +191,9 @@ html[data-game="on"] .visor:not([hidden]) {
|
|
|
187
191
|
panel between two strong hairlines, standing over the hints that opened it, clear of the foot
|
|
188
192
|
row even when the hints have wrapped onto a second line. */
|
|
189
193
|
.visor__sheet {
|
|
190
|
-
position: absolute; right: var(--visor-inset-right); bottom: calc(var(--visor-inset-bottom) +
|
|
194
|
+
position: absolute; right: var(--visor-inset-right); bottom: calc(var(--visor-inset-bottom) + var(--visor-foot-room)); z-index: 1;
|
|
191
195
|
pointer-events: auto; box-sizing: border-box; width: min(18rem, calc(100vw - 2 * var(--ds-space-gutter-narrow)));
|
|
192
|
-
max-height: calc(100% - var(--visor-inset-top) - var(--visor-inset-bottom) -
|
|
196
|
+
max-height: calc(100% - var(--visor-inset-top) - var(--visor-inset-bottom) - var(--visor-foot-room)); overflow-y: auto;
|
|
193
197
|
padding: var(--ds-space-sm); background: var(--bg-card);
|
|
194
198
|
border: 0 solid var(--rule); border-left-width: var(--line-strong); border-right-width: var(--line-strong);
|
|
195
199
|
}
|
|
@@ -237,5 +241,29 @@ html[data-game="on"] .visor:not([hidden]) {
|
|
|
237
241
|
.visor__focus .visor__key { color: var(--ink-soft); background: none; }
|
|
238
242
|
.visor__main--lead[aria-busy="true"] { cursor: progress; background: var(--accent-lift); }
|
|
239
243
|
|
|
244
|
+
/* A WINDOW THE GLASS OPENS OPENS IN THE GLASS (task 1005253, ADR 0403; owner 2026-11-13). The
|
|
245
|
+
options window and your profile (shell-game.js openOverlay, .opt-window) and the game menu
|
|
246
|
+
(openMenu, .game-menu) are reached from the visor, so they never cover it: in game mode each
|
|
247
|
+
fits between the top arc and the foot row, and the visor is drawn over its scrim, undimmed,
|
|
248
|
+
as the frame you see it through. While one is up the glass is a picture: nothing on it takes
|
|
249
|
+
a pointer (the window is modal and keeps the keyboard), the sight leaves the window's middle,
|
|
250
|
+
and the glass's own pop-ups (the sheet, the scene's pick, your card) step aside. */
|
|
251
|
+
html.visor-on .opt-window, html.visor-on .game-menu {
|
|
252
|
+
box-sizing: border-box;
|
|
253
|
+
padding: var(--visor-inset-top) var(--visor-inset-right) calc(var(--visor-inset-bottom) + var(--visor-foot-room)) var(--visor-inset-left);
|
|
254
|
+
}
|
|
255
|
+
html.visor-on .opt-window__box { width: min(1040px, 100%); height: min(720px, 100%); }
|
|
256
|
+
html.visor-on .game-menu__box { max-height: 100%; }
|
|
257
|
+
html.visor-on:is(.opt-window-open, .game-menu-open) .visor:not([hidden]) { z-index: calc(var(--ds-z-modal, 160) + 1); }
|
|
258
|
+
html.visor-on:is(.opt-window-open, .game-menu-open) .visor * { pointer-events: none; }
|
|
259
|
+
html.visor-on:is(.opt-window-open, .game-menu-open) :is(.visor__sight, .visor__sheet, .visor__focus, .visor__card) { visibility: hidden; }
|
|
260
|
+
/* THE GAME MENU IS THE ONE THING IN FOCUS (owner 2026-11-13): the place behind it is frosted
|
|
261
|
+
(the hall's glass blur, under the glass, so the visor's lines stay sharp), and everything on
|
|
262
|
+
the glass but its two arcs steps back, so the eye goes to the menu. The arcs stay as the frame
|
|
263
|
+
the menu is held in. */
|
|
264
|
+
html.visor-on .game-menu { -webkit-backdrop-filter: blur(var(--glass-blur)); backdrop-filter: blur(var(--glass-blur)); }
|
|
265
|
+
html.visor-on .visor > :not(.visor__frame, .visor__notch) { transition: opacity var(--ds-dur-fast) var(--ds-ease); }
|
|
266
|
+
html.visor-on.game-menu-open .visor > :not(.visor__frame, .visor__notch) { opacity: .25; }
|
|
267
|
+
|
|
240
268
|
/* a phone (640px and narrower): the rules live in style.css’s shared phone block, so the
|
|
241
269
|
visor adds no breakpoint of its own (the design-count ratchet). */
|
|
@@ -28,6 +28,6 @@ The menu is a Helm screen, written from the hall tier's tokens alone (`settings.
|
|
|
28
28
|
## The options window (owner, 2026-11-11: "WoW sizing, an overlay")
|
|
29
29
|
|
|
30
30
|
- **In game mode the menu opens over the place, not as a page.** The game menu's Options row (task 1005250, `records/game-menu.md`; until then Escape itself), or a click on any link to `/settings` (the profile chip), draws one window (`shell-game.js` `openOverlay`, `window.OTBOptionsOverlay`), built on the shared dialog (`OTBDialog.bind`: Escape, scrim, close button, focus trap and return), with the page behind made `inert` while it is up, holding the menu framed with `?embed=1`; the place stays drawn behind it. Escape, the scrim or the × shuts it; `options-menu.js` `close()` shuts the window when it is in one. A page that cannot draw it falls back to the menu page. A plain visit to `/settings` is the page, as before.
|
|
31
|
-
- **Window sized, see-through.** The window is `min(1040px, …) × min(720px, …)` of glass at 48% of the ground with a light blur, over the shared `--scrim` at a third. Every embedded screen is drawn at `zoom: 0.82` with no ground of its own (`style.css`), and the menu inside it takes smaller words (`settings.css`, `html[data-embed="on"]`); a window-high length divides by the zoom (`--opt-vh`).
|
|
31
|
+
- **Window sized, see-through.** The window is `min(1040px, …) × min(720px, …)` of glass at 48% of the ground with a light blur, over the shared `--scrim` at a third. Every embedded screen is drawn at `zoom: 0.82` with no ground of its own (`style.css`), and the menu inside it takes smaller words (`settings.css`, `html[data-embed="on"]`); a window-high length divides by the zoom (`--opt-vh`). In game mode with the visor up the window fits inside the glass, between the top arc and the foot row, and never covers the visor (task 1005253, `records/visor.md`).
|
|
32
32
|
- **One review palette.** A framed screen docks no artist palette of its own (`craft-mode.js` `applyDocked`); the page around it has one.
|
|
33
33
|
- **Tests:** `tests/hall_options_menu.mjs` ("away from the menu, Escape opens the options as a window…"), `tests/page_notes_panel.mjs` (the frame docks no panel).
|
|
@@ -6,6 +6,14 @@ Covers: `visor.js` + `visor.css`, loaded on Home, `/city`, `/goal-map` and `/thi
|
|
|
6
6
|
|
|
7
7
|
The visor is the control and the scene is the view: every main call to action in game mode is on the glass (the accent button, the key hints, the Actions sheet), and a scene carries none of its own. A scene that has something to do registers it with `OTBVisor.scene({ actions, keys })`. ADR 0403 §3 lists the scenes that do not keep it yet; the Governor City keeps it since task 1005209 the sky since task 1005210, and Home's gallery since task 1005211 (below).
|
|
8
8
|
|
|
9
|
+
## A window the glass opens opens in the glass (task 1005253, owner 2026-11-13)
|
|
10
|
+
|
|
11
|
+
- **The bug.** The options window and your profile window (`shell-game.js` `openOverlay`, `.opt-window`), and the game menu (`openMenu`, `.game-menu`, task 1005250), are reached from the visor, yet they opened as a box over the whole screen and covered the visor itself: the arcs, the place, your credits, the accent button and the hints.
|
|
12
|
+
- **The rule.** A menu or window the visor opens never covers the visor. In game mode (`html.visor-on`) the window fits between the top arc (`--visor-inset-top`) and the foot row (`--visor-inset-bottom` + `--visor-foot-room`), inside the side insets, and the visor is drawn over the window's scrim, undimmed, as the frame it is seen through (`visor.css`). While a window is up the glass is a picture: none of it takes a pointer (the window is modal and keeps the keyboard), the sight leaves the window's middle, and the glass's own pop-ups (the sheet, the scene's pick, your card) step aside. Shut, the glass goes back to z 4.
|
|
13
|
+
- **The game menu is the one thing in focus** (owner, same day: "a frosted glass or blur… so the user focuses specifically on the game menu"). While it is up the place behind it is frosted (`backdrop-filter` with the hall's `--glass-blur`, on `.game-menu`, so it is under the glass and the visor's lines stay sharp), and everything on the glass but its two arcs and the notch fades to a quarter. The options and profile windows are glass of their own and keep the visor whole around them.
|
|
14
|
+
- **The glass's measures are on the root now** (`html[data-game="on"]`, and the phone block's `:root[data-game="on"]`), not on `#visor`, because the window is not inside the visor. The sheet reads `--visor-foot-room` too, so the sheet and a window keep the same clearance over the foot row. Classic mode keeps the centred window.
|
|
15
|
+
- **Tests:** `tests/hall_visor_profile.mjs` ("a window the visor opens sits inside the glass…", at a desk and a phone width).
|
|
16
|
+
|
|
9
17
|
## One owner per key (task 1005248, owner 2026-11-12)
|
|
10
18
|
|
|
11
19
|
- **The bug.** The Artist saw Esc twice: "Options" on the glass, then in the Actions sheet both Close and the Options row said Esc.
|
|
@@ -58,7 +66,7 @@ The glass was redrawn to the owner's mock-up "Cloud city: in the visor, minimal"
|
|
|
58
66
|
- **The four progress segments (task 1005203).** Under the place: the version the project is building, in quarters, then the same reading in words (`BONGOS-V2 · 89%`; the screen reader hears the version's name too). The owner chose the measure (2026-11-11): the version's `percent_complete` from the public `GET /versions/progress`, the number /status reports. The version is the starred focus (`GET /versions/focus`) while it is still open, else the first one `building`; with neither, or a failed read, no segments. A quarter wholly built is the soft ink, the quarter being built is the accent, the rest are outlines; each wears an outline of the night, and the words stand on a night plate (`--night-plate`, the rule task 1005196 set), for a midday sky. The arc band is `--visor-arc` (64px) and the scene inset grew to 88px (`--visor-inset-top`), so the sky's top offsets in `thinking.css` grew by 24px. Hidden on a phone, with the place. Harness fixture: `versions__progress.json`.
|
|
59
67
|
- **In the mock-up, not built, because the visor has no data for it:** the marker and name on the building in view (the visor owns no camera, ADR 0399 §2.2), and the party bars with a speaker's name and a Voice key. Each is a scene or a later task handing the visor real data; none is drawn empty.
|
|
60
68
|
- **It reads over any sky, with no per-hour style, and it darkens none of it** (task 1005196, owner 2026-11-11: "I don't like how dark the edges of the view are"). The glass paints nothing of its own: the bands of `--night-glass` at its top and bottom edge are gone, and so is the dark halo round its type. The marks carry themselves. The place, each key hint and your name and credits stand on a small cut plate of the night (`--night-plate`, the ground at 88%), sized to the words; every line is drawn twice (a wider solid stroke of the night under the ice hairline, `.visor__line--under`), so an arc is ice on night and a dark line on cream cloud; a key sits on a chip of the night. One new token, `--night-plate`. Tried first and dropped: a 4px night stroke round each letter with no plate, which filled the condensed capitals in.
|
|
61
|
-
- **The plates are smoked glass** (task 1005252, the owner's pick from a lab of seven treatments, 2026-11-12). Reviewing a screenshot of the hall put a second visor under ours, and solid plates stacked on its plates. Where the browser can blur, the place, each hint, your name and credits and the progress words are panes: the scene behind them blurred, slightly dimmed and greyed (`--smoke-blur`), a lighter tint of the night (`--smoke`, 62%), a faint sheen (`--smoke-sheen`) and a lit top edge (`--smoke-edge`). Still sized to the words, so the sky outside them is untouched. Asking for less transparency, or a browser without backdrop blur, gets the night plate (the fallback is in style.css, because visor.css carries no media query). Tried and not picked: glass bands top and foot (bring back the band task 1005196 removed), a blurred lens rim, and halos only (too weak over a white sky). On a phone (the shared 640px block in style.css) the hints and your credits keep the night plate: a live blur under a HUD the scene pans beneath costs every frame, and a phone has the weakest GPU. Every colour in the four smoke tokens derives from `--bg` or `--ink-soft`. **Seen and approved (2026-11-12):** the builder who asked for it picked smoked glass in the live lab (all seven treatments over four backdrops), then saw before/after renders of the real visor sheets (a midday sky, and a screenshot of the visor under the visor) and said "Ship it". They then saw it staged: the real hall served by the local preview harness (Home in game mode, the artisan held, the city pannable under the glass), and answered "Looks good, land it". Not yet looked at: the night hour.
|
|
69
|
+
- **The plates are smoked glass** (task 1005252, the owner's pick from a lab of seven treatments, 2026-11-12). Reviewing a screenshot of the hall put a second visor under ours, and solid plates stacked on its plates. Where the browser can blur, the place, each hint, your name and credits and the progress words are panes: the scene behind them blurred, slightly dimmed and greyed (`--smoke-blur`), a lighter tint of the night (`--smoke`, 62%), a faint sheen (`--smoke-sheen`) and a lit top edge (`--smoke-edge`). Still sized to the words, so the sky outside them is untouched. Asking for less transparency, or a browser without backdrop blur, gets the night plate (the fallback is in style.css, because visor.css carries no media query). Tried and not picked: glass bands top and foot (bring back the band task 1005196 removed), a blurred lens rim, and halos only (too weak over a white sky). On a phone (the shared 640px block in style.css) the hints and your credits keep the night plate: a live blur under a HUD the scene pans beneath costs every frame, and a phone has the weakest GPU. Every colour in the four smoke tokens derives from `--bg` or `--ink-soft`. **Seen and approved (2026-11-12):** the builder who asked for it picked smoked glass in the live lab (all seven treatments over four backdrops), then saw before/after renders of the real visor sheets (a midday sky, and a screenshot of the visor under the visor) and said "Ship it". They then saw it staged: the real hall served by the local preview harness (Home in game mode, the artisan held, the city pannable under the glass), and answered "Looks good, land it". Not yet looked at: the night hour. **The family across the hall (task 1005267, owner: "all six" from the Smoke across Helm lab).** Deep smoke (`--smoke-deep`, night at 76%, a 24px blur) for the big glass: the game menu, the start and load panels, the Options rail, the craft doors, the visor's sheet and focus card, a dialog, the top bar and rail. Light smoke for a toast and the city's labels. A smoke scrim (`--smoke-scrim`) blurs the world behind a dialog. All in one block in style.css behind `@supports`, every selector starting at `html[data-theme="dark"]`; the fallbacks (a phone, less transparency) are token overrides, so no rule has a twin. `tests/hall_smoke.mjs` holds it, in source and in a browser at desk and phone width. **Seen staged and approved (2026-11-13):** the owner looked at it in the hall preview harness (Home in game mode at night, the game menu open over the city, then the Actions sheet) and said "Ship it". Not opened in that review: a dialog, a toast, the start screen, and the top bar over a long scrolling page.
|
|
62
70
|
- **A phone.** The shared phone block in `style.css` (no breakpoint of the visor's own): the top arc, its notch and the place step aside (the top of a phone is the scene's and the shell's); the foot row stays one line with nothing leaning (the sprite, the count over its word, the accent button whose name may wrap and whose key is left to the sheet, and of the hints only Actions, as three dots on a night chip). Between a phone and a wide desk the hints wrap onto a second line, right-aligned, rather than run into the button.
|
|
63
71
|
- **Scenes.** The top arc, the notch and the place sit inside the top 64px (`--visor-arc`; the segments under them take the inset to 88px, `--visor-inset-top`), so no scene's top row is struck through. Home no longer shifts its greeting row left (there is no pill top-right to clear). The city's door rises above the foot row at every width, because the accent button is centred where the door stood. The sky's `visor-on` offsets are unchanged.
|
|
64
72
|
- **Looking at it.** The stand-in scene in `tests/hall_visor.mjs` over the hall's real sheets; put a bright gradient behind it to check midday.
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
<ul class="ref-list" role="list"><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--ok)" aria-hidden="true"></span><code class="ref-name">--ok</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#187444</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#4ade80</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--ok-weak)" aria-hidden="true"></span><code class="ref-name">--ok-weak</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, #187444 12%, var(--bg-card))</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, #4ade80 14%, var(--bg-card))</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--warn)" aria-hidden="true"></span><code class="ref-name">--warn</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#895c00</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#fbbf24</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--warn-weak)" aria-hidden="true"></span><code class="ref-name">--warn-weak</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, #895c00 14%, var(--bg-card))</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, #fbbf24 14%, var(--bg-card))</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--danger)" aria-hidden="true"></span><code class="ref-name">--danger</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#b42318</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#f87171</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--danger-weak)" aria-hidden="true"></span><code class="ref-name">--danger-weak</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, #b42318 10%, var(--bg-card))</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, #f87171 14%, var(--bg-card))</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--info)" aria-hidden="true"></span><code class="ref-name">--info</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--sea) 86%, #000000)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, var(--sea) 80%, #ffffff)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--info-weak)" aria-hidden="true"></span><code class="ref-name">--info-weak</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--info) 9%, var(--bg-card))</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, var(--info) 14%, var(--bg-card))</code></span></li></ul>
|
|
52
52
|
<h3 class="ref-sub">Derived colours</h3>
|
|
53
53
|
<p class="ref-note">Mixed from the thirteen, never typed as a new colour. Black and white with alpha appear only as a scrim, a shadow or glass.</p>
|
|
54
|
-
<ul class="ref-list" role="list"><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--glass)" aria-hidden="true"></span><code class="ref-name">--glass</code><span class="ref-val"><span class="ref-val__k">light</span> <code>rgba(23, 24, 26, .05)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>rgba(200, 241, 247, .1)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--glass-strong)" aria-hidden="true"></span><code class="ref-name">--glass-strong</code><span class="ref-val"><span class="ref-val__k">light</span> <code>rgba(23, 24, 26, .08)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>rgba(200, 241, 247, .16)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--glass-edge)" aria-hidden="true"></span><code class="ref-name">--glass-edge</code><span class="ref-val"><span class="ref-val__k">light</span> <code>rgba(23, 24, 26, .12)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>rgba(200, 241, 247, .2)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--void)" aria-hidden="true"></span><code class="ref-name">--void</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#050508</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#050d16</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--void-ink)" aria-hidden="true"></span><code class="ref-name">--void-ink</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#ffffff</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>var(--ink)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--void-edge)" aria-hidden="true"></span><code class="ref-name">--void-edge</code><span class="ref-val"><span class="ref-val__k">light</span> <code>rgba(23, 24, 26, .12)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>rgba(200, 241, 247, .4)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--skeleton)" aria-hidden="true"></span><code class="ref-name">--skeleton</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--ink) 10%, var(--bg-card))</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, var(--ink) 10%, var(--bg-card))</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--accent-ink)" aria-hidden="true"></span><code class="ref-name">--accent-ink</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--accent) 45%, #240e00)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>var(--accent)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--accent-lift)" aria-hidden="true"></span><code class="ref-name">--accent-lift</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--accent) 58%, #ffffff)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, var(--accent) 58%, #ffffff)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--accent-tint)" aria-hidden="true"></span><code class="ref-name">--accent-tint</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--accent) 30%, #fffdf9)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, var(--accent) 22%, #050d16)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--accent-on)" aria-hidden="true"></span><code class="ref-name">--accent-on</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#2a1305</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#2a1305</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--focus)" aria-hidden="true"></span><code class="ref-name">--focus</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--accent-deep) 82%, #3a1400)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>var(--accent)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--scrim)" aria-hidden="true"></span><code class="ref-name">--scrim</code><span class="ref-val"><span class="ref-val__k">light</span> <code>rgba(0, 0, 0, .55)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>rgba(0, 0, 0, .55)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--surface-2)" aria-hidden="true"></span><code class="ref-name">--surface-2</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--ink) 5%, var(--bg-card))</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, var(--ink) 6%, var(--bg-card))</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--night-glass)" aria-hidden="true"></span><code class="ref-name">--night-glass</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--bg) 72%, transparent)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, var(--bg) 72%, transparent)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--night-plate)" aria-hidden="true"></span><code class="ref-name">--night-plate</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--bg) 88%, transparent)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, var(--bg) 88%, transparent)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--smoke)" aria-hidden="true"></span><code class="ref-name">--smoke</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--bg) 62%, transparent)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, var(--bg) 62%, transparent)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-night-top)" aria-hidden="true"></span><code class="ref-name">--sky-night-top</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#02060c</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#02060c</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-night-mid)" aria-hidden="true"></span><code class="ref-name">--sky-night-mid</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#07121f</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#07121f</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-night-cloud)" aria-hidden="true"></span><code class="ref-name">--sky-night-cloud</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#456780</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#456780</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-night-cloud-shade)" aria-hidden="true"></span><code class="ref-name">--sky-night-cloud-shade</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#1a3348</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#1a3348</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-night-roof)" aria-hidden="true"></span><code class="ref-name">--sky-night-roof</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#2a475e</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#2a475e</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-night-lit)" aria-hidden="true"></span><code class="ref-name">--sky-night-lit</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#10263a</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#10263a</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-night-shade)" aria-hidden="true"></span><code class="ref-name">--sky-night-shade</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#081522</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#081522</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-night-base)" aria-hidden="true"></span><code class="ref-name">--sky-night-base</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#3c5d75</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#3c5d75</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-night-lamp)" aria-hidden="true"></span><code class="ref-name">--sky-night-lamp</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#ffe9c9</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#ffe9c9</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-night-line)" aria-hidden="true"></span><code class="ref-name">--sky-night-line</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#8fb3c8</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#8fb3c8</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dawn-top)" aria-hidden="true"></span><code class="ref-name">--sky-dawn-top</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#050d16</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#050d16</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dawn-mid)" aria-hidden="true"></span><code class="ref-name">--sky-dawn-mid</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#17334a</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#17334a</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dawn-cloud)" aria-hidden="true"></span><code class="ref-name">--sky-dawn-cloud</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#fbe3c8</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#fbe3c8</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dawn-cloud-shade)" aria-hidden="true"></span><code class="ref-name">--sky-dawn-cloud-shade</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#b08e8c</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#b08e8c</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dawn-roof)" aria-hidden="true"></span><code class="ref-name">--sky-dawn-roof</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#a9c0cc</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#a9c0cc</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dawn-lit)" aria-hidden="true"></span><code class="ref-name">--sky-dawn-lit</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#3f5b70</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#3f5b70</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dawn-shade)" aria-hidden="true"></span><code class="ref-name">--sky-dawn-shade</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#1f3a50</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#1f3a50</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dawn-base)" aria-hidden="true"></span><code class="ref-name">--sky-dawn-base</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#f0c9ab</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#f0c9ab</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dawn-lamp)" aria-hidden="true"></span><code class="ref-name">--sky-dawn-lamp</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#ffe2c4</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#ffe2c4</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dawn-line)" aria-hidden="true"></span><code class="ref-name">--sky-dawn-line</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#2f4b61</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#2f4b61</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-midday-top)" aria-hidden="true"></span><code class="ref-name">--sky-midday-top</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#1d5687</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#1d5687</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-midday-mid)" aria-hidden="true"></span><code class="ref-name">--sky-midday-mid</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#4a90c2</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#4a90c2</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-midday-cloud)" aria-hidden="true"></span><code class="ref-name">--sky-midday-cloud</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#fff6dc</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#fff6dc</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-midday-cloud-shade)" aria-hidden="true"></span><code class="ref-name">--sky-midday-cloud-shade</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#e8d2a8</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#e8d2a8</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-midday-roof)" aria-hidden="true"></span><code class="ref-name">--sky-midday-roof</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#fff3d4</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#fff3d4</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-midday-lit)" aria-hidden="true"></span><code class="ref-name">--sky-midday-lit</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#dcc79c</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#dcc79c</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-midday-shade)" aria-hidden="true"></span><code class="ref-name">--sky-midday-shade</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#7f93a8</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#7f93a8</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-midday-base)" aria-hidden="true"></span><code class="ref-name">--sky-midday-base</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#ffe6b3</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#ffe6b3</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-midday-lamp)" aria-hidden="true"></span><code class="ref-name">--sky-midday-lamp</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#fff6dc</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#fff6dc</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-midday-line)" aria-hidden="true"></span><code class="ref-name">--sky-midday-line</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#2f679a</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#2f679a</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dusk-top)" aria-hidden="true"></span><code class="ref-name">--sky-dusk-top</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#0a0f24</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#0a0f24</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dusk-mid)" aria-hidden="true"></span><code class="ref-name">--sky-dusk-mid</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#2a2552</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#2a2552</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dusk-cloud)" aria-hidden="true"></span><code class="ref-name">--sky-dusk-cloud</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#ffc79a</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#ffc79a</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dusk-cloud-shade)" aria-hidden="true"></span><code class="ref-name">--sky-dusk-cloud-shade</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#a8748a</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#a8748a</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dusk-roof)" aria-hidden="true"></span><code class="ref-name">--sky-dusk-roof</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#c7a3b0</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#c7a3b0</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dusk-lit)" aria-hidden="true"></span><code class="ref-name">--sky-dusk-lit</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#4a4470</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#4a4470</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dusk-shade)" aria-hidden="true"></span><code class="ref-name">--sky-dusk-shade</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#231f44</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#231f44</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dusk-base)" aria-hidden="true"></span><code class="ref-name">--sky-dusk-base</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#f6b596</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#f6b596</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dusk-lamp)" aria-hidden="true"></span><code class="ref-name">--sky-dusk-lamp</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#ffe2c4</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#ffe2c4</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dusk-line)" aria-hidden="true"></span><code class="ref-name">--sky-dusk-line</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#302b55</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#302b55</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-now-haze)" aria-hidden="true"></span><code class="ref-name">--sky-now-haze</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--sky-now-mid) 55%, var(--sky-now-cloud))</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, var(--sky-now-mid) 55%, var(--sky-now-cloud))</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-now-glow)" aria-hidden="true"></span><code class="ref-name">--sky-now-glow</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--sky-now-lamp) calc(var(--sky-now-windows) * 100%), transparent)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, var(--sky-now-lamp) calc(var(--sky-now-windows) * 100%), transparent)</code></span></li></ul>
|
|
54
|
+
<ul class="ref-list" role="list"><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--glass)" aria-hidden="true"></span><code class="ref-name">--glass</code><span class="ref-val"><span class="ref-val__k">light</span> <code>rgba(23, 24, 26, .05)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>rgba(200, 241, 247, .1)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--glass-strong)" aria-hidden="true"></span><code class="ref-name">--glass-strong</code><span class="ref-val"><span class="ref-val__k">light</span> <code>rgba(23, 24, 26, .08)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>rgba(200, 241, 247, .16)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--glass-edge)" aria-hidden="true"></span><code class="ref-name">--glass-edge</code><span class="ref-val"><span class="ref-val__k">light</span> <code>rgba(23, 24, 26, .12)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>rgba(200, 241, 247, .2)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--void)" aria-hidden="true"></span><code class="ref-name">--void</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#050508</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#050d16</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--void-ink)" aria-hidden="true"></span><code class="ref-name">--void-ink</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#ffffff</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>var(--ink)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--void-edge)" aria-hidden="true"></span><code class="ref-name">--void-edge</code><span class="ref-val"><span class="ref-val__k">light</span> <code>rgba(23, 24, 26, .12)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>rgba(200, 241, 247, .4)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--skeleton)" aria-hidden="true"></span><code class="ref-name">--skeleton</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--ink) 10%, var(--bg-card))</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, var(--ink) 10%, var(--bg-card))</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--accent-ink)" aria-hidden="true"></span><code class="ref-name">--accent-ink</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--accent) 45%, #240e00)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>var(--accent)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--accent-lift)" aria-hidden="true"></span><code class="ref-name">--accent-lift</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--accent) 58%, #ffffff)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, var(--accent) 58%, #ffffff)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--accent-tint)" aria-hidden="true"></span><code class="ref-name">--accent-tint</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--accent) 30%, #fffdf9)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, var(--accent) 22%, #050d16)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--accent-on)" aria-hidden="true"></span><code class="ref-name">--accent-on</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#2a1305</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#2a1305</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--focus)" aria-hidden="true"></span><code class="ref-name">--focus</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--accent-deep) 82%, #3a1400)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>var(--accent)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--scrim)" aria-hidden="true"></span><code class="ref-name">--scrim</code><span class="ref-val"><span class="ref-val__k">light</span> <code>rgba(0, 0, 0, .55)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>rgba(0, 0, 0, .55)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--surface-2)" aria-hidden="true"></span><code class="ref-name">--surface-2</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--ink) 5%, var(--bg-card))</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, var(--ink) 6%, var(--bg-card))</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--night-glass)" aria-hidden="true"></span><code class="ref-name">--night-glass</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--bg) 72%, transparent)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, var(--bg) 72%, transparent)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--night-plate)" aria-hidden="true"></span><code class="ref-name">--night-plate</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--bg) 88%, transparent)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, var(--bg) 88%, transparent)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--smoke)" aria-hidden="true"></span><code class="ref-name">--smoke</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--bg) 62%, transparent)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, var(--bg) 62%, transparent)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--smoke-deep)" aria-hidden="true"></span><code class="ref-name">--smoke-deep</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--bg) 76%, transparent)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, var(--bg) 76%, transparent)</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-night-top)" aria-hidden="true"></span><code class="ref-name">--sky-night-top</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#02060c</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#02060c</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-night-mid)" aria-hidden="true"></span><code class="ref-name">--sky-night-mid</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#07121f</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#07121f</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-night-cloud)" aria-hidden="true"></span><code class="ref-name">--sky-night-cloud</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#456780</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#456780</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-night-cloud-shade)" aria-hidden="true"></span><code class="ref-name">--sky-night-cloud-shade</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#1a3348</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#1a3348</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-night-roof)" aria-hidden="true"></span><code class="ref-name">--sky-night-roof</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#2a475e</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#2a475e</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-night-lit)" aria-hidden="true"></span><code class="ref-name">--sky-night-lit</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#10263a</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#10263a</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-night-shade)" aria-hidden="true"></span><code class="ref-name">--sky-night-shade</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#081522</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#081522</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-night-base)" aria-hidden="true"></span><code class="ref-name">--sky-night-base</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#3c5d75</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#3c5d75</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-night-lamp)" aria-hidden="true"></span><code class="ref-name">--sky-night-lamp</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#ffe9c9</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#ffe9c9</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-night-line)" aria-hidden="true"></span><code class="ref-name">--sky-night-line</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#8fb3c8</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#8fb3c8</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dawn-top)" aria-hidden="true"></span><code class="ref-name">--sky-dawn-top</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#050d16</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#050d16</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dawn-mid)" aria-hidden="true"></span><code class="ref-name">--sky-dawn-mid</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#17334a</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#17334a</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dawn-cloud)" aria-hidden="true"></span><code class="ref-name">--sky-dawn-cloud</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#fbe3c8</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#fbe3c8</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dawn-cloud-shade)" aria-hidden="true"></span><code class="ref-name">--sky-dawn-cloud-shade</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#b08e8c</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#b08e8c</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dawn-roof)" aria-hidden="true"></span><code class="ref-name">--sky-dawn-roof</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#a9c0cc</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#a9c0cc</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dawn-lit)" aria-hidden="true"></span><code class="ref-name">--sky-dawn-lit</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#3f5b70</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#3f5b70</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dawn-shade)" aria-hidden="true"></span><code class="ref-name">--sky-dawn-shade</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#1f3a50</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#1f3a50</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dawn-base)" aria-hidden="true"></span><code class="ref-name">--sky-dawn-base</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#f0c9ab</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#f0c9ab</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dawn-lamp)" aria-hidden="true"></span><code class="ref-name">--sky-dawn-lamp</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#ffe2c4</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#ffe2c4</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dawn-line)" aria-hidden="true"></span><code class="ref-name">--sky-dawn-line</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#2f4b61</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#2f4b61</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-midday-top)" aria-hidden="true"></span><code class="ref-name">--sky-midday-top</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#1d5687</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#1d5687</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-midday-mid)" aria-hidden="true"></span><code class="ref-name">--sky-midday-mid</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#4a90c2</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#4a90c2</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-midday-cloud)" aria-hidden="true"></span><code class="ref-name">--sky-midday-cloud</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#fff6dc</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#fff6dc</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-midday-cloud-shade)" aria-hidden="true"></span><code class="ref-name">--sky-midday-cloud-shade</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#e8d2a8</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#e8d2a8</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-midday-roof)" aria-hidden="true"></span><code class="ref-name">--sky-midday-roof</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#fff3d4</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#fff3d4</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-midday-lit)" aria-hidden="true"></span><code class="ref-name">--sky-midday-lit</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#dcc79c</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#dcc79c</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-midday-shade)" aria-hidden="true"></span><code class="ref-name">--sky-midday-shade</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#7f93a8</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#7f93a8</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-midday-base)" aria-hidden="true"></span><code class="ref-name">--sky-midday-base</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#ffe6b3</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#ffe6b3</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-midday-lamp)" aria-hidden="true"></span><code class="ref-name">--sky-midday-lamp</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#fff6dc</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#fff6dc</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-midday-line)" aria-hidden="true"></span><code class="ref-name">--sky-midday-line</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#2f679a</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#2f679a</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dusk-top)" aria-hidden="true"></span><code class="ref-name">--sky-dusk-top</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#0a0f24</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#0a0f24</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dusk-mid)" aria-hidden="true"></span><code class="ref-name">--sky-dusk-mid</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#2a2552</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#2a2552</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dusk-cloud)" aria-hidden="true"></span><code class="ref-name">--sky-dusk-cloud</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#ffc79a</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#ffc79a</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dusk-cloud-shade)" aria-hidden="true"></span><code class="ref-name">--sky-dusk-cloud-shade</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#a8748a</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#a8748a</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dusk-roof)" aria-hidden="true"></span><code class="ref-name">--sky-dusk-roof</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#c7a3b0</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#c7a3b0</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dusk-lit)" aria-hidden="true"></span><code class="ref-name">--sky-dusk-lit</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#4a4470</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#4a4470</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dusk-shade)" aria-hidden="true"></span><code class="ref-name">--sky-dusk-shade</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#231f44</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#231f44</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dusk-base)" aria-hidden="true"></span><code class="ref-name">--sky-dusk-base</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#f6b596</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#f6b596</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dusk-lamp)" aria-hidden="true"></span><code class="ref-name">--sky-dusk-lamp</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#ffe2c4</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#ffe2c4</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-dusk-line)" aria-hidden="true"></span><code class="ref-name">--sky-dusk-line</code><span class="ref-val"><span class="ref-val__k">light</span> <code>#302b55</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>#302b55</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-now-haze)" aria-hidden="true"></span><code class="ref-name">--sky-now-haze</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--sky-now-mid) 55%, var(--sky-now-cloud))</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, var(--sky-now-mid) 55%, var(--sky-now-cloud))</code></span></li><li class="ref-row ref-row--colour"><span class="ref-swatch" style="background: var(--sky-now-glow)" aria-hidden="true"></span><code class="ref-name">--sky-now-glow</code><span class="ref-val"><span class="ref-val__k">light</span> <code>color-mix(in srgb, var(--sky-now-lamp) calc(var(--sky-now-windows) * 100%), transparent)</code></span><span class="ref-val"><span class="ref-val__k">dark</span> <code>color-mix(in srgb, var(--sky-now-lamp) calc(var(--sky-now-windows) * 100%), transparent)</code></span></li></ul>
|
|
55
55
|
</section>
|
|
56
56
|
<section class="scroll ref-sec" id="ref-type" aria-labelledby="ref-type-h">
|
|
57
57
|
<h2 class="scroll__h" id="ref-type-h">Type</h2>
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.25.
|
|
3
|
+
"version": "1.25.10",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.25.
|
|
9
|
+
"version": "1.25.10",
|
|
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.25.
|
|
3
|
+
"version": "1.25.10",
|
|
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",
|
package/release-notes.json
CHANGED
|
@@ -11754,5 +11754,17 @@
|
|
|
11754
11754
|
"text": "Opening the builders' hall now starts on the Game or Classic choice. Signed out, your pick takes you to sign in and then straight to that menu."
|
|
11755
11755
|
}
|
|
11756
11756
|
],
|
|
11757
|
-
"1.25.8": []
|
|
11757
|
+
"1.25.8": [],
|
|
11758
|
+
"1.25.9": [
|
|
11759
|
+
{
|
|
11760
|
+
"id": "1005253",
|
|
11761
|
+
"text": "In game mode, the windows the visor opens (Options, your profile, the game menu) now open inside the visor instead of covering it, and the game menu blurs the place behind it and quiets the visor so it is the one thing in focu"
|
|
11762
|
+
}
|
|
11763
|
+
],
|
|
11764
|
+
"1.25.10": [
|
|
11765
|
+
{
|
|
11766
|
+
"id": "1005267",
|
|
11767
|
+
"text": "The hall's panels, menus, dialogs, toasts, top bar and city labels now share one smoked-glass look that softens whatever is behind them; phones keep solid panels."
|
|
11768
|
+
}
|
|
11769
|
+
]
|
|
11758
11770
|
}
|
package/src/module-api.js
CHANGED
|
@@ -81,7 +81,7 @@ const { sleep } = require('./sleep');
|
|
|
81
81
|
// MAJOR (see allowBoxScope below): passes the request through untouched.
|
|
82
82
|
function deprecatedNoopMiddleware(_req, _res, next) { next(); }
|
|
83
83
|
|
|
84
|
-
const CORE_VERSION = '1.25.
|
|
84
|
+
const CORE_VERSION = '1.25.10'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
85
85
|
|
|
86
86
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
87
87
|
// Usage: const log = api.logger('discord'); log.info('mounted');
|
package/tests/hall_game_menu.mjs
CHANGED
|
@@ -93,6 +93,35 @@ test('Escape in a game place opens the game menu, not the options; Escape again
|
|
|
93
93
|
await ctx.close();
|
|
94
94
|
});
|
|
95
95
|
|
|
96
|
+
// task 1005253 (owner, 2026-11-13): the menu is in the glass and is the one thing in focus. The
|
|
97
|
+
// place behind it is frosted, the visor stays over it with only its arcs at full strength, and
|
|
98
|
+
// it ends above the foot row.
|
|
99
|
+
test('the game menu is the one thing in focus: the place frosted, the glass quiet but for its arcs', { skip }, async () => {
|
|
100
|
+
const { ctx, page, errors } = await open();
|
|
101
|
+
await escape(page);
|
|
102
|
+
assert.equal(await menuUp(page), true);
|
|
103
|
+
await page.waitForTimeout(300); // the glass's fade
|
|
104
|
+
const f = await page.evaluate(() => {
|
|
105
|
+
const cs = (s) => getComputedStyle(document.querySelector(s));
|
|
106
|
+
return {
|
|
107
|
+
blur: cs('.game-menu').backdropFilter,
|
|
108
|
+
visorOver: Number(cs('#visor').zIndex) > Number(cs('.game-menu').zIndex),
|
|
109
|
+
foot: Number(cs('.visor__foot').opacity), arc: Number(cs('.visor__frame--top').opacity),
|
|
110
|
+
clear: document.querySelector('.game-menu__box').getBoundingClientRect().bottom <= document.querySelector('.visor__foot').getBoundingClientRect().top,
|
|
111
|
+
};
|
|
112
|
+
});
|
|
113
|
+
assert.match(f.blur, /^blur\(\d/, 'the place behind is frosted');
|
|
114
|
+
assert.ok(f.visorOver, 'the glass stays over the menu\'s scrim');
|
|
115
|
+
assert.ok(f.foot < 0.5, 'the buttons and words on the glass step back');
|
|
116
|
+
assert.equal(f.arc, 1, 'the arcs hold the menu at full strength');
|
|
117
|
+
assert.ok(f.clear, 'the menu ends above the foot row');
|
|
118
|
+
await escape(page);
|
|
119
|
+
await page.waitForTimeout(300);
|
|
120
|
+
assert.equal(await page.evaluate(() => Number(getComputedStyle(document.querySelector('.visor__foot')).opacity)), 1, 'shut, the glass is whole again');
|
|
121
|
+
assert.deepEqual(errors, []);
|
|
122
|
+
await ctx.close();
|
|
123
|
+
});
|
|
124
|
+
|
|
96
125
|
test('Return to game shuts the menu; Options opens the options window in its place', { skip }, async () => {
|
|
97
126
|
const { ctx, page, errors } = await open();
|
|
98
127
|
await escape(page);
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// tests/hall_smoke.mjs — the smoke family across the hall (task 1005267, follow-up to task 1005252).
|
|
2
|
+
//
|
|
3
|
+
// The owner picked "all six" from the Smoke across Helm lab: the hall's glass is one family.
|
|
4
|
+
// Light smoke (--smoke) for small things (a toast, the city's labels), deep smoke (--smoke-deep)
|
|
5
|
+
// for big ones (panels over art, the visor's sheet and card, a dialog, the top bar and rail), a
|
|
6
|
+
// smoke scrim behind a dialog. A phone and "less transparency" turn the family back to solid night
|
|
7
|
+
// by its TOKENS, so no rule needs a twin. The status page links controls.css without the hall's
|
|
8
|
+
// tier, so the one rule there falls back to no blur.
|
|
9
|
+
import assert from 'node:assert/strict';
|
|
10
|
+
import { test, after } from 'node:test';
|
|
11
|
+
import { createRequire } from 'node:module';
|
|
12
|
+
import fs from 'node:fs';
|
|
13
|
+
import path from 'node:path';
|
|
14
|
+
import { fileURLToPath } from 'node:url';
|
|
15
|
+
|
|
16
|
+
const require = createRequire(import.meta.url);
|
|
17
|
+
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
18
|
+
const HALL = path.join(ROOT, 'modules', 'hall-ui', 'public');
|
|
19
|
+
const read = (f) => fs.readFileSync(path.join(HALL, f), 'utf8').replace(/\r\n/g, '\n');
|
|
20
|
+
const STYLE = read('style.css');
|
|
21
|
+
const CONTROLS = read('controls.css');
|
|
22
|
+
|
|
23
|
+
const familyAt = STYLE.indexOf('/* THE SMOKE FAMILY ON THE HALL');
|
|
24
|
+
const FAMILY = STYLE.slice(familyAt, STYLE.indexOf('/* The Kill Switch Rule', familyAt));
|
|
25
|
+
const ruleFor = (sel) => { const at = FAMILY.indexOf(sel); assert.ok(at >= 0, sel + ' is in the family'); return FAMILY.slice(at, FAMILY.indexOf('}', at)); };
|
|
26
|
+
|
|
27
|
+
test('source: one family block, behind @supports, lifted by the hall\'s own stamp', () => {
|
|
28
|
+
assert.ok(familyAt > 0, 'the family block exists');
|
|
29
|
+
assert.match(FAMILY, /@supports \(\(backdrop-filter: blur\(1px\)\) or \(-webkit-backdrop-filter: blur\(1px\)\)\) \{/, 'a browser without blur keeps today\'s surfaces');
|
|
30
|
+
const sels = FAMILY.replace(/\/\*[\s\S]*?\*\//g, '').match(/[^{}]+\{/g).join(' ');
|
|
31
|
+
for (const s of sels.match(/\.[a-z][\w-]*/g)) {
|
|
32
|
+
if (/^\.(app|game|gs|opt|craft|visor|hall|toast|city|page|hc)/.test(s)) continue;
|
|
33
|
+
assert.fail('unexpected selector in the family: ' + s);
|
|
34
|
+
}
|
|
35
|
+
for (const line of FAMILY.replace(/\/\*[\s\S]*?\*\//g, '').split('\n').filter((l) => /\{\s*$/.test(l) && !/@supports/.test(l))) {
|
|
36
|
+
for (const part of line.replace(/\{\s*$/, '').split(',').map((p) => p.trim()).filter(Boolean)) {
|
|
37
|
+
assert.match(part, /^html\[data-theme="dark"\]/, 'every selector starts at the hall\'s stamp: ' + part);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test('source: the six surfaces spend the right weight of smoke', () => {
|
|
43
|
+
for (const sel of ['.game-menu__box', '.gs__menu', '.gs__load', '.opt-rail', '.craft-door', '.visor__sheet', '.visor__focus']) {
|
|
44
|
+
const r = ruleFor(sel);
|
|
45
|
+
assert.ok(r.includes('var(--smoke-deep)') && r.includes('backdrop-filter: var(--smoke-deep-blur)'), sel + ' takes deep smoke');
|
|
46
|
+
}
|
|
47
|
+
assert.ok(ruleFor('.hall-dialog {').includes('box-shadow: var(--smoke-edge), var(--ds-shadow-pop)'), 'a dialog keeps its lift under the pane');
|
|
48
|
+
const bars = ruleFor('.app-topbar');
|
|
49
|
+
assert.ok(bars.includes('.app-sidebar') && bars.includes('background: var(--smoke-deep);') && !bars.includes('sheen'), 'the bars: deep smoke, no sheen');
|
|
50
|
+
assert.ok(ruleFor('.hall-scrim {').includes('backdrop-filter: var(--smoke-scrim)'), 'a div overlay\'s scrim blurs the world');
|
|
51
|
+
const toast = ruleFor('.toast:not([data-kind="error"])');
|
|
52
|
+
assert.ok(toast.includes('var(--smoke)') && toast.includes('color: var(--ink)'), 'a toast is light smoke with white words; an error keeps its colour');
|
|
53
|
+
const labels = ruleFor('.city-line');
|
|
54
|
+
for (const s of ['.city-mark', '.city-plaque', '.city-archived', '.page-head__h', '.hc-ladder::before']) assert.ok(labels.includes(s), s + ' is a city label');
|
|
55
|
+
assert.ok(labels.includes('backdrop-filter: var(--smoke-blur)'), 'the city labels take the visor\'s light smoke');
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test('source: the native dialog\'s scrim blurs in the hall and nowhere else', () => {
|
|
59
|
+
assert.match(CONTROLS, /\.hall-dialog::backdrop \{ background: var\(--scrim\); \}/, 'the flat scrim stays the base');
|
|
60
|
+
assert.match(CONTROLS, /\.hall-dialog::backdrop \{ -webkit-backdrop-filter: var\(--smoke-scrim, none\); backdrop-filter: var\(--smoke-scrim, none\); \}/,
|
|
61
|
+
'no --smoke-scrim (the status page) falls back to no blur');
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
test('source: the fallbacks are tokens — less transparency and a phone turn every pane to solid night', () => {
|
|
65
|
+
const NIGHT = 'html:root { --smoke: var(--night-plate); --smoke-deep: var(--bg); --smoke-sheen: none; --smoke-edge: 0 0 0 0 transparent;\n --smoke-blur: none; --smoke-deep-blur: none; --smoke-scrim: none; }';
|
|
66
|
+
const rt = STYLE.indexOf('@media (prefers-reduced-transparency: reduce) {');
|
|
67
|
+
assert.ok(STYLE.indexOf(NIGHT, rt) > rt && STYLE.indexOf(NIGHT, rt) < familyAt, 'less transparency: solid night, by the tokens');
|
|
68
|
+
const phone = STYLE.match(/tasks 1005148 and 1005195, the visor[\s\S]*?\n\}/)[0];
|
|
69
|
+
assert.ok(phone.includes(NIGHT), 'a phone: solid night, by the tokens (no live blur on the weakest GPU)');
|
|
70
|
+
assert.ok(STYLE.match(/--smoke-edge: 0 0 0 0 transparent/g).length === 2, 'the edge falls back to a no-op shadow, so the dialog\'s pair stays valid');
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
// ---------- in a browser: the computed glass ----------
|
|
74
|
+
const lib = require(path.join(ROOT, 'modules', 'ui-design', 'kit', 'lib.js'));
|
|
75
|
+
let browser = null;
|
|
76
|
+
try { browser = await lib.launchBrowser(); } catch (e) { if (!(e instanceof lib.NoBrowserError)) throw e; }
|
|
77
|
+
after(() => browser && browser.close());
|
|
78
|
+
const skip = !browser && 'no system Edge or Chrome';
|
|
79
|
+
const ORIGIN = 'http://hall.test';
|
|
80
|
+
const PAGE = `<!doctype html><html data-theme="dark" data-faces="helm"><head><meta charset="utf-8">
|
|
81
|
+
<link rel="stylesheet" href="/builders/style.css"><link rel="stylesheet" href="/builders/controls.css"></head>
|
|
82
|
+
<body><div class="app-topbar">t</div><div class="app-sidebar">r</div><div class="game-menu__box">m</div><div class="opt-rail">o</div>
|
|
83
|
+
<div class="visor__sheet">s</div><div class="toast" data-visible="1">ok</div><div class="toast" data-kind="error">no</div>
|
|
84
|
+
<div class="city-plaque">p</div><dialog class="hall-dialog">d</dialog></body></html>`;
|
|
85
|
+
|
|
86
|
+
async function computed(width) {
|
|
87
|
+
const ctx = await browser.newContext({ viewport: { width, height: 800 } });
|
|
88
|
+
await ctx.route(ORIGIN + '/**', (route) => {
|
|
89
|
+
const p = new URL(route.request().url()).pathname;
|
|
90
|
+
if (p === '/') return route.fulfill({ contentType: 'text/html', body: PAGE });
|
|
91
|
+
const f = path.join(HALL, p.replace(/^\/builders\//, ''));
|
|
92
|
+
if (p.endsWith('.css') && fs.existsSync(f)) return route.fulfill({ contentType: 'text/css', body: fs.readFileSync(f) });
|
|
93
|
+
return route.fulfill({ status: 404, body: '' });
|
|
94
|
+
});
|
|
95
|
+
const page = await ctx.newPage();
|
|
96
|
+
await page.goto(ORIGIN + '/');
|
|
97
|
+
const out = await page.evaluate(() => {
|
|
98
|
+
const bf = (s) => getComputedStyle(document.querySelector(s)).backdropFilter;
|
|
99
|
+
return { bar: bf('.app-topbar'), rail: bf('.app-sidebar'), menu: bf('.game-menu__box'), opt: bf('.opt-rail'), sheet: bf('.visor__sheet'),
|
|
100
|
+
dialog: bf('.hall-dialog'), toast: bf('.toast[data-visible]'), err: bf('.toast[data-kind="error"]'), plaque: bf('.city-plaque') };
|
|
101
|
+
});
|
|
102
|
+
await ctx.close();
|
|
103
|
+
return out;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
test('on a desk the six surfaces are smoked; an error toast is not', { skip }, async () => {
|
|
107
|
+
const g = await computed(1280);
|
|
108
|
+
for (const k of ['bar', 'rail', 'menu', 'opt', 'sheet', 'dialog']) assert.match(g[k], /blur\(24px\)/, k + ' is deep smoke');
|
|
109
|
+
for (const k of ['toast', 'plaque']) assert.match(g[k], /blur\(14px\)/, k + ' is light smoke');
|
|
110
|
+
assert.equal(g.err, 'none', 'an error toast keeps its own colour and no glass');
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test('on a phone every pane is solid night', { skip }, async () => {
|
|
114
|
+
const g = await computed(390);
|
|
115
|
+
for (const k of ['bar', 'rail', 'menu', 'opt', 'sheet', 'dialog', 'toast', 'plaque']) assert.equal(g[k], 'none', k + ' has no live blur on a phone');
|
|
116
|
+
});
|
package/tests/hall_visor.mjs
CHANGED
|
@@ -219,7 +219,9 @@ test('source: the minimal visor spends the Helm tokens and types in no colour, s
|
|
|
219
219
|
assert.ok(plainAt >= 0 && plain.includes('html .visor__place, html .visor__who, html .visor__hint, html .visor__progress-words {'), 'less transparency is answered in style.css, lifted over visor.css');
|
|
220
220
|
assert.ok(plain.includes('background: var(--night-plate);') && plain.includes(' backdrop-filter: none;'), 'less transparency: the night plate again');
|
|
221
221
|
const smokeTokens = STYLE.match(/--smoke[a-z-]*:[^;]*;/g) || [];
|
|
222
|
-
|
|
222
|
+
const smokeNames = [...new Set(smokeTokens.map((t) => t.split(':')[0]))].sort();
|
|
223
|
+
assert.deepEqual(smokeNames, ['--smoke', '--smoke-blur', '--smoke-deep', '--smoke-deep-blur', '--smoke-edge', '--smoke-scrim', '--smoke-sheen'],
|
|
224
|
+
'one smoke family: the light pane, the deep pane, the scrim, the sheen and the edge (tasks 1005252, 1005267)');
|
|
223
225
|
assert.doesNotMatch(smokeTokens.join(' '), /rgba?\(|#[0-9a-f]{3,8}\b/i, 'every smoke colour derives from a Helm token, no literal');
|
|
224
226
|
assert.ok(STYLE.includes('html[data-game="on"] .visor__who, html[data-game="on"] .visor__hint { background: var(--night-plate); box-shadow: none; -webkit-backdrop-filter: none; backdrop-filter: none; }'), 'a phone keeps the night plate: no live blur on the weakest GPU');
|
|
225
227
|
assert.ok(STYLE.indexOf('backdrop-filter: none; }') > STYLE.indexOf('tasks 1005148 and 1005195, the visor'), 'and that rule sits in the shared phone block');
|
|
@@ -65,7 +65,7 @@ const SCENE = `<script>
|
|
|
65
65
|
window.__visorScene = { name: 'test', place: 'Test city', actions: [], keys: [] };
|
|
66
66
|
</script>`;
|
|
67
67
|
const PAGE = (withWindow) => `<!doctype html><html data-theme="dark" data-faces="helm"><head><meta charset="utf-8">
|
|
68
|
-
<link rel="stylesheet" href="/builders/style.css"><link rel="stylesheet" href="/builders/visor.css"></head>
|
|
68
|
+
<link rel="stylesheet" href="/tokens.css"><link rel="stylesheet" href="/builders/style.css"><link rel="stylesheet" href="/builders/visor.css"></head>
|
|
69
69
|
<body>${SCENE}<script src="/builders/hall-dialog.js"></script>${withWindow ? '<script src="/builders/shell-game.js"></script>' : ''}<script src="/builders/visor.js"></script></body></html>`;
|
|
70
70
|
|
|
71
71
|
async function open({ withWindow = true } = {}) {
|
|
@@ -73,6 +73,7 @@ async function open({ withWindow = true } = {}) {
|
|
|
73
73
|
await ctx.route(ORIGIN + '/**', (route) => {
|
|
74
74
|
const p = new URL(route.request().url()).pathname;
|
|
75
75
|
if (p === '/') return route.fulfill({ contentType: 'text/html', body: PAGE(withWindow) });
|
|
76
|
+
if (p === '/tokens.css') return route.fulfill({ contentType: 'text/css', body: fs.readFileSync(path.join(ROOT, 'modules/ui-design/public/tokens.css')) }); // the design tokens the hall loads first
|
|
76
77
|
if (p === '/profile') return route.fulfill({ contentType: 'text/html', body: '<!doctype html><title>profile</title><p id="pp">your profile</p><script src="/builders/shell-game.js"></script>' }); // the real page carries the game shell, which hands an Escape up
|
|
77
78
|
const f = path.join(HALL, p.replace(/^\/builders\//, ''));
|
|
78
79
|
if (p.startsWith('/builders/') && TYPES[path.extname(p)] && fs.existsSync(f)) return route.fulfill({ contentType: TYPES[path.extname(p)], body: fs.readFileSync(f) });
|
|
@@ -133,6 +134,44 @@ test('clicking you opens your whole profile in the window over the place; Escape
|
|
|
133
134
|
await ctx.close();
|
|
134
135
|
});
|
|
135
136
|
|
|
137
|
+
// task 1005253 (owner, 2026-11-13): a window the glass opens opens IN the glass. It never covers
|
|
138
|
+
// the visor: it sits under the top arc and above the foot row, the visor is drawn over its scrim,
|
|
139
|
+
// and while it is up nothing on the glass takes a pointer and the glass's own pop-ups step aside.
|
|
140
|
+
test('a window the visor opens sits inside the glass, and the visor stays drawn around it', { skip }, async () => {
|
|
141
|
+
for (const viewport of [{ width: 1280, height: 800 }, { width: 390, height: 844 }]) {
|
|
142
|
+
const { ctx, page, errors } = await open();
|
|
143
|
+
await page.setViewportSize(viewport);
|
|
144
|
+
await page.evaluate(() => window.OTBOptionsOverlay.open(''));
|
|
145
|
+
await page.waitForFunction(() => window.OTBOptionsOverlay.isOpen());
|
|
146
|
+
const g = await page.evaluate(() => {
|
|
147
|
+
const r = (s) => document.querySelector(s).getBoundingClientRect();
|
|
148
|
+
const box = r('.opt-window__box'); const foot = r('.visor__foot'); const main = r('.visor__main');
|
|
149
|
+
const z = (s) => Number(getComputedStyle(document.querySelector(s)).zIndex);
|
|
150
|
+
// what is on top at the centre of the accent button: the glass, not the window
|
|
151
|
+
const hit = document.elementsFromPoint(main.left + main.width / 2, main.top + main.height / 2);
|
|
152
|
+
return {
|
|
153
|
+
top: box.top, bottom: box.bottom, footTop: foot.top, place: getComputedStyle(document.documentElement).getPropertyValue('--visor-inset-top').trim(),
|
|
154
|
+
visorOver: z('#visor') > z('.opt-window'),
|
|
155
|
+
buttonUnder: hit.some((el) => el.closest && el.closest('.opt-window__box')),
|
|
156
|
+
mainPointer: getComputedStyle(document.querySelector('.visor__main')).pointerEvents,
|
|
157
|
+
sight: getComputedStyle(document.querySelector('.visor__sight')).visibility,
|
|
158
|
+
};
|
|
159
|
+
});
|
|
160
|
+
assert.ok(g.bottom <= g.footTop, `${viewport.width}px: the window ends above the foot row (${g.bottom} > ${g.footTop})`);
|
|
161
|
+
assert.equal(g.top, parseFloat(g.place), `${viewport.width}px: the window starts under the top arc`);
|
|
162
|
+
assert.ok(g.visorOver, 'the glass is drawn over the window\'s scrim');
|
|
163
|
+
assert.ok(!g.buttonUnder, 'the window covers none of the foot row');
|
|
164
|
+
assert.equal(g.mainPointer, 'none', 'the glass is a picture while the window is up');
|
|
165
|
+
assert.equal(g.sight, 'hidden', 'the sight leaves the window\'s middle');
|
|
166
|
+
await page.evaluate(() => window.OTBOptionsOverlay.close());
|
|
167
|
+
await page.waitForFunction(() => !window.OTBOptionsOverlay.isOpen());
|
|
168
|
+
assert.equal(await page.evaluate(() => getComputedStyle(document.querySelector('#visor')).zIndex), '4', 'shut, the glass goes back under the pop-ups');
|
|
169
|
+
assert.equal(await page.evaluate(() => getComputedStyle(document.querySelector('.visor__main')).pointerEvents), 'auto');
|
|
170
|
+
assert.deepEqual(errors, []);
|
|
171
|
+
await ctx.close();
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
|
|
136
175
|
test('with no window to draw, you are still a link to your profile', { skip }, async () => {
|
|
137
176
|
const { ctx, page, errors } = await open({ withWindow: false });
|
|
138
177
|
const r = await page.evaluate(() => {
|