@bongos/core 1.25.9 → 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 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.9",
6
- "core_contract": "1.25.9",
7
- "source_commit": "9ed90d8cd3b43792d4f4a598a347e8ab4441734d",
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-13T11:07:19.108Z",
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": 3999,
14
+ "functional_verbatim": 4000,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 4687,
20
- "tree_sha256": "a59edc6f17cdc5df23a1af969951b50606e5452598b4768170f27a744e38662b",
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": "5aa4770f0789676665312ce6caf84e4a57f7910deb2a7fb010e7f5e7ead6e8c7"
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": "653e77ea77b0810685513cc5dc10aa56ddf6f35108916db2f0779e690772b9f6"
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": "3237be76b658381ec9f5d891d419be1fc192e63b78452ba6ad5f586f1600f0e3"
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": "4675124c888ba195047e9a54c769a6a415a9ef6158fa69570ca4609b9dd046d6"
7460
+ "sha256": "4f63546a08862793d3fe341e262644f198760bbfc604e042f39e317ec1514970"
7461
7461
  },
7462
7462
  {
7463
7463
  "path": "modules/hall-ui/public/task-detail.js",
@@ -7877,7 +7877,7 @@
7877
7877
  {
7878
7878
  "path": "modules/hall-ui/records/visor.md",
7879
7879
  "mode": "0000644",
7880
- "sha256": "bacc075f1b33733375259174e2251e29c471c2c3df821b774e7b346898f9c24e"
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": "f1bdfad662e4bfb7108a8175aff863c8a8f9bff2b9fe87f515ab28f33f6ad82c"
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": "fcaa089d16adcf12a27e6946bf683e9198163ad06db072982c60cd01e23dd81d"
12250
+ "sha256": "c3e72096d4af2d7e8fb83e5cad86339d2e545e7935586096914d521eadcdb462"
12251
12251
  },
12252
12252
  {
12253
12253
  "path": "package.json",
12254
12254
  "mode": "0000644",
12255
- "sha256": "90bf1fb6bd405112ae7b6d1025d94be97565f27390021d5ccbd29498c78aa64f"
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": "8f297631502a99fdca4606ee73e11babb2845653242aea51af6536d69ecf6a5f"
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": "a983e792ad432153dc9855b490a47bbb33d01faa36448ee48bc4636e8ccd4a6e"
16285
+ "sha256": "6af4e54b019be69cb75a0c6181df0aa9f2fcc8f64759b626b7432c56d59387e5"
16286
16286
  },
16287
16287
  {
16288
16288
  "path": "src/module-loader/catalog.js",
@@ -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,7 +19567,7 @@
19562
19567
  {
19563
19568
  "path": "tests/hall_visor.mjs",
19564
19569
  "mode": "0000644",
19565
- "sha256": "61b841c72569b47e8c6011a1a3a969e5134f1f0023976ca37aa086115a0c35c8"
19570
+ "sha256": "4141b4c117ef5f8ca0393cc7b84ad8119aa1d0b35ac47a0628e129f33b677eac"
19566
19571
  },
19567
19572
  {
19568
19573
  "path": "tests/hall_visor_profile.mjs",
@@ -3458,5 +3458,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
3458
3458
  landed since 1.25.7 with no explicit bump. run 43412600767. (task 1002620)
3459
3459
  1.25.9 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3460
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)
3461
3463
  ---------------------------------------------------------------------------
3462
3464
  ```
@@ -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": "edbac26dd39e70bc",
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": "b2f8a634b905363d",
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": "b6e2a953bc435b4b",
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": "f905f58209651dc7",
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": "fa85296c94285592",
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": "1a123673d5c42eb1",
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": "f489c16266526faf",
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": "785cdc61de7f47d8",
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": "269ff7a1cfd6321c",
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": "acd20be9a69d8558",
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": "b39eeda78fc88c8b",
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": "1d4334e6e491f2e8",
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": "6b487fdb592daf9f",
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": "353f7a1879a701b3",
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": "05c0b64561105735",
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": "2f439bfb64896471",
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": "7410949d9aea8036",
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": "1cc1e77329378c59",
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": "ea01e6abd87dcd01",
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": "08a51d923113820a",
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": "54956a6409fa367f",
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": "4383ba8fb3e392f2",
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": "590c6916dbf983e9",
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": "c5e58719c2d5ed68",
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": "d8aaebb0b4307cb3",
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": "fb7a82cf8d12b927",
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": "aef96af62a009d70",
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": "47860545115fd317",
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": "88ed0a90ad234675",
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": "19780a3e357c9e36",
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": "0b07f1692457561d",
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": "ff7431bb0ccb520f",
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": "1d8e106e9142a083",
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": "c81e32c29d3bd144",
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
@@ -912,6 +957,9 @@ 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
965
  html[data-game="on"] .visor__sheet { max-height: 60vh; }
@@ -66,7 +66,7 @@ The glass was redrawn to the owner's mock-up "Cloud city: in the visor, minimal"
66
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`.
67
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.
68
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.
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.
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.
70
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.
71
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.
72
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.9",
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",
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.9",
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",
@@ -11760,5 +11760,11 @@
11760
11760
  "id": "1005253",
11761
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
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
+ }
11763
11769
  ]
11764
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.9'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
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');
@@ -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
+ });
@@ -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
- assert.equal(smokeTokens.length, 4, 'four smoke tokens: the tint, the blur, the sheen, the edge');
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');