@bongos/core 1.19.539 → 1.19.541
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 +34 -24
- package/.claude/skills/blocker-solve/SKILL.md +1 -1
- package/docs/copy-inventory.md +38 -36
- package/docs/copy-registry.json +63 -45
- package/docs/module-api-changelog.md +4 -0
- package/modules/hall-ui/public/hall-kit.js +105 -6
- package/modules/hall-ui/public/profile-charts.js +39 -4
- package/modules/hall-ui/public/profile.html +1 -1
- package/modules/hall-ui/public/profile.js +8 -1
- package/modules/hall-ui/public/style.css +31 -0
- package/modules/ideas/blockers.js +14 -8
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/src/bongos/routes/me.js +42 -0
- package/src/module-api.js +1 -1
- package/tests/blocker_detail_hydration.mjs +128 -0
- package/tests/hall_audit.mjs +4 -1
- package/tests/hall_kit_charts.mjs +75 -0
- package/tests/hall_profile_world.mjs +4 -1
- package/tests/me_ship_days_bound.mjs +76 -0
package/docs/copy-registry.json
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
"generator": "scripts/gds/copy-inventory.js",
|
|
4
4
|
"goal": 1000074,
|
|
5
5
|
"counts": {
|
|
6
|
-
"strings":
|
|
7
|
-
"unique_ids":
|
|
8
|
-
"certain":
|
|
6
|
+
"strings": 1683,
|
|
7
|
+
"unique_ids": 1455,
|
|
8
|
+
"certain": 1683,
|
|
9
9
|
"heuristic": 0,
|
|
10
10
|
"duplicate_ids": 159
|
|
11
11
|
},
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"builders-hall": {
|
|
14
14
|
"at": "modules/hall-ui/public",
|
|
15
15
|
"files": 76,
|
|
16
|
-
"strings":
|
|
16
|
+
"strings": 1210
|
|
17
17
|
},
|
|
18
18
|
"status-dashboard": {
|
|
19
19
|
"at": "modules/status-ui/public",
|
|
@@ -904,7 +904,7 @@
|
|
|
904
904
|
"occurrences": 2,
|
|
905
905
|
"at": [
|
|
906
906
|
"modules/hall-ui/public/hall-render.js:499",
|
|
907
|
-
"modules/hall-ui/public/profile.js:
|
|
907
|
+
"modules/hall-ui/public/profile.js:70"
|
|
908
908
|
]
|
|
909
909
|
},
|
|
910
910
|
{
|
|
@@ -954,7 +954,7 @@
|
|
|
954
954
|
"occurrences": 2,
|
|
955
955
|
"at": [
|
|
956
956
|
"modules/hall-ui/public/builders.js:480",
|
|
957
|
-
"modules/hall-ui/public/profile.js:
|
|
957
|
+
"modules/hall-ui/public/profile.js:120"
|
|
958
958
|
]
|
|
959
959
|
},
|
|
960
960
|
{
|
|
@@ -973,7 +973,7 @@
|
|
|
973
973
|
"text": "Nothing shipped yet.",
|
|
974
974
|
"occurrences": 2,
|
|
975
975
|
"at": [
|
|
976
|
-
"modules/hall-ui/public/profile.js:
|
|
976
|
+
"modules/hall-ui/public/profile.js:218",
|
|
977
977
|
"modules/hall-ui/public/work.js:1016"
|
|
978
978
|
]
|
|
979
979
|
},
|
|
@@ -1044,7 +1044,7 @@
|
|
|
1044
1044
|
"occurrences": 2,
|
|
1045
1045
|
"at": [
|
|
1046
1046
|
"modules/hall-ui/public/hall-render.js:513",
|
|
1047
|
-
"modules/hall-ui/public/profile.js:
|
|
1047
|
+
"modules/hall-ui/public/profile.js:64"
|
|
1048
1048
|
]
|
|
1049
1049
|
},
|
|
1050
1050
|
{
|
|
@@ -1253,7 +1253,7 @@
|
|
|
1253
1253
|
"text": "Sign in",
|
|
1254
1254
|
"occurrences": 2,
|
|
1255
1255
|
"at": [
|
|
1256
|
-
"modules/hall-ui/public/profile.js:
|
|
1256
|
+
"modules/hall-ui/public/profile.js:184",
|
|
1257
1257
|
"modules/hall-ui/public/settings.html:42"
|
|
1258
1258
|
]
|
|
1259
1259
|
},
|
|
@@ -1404,7 +1404,7 @@
|
|
|
1404
1404
|
"occurrences": 2,
|
|
1405
1405
|
"at": [
|
|
1406
1406
|
"modules/hall-ui/public/builders.js:487",
|
|
1407
|
-
"modules/hall-ui/public/profile.js:
|
|
1407
|
+
"modules/hall-ui/public/profile.js:127"
|
|
1408
1408
|
]
|
|
1409
1409
|
},
|
|
1410
1410
|
{
|
|
@@ -1533,8 +1533,8 @@
|
|
|
1533
1533
|
"text": "sign in",
|
|
1534
1534
|
"occurrences": 2,
|
|
1535
1535
|
"at": [
|
|
1536
|
-
"modules/hall-ui/public/profile-charts.js:
|
|
1537
|
-
"modules/hall-ui/public/profile-charts.js:
|
|
1536
|
+
"modules/hall-ui/public/profile-charts.js:493",
|
|
1537
|
+
"modules/hall-ui/public/profile-charts.js:505"
|
|
1538
1538
|
]
|
|
1539
1539
|
},
|
|
1540
1540
|
{
|
|
@@ -1848,7 +1848,7 @@
|
|
|
1848
1848
|
"surface": "builders-hall",
|
|
1849
1849
|
"text": "+ {…} more project{…} not publicly listed.",
|
|
1850
1850
|
"file": "modules/hall-ui/public/profile.js",
|
|
1851
|
-
"line":
|
|
1851
|
+
"line": 296,
|
|
1852
1852
|
"origin": "js-markup",
|
|
1853
1853
|
"confidence": "certain"
|
|
1854
1854
|
},
|
|
@@ -3585,7 +3585,7 @@
|
|
|
3585
3585
|
"surface": "builders-hall",
|
|
3586
3586
|
"text": "Could not load the profile.",
|
|
3587
3587
|
"file": "modules/hall-ui/public/profile.js",
|
|
3588
|
-
"line":
|
|
3588
|
+
"line": 766,
|
|
3589
3589
|
"origin": "js-notice",
|
|
3590
3590
|
"confidence": "certain"
|
|
3591
3591
|
},
|
|
@@ -5529,7 +5529,7 @@
|
|
|
5529
5529
|
"surface": "builders-hall",
|
|
5530
5530
|
"text": "Karma — peer recognition and approvals, a separate counter from {…}.",
|
|
5531
5531
|
"file": "modules/hall-ui/public/profile.js",
|
|
5532
|
-
"line":
|
|
5532
|
+
"line": 70,
|
|
5533
5533
|
"origin": "js-markup",
|
|
5534
5534
|
"confidence": "certain"
|
|
5535
5535
|
},
|
|
@@ -5916,7 +5916,7 @@
|
|
|
5916
5916
|
"surface": "builders-hall",
|
|
5917
5917
|
"text": "Lookback window",
|
|
5918
5918
|
"file": "modules/hall-ui/public/profile-charts.js",
|
|
5919
|
-
"line":
|
|
5919
|
+
"line": 425,
|
|
5920
5920
|
"origin": "js-markup",
|
|
5921
5921
|
"confidence": "certain"
|
|
5922
5922
|
},
|
|
@@ -5961,7 +5961,7 @@
|
|
|
5961
5961
|
"surface": "builders-hall",
|
|
5962
5962
|
"text": "Member since {…}",
|
|
5963
5963
|
"file": "modules/hall-ui/public/profile.js",
|
|
5964
|
-
"line":
|
|
5964
|
+
"line": 70,
|
|
5965
5965
|
"origin": "js-markup",
|
|
5966
5966
|
"confidence": "certain"
|
|
5967
5967
|
},
|
|
@@ -5970,7 +5970,7 @@
|
|
|
5970
5970
|
"surface": "builders-hall",
|
|
5971
5971
|
"text": "Merged into",
|
|
5972
5972
|
"file": "modules/hall-ui/public/profile.js",
|
|
5973
|
-
"line":
|
|
5973
|
+
"line": 382,
|
|
5974
5974
|
"origin": "js-markup",
|
|
5975
5975
|
"confidence": "certain"
|
|
5976
5976
|
},
|
|
@@ -6177,7 +6177,7 @@
|
|
|
6177
6177
|
"surface": "builders-hall",
|
|
6178
6178
|
"text": "Next page",
|
|
6179
6179
|
"file": "modules/hall-ui/public/hall-kit.js",
|
|
6180
|
-
"line":
|
|
6180
|
+
"line": 74,
|
|
6181
6181
|
"origin": "js-markup",
|
|
6182
6182
|
"confidence": "certain"
|
|
6183
6183
|
},
|
|
@@ -6195,7 +6195,7 @@
|
|
|
6195
6195
|
"surface": "builders-hall",
|
|
6196
6196
|
"text": "Next ›",
|
|
6197
6197
|
"file": "modules/hall-ui/public/hall-kit.js",
|
|
6198
|
-
"line":
|
|
6198
|
+
"line": 74,
|
|
6199
6199
|
"origin": "js-markup",
|
|
6200
6200
|
"confidence": "certain"
|
|
6201
6201
|
},
|
|
@@ -6222,7 +6222,7 @@
|
|
|
6222
6222
|
"surface": "builders-hall",
|
|
6223
6223
|
"text": "No achievements earned yet.",
|
|
6224
6224
|
"file": "modules/hall-ui/public/profile.js",
|
|
6225
|
-
"line":
|
|
6225
|
+
"line": 120,
|
|
6226
6226
|
"origin": "js-markup",
|
|
6227
6227
|
"confidence": "certain"
|
|
6228
6228
|
},
|
|
@@ -6240,7 +6240,7 @@
|
|
|
6240
6240
|
"surface": "builders-hall",
|
|
6241
6241
|
"text": "No cross-project activity reported yet.",
|
|
6242
6242
|
"file": "modules/hall-ui/public/profile.js",
|
|
6243
|
-
"line":
|
|
6243
|
+
"line": 299,
|
|
6244
6244
|
"origin": "js-markup",
|
|
6245
6245
|
"confidence": "certain"
|
|
6246
6246
|
},
|
|
@@ -6609,7 +6609,7 @@
|
|
|
6609
6609
|
"surface": "builders-hall",
|
|
6610
6610
|
"text": "Nothing shipped yet.",
|
|
6611
6611
|
"file": "modules/hall-ui/public/profile.js",
|
|
6612
|
-
"line":
|
|
6612
|
+
"line": 218,
|
|
6613
6613
|
"origin": "js-markup",
|
|
6614
6614
|
"confidence": "certain"
|
|
6615
6615
|
},
|
|
@@ -6924,7 +6924,7 @@
|
|
|
6924
6924
|
"surface": "builders-hall",
|
|
6925
6925
|
"text": "Page {…} of {…}",
|
|
6926
6926
|
"file": "modules/hall-ui/public/hall-kit.js",
|
|
6927
|
-
"line":
|
|
6927
|
+
"line": 112,
|
|
6928
6928
|
"origin": "js-text-assign",
|
|
6929
6929
|
"confidence": "certain"
|
|
6930
6930
|
},
|
|
@@ -7014,7 +7014,7 @@
|
|
|
7014
7014
|
"surface": "builders-hall",
|
|
7015
7015
|
"text": "Per page",
|
|
7016
7016
|
"file": "modules/hall-ui/public/hall-kit.js",
|
|
7017
|
-
"line":
|
|
7017
|
+
"line": 74,
|
|
7018
7018
|
"origin": "js-markup",
|
|
7019
7019
|
"confidence": "certain"
|
|
7020
7020
|
},
|
|
@@ -7068,7 +7068,7 @@
|
|
|
7068
7068
|
"surface": "builders-hall",
|
|
7069
7069
|
"text": "Preferred work:",
|
|
7070
7070
|
"file": "modules/hall-ui/public/profile.js",
|
|
7071
|
-
"line":
|
|
7071
|
+
"line": 64,
|
|
7072
7072
|
"origin": "js-markup",
|
|
7073
7073
|
"confidence": "certain"
|
|
7074
7074
|
},
|
|
@@ -7086,7 +7086,7 @@
|
|
|
7086
7086
|
"surface": "builders-hall",
|
|
7087
7087
|
"text": "Previous page",
|
|
7088
7088
|
"file": "modules/hall-ui/public/hall-kit.js",
|
|
7089
|
-
"line":
|
|
7089
|
+
"line": 74,
|
|
7090
7090
|
"origin": "js-markup",
|
|
7091
7091
|
"confidence": "certain"
|
|
7092
7092
|
},
|
|
@@ -7311,7 +7311,7 @@
|
|
|
7311
7311
|
"surface": "builders-hall",
|
|
7312
7312
|
"text": "Rank: {…}",
|
|
7313
7313
|
"file": "modules/hall-ui/public/profile.js",
|
|
7314
|
-
"line":
|
|
7314
|
+
"line": 50,
|
|
7315
7315
|
"origin": "js-markup",
|
|
7316
7316
|
"confidence": "certain"
|
|
7317
7317
|
},
|
|
@@ -7590,7 +7590,7 @@
|
|
|
7590
7590
|
"surface": "builders-hall",
|
|
7591
7591
|
"text": "Remove filter",
|
|
7592
7592
|
"file": "modules/hall-ui/public/hall-kit.js",
|
|
7593
|
-
"line":
|
|
7593
|
+
"line": 311,
|
|
7594
7594
|
"origin": "js-markup",
|
|
7595
7595
|
"confidence": "certain"
|
|
7596
7596
|
},
|
|
@@ -8274,7 +8274,7 @@
|
|
|
8274
8274
|
"surface": "builders-hall",
|
|
8275
8275
|
"text": "Sign in",
|
|
8276
8276
|
"file": "modules/hall-ui/public/profile.js",
|
|
8277
|
-
"line":
|
|
8277
|
+
"line": 184,
|
|
8278
8278
|
"origin": "js-markup",
|
|
8279
8279
|
"confidence": "certain"
|
|
8280
8280
|
},
|
|
@@ -8508,7 +8508,7 @@
|
|
|
8508
8508
|
"surface": "builders-hall",
|
|
8509
8509
|
"text": "Standing there",
|
|
8510
8510
|
"file": "modules/hall-ui/public/profile.js",
|
|
8511
|
-
"line":
|
|
8511
|
+
"line": 290,
|
|
8512
8512
|
"origin": "js-markup",
|
|
8513
8513
|
"confidence": "certain"
|
|
8514
8514
|
},
|
|
@@ -8517,7 +8517,7 @@
|
|
|
8517
8517
|
"surface": "builders-hall",
|
|
8518
8518
|
"text": "Still open",
|
|
8519
8519
|
"file": "modules/hall-ui/public/profile.js",
|
|
8520
|
-
"line":
|
|
8520
|
+
"line": 387,
|
|
8521
8521
|
"origin": "js-markup",
|
|
8522
8522
|
"confidence": "certain"
|
|
8523
8523
|
},
|
|
@@ -8742,7 +8742,7 @@
|
|
|
8742
8742
|
"surface": "builders-hall",
|
|
8743
8743
|
"text": "That project's own standing, as reported by that project.",
|
|
8744
8744
|
"file": "modules/hall-ui/public/profile.js",
|
|
8745
|
-
"line":
|
|
8745
|
+
"line": 290,
|
|
8746
8746
|
"origin": "js-markup",
|
|
8747
8747
|
"confidence": "certain"
|
|
8748
8748
|
},
|
|
@@ -9237,7 +9237,7 @@
|
|
|
9237
9237
|
"surface": "builders-hall",
|
|
9238
9238
|
"text": "This builder keeps their track record private.",
|
|
9239
9239
|
"file": "modules/hall-ui/public/profile.js",
|
|
9240
|
-
"line":
|
|
9240
|
+
"line": 270,
|
|
9241
9241
|
"origin": "js-markup",
|
|
9242
9242
|
"confidence": "certain"
|
|
9243
9243
|
},
|
|
@@ -9336,7 +9336,7 @@
|
|
|
9336
9336
|
"surface": "builders-hall",
|
|
9337
9337
|
"text": "This is you —",
|
|
9338
9338
|
"file": "modules/hall-ui/public/profile.js",
|
|
9339
|
-
"line":
|
|
9339
|
+
"line": 266,
|
|
9340
9340
|
"origin": "js-markup",
|
|
9341
9341
|
"confidence": "certain"
|
|
9342
9342
|
},
|
|
@@ -9957,7 +9957,7 @@
|
|
|
9957
9957
|
"surface": "builders-hall",
|
|
9958
9958
|
"text": "Won {…}",
|
|
9959
9959
|
"file": "modules/hall-ui/public/profile.js",
|
|
9960
|
-
"line":
|
|
9960
|
+
"line": 127,
|
|
9961
9961
|
"origin": "js-markup",
|
|
9962
9962
|
"confidence": "certain"
|
|
9963
9963
|
},
|
|
@@ -10339,6 +10339,15 @@
|
|
|
10339
10339
|
"origin": "js-markup",
|
|
10340
10340
|
"confidence": "certain"
|
|
10341
10341
|
},
|
|
10342
|
+
{
|
|
10343
|
+
"id": "b410b052f000",
|
|
10344
|
+
"surface": "builders-hall",
|
|
10345
|
+
"text": "Your shipping year",
|
|
10346
|
+
"file": "modules/hall-ui/public/profile-charts.js",
|
|
10347
|
+
"line": 279,
|
|
10348
|
+
"origin": "js-markup",
|
|
10349
|
+
"confidence": "certain"
|
|
10350
|
+
},
|
|
10342
10351
|
{
|
|
10343
10352
|
"id": "c16addf957d0",
|
|
10344
10353
|
"surface": "builders-hall",
|
|
@@ -10420,6 +10429,15 @@
|
|
|
10420
10429
|
"origin": "js-markup",
|
|
10421
10430
|
"confidence": "certain"
|
|
10422
10431
|
},
|
|
10432
|
+
{
|
|
10433
|
+
"id": "a02616e47d11",
|
|
10434
|
+
"surface": "builders-hall",
|
|
10435
|
+
"text": "a year of qualifying ships, in your timezone \\u00b7 only you see this one",
|
|
10436
|
+
"file": "modules/hall-ui/public/profile-charts.js",
|
|
10437
|
+
"line": 279,
|
|
10438
|
+
"origin": "js-markup",
|
|
10439
|
+
"confidence": "certain"
|
|
10440
|
+
},
|
|
10423
10441
|
{
|
|
10424
10442
|
"id": "44e6e402db94",
|
|
10425
10443
|
"surface": "builders-hall",
|
|
@@ -11037,7 +11055,7 @@
|
|
|
11037
11055
|
"surface": "builders-hall",
|
|
11038
11056
|
"text": "manage its visibility in Settings → Cross-project record",
|
|
11039
11057
|
"file": "modules/hall-ui/public/profile.js",
|
|
11040
|
-
"line":
|
|
11058
|
+
"line": 266,
|
|
11041
11059
|
"origin": "js-markup",
|
|
11042
11060
|
"confidence": "certain"
|
|
11043
11061
|
},
|
|
@@ -11118,7 +11136,7 @@
|
|
|
11118
11136
|
"surface": "builders-hall",
|
|
11119
11137
|
"text": "no data",
|
|
11120
11138
|
"file": "modules/hall-ui/public/hall-kit.js",
|
|
11121
|
-
"line":
|
|
11139
|
+
"line": 727,
|
|
11122
11140
|
"origin": "js-markup",
|
|
11123
11141
|
"confidence": "certain"
|
|
11124
11142
|
},
|
|
@@ -11451,7 +11469,7 @@
|
|
|
11451
11469
|
"surface": "builders-hall",
|
|
11452
11470
|
"text": "sign in",
|
|
11453
11471
|
"file": "modules/hall-ui/public/profile-charts.js",
|
|
11454
|
-
"line":
|
|
11472
|
+
"line": 493,
|
|
11455
11473
|
"origin": "js-markup",
|
|
11456
11474
|
"confidence": "certain"
|
|
11457
11475
|
},
|
|
@@ -11460,7 +11478,7 @@
|
|
|
11460
11478
|
"surface": "builders-hall",
|
|
11461
11479
|
"text": "sign in",
|
|
11462
11480
|
"file": "modules/hall-ui/public/profile-charts.js",
|
|
11463
|
-
"line":
|
|
11481
|
+
"line": 505,
|
|
11464
11482
|
"origin": "js-markup",
|
|
11465
11483
|
"confidence": "certain"
|
|
11466
11484
|
},
|
|
@@ -11631,7 +11649,7 @@
|
|
|
11631
11649
|
"surface": "builders-hall",
|
|
11632
11650
|
"text": "to see the full record.",
|
|
11633
11651
|
"file": "modules/hall-ui/public/profile.js",
|
|
11634
|
-
"line":
|
|
11652
|
+
"line": 184,
|
|
11635
11653
|
"origin": "js-markup",
|
|
11636
11654
|
"confidence": "certain"
|
|
11637
11655
|
},
|
|
@@ -11991,7 +12009,7 @@
|
|
|
11991
12009
|
"surface": "builders-hall",
|
|
11992
12010
|
"text": "{…} of {…} shipped",
|
|
11993
12011
|
"file": "modules/hall-ui/public/profile.js",
|
|
11994
|
-
"line":
|
|
12012
|
+
"line": 488,
|
|
11995
12013
|
"origin": "js-markup",
|
|
11996
12014
|
"confidence": "certain"
|
|
11997
12015
|
},
|
|
@@ -12009,7 +12027,7 @@
|
|
|
12009
12027
|
"surface": "builders-hall",
|
|
12010
12028
|
"text": "{…} per page",
|
|
12011
12029
|
"file": "modules/hall-ui/public/hall-kit.js",
|
|
12012
|
-
"line":
|
|
12030
|
+
"line": 74,
|
|
12013
12031
|
"origin": "js-markup",
|
|
12014
12032
|
"confidence": "certain"
|
|
12015
12033
|
},
|
|
@@ -12216,7 +12234,7 @@
|
|
|
12216
12234
|
"surface": "builders-hall",
|
|
12217
12235
|
"text": "{…} — total payout from shipped work.",
|
|
12218
12236
|
"file": "modules/hall-ui/public/profile.js",
|
|
12219
|
-
"line":
|
|
12237
|
+
"line": 70,
|
|
12220
12238
|
"origin": "js-markup",
|
|
12221
12239
|
"confidence": "certain"
|
|
12222
12240
|
},
|
|
@@ -12432,7 +12450,7 @@
|
|
|
12432
12450
|
"surface": "builders-hall",
|
|
12433
12451
|
"text": "‹ Prev",
|
|
12434
12452
|
"file": "modules/hall-ui/public/hall-kit.js",
|
|
12435
|
-
"line":
|
|
12453
|
+
"line": 74,
|
|
12436
12454
|
"origin": "js-markup",
|
|
12437
12455
|
"confidence": "certain"
|
|
12438
12456
|
},
|
|
@@ -1527,5 +1527,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
1527
1527
|
landed since 1.19.537 with no explicit bump. run 33890191596. (task 1002620)
|
|
1528
1528
|
1.19.539 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1529
1529
|
landed since 1.19.538 with no explicit bump. run 33892948885. (task 1002620)
|
|
1530
|
+
1.19.540 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1531
|
+
landed since 1.19.539 with no explicit bump. run 33895602533. (task 1002620)
|
|
1532
|
+
1.19.541 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1533
|
+
landed since 1.19.540 with no explicit bump. run 33897974683. (task 1002620)
|
|
1530
1534
|
---------------------------------------------------------------------------
|
|
1531
1535
|
```
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
// modules/hall-ui/public/hall-kit.js — the hall's shared UI component kit
|
|
2
2
|
// (task 2166, the hall UX-coherence program's foundation).
|
|
3
3
|
//
|
|
4
|
-
// One dependency-free IIFE exposing `window.OTBKit`: the SIX primitives
|
|
5
|
-
// page redesign (tasks 2169–2176) adopts instead of re-implementing —
|
|
6
|
-
// ledger, filter bar, tabs, section rail, empty/skeleton/collapsible
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
4
|
+
// One dependency-free IIFE exposing `window.OTBKit`: the SIX layout primitives
|
|
5
|
+
// every page redesign (tasks 2169–2176) adopts instead of re-implementing —
|
|
6
|
+
// pager, ledger, filter bar, tabs, section rail, empty/skeleton/collapsible —
|
|
7
|
+
// plus, since task 1003445, the hall's CHART families: a horizontal bar series
|
|
8
|
+
// and a sparkline, the plotted time-axis charts, and (task 1003572) the
|
|
9
|
+
// year-grid contribution calendar. Before this file, the ledger+pager block
|
|
10
|
+
// existed in ~10 drifted copies across work.js / goals-page.js / builders.js;
|
|
11
|
+
// the section rail existed twice with different mechanics (Standing scrollspy vs
|
|
12
|
+
// Settings panel-switch), and the same bar series was hand-drawn three times.
|
|
10
13
|
//
|
|
11
14
|
// Contract:
|
|
12
15
|
// - Dependency-free like shell.js (own esc(), no window.OTB use) so load order
|
|
@@ -1030,6 +1033,100 @@
|
|
|
1030
1033
|
+ '</div>';
|
|
1031
1034
|
}
|
|
1032
1035
|
|
|
1036
|
+
// calendarGridHtml(days, opts) — a year of ship-days as a contribution calendar:
|
|
1037
|
+
// one cell per calendar day, BANDED by count rather than scaled, its reading a
|
|
1038
|
+
// per-cell title (plus an aria summary on the whole grid), not a crosshair. The
|
|
1039
|
+
// hall's THIRD chart family (task 1003572, criterion legibility-series-are-drawn):
|
|
1040
|
+
// OTBKit's other two shapes are a horizontal bar series and a plot on a time axis;
|
|
1041
|
+
// a 2-D year grid is neither, so it earns its own primitive rather than a hand-roll
|
|
1042
|
+
// at the page (modules/hall-ui/CLAUDE.md; tests/hall_audit.mjs section 6b).
|
|
1043
|
+
//
|
|
1044
|
+
// THE READING, decided and written down (the task asked which): a NON-picture reader
|
|
1045
|
+
// gets the exact figure two ways — each cell carries a `title` ("2026-09-03 · 3
|
|
1046
|
+
// ships" / "… · no ships"), and the grid carries an aria-label summarising the
|
|
1047
|
+
// window (active days + total ships). No table twin: unlike a line, a calendar's
|
|
1048
|
+
// value IS its position, so a per-cell title reads the same fact the picture shows,
|
|
1049
|
+
// and a 366-row table beneath would be longer than the thing it explains.
|
|
1050
|
+
//
|
|
1051
|
+
// `days`: [{ local_date:'YYYY-MM-DD', count }] — SPARSE (only days that had ships),
|
|
1052
|
+
// already resolved in the BUILDER's timezone server-side (GET /me). Empty → '' so
|
|
1053
|
+
// the caller renders its own empty state, never an empty grid.
|
|
1054
|
+
//
|
|
1055
|
+
// THE TIMEZONE TRAP the task names: local_date is already the builder's own day, so
|
|
1056
|
+
// the grid is built by ORDINAL arithmetic on the 'YYYY-MM-DD' parts (Date.UTC on the
|
|
1057
|
+
// parsed integers, floored to an epoch day) — never `new Date('2026-09-03')`, which
|
|
1058
|
+
// is UTC-midnight and would shift a cell a day west of Greenwich. Same epoch-day
|
|
1059
|
+
// floor cumulateByDay uses, so no cell moves relative to the other charts.
|
|
1060
|
+
function calendarGridHtml(days, opts = {}) {
|
|
1061
|
+
const list = (days || []).filter((d) => d && typeof d.local_date === 'string');
|
|
1062
|
+
const ymdToOrd = (ymd) => {
|
|
1063
|
+
const m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(ymd);
|
|
1064
|
+
if (!m) return null;
|
|
1065
|
+
return Math.floor(Date.UTC(Number(m[1]), Number(m[2]) - 1, Number(m[3])) / 86400000);
|
|
1066
|
+
};
|
|
1067
|
+
const ordToYmd = (ord) => {
|
|
1068
|
+
const dt = new Date(ord * 86400000);
|
|
1069
|
+
return `${dt.getUTCFullYear()}-${String(dt.getUTCMonth() + 1).padStart(2, '0')}-${String(dt.getUTCDate()).padStart(2, '0')}`;
|
|
1070
|
+
};
|
|
1071
|
+
const counts = new Map();
|
|
1072
|
+
let maxOrd = null;
|
|
1073
|
+
let activeDays = 0;
|
|
1074
|
+
let totalShips = 0;
|
|
1075
|
+
for (const d of list) {
|
|
1076
|
+
const o = ymdToOrd(d.local_date);
|
|
1077
|
+
if (o == null) continue;
|
|
1078
|
+
const c = Math.max(0, Math.round(Number(d.count) || 0));
|
|
1079
|
+
if (c <= 0) continue;
|
|
1080
|
+
counts.set(o, (counts.get(o) || 0) + c);
|
|
1081
|
+
if (maxOrd == null || o > maxOrd) maxOrd = o;
|
|
1082
|
+
}
|
|
1083
|
+
if (maxOrd == null) return ''; // nothing real to draw → caller's empty state
|
|
1084
|
+
for (const [, c] of counts) { activeDays += 1; totalShips += c; }
|
|
1085
|
+
|
|
1086
|
+
// The grid ENDS at `today` (the builder's, when given) so a quiet recent week still
|
|
1087
|
+
// reads as time that passed, not a truncated chart; falls back to the last ship day.
|
|
1088
|
+
const todayOrd = (opts.today && ymdToOrd(opts.today)) || maxOrd;
|
|
1089
|
+
const endOrd = Math.max(todayOrd, maxOrd);
|
|
1090
|
+
const weeks = Math.max(1, Math.min(53, Math.round(Number(opts.weeks)) || 53));
|
|
1091
|
+
|
|
1092
|
+
// Columns are weeks, rows Sun..Sat. Epoch day 0 (1970-01-01) is a Thursday, so the
|
|
1093
|
+
// Sunday-indexed weekday is (ord + 4) mod 7. The last column is the week holding
|
|
1094
|
+
// endOrd; walk back `weeks` Sundays to the first cell.
|
|
1095
|
+
const dow = (o) => (((o + 4) % 7) + 7) % 7;
|
|
1096
|
+
const endSun = endOrd - dow(endOrd);
|
|
1097
|
+
const startSun = endSun - (weeks - 1) * 7;
|
|
1098
|
+
|
|
1099
|
+
// level 0 = empty; 1..5 map to the anti-gaming daily cap (streak.js caps a day at
|
|
1100
|
+
// 5), so the darkest band means "hit the day's max", not "over some threshold".
|
|
1101
|
+
const level = (c) => (c <= 0 ? 0 : Math.min(5, c));
|
|
1102
|
+
|
|
1103
|
+
let cells = '';
|
|
1104
|
+
for (let col = 0; col < weeks; col++) {
|
|
1105
|
+
for (let row = 0; row < 7; row++) {
|
|
1106
|
+
const o = startSun + col * 7 + row;
|
|
1107
|
+
if (o > endOrd) { cells += '<span class="kit-cal__cell kit-cal__cell--void" aria-hidden="true"></span>'; continue; }
|
|
1108
|
+
const c = counts.get(o) || 0;
|
|
1109
|
+
const ymd = ordToYmd(o);
|
|
1110
|
+
const title = c > 0 ? `${ymd} · ${c} ship${c === 1 ? '' : 's'}` : `${ymd} · no ships`;
|
|
1111
|
+
cells += `<span class="kit-cal__cell" data-level="${level(c)}" title="${esc(title)}"></span>`;
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
const summary = opts.ariaLabel
|
|
1116
|
+
|| `Ships per day over the last year: ${totalShips} ship${totalShips === 1 ? '' : 's'} across ${activeDays} day${activeDays === 1 ? '' : 's'}.`;
|
|
1117
|
+
// The legend is aria-hidden: it decorates the bands, it carries no fact the cell
|
|
1118
|
+
// titles and the summary do not already state in words.
|
|
1119
|
+
const legend = '<div class="kit-cal__key" aria-hidden="true"><span class="kit-cal__key-label">less</span>'
|
|
1120
|
+
+ [0, 1, 2, 3, 5].map((lv) => `<span class="kit-cal__cell" data-level="${lv}"></span>`).join('')
|
|
1121
|
+
+ '<span class="kit-cal__key-label">more</span></div>';
|
|
1122
|
+
// The grid is wide, so it gets its OWN horizontal strip (the section-rail idiom) —
|
|
1123
|
+
// it never widens the document (modules/hall-ui/CLAUDE.md "no sideways scroll").
|
|
1124
|
+
return `<div class="kit-cal" role="img" aria-label="${esc(summary)}">`
|
|
1125
|
+
+ `<div class="kit-cal__scroll"><div class="kit-cal__grid">${cells}</div></div>`
|
|
1126
|
+
+ legend
|
|
1127
|
+
+ '</div>';
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1033
1130
|
const api = {
|
|
1034
1131
|
esc,
|
|
1035
1132
|
// pager (low-level exports so pages can adopt incrementally)
|
|
@@ -1042,6 +1139,8 @@
|
|
|
1042
1139
|
// linePoints/cumulate are the maths on their own, for a chart that wants
|
|
1043
1140
|
// the geometry without this SVG (the profile's timeChart).
|
|
1044
1141
|
sparklineHtml, barSeriesHtml, chartCardHtml, linePoints, cumulate, cumulateByDay,
|
|
1142
|
+
// the year-grid contribution calendar (task 1003572) — the hall's third chart family
|
|
1143
|
+
calendarGridHtml,
|
|
1045
1144
|
// plotted charts: the axis frame + the two series shapes that ride it
|
|
1046
1145
|
plotSvgHtml, plotValueLabelHtml, timeStepSeriesHtml, timeStepGeometry, columnSeriesHtml,
|
|
1047
1146
|
// plotBox is exported so a caller mapping pointer x back into viewBox
|
|
@@ -258,6 +258,35 @@
|
|
|
258
258
|
};
|
|
259
259
|
}
|
|
260
260
|
|
|
261
|
+
// The contribution calendar (task 1003572, criterion legibility-series-are-drawn):
|
|
262
|
+
// a year of qualifying ship-days as OTBKit's third chart family, with the streak
|
|
263
|
+
// scalars read beside it. SELF-ONLY and range-INDEPENDENT — the data is streak.
|
|
264
|
+
// ship_days off the viewer's own /me (task added it there), and a calendar is a
|
|
265
|
+
// year by definition, so it ignores the lookback the other figures clip to. Returns
|
|
266
|
+
// null on an empty history so draw() simply omits it — never an empty grid (the
|
|
267
|
+
// module doc's honest-exit rule; DONE WHEN #4).
|
|
268
|
+
function calendarChart({ id, streak }) {
|
|
269
|
+
const days = (streak && Array.isArray(streak.ship_days)) ? streak.ship_days : [];
|
|
270
|
+
const grid = window.OTBKit.calendarGridHtml(days, { today: streak && streak.today });
|
|
271
|
+
if (!grid) return null;
|
|
272
|
+
const active = days.filter((d) => Number(d.count) > 0).length;
|
|
273
|
+
const cur = Number(streak && streak.current) || 0;
|
|
274
|
+
const lng = Number(streak && streak.longest) || 0;
|
|
275
|
+
// The scalars in words, in the .pchart__read slot the other figures use for their
|
|
276
|
+
// crosshair readout — here it is static because the calendar's reading is per-cell.
|
|
277
|
+
const read = `Current streak ${cur} day${cur === 1 ? '' : 's'} \u00b7 longest ${lng} \u00b7 `
|
|
278
|
+
+ `${active} day${active === 1 ? '' : 's'} shipped this year`;
|
|
279
|
+
const html = `<figure class="pchart" id="${esc(id)}">
|
|
280
|
+
<figcaption class="pchart__title">Your shipping year</figcaption>
|
|
281
|
+
<p class="pchart__read">${esc(read)}</p>
|
|
282
|
+
${grid}
|
|
283
|
+
<p class="pchart__foot">a year of qualifying ships, in your timezone \u00b7 only you see this one</p>
|
|
284
|
+
</figure>`;
|
|
285
|
+
// No wire: the reading is the per-cell title + the grid's aria summary, not a
|
|
286
|
+
// crosshair, so there is no pointer handler to attach.
|
|
287
|
+
return { id, html, wire() {} };
|
|
288
|
+
}
|
|
289
|
+
|
|
261
290
|
// Weekly columns: at most 24px thick, a 4px rounded cap on a square base, a
|
|
262
291
|
// 2px surface gap between neighbours, the tallest column labelled.
|
|
263
292
|
function columnChart({ id, title, buckets, footer }) {
|
|
@@ -400,7 +429,7 @@
|
|
|
400
429
|
|
|
401
430
|
// Draw every figure for one lookback window into #charts-grid. Split from
|
|
402
431
|
// render() so the range buttons can re-draw without re-fetching the record.
|
|
403
|
-
async function draw({ api, API, builderId, isOwn, rows, paidFull, estimated, now, rangeId }) {
|
|
432
|
+
async function draw({ api, API, builderId, isOwn, rows, paidFull, estimated, now, rangeId, selfStreak }) {
|
|
404
433
|
const grid = $('#charts-grid');
|
|
405
434
|
if (!grid) return;
|
|
406
435
|
const range = RANGES.find((r) => r.id === rangeId) || RANGES[RANGES.length - 1];
|
|
@@ -431,6 +460,12 @@
|
|
|
431
460
|
footer: `${fmtNum(inWindow.length)} work${inWindow.length === 1 ? '' : 's'} · ${span}`,
|
|
432
461
|
}),
|
|
433
462
|
];
|
|
463
|
+
if (isOwn && selfStreak) {
|
|
464
|
+
// The calendar leads the viewer's own overview — the year-at-a-glance the goal's
|
|
465
|
+
// thesis is about. Null (no qualifying ships yet) → simply not shown.
|
|
466
|
+
const cal = calendarChart({ id: 'chart-calendar', streak: selfStreak });
|
|
467
|
+
if (cal) figs.unshift(cal);
|
|
468
|
+
}
|
|
434
469
|
if (isOwn) {
|
|
435
470
|
const paceDays = Math.min(range.days || PACE_MAX_DAYS, PACE_MAX_DAYS);
|
|
436
471
|
const own = await fetchOwnRate(api, API, builderId, paceDays);
|
|
@@ -448,7 +483,7 @@
|
|
|
448
483
|
figs.forEach((f) => { const el = grid.querySelector(`#${f.id}`); if (el) f.wire(el); });
|
|
449
484
|
}
|
|
450
485
|
|
|
451
|
-
async function render({ api, API, builderId, selfId, signedIn, now = Date.now() }) {
|
|
486
|
+
async function render({ api, API, builderId, selfId, signedIn, selfStreak = null, now = Date.now() }) {
|
|
452
487
|
const mount = $('#charts-grid');
|
|
453
488
|
const controls = $('#charts-controls');
|
|
454
489
|
if (!mount) return;
|
|
@@ -500,10 +535,10 @@
|
|
|
500
535
|
b.classList.toggle('is-active', on);
|
|
501
536
|
b.setAttribute('aria-pressed', String(on));
|
|
502
537
|
});
|
|
503
|
-
draw({ api, API, builderId, isOwn, rows, paidFull, estimated, now, rangeId });
|
|
538
|
+
draw({ api, API, builderId, isOwn, rows, paidFull, estimated, now, rangeId, selfStreak });
|
|
504
539
|
});
|
|
505
540
|
}
|
|
506
|
-
await draw({ api, API, builderId, isOwn, rows, paidFull, estimated, now, rangeId });
|
|
541
|
+
await draw({ api, API, builderId, isOwn, rows, paidFull, estimated, now, rangeId, selfStreak });
|
|
507
542
|
}
|
|
508
543
|
|
|
509
544
|
window.OTBProfileCharts = { render, cumulativeByDay, craftMix, weeklyBuckets, estimateOf, clipToWindow };
|
|
@@ -208,7 +208,7 @@
|
|
|
208
208
|
<!-- The charts (task 1003489). Loaded BEFORE profile.js so window.OTBProfileCharts
|
|
209
209
|
exists when renderProfile runs; profile.js guards on it, so a page that
|
|
210
210
|
omits this script simply has no charts section content. -->
|
|
211
|
-
<script src="/builders/profile-charts.js?v=2026-09-
|
|
211
|
+
<script src="/builders/profile-charts.js?v=2026-09-04-calendar"></script>
|
|
212
212
|
<script src="/builders/profile.js?v=2026-09-02-rail"></script>
|
|
213
213
|
</body>
|
|
214
214
|
</html>
|
|
@@ -25,6 +25,11 @@
|
|
|
25
25
|
// ({ status, ok, data }) preserves control flow 1:1. throwOnError:false so a
|
|
26
26
|
// 401/404 is a value to branch on, not an exception.
|
|
27
27
|
const api = window.BongosClient.createClient({ baseUrl: '', credentials: 'same-origin', throwOnError: false });
|
|
28
|
+
// The viewer's own /me payload, captured wherever it is fetched so the Overview's
|
|
29
|
+
// contribution calendar (task 1003572) can read streak.ship_days without a second
|
|
30
|
+
// /me round-trip. Null until /me resolves; only ever the VIEWER's own, never a
|
|
31
|
+
// profile being viewed by id.
|
|
32
|
+
let selfMe = null;
|
|
28
33
|
|
|
29
34
|
const { escapeHtml, $, fmtNum, fmtDate } = window.OTB;
|
|
30
35
|
const rankLabel = (rank) => window.OTB.rankLabel(rank);
|
|
@@ -656,7 +661,7 @@
|
|
|
656
661
|
// The charts (task 1003489) read the activity route and the credits ledger
|
|
657
662
|
// (task 1003491), so they need the same session the ledgers do; on the
|
|
658
663
|
// viewer's own profile they add the pace.
|
|
659
|
-
if (window.OTBProfileCharts) window.OTBProfileCharts.render({ api, API, builderId: builder.id, selfId, signedIn: selfId != null });
|
|
664
|
+
if (window.OTBProfileCharts) window.OTBProfileCharts.render({ api, API, builderId: builder.id, selfId, signedIn: selfId != null, selfStreak: (selfMe && selfMe.streak) || null });
|
|
660
665
|
renderCrossProject(data, selfId);
|
|
661
666
|
renderAchievements(data.achievements);
|
|
662
667
|
buildWorksLedger(builder.id, selfId != null, data.recent_ships);
|
|
@@ -722,6 +727,7 @@
|
|
|
722
727
|
try {
|
|
723
728
|
const me = await api.request('GET', `${API}/me`);
|
|
724
729
|
if (!me.ok) return null;
|
|
730
|
+
selfMe = me.data || null;
|
|
725
731
|
const builder = (me.data && me.data.builder) ? me.data.builder : me.data;
|
|
726
732
|
return (builder && builder.id) || null;
|
|
727
733
|
} catch (err) {
|
|
@@ -746,6 +752,7 @@
|
|
|
746
752
|
return;
|
|
747
753
|
}
|
|
748
754
|
if (!me.ok) throw new Error(`me → ${me.status}`);
|
|
755
|
+
selfMe = me.data || null;
|
|
749
756
|
const builder = (me.data && me.data.builder) ? me.data.builder : me.data;
|
|
750
757
|
const selfId = builder && builder.id;
|
|
751
758
|
if (!selfId) {
|