@bongos/core 1.23.11 → 1.23.13
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 +41 -21
- package/docs/copy-inventory.md +70 -70
- package/docs/copy-registry.json +83 -83
- package/docs/module-api-changelog.md +4 -0
- package/docs/page-inventory.json +7 -1
- package/docs/page-readings.json +80 -74
- package/modules/hall-ui/public/tweak-editor-lib.js +7 -6
- package/modules/hall-ui/records/tweak-editor.md +1 -1
- package/modules/public-landing/public/community-owner-two.states.json +16 -0
- package/modules/public-landing/public/community-owner.states.json +16 -0
- package/modules/public-landing/public/community.html +122 -10
- package/modules/ui-design/kit/fixtures/my-projects-owner-two.json +1 -0
- package/modules/ui-design/kit/fixtures/my-projects-owner.json +1 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +12 -0
- package/src/module-api.js +1 -1
- package/tests/hall_tweak_editor.mjs +8 -11
- package/tests/hub_community_page.mjs +128 -6
package/docs/page-inventory.json
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"pages": 47,
|
|
14
14
|
"surfaces": 3,
|
|
15
15
|
"with_states": 40,
|
|
16
|
-
"states":
|
|
16
|
+
"states": 342
|
|
17
17
|
},
|
|
18
18
|
"surfaces": [
|
|
19
19
|
{
|
|
@@ -1452,6 +1452,8 @@
|
|
|
1452
1452
|
"states_files": [
|
|
1453
1453
|
"modules/public-landing/public/community.states.json",
|
|
1454
1454
|
"modules/public-landing/public/community-empty.states.json",
|
|
1455
|
+
"modules/public-landing/public/community-owner.states.json",
|
|
1456
|
+
"modules/public-landing/public/community-owner-two.states.json",
|
|
1455
1457
|
"modules/public-landing/public/community-recruiter.states.json"
|
|
1456
1458
|
],
|
|
1457
1459
|
"states": [
|
|
@@ -1468,6 +1470,10 @@
|
|
|
1468
1470
|
"in-recruiters",
|
|
1469
1471
|
"in",
|
|
1470
1472
|
"out-empty",
|
|
1473
|
+
"in-owner",
|
|
1474
|
+
"in-owner-find",
|
|
1475
|
+
"in-owner-two",
|
|
1476
|
+
"in-owner-two-picked",
|
|
1471
1477
|
"in-recruiter"
|
|
1472
1478
|
]
|
|
1473
1479
|
},
|
package/docs/page-readings.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"adr": "0341 D3",
|
|
6
6
|
"reread": "node scripts/bongos/page-reader.js --stale",
|
|
7
7
|
"how": ["Generated by node scripts/bongos/page-reader.js (BV2.TW04, task 1004315; ADR 0341 D3). Do not hand-edit.","One entry per page of docs/page-inventory.json. Lines are in page order: the default state first, and a line only another state shows sits where that state shows it, with its state named.","placement: placed = a docs/copy-registry.json row renders it (file, line, string_id); shared = shell text every page of the surface carries (top bar, sidebar, footer), with its row when the registry has one; unplaced = the registry cannot place it (a rewrite becomes an engineer task, ADR 0341 D4).","text keeps {…} where the registry row has a hole, or where a value the page read from its API was filled in. A string that is only such data is counted under omitted.data, not listed.","reading_hash is over the non-shared lines (key, section, text); files_hash is over the page's inventory files. --check compares files_hash only and never opens a browser.","Rendered through the hall-preview harness (hall) and the ui-design kit stub (landing, status), at 1280x800 with the clock pinned, so a reading is the fixture world's page."],
|
|
8
|
-
"counts": {"pages":47,"lines":
|
|
8
|
+
"counts": {"pages":47,"lines":5226,"placed":1582,"shared":419,"unplaced":3225,"omitted_data":3534},
|
|
9
9
|
"pages": [
|
|
10
10
|
{
|
|
11
11
|
"id": "builders:atlas",
|
|
@@ -3868,34 +3868,34 @@
|
|
|
3868
3868
|
"surface": "builders",
|
|
3869
3869
|
"title": "Studio",
|
|
3870
3870
|
"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"],
|
|
3871
|
-
"files_hash": "
|
|
3872
|
-
"reading_hash": "
|
|
3871
|
+
"files_hash": "4538426333de6374",
|
|
3872
|
+
"reading_hash": "55e9090fdd96a979",
|
|
3873
3873
|
"counts": {"lines":30,"placed":16,"shared":6,"unplaced":8},
|
|
3874
3874
|
"omitted": {"data":4},
|
|
3875
3875
|
"notes": ["flow: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","flow-pick: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","status: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","words-offer: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","words-edit: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","reviews: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","full: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","full-back: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","approvals: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","approvals-before: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","approvals-phone: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","approvals-note: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","approved: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","sent-back: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood"],
|
|
3876
3876
|
"lines": [
|
|
3877
3877
|
{"key":"L0001","section":"skip link","text":"Skip to content","placement":"shared","file":"modules/hall-ui/public/shell.js","line":868,"string_id":"87cee78ca134"},
|
|
3878
3878
|
{"key":"L0002","section":"top bar","text":"Jump to…","placement":"shared","file":"modules/hall-ui/public/shell.js","line":540,"string_id":"eba610d25523"},
|
|
3879
|
-
{"key":"L0003","section":"top bar","text":"
|
|
3879
|
+
{"key":"L0003","section":"top bar","text":"Ctrl K","placement":"shared"},
|
|
3880
3880
|
{"key":"L0004","section":"top bar","text":"Building","placement":"shared"},
|
|
3881
3881
|
{"key":"L0005","section":"top bar","text":"Artistry","placement":"shared"},
|
|
3882
3882
|
{"key":"L0006","section":"top bar","text":"Ideating","placement":"shared"},
|
|
3883
3883
|
{"key":"L0007","section":"page top","text":"{{worldName}} · studio","placement":"placed","file":"modules/hall-ui/public/studio.html","line":85,"string_id":"3d8611c2e79d"},
|
|
3884
3884
|
{"key":"L0008","section":"page top","text":"pages tweaked","placement":"placed","file":"modules/hall-ui/public/studio.html","line":89,"string_id":"271de72308a4"},
|
|
3885
3885
|
{"key":"L0009","section":"page top","text":"this week","placement":"placed","file":"modules/hall-ui/public/studio.html","line":91,"string_id":"130c3731ad83"},
|
|
3886
|
-
{"key":"L0010","section":"Good
|
|
3887
|
-
{"key":"L0011","section":"Good
|
|
3888
|
-
{"key":"L0012","section":"Good
|
|
3889
|
-
{"key":"L0013","section":"Good
|
|
3890
|
-
{"key":"L0014","section":"Good
|
|
3891
|
-
{"key":"L0015","section":"Good
|
|
3892
|
-
{"key":"L0016","section":"Good
|
|
3893
|
-
{"key":"L0017","section":"Good
|
|
3894
|
-
{"key":"L0018","section":"Good
|
|
3895
|
-
{"key":"L0019","section":"Good
|
|
3896
|
-
{"key":"L0020","section":"Good
|
|
3897
|
-
{"key":"L0021","section":"Good
|
|
3898
|
-
{"key":"L0022","section":"Good
|
|
3886
|
+
{"key":"L0010","section":"Good evening.","text":"Good evening.","placement":"placed","file":"modules/hall-ui/public/studio.html","line":101,"string_id":"80fd51db38d7"},
|
|
3887
|
+
{"key":"L0011","section":"Good evening.","text":"{…}, on the {…} page, is where you left it. {…} of its {…} lines are yours so far.","placement":"placed","file":"modules/hall-ui/public/studio.js","line":659,"string_id":"7763e6f28c67"},
|
|
3888
|
+
{"key":"L0012","section":"Good evening.","text":"click any words here to rewrite them","placement":"placed","file":"modules/hall-ui/public/studio.html","line":103,"string_id":"8d46c902a9d5"},
|
|
3889
|
+
{"key":"L0013","section":"Good evening.","text":"Resume","placement":"unplaced"},
|
|
3890
|
+
{"key":"L0014","section":"Good evening.","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","occurrences":2},
|
|
3891
|
+
{"key":"L0015","section":"Good evening.","text":"Tweak/CopyWrite Flow","placement":"placed","file":"modules/hall-ui/public/studio.html","line":123,"string_id":"18801fb6845f"},
|
|
3892
|
+
{"key":"L0016","section":"Good evening.","text":"next up: {…} — {…}","placement":"unplaced"},
|
|
3893
|
+
{"key":"L0017","section":"Good evening.","text":"Copy-write Approval queue","placement":"placed","file":"modules/hall-ui/public/studio.html","line":127,"string_id":"f770588750ef"},
|
|
3894
|
+
{"key":"L0018","section":"Good evening.","text":"2 pages applied, waiting for you","placement":"unplaced"},
|
|
3895
|
+
{"key":"L0019","section":"Good evening.","text":"Artist Review Status","placement":"placed","file":"modules/hall-ui/public/studio.html","line":131,"string_id":"4d3b1bcae3eb"},
|
|
3896
|
+
{"key":"L0020","section":"Good evening.","text":"From the live site","placement":"placed","file":"modules/hall-ui/public/studio.html","line":137,"string_id":"edced5d528c3"},
|
|
3897
|
+
{"key":"L0021","section":"Good evening.","text":"2 reviews from the live site","placement":"unplaced"},
|
|
3898
|
+
{"key":"L0022","section":"Good evening.","text":"Builders hall · this session","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":670,"string_id":"fd1903586e8e"},
|
|
3899
3899
|
{"key":"L0023","section":"What are you doing now?","text":"What are you doing now?","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":671,"string_id":"60853319f290"},
|
|
3900
3900
|
{"key":"L0024","section":"What are you doing now?","text":"Pick one. You can switch any time from the top bar.","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":672,"string_id":"4f87d5b17b54"},
|
|
3901
3901
|
{"key":"L0025","section":"What are you doing now?","text":"Building","placement":"unplaced"},
|
|
@@ -4117,7 +4117,7 @@
|
|
|
4117
4117
|
"surface": "builders",
|
|
4118
4118
|
"title": "Tweak a page",
|
|
4119
4119
|
"states_read": ["doc","typed","chrome","submitted","picking","out"],
|
|
4120
|
-
"files_hash": "
|
|
4120
|
+
"files_hash": "d456607f6e2337c7",
|
|
4121
4121
|
"reading_hash": "711c540ebc7ef977",
|
|
4122
4122
|
"counts": {"lines":23,"placed":15,"shared":1,"unplaced":7},
|
|
4123
4123
|
"omitted": {"data":35},
|
|
@@ -4490,79 +4490,85 @@
|
|
|
4490
4490
|
"id": "landing:community",
|
|
4491
4491
|
"surface": "landing",
|
|
4492
4492
|
"title": "{{productName}} — Community",
|
|
4493
|
-
"states_read": ["out","out-30d","out-artists","out-community-band","in-community-band","in-projects-band","out-projects-band","out-find","out-find-search","out-recruiters","in-recruiters","in","out-empty","in-recruiter"],
|
|
4494
|
-
"files_hash": "
|
|
4495
|
-
"reading_hash": "
|
|
4496
|
-
"counts": {"lines":
|
|
4497
|
-
"omitted": {"data":
|
|
4493
|
+
"states_read": ["out","out-30d","out-artists","out-community-band","in-community-band","in-projects-band","out-projects-band","out-find","out-find-search","out-recruiters","in-recruiters","in","out-empty","in-owner","in-owner-find","in-owner-two","in-owner-two-picked","in-recruiter"],
|
|
4494
|
+
"files_hash": "8bd332ba8f0f0243",
|
|
4495
|
+
"reading_hash": "6b81da8cd8fdb090",
|
|
4496
|
+
"counts": {"lines":72,"placed":27,"shared":12,"unplaced":33},
|
|
4497
|
+
"omitted": {"data":30},
|
|
4498
4498
|
"notes": [],
|
|
4499
4499
|
"lines": [
|
|
4500
4500
|
{"key":"L0001","section":"top bar","text":"Community","placement":"shared"},
|
|
4501
4501
|
{"key":"L0002","section":"top bar","text":"Projects","placement":"shared"},
|
|
4502
4502
|
{"key":"L0003","section":"top bar","text":"Review","placement":"shared","state":"in-community-band"},
|
|
4503
4503
|
{"key":"L0004","section":"page top","text":"Sky","placement":"unplaced","state":"in-projects-band"},
|
|
4504
|
-
{"key":"L0005","section":"page top","text":"the sky of every project","placement":"placed","file":"modules/public-landing/public/community.html","line":
|
|
4504
|
+
{"key":"L0005","section":"page top","text":"the sky of every project","placement":"placed","file":"modules/public-landing/public/community.html","line":144,"string_id":"8fa12f730019","state":"in-projects-band"},
|
|
4505
4505
|
{"key":"L0006","section":"page top","text":"Table","placement":"unplaced","state":"in-projects-band"},
|
|
4506
|
-
{"key":"L0007","section":"page top","text":"the same projects as rows","placement":"placed","file":"modules/public-landing/public/community.html","line":
|
|
4507
|
-
{"key":"L0008","section":"page top","text":"Your projects","placement":"placed","file":"modules/public-landing/public/community.html","line":
|
|
4508
|
-
{"key":"L0009","section":"page top","text":"the ones you own","placement":"placed","file":"modules/public-landing/public/community.html","line":
|
|
4509
|
-
{"key":"L0010","section":"page top","text":"New project","placement":"placed","file":"modules/public-landing/public/community.html","line":
|
|
4510
|
-
{"key":"L0011","section":"page top","text":"five questions and a home","placement":"placed","file":"modules/public-landing/public/community.html","line":
|
|
4511
|
-
{"key":"L0012","section":"top bar","text":"Sign in","placement":"shared","file":"modules/public-landing/public/community.html","line":
|
|
4512
|
-
{"key":"L0013","section":"Open to recruiters","text":"Open to recruiters","placement":"placed","file":"modules/public-landing/public/community.html","line":
|
|
4513
|
-
{"key":"L0014","section":"Open to recruiters","text":"Builders who keep their numbers hidden but are open to hearing from projects. Only project owners see who they are, and only by name.","placement":"placed","file":"modules/public-landing/public/community.html","line":
|
|
4506
|
+
{"key":"L0007","section":"page top","text":"the same projects as rows","placement":"placed","file":"modules/public-landing/public/community.html","line":145,"string_id":"21453b3ba5c3","state":"in-projects-band"},
|
|
4507
|
+
{"key":"L0008","section":"page top","text":"Your projects","placement":"placed","file":"modules/public-landing/public/community.html","line":146,"string_id":"4e25e6872321","state":"in-projects-band"},
|
|
4508
|
+
{"key":"L0009","section":"page top","text":"the ones you own","placement":"placed","file":"modules/public-landing/public/community.html","line":146,"string_id":"a0fa148c60a6","state":"in-projects-band"},
|
|
4509
|
+
{"key":"L0010","section":"page top","text":"New project","placement":"placed","file":"modules/public-landing/public/community.html","line":147,"string_id":"0a81a82d10c4","state":"in-projects-band"},
|
|
4510
|
+
{"key":"L0011","section":"page top","text":"five questions and a home","placement":"placed","file":"modules/public-landing/public/community.html","line":147,"string_id":"94a3462373d2","state":"in-projects-band"},
|
|
4511
|
+
{"key":"L0012","section":"top bar","text":"Sign in","placement":"shared","file":"modules/public-landing/public/community.html","line":127,"string_id":"ad80586f802a"},
|
|
4512
|
+
{"key":"L0013","section":"Open to recruiters","text":"Open to recruiters","placement":"placed","file":"modules/public-landing/public/community.html","line":136,"string_id":"1e116d8fe95a","state":"out-recruiters"},
|
|
4513
|
+
{"key":"L0014","section":"Open to recruiters","text":"Builders who keep their numbers hidden but are open to hearing from projects. Only project owners see who they are, and only by name.","placement":"placed","file":"modules/public-landing/public/community.html","line":234,"string_id":"932bb6ad495b","state":"out-recruiters"},
|
|
4514
4514
|
{"key":"L0015","section":"Open to recruiters","text":"GitHub: {…}","placement":"unplaced","state":"in-recruiter","occurrences":3},
|
|
4515
|
-
{"key":"L0016","section":"Open to recruiters","text":"Only project owners can see this list.","placement":"placed","file":"modules/public-landing/public/community.html","line":
|
|
4516
|
-
{"key":"L0017","section":"Open to recruiters","text":"Sign in to see whether this list is open to you.","placement":"placed","file":"modules/public-landing/public/community.html","line":
|
|
4517
|
-
{"key":"L0018","section":"Open to recruiters","text":"Sign in with GitHub","placement":"placed","file":"modules/public-landing/public/community.html","line":
|
|
4518
|
-
{"key":"L0019","section":"footer","text":"A non-profit, capture-resistant commons.","placement":"shared","file":"modules/public-landing/public/community.html","line":
|
|
4519
|
-
{"key":"L0020","section":"footer","text":"Built by agents, on Cloud Bongos.","placement":"shared","file":"modules/public-landing/public/community.html","line":
|
|
4520
|
-
{"key":"L0021","section":"footer","text":"Open source","placement":"shared","file":"modules/public-landing/public/community.html","line":
|
|
4515
|
+
{"key":"L0016","section":"Open to recruiters","text":"Only project owners can see this list.","placement":"placed","file":"modules/public-landing/public/community.html","line":243,"string_id":"6bcd385b13d5","state":"in-recruiters"},
|
|
4516
|
+
{"key":"L0017","section":"Open to recruiters","text":"Sign in to see whether this list is open to you.","placement":"placed","file":"modules/public-landing/public/community.html","line":237,"string_id":"f59de6034af4","state":"out-recruiters"},
|
|
4517
|
+
{"key":"L0018","section":"Open to recruiters","text":"Sign in with GitHub","placement":"placed","file":"modules/public-landing/public/community.html","line":239,"string_id":"df38941b25a6","state":"out-recruiters"},
|
|
4518
|
+
{"key":"L0019","section":"footer","text":"A non-profit, capture-resistant commons.","placement":"shared","file":"modules/public-landing/public/community.html","line":251,"string_id":"afe83bbbd0d4","state":"out-recruiters","occurrences":3},
|
|
4519
|
+
{"key":"L0020","section":"footer","text":"Built by agents, on Cloud Bongos.","placement":"shared","file":"modules/public-landing/public/community.html","line":251,"string_id":"bd315dd71ea7","state":"out-recruiters","occurrences":3},
|
|
4520
|
+
{"key":"L0021","section":"footer","text":"Open source","placement":"shared","file":"modules/public-landing/public/community.html","line":251,"string_id":"d6314ddcc1d0","state":"out-recruiters","occurrences":3},
|
|
4521
4521
|
{"key":"L0022","section":"footer","text":"AGPL-3.0","placement":"shared","state":"out-recruiters","occurrences":3},
|
|
4522
4522
|
{"key":"L0023","section":"navigation","text":"Privacy","placement":"shared","state":"out-recruiters","occurrences":3},
|
|
4523
4523
|
{"key":"L0024","section":"navigation","text":"Terms","placement":"shared","state":"out-recruiters","occurrences":3},
|
|
4524
4524
|
{"key":"L0025","section":"navigation","text":"Contact","placement":"shared","state":"out-recruiters","occurrences":3},
|
|
4525
|
-
{"key":"L0026","section":"navigation","text":"Builders' hall","placement":"shared","file":"modules/public-landing/public/community.html","line":
|
|
4526
|
-
{"key":"L0027","section":"Find a builder","text":"Find a builder","placement":"placed","file":"modules/public-landing/public/community.html","line":
|
|
4527
|
-
{"key":"L0028","section":"Find a builder","text":"Their name or handle","placement":"placed","file":"modules/public-landing/public/community.html","line":
|
|
4528
|
-
{"key":"L0029","section":"Find a builder","text":"Any role","placement":"placed","file":"modules/public-landing/public/community.html","line":
|
|
4525
|
+
{"key":"L0026","section":"navigation","text":"Builders' hall","placement":"shared","file":"modules/public-landing/public/community.html","line":251,"string_id":"90a128c97eae","state":"out-recruiters","occurrences":3},
|
|
4526
|
+
{"key":"L0027","section":"Find a builder","text":"Find a builder","placement":"placed","file":"modules/public-landing/public/community.html","line":135,"string_id":"f1e93ba98ceb","state":"out-find"},
|
|
4527
|
+
{"key":"L0028","section":"Find a builder","text":"Their name or handle","placement":"placed","file":"modules/public-landing/public/community.html","line":208,"string_id":"541d5a7612a9","attr":"placeholder","state":"out-find"},
|
|
4528
|
+
{"key":"L0029","section":"Find a builder","text":"Any role","placement":"placed","file":"modules/public-landing/public/community.html","line":212,"string_id":"648862c67a23","state":"out-find"},
|
|
4529
4529
|
{"key":"L0030","section":"Find a builder","text":"Engineers","placement":"unplaced","state":"out-find"},
|
|
4530
4530
|
{"key":"L0031","section":"Find a builder","text":"Artists","placement":"unplaced","state":"out-find"},
|
|
4531
4531
|
{"key":"L0032","section":"Find a builder","text":"Ideators","placement":"unplaced","state":"out-find"},
|
|
4532
4532
|
{"key":"L0033","section":"Find a builder","text":"Designers","placement":"unplaced","state":"out-find"},
|
|
4533
4533
|
{"key":"L0034","section":"Find a builder","text":"Search","placement":"unplaced","state":"out-find"},
|
|
4534
|
-
{"key":"L0035","section":"Find a builder","text":"
|
|
4535
|
-
{"key":"L0036","section":"Find a builder","text":"
|
|
4536
|
-
{"key":"L0037","section":"
|
|
4537
|
-
{"key":"L0038","section":"
|
|
4538
|
-
{"key":"L0039","section":"page top","text":"
|
|
4539
|
-
{"key":"L0040","section":"page top","text":"
|
|
4540
|
-
{"key":"L0041","section":"page top","text":"
|
|
4541
|
-
{"key":"L0042","section":"page top","text":"
|
|
4542
|
-
{"key":"L0043","section":"page top","text":"
|
|
4543
|
-
{"key":"L0044","section":"page top","text":"
|
|
4544
|
-
{"key":"L0045","section":"
|
|
4545
|
-
{"key":"L0046","section":"
|
|
4546
|
-
{"key":"L0047","section":"Leaderboard","text":"
|
|
4547
|
-
{"key":"L0048","section":"Leaderboard","text":"
|
|
4548
|
-
{"key":"L0049","section":"Leaderboard","text":"
|
|
4549
|
-
{"key":"L0050","section":"Leaderboard","text":"
|
|
4550
|
-
{"key":"L0051","section":"Leaderboard","text":"
|
|
4551
|
-
{"key":"L0052","section":"Leaderboard","text":"
|
|
4552
|
-
{"key":"L0053","section":"Leaderboard","text":"
|
|
4553
|
-
{"key":"L0054","section":"Leaderboard","text":"
|
|
4554
|
-
{"key":"L0055","section":"Leaderboard","text":"
|
|
4555
|
-
{"key":"L0056","section":"Leaderboard","text":"
|
|
4556
|
-
{"key":"L0057","section":"Leaderboard","text":"
|
|
4557
|
-
{"key":"L0058","section":"Leaderboard","text":"
|
|
4558
|
-
{"key":"L0059","section":"Leaderboard","text":"
|
|
4559
|
-
{"key":"L0060","section":"Leaderboard","text":"
|
|
4560
|
-
{"key":"L0061","section":"Leaderboard","text":"
|
|
4561
|
-
{"key":"L0062","section":"Leaderboard","text":"
|
|
4562
|
-
{"key":"L0063","section":"Leaderboard","text":"
|
|
4563
|
-
{"key":"L0064","section":"Leaderboard","text":"
|
|
4564
|
-
{"key":"L0065","section":"Leaderboard","text":"
|
|
4565
|
-
{"key":"L0066","section":"Leaderboard","text":"
|
|
4534
|
+
{"key":"L0035","section":"Find a builder","text":"Recruit opens {…}’s hall with their name filled in, and you send the invite there.","placement":"unplaced","state":"in-owner-find"},
|
|
4535
|
+
{"key":"L0036","section":"Find a builder","text":"2 builders found.","placement":"unplaced","state":"out-find-search"},
|
|
4536
|
+
{"key":"L0037","section":"Find a builder","text":"{…} · designer","placement":"unplaced","state":"out-find-search"},
|
|
4537
|
+
{"key":"L0038","section":"Find a builder","text":"Recruit","placement":"unplaced","state":"in-owner-find","occurrences":2},
|
|
4538
|
+
{"key":"L0039","section":"page top","text":"Leaderboard","placement":"unplaced","state":"out-community-band"},
|
|
4539
|
+
{"key":"L0040","section":"page top","text":"who earned the most, across every project","placement":"placed","file":"modules/public-landing/public/community.html","line":134,"string_id":"776e80cf232d","state":"out-community-band"},
|
|
4540
|
+
{"key":"L0041","section":"page top","text":"Find a builder","placement":"placed","file":"modules/public-landing/public/community.html","line":135,"string_id":"f1e93ba98ceb","state":"out-community-band"},
|
|
4541
|
+
{"key":"L0042","section":"page top","text":"anyone building here, by name or role","placement":"placed","file":"modules/public-landing/public/community.html","line":135,"string_id":"a4e84a1501c5","state":"out-community-band"},
|
|
4542
|
+
{"key":"L0043","section":"page top","text":"Open to recruiters","placement":"placed","file":"modules/public-landing/public/community.html","line":136,"string_id":"1e116d8fe95a","state":"out-community-band"},
|
|
4543
|
+
{"key":"L0044","section":"page top","text":"who is open to recruiting, for project owners","placement":"placed","file":"modules/public-landing/public/community.html","line":136,"string_id":"15ac45627fab","state":"out-community-band"},
|
|
4544
|
+
{"key":"L0045","section":"page top","text":"Builders you may know","placement":"placed","file":"modules/public-landing/public/community.html","line":137,"string_id":"724de83c77c6","state":"in-community-band"},
|
|
4545
|
+
{"key":"L0046","section":"page top","text":"connections or projects in common","placement":"placed","file":"modules/public-landing/public/community.html","line":137,"string_id":"171cee573b19","state":"in-community-band"},
|
|
4546
|
+
{"key":"L0047","section":"Leaderboard","text":"Leaderboard","placement":"unplaced"},
|
|
4547
|
+
{"key":"L0048","section":"Leaderboard","text":"Everyone","placement":"unplaced"},
|
|
4548
|
+
{"key":"L0049","section":"Leaderboard","text":"Engineers","placement":"unplaced"},
|
|
4549
|
+
{"key":"L0050","section":"Leaderboard","text":"Artists","placement":"unplaced"},
|
|
4550
|
+
{"key":"L0051","section":"Leaderboard","text":"Ideators","placement":"unplaced"},
|
|
4551
|
+
{"key":"L0052","section":"Leaderboard","text":"Designers","placement":"unplaced"},
|
|
4552
|
+
{"key":"L0053","section":"Leaderboard","text":"Last 7 days","placement":"placed","file":"modules/public-landing/public/community.html","line":186,"string_id":"fc3582ac098d"},
|
|
4553
|
+
{"key":"L0054","section":"Leaderboard","text":"Last 30 days","placement":"placed","file":"modules/public-landing/public/community.html","line":187,"string_id":"52f6b5974994"},
|
|
4554
|
+
{"key":"L0055","section":"Leaderboard","text":"Past year","placement":"placed","file":"modules/public-landing/public/community.html","line":188,"string_id":"42a9479b375c"},
|
|
4555
|
+
{"key":"L0056","section":"Leaderboard","text":"All time","placement":"placed","file":"modules/public-landing/public/community.html","line":189,"string_id":"23c761dcff62"},
|
|
4556
|
+
{"key":"L0057","section":"Leaderboard","text":"Credits earned in the last 30 days, across every project.","placement":"unplaced","state":"out-30d"},
|
|
4557
|
+
{"key":"L0058","section":"Leaderboard","text":"{{Currency}} earned across every project, since each builder started.","placement":"placed","file":"modules/public-landing/public/community.html","line":193,"string_id":"f81129627f7b"},
|
|
4558
|
+
{"key":"L0059","section":"Leaderboard","text":"Recruit to","placement":"unplaced","state":"in-owner-two"},
|
|
4559
|
+
{"key":"L0060","section":"Leaderboard","text":"Recruit opens its hall with their name filled in, and you send the invite there.","placement":"unplaced","state":"in-owner-two"},
|
|
4560
|
+
{"key":"L0061","section":"Leaderboard","text":"Recruit opens {…}’s hall with their name filled in, and you send the invite there.","placement":"unplaced","state":"in-owner"},
|
|
4561
|
+
{"key":"L0062","section":"Leaderboard","text":"No builders on the leaderboard yet.","placement":"unplaced","state":"out-empty"},
|
|
4562
|
+
{"key":"L0063","section":"Leaderboard","text":"212 works shipped · 64 karma","placement":"unplaced"},
|
|
4563
|
+
{"key":"L0064","section":"Leaderboard","text":"Recruit","placement":"unplaced","state":"in-owner","occurrences":6},
|
|
4564
|
+
{"key":"L0065","section":"Leaderboard","text":"131 works shipped · 40 karma","placement":"unplaced"},
|
|
4565
|
+
{"key":"L0066","section":"Leaderboard","text":"19 works shipped · 9 karma","placement":"unplaced","state":"out-30d"},
|
|
4566
|
+
{"key":"L0067","section":"Leaderboard","text":"11 works shipped · 4 karma","placement":"unplaced","state":"out-30d"},
|
|
4567
|
+
{"key":"L0068","section":"Leaderboard","text":"77 works shipped · 52 karma","placement":"unplaced"},
|
|
4568
|
+
{"key":"L0069","section":"Leaderboard","text":"31 works shipped · 18 karma","placement":"unplaced"},
|
|
4569
|
+
{"key":"L0070","section":"Leaderboard","text":"12 works shipped · 7 karma","placement":"unplaced"},
|
|
4570
|
+
{"key":"L0071","section":"Leaderboard","text":"1 work shipped · 0 karma","placement":"unplaced"},
|
|
4571
|
+
{"key":"L0072","section":"Leaderboard","text":"A project reports a builder’s numbers when they sign in or ship there, so a window counts work when it was reported, not when it was done.","placement":"placed","file":"modules/public-landing/public/community.html","line":199,"string_id":"8d79db29b7d6"}
|
|
4566
4572
|
]
|
|
4567
4573
|
},
|
|
4568
4574
|
{
|
|
@@ -223,12 +223,13 @@
|
|
|
223
223
|
//
|
|
224
224
|
// The SIBLINGS (task 1004393): once the proxy answers the apex and status hosts
|
|
225
225
|
// with `frame-ancestors 'self' https://builders.<apex>` instead of SAMEORIGIN,
|
|
226
|
-
// those two pages may split in place too.
|
|
227
|
-
//
|
|
228
|
-
//
|
|
229
|
-
// apex and status.<apex> are
|
|
230
|
-
//
|
|
231
|
-
|
|
226
|
+
// those two pages may split in place too. The proxy change is live (checked on
|
|
227
|
+
// the apex and status hosts in task 1004644), so FRAME_SIBLINGS is on. Set it
|
|
228
|
+
// back to false if the proxy ever stops sending frame-ancestors: framing them
|
|
229
|
+
// would show the browser's refusal page. Only the apex and status.<apex> are
|
|
230
|
+
// siblings, never another subdomain: the proxy keeps every other host
|
|
231
|
+
// unframeable, sign-in and settings included.
|
|
232
|
+
const FRAME_SIBLINGS = true;
|
|
232
233
|
function siblingOrigins(loc) {
|
|
233
234
|
const here = new URL(loc.href || loc.origin);
|
|
234
235
|
if (!/^builders\./.test(here.hostname)) return [];
|
|
@@ -27,7 +27,7 @@ The paper is paper and the room is the room whatever the hall's theme: the stage
|
|
|
27
27
|
- **Boxes grow to their words** rather than the artboard's rows 1 or 2.
|
|
28
28
|
- **A refused upload opens a panel** (task 1004354, `#tw-refused`): the "is in" panel's glass and scrim over the whole window, a headline per refusal (`lib.uploadRefusal`), the server's words, the lines it names, "what to do", and "download this page again" or close (Escape too). An artist uploads from the bar, often far down the page, where the paper's notice was off screen. The notice stays on the paper after the panel closes. The kit has no file-upload action, so the panel is proven in `tests/hall_tweak_editor.mjs` and by shots of a real browser at 1440 and 390, not by a states.json state.
|
|
29
29
|
- **The check, the restore and Shift + Enter (task 1004385, owner-asked).** Beside each line a round restore button (only on a changed line: it puts the page's words back and takes the check off) and a round green check. A checked line takes a light green wash; the owner picked the check over a tint alone. **Shift + Enter** in a line checks it and lands in the next, and a green hint above the words says so (with "N of M checked"), because it is the quickest way through a page. Enter alone is unchanged. The checks are the artist's place-keeper and stay in the browser (`localStorage`, keyed by page and reading hash, so a page that moved never ticks the wrong words); the server has no such field and `WRITES` is unchanged. A page the caller cannot write has none of it. Rules in `tweak-editor-lib.js` (`nextLineKey`, `confirmedCount`, `parseConfirmed`, `confirmStoreKey`, `hintText`).
|
|
30
|
-
- **No page title or sub text at the top of the paper, and "open the page" is a menu (task 1004386, owner-asked).** The bar already names the page, so the paper opens on its first section; the h1 stays, visually hidden, for the one-h1 floor. "open the page" is a **split button** (owner-amended mid-build): the main half repeats the artist's last choice ("open the page ↗" for a new tab, "open in split view"), and the ▾ beside it opens **open in new tab** and **open in split view**. Click, keyboard and touch; hover alone opens nothing, because a hover menu closes when the pointer wanders and does not exist on touch. Split view has a **draggable divider** (mouse, touch, or the arrow keys and Home/End on the focused divider; the live page takes 20% to 80% of the window, `lib.clampSplit`), and the frame stops taking the pointer while it is dragged. The choice, the size and whether split view was open are remembered (`hall-tweak-open-as`, `hall-tweak-split-size`, `hall-tweak-split`), so the next page opens the same way; a split that would be a second window never reopens on load, because a browser blocks a popup nobody clicked. At phone width the live page takes at most half the screen, whatever the saved size, because the two-row bar is tall there. Split view pins the live page under the words (words above, page below, both scroll; "close split view" unloads it; the frame loads only when opened). **The live site answers `X-Frame-Options: SAMEORIGIN`** (set at the proxy in front of the app, not in this repo), so only a page on the editor's own host can be framed. A landing or status page is on another host, so its split view opens the page in a second window docked to the bottom half of the screen (`lib.canFrame`, `lib.splitWindowFeatures`). **Letting them split in place (task 1004393)** is two steps, in this order. First the proxy answers the apex and `status.<apex>` with `<redacted>: frame-ancestors 'self' https://builders.<apex>` in place of `X-Frame-Options: SAMEORIGIN`, and every other host keeps SAMEORIGIN (sign-in and settings stay unframeable). Then `FRAME_SIBLINGS` in `tweak-editor-lib.js` flips to `true
|
|
30
|
+
- **No page title or sub text at the top of the paper, and "open the page" is a menu (task 1004386, owner-asked).** The bar already names the page, so the paper opens on its first section; the h1 stays, visually hidden, for the one-h1 floor. "open the page" is a **split button** (owner-amended mid-build): the main half repeats the artist's last choice ("open the page ↗" for a new tab, "open in split view"), and the ▾ beside it opens **open in new tab** and **open in split view**. Click, keyboard and touch; hover alone opens nothing, because a hover menu closes when the pointer wanders and does not exist on touch. Split view has a **draggable divider** (mouse, touch, or the arrow keys and Home/End on the focused divider; the live page takes 20% to 80% of the window, `lib.clampSplit`), and the frame stops taking the pointer while it is dragged. The choice, the size and whether split view was open are remembered (`hall-tweak-open-as`, `hall-tweak-split-size`, `hall-tweak-split`), so the next page opens the same way; a split that would be a second window never reopens on load, because a browser blocks a popup nobody clicked. At phone width the live page takes at most half the screen, whatever the saved size, because the two-row bar is tall there. Split view pins the live page under the words (words above, page below, both scroll; "close split view" unloads it; the frame loads only when opened). **The live site answers `X-Frame-Options: SAMEORIGIN`** (set at the proxy in front of the app, not in this repo), so only a page on the editor's own host can be framed. A landing or status page is on another host, so its split view opens the page in a second window docked to the bottom half of the screen (`lib.canFrame`, `lib.splitWindowFeatures`). **Letting them split in place (task 1004393)** is two steps, in this order. First the proxy answers the apex and `status.<apex>` with `<redacted>: frame-ancestors 'self' https://builders.<apex>` in place of `X-Frame-Options: SAMEORIGIN`, and every other host keeps SAMEORIGIN (sign-in and settings stay unframeable). Then `FRAME_SIBLINGS` in `tweak-editor-lib.js` flips to `true` (done in task 1004644, after checking both hosts answer frame-ancestors and no X-Frame-Options). `lib.canFrame` then also admits exactly those two origins, same scheme and port, and only from the builders host; never another subdomain or a lookalike. Flipping it before the proxy changes would put the browser's refusal page in the split, which is why it shipped off until the proxy was live; if the proxy ever stops sending frame-ancestors, flip it back.
|
|
31
31
|
- **Not on the artboard at all:** the phone layout (the bar becomes a two-row glass card, notes drop under their lines), the shell's full-screen button top right, the read-only and refusal notices on the paper, the chrome view (the switch off), and light mode.
|
|
32
32
|
|
|
33
33
|
## The proof
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_": "The community leaderboard for a builder who owns two projects (task 1002292): GET /my-projects answers Mercury and Tidepool (fixtures/my-projects-owner-two.json), so a labelled \"Recruit to\" choice sits above the rows, and picking Tidepool re-points every row's Recruit link at Tidepool's hall invite box.",
|
|
3
|
+
"page": "/community",
|
|
4
|
+
"surface": "public-landing",
|
|
5
|
+
"modes": ["dark"],
|
|
6
|
+
"modeQuery": false,
|
|
7
|
+
"stub": { "fixtures": { "my-projects": "my-projects-owner-two" } },
|
|
8
|
+
"ignoreRequests": ["/api/(gds|bongos)/me$", "/me/guild-", "/scouting$"],
|
|
9
|
+
"ignoreConsole": ["/api/(gds|bongos)/me", "/scouting", "\\b40[13]\\b", "Unauthorized", "Forbidden"],
|
|
10
|
+
"ignoreControls": [".vh"],
|
|
11
|
+
"states": {
|
|
12
|
+
"in-owner-two": { "auth": true, "actions": [["wait", 600]], "expect": { "visible": ["#boardFor", "#boardForPick"], "value": [["#boardForPick", "0"]], "count": [["#boardForPick option", 2], ["#boardList a.commRecruit", 6]], "href": [["#boardList .commRow:first-child .commRecruit", "https://mercury.example.test/builders/watch?invite=priyanair"]] } },
|
|
13
|
+
"in-owner-two-picked": { "auth": true, "actions": [["wait", 600], ["select", "#boardForPick", "1"], ["wait", 200]], "expect": { "value": [["#boardForPick", "1"]], "href": [["#boardList .commRow:first-child .commRecruit", "https://tidepool.example.test/builders/watch?invite=priyanair"]], "attr": [["#boardList .commRow:first-child .commRecruit", "aria-label", "Recruit Priya Nair to Tidepool (opens in a new tab)"]] } }
|
|
14
|
+
},
|
|
15
|
+
"reducedMotion": { "auth": true, "actions": [["wait", 600]] }
|
|
16
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_": "The community pages for a project owner (task 1002292; spec D6, owner 2026-10-27): GET /my-projects answers one owned project (fixtures/my-projects-owner.json), so every leaderboard and search row carries a Recruit link to Mercury's hall invite box with the GitHub login filled in, and a line above the rows says what it opens. The rows are the ones everyone sees.",
|
|
3
|
+
"page": "/community",
|
|
4
|
+
"surface": "public-landing",
|
|
5
|
+
"modes": ["dark"],
|
|
6
|
+
"modeQuery": false,
|
|
7
|
+
"stub": { "fixtures": { "my-projects": "my-projects-owner" } },
|
|
8
|
+
"ignoreRequests": ["/api/(gds|bongos)/me$", "/me/guild-", "/scouting$"],
|
|
9
|
+
"ignoreConsole": ["/api/(gds|bongos)/me", "/scouting", "\\b40[13]\\b", "Unauthorized", "Forbidden"],
|
|
10
|
+
"ignoreControls": [".vh"],
|
|
11
|
+
"states": {
|
|
12
|
+
"in-owner": { "auth": true, "actions": [["wait", 600]], "expect": { "visible": ["#board", "#boardFor", "#who"], "hidden": ["#find", "#recruit", "#boardFailed"], "count": [["#boardList .commRow", 6], ["#boardList a.commRecruit", 6]], "text": [["#boardFor", "Recruit opens Mercury’s hall with their name filled in, and you send the invite there."], ["#boardList .commRow:first-child .commRecruit", "Recruit"]], "href": [["#boardList .commRow:first-child .commRecruit", "https://mercury.example.test/builders/watch?invite=priyanair"]] } },
|
|
13
|
+
"in-owner-find": { "auth": true, "url": "/community/find", "actions": [["wait", 600], ["fill", "#findQ", "pri"], ["click", "#findBtn"], ["wait", 300]], "expect": { "visible": ["#find", "#findFor"], "hidden": ["#board", "#recruit"], "count": [["#findList .mineRow", 2], ["#findList .mineRow__actions a.commRecruit", 2]], "href": [["#findList .mineRow:first-child .commRecruit", "https://mercury.example.test/builders/watch?invite=priyanair"]] } }
|
|
14
|
+
},
|
|
15
|
+
"reducedMotion": { "auth": true, "actions": [["wait", 600]] }
|
|
16
|
+
}
|