@bongos/core 1.23.10 → 1.23.11
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 +45 -35
- package/docs/adr/0337-the-hub-account-is-the-person-a-hall-account-is-their-seat-in-one-project.md +1 -0
- package/docs/copy-inventory.md +847 -806
- package/docs/copy-registry.json +1499 -1073
- package/docs/module-api-changelog.md +2 -0
- package/docs/page-inventory.json +9 -3
- package/docs/page-readings.json +581 -575
- package/modules/public-landing/public/account.html +2 -1
- package/modules/public-landing/public/assets/hub-bar.js +4 -2
- package/modules/public-landing/public/community.html +2 -1
- package/modules/public-landing/public/community.states.json +3 -1
- package/modules/public-landing/public/connections-nosuggest.states.json +15 -0
- package/modules/public-landing/public/connections.html +23 -3
- package/modules/public-landing/public/connections.states.json +1 -0
- package/modules/public-landing/public/contact.html +2 -1
- package/modules/public-landing/public/guild.html +2 -1
- package/modules/public-landing/public/index.html +6 -2
- package/modules/public-landing/public/invitations.html +2 -1
- package/modules/public-landing/public/privacy.html +2 -1
- package/modules/public-landing/public/projects.html +4 -1
- package/modules/public-landing/public/terms.html +2 -1
- package/modules/ui-design/kit/fixtures/connections-nosuggest.json +12 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +6 -0
- package/src/module-api.js +1 -1
- package/tests/hub_account_page.mjs +7 -1
- package/tests/hub_community_page.mjs +21 -3
- package/tests/hub_connections_page.mjs +53 -4
- package/tests/hub_guild_page.mjs +1 -0
- package/tests/landing_legal_pages.mjs +7 -1
|
@@ -120,6 +120,7 @@
|
|
|
120
120
|
<li class="bandCell"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li>
|
|
121
121
|
<li class="bandCell"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li>
|
|
122
122
|
<li class="bandCell"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li>
|
|
123
|
+
<li class="bandCell knowCell" hidden><a class="bandT" href="/connections#connSuggest">Builders you may know</a><span class="bandC">connections or projects in common</span></li>
|
|
123
124
|
</ul>
|
|
124
125
|
</div>
|
|
125
126
|
</div>
|
|
@@ -130,7 +131,7 @@
|
|
|
130
131
|
<li class="bandCell"><a class="bandT" href="/projects?view=map&sub=table">Table</a><span class="bandC">the same projects as rows</span></li>
|
|
131
132
|
<li class="bandCell" id="mineCell"><a class="bandT" href="/projects?view=mine">Your projects</a><span class="bandC">the ones you own</span></li>
|
|
132
133
|
<li class="bandCell"><a class="bandT" href="/projects?view=new">New project</a><span class="bandC">five questions and a home</span></li>
|
|
133
|
-
<li class="bandCell bandFold"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li>
|
|
134
|
+
<li class="bandCell bandFold"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li><li class="bandCell bandFold knowCell" hidden><a class="bandT" href="/connections#connSuggest">Builders you may know</a><span class="bandC">connections or projects in common</span></li>
|
|
134
135
|
</ul>
|
|
135
136
|
</div>
|
|
136
137
|
</div>
|
|
@@ -7,8 +7,9 @@
|
|
|
7
7
|
the three footer doors (/privacy, /terms, /contact). Each page keeps the bar's
|
|
8
8
|
MARKUP (real markup, pinned byte-equal to the hub's); this file is the one copy
|
|
9
9
|
of what makes it work there:
|
|
10
|
-
- the chip, filled from GET /me — signed out there is no chip
|
|
11
|
-
Your-projects item
|
|
10
|
+
- the chip, filled from GET /me — signed out there is no chip, no
|
|
11
|
+
Your-projects item and no Builders-you-may-know item, and the sign-in
|
|
12
|
+
door takes the chip's slot;
|
|
12
13
|
- the bands' disclosure: a trigger toggles its band, opening one closes the
|
|
13
14
|
other, Escape closes and returns focus to the trigger, a click outside or
|
|
14
15
|
Tab out closes, the arrows walk the items, an item activated closes it;
|
|
@@ -33,6 +34,7 @@
|
|
|
33
34
|
$('who').hidden = !me;
|
|
34
35
|
$('signinTop').hidden = !!me;
|
|
35
36
|
$('mineCell').hidden = !me;
|
|
37
|
+
Array.prototype.forEach.call(document.querySelectorAll('.knowCell'), function (c) { c.hidden = !me; });
|
|
36
38
|
[['whoImg', 'whoLogin'], ['bandWhoImg', 'bandWhoLogin']].forEach(function (ids) {
|
|
37
39
|
$(ids[0]).hidden = !avatar;
|
|
38
40
|
if (avatar) $(ids[0]).src = avatar;
|
|
@@ -119,6 +119,7 @@
|
|
|
119
119
|
<li class="bandCell"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li>
|
|
120
120
|
<li class="bandCell"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li>
|
|
121
121
|
<li class="bandCell"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li>
|
|
122
|
+
<li class="bandCell knowCell" hidden><a class="bandT" href="/connections#connSuggest">Builders you may know</a><span class="bandC">connections or projects in common</span></li>
|
|
122
123
|
</ul>
|
|
123
124
|
</div>
|
|
124
125
|
</div>
|
|
@@ -129,7 +130,7 @@
|
|
|
129
130
|
<li class="bandCell"><a class="bandT" href="/projects?view=map&sub=table">Table</a><span class="bandC">the same projects as rows</span></li>
|
|
130
131
|
<li class="bandCell" id="mineCell"><a class="bandT" href="/projects?view=mine">Your projects</a><span class="bandC">the ones you own</span></li>
|
|
131
132
|
<li class="bandCell"><a class="bandT" href="/projects?view=new">New project</a><span class="bandC">five questions and a home</span></li>
|
|
132
|
-
<li class="bandCell bandFold"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li>
|
|
133
|
+
<li class="bandCell bandFold"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li><li class="bandCell bandFold knowCell" hidden><a class="bandT" href="/connections#connSuggest">Builders you may know</a><span class="bandC">connections or projects in common</span></li>
|
|
133
134
|
</ul>
|
|
134
135
|
</div>
|
|
135
136
|
</div>
|
|
@@ -11,7 +11,9 @@
|
|
|
11
11
|
"out": { "auth": false, "actions": [["wait", 400]], "expect": { "visible": ["#board", "#boardList", "#boardWindow", "#signinTop", "#projTrig"], "hidden": ["#find", "#recruit", "#who", "#boardLoading", "#boardFailed", "#boardEmpty"], "count": [["#boardList .commRow", 6]], "value": [["#boardWindow", "all"]], "attr": [["#craftTabs [data-craft=\"\"]", "aria-pressed", "true"], ["#commTrig", "aria-current", "true"], ["#menuCommunity a[href=\"/community\"]", "aria-current", "page"]], "text": [["#boardList .commRow:first-child .mineRow__name", "Priya Nair"], ["#boardList .commRow:first-child .commNum", "18,420"], ["#boardList .commRow:first-child .mineRow__hint", "212 works shipped · 64 karma"], ["#boardNote", "Credits earned across every project, since each builder started."]] } },
|
|
12
12
|
"out-30d": { "auth": false, "actions": [["wait", 400], ["select", "#boardWindow", "30d"], ["wait", 300]], "expect": { "count": [["#boardList .commRow", 3]], "value": [["#boardWindow", "30d"]], "text": [["#boardList .commRow:first-child .mineRow__name", "Ada Okafor"], ["#boardNote", "Credits earned in the last 30 days, across every project."]] } },
|
|
13
13
|
"out-artists": { "auth": false, "actions": [["wait", 400], ["click", "#craftTabs [data-craft=\"artist\"]"], ["wait", 300]], "expect": { "count": [["#boardList .commRow", 1]], "text": [["#boardList .commRow:first-child .mineRow__name", "Ada Okafor"], ["#boardList .commRow:first-child .commPlace", "1"]] } },
|
|
14
|
-
"out-community-band": { "auth": false, "actions": [["wait", 400], ["clickIfVisible", "#commTrig"], ["wait", 300]], "expect": { "count": [["#menuCommunity .bandCell", 3]], "attr": [["#menuCommunity a[href=\"/community\"]", "aria-current", "page"]] } },
|
|
14
|
+
"out-community-band": { "auth": false, "actions": [["wait", 400], ["clickIfVisible", "#commTrig"], ["wait", 300]], "expect": { "hidden": ["#menuCommunity .knowCell"], "count": [["#menuCommunity .bandCell:not([hidden])", 3]], "attr": [["#menuCommunity a[href=\"/community\"]", "aria-current", "page"]] } },
|
|
15
|
+
"in-community-band": { "auth": true, "actions": [["wait", 400], ["clickIfVisible", "#commTrig"], ["wait", 300]], "expect": { "count": [["#menuCommunity .bandCell:not([hidden])", 4]], "href": [["#menuCommunity .knowCell a", "/connections#connSuggest"]] } },
|
|
16
|
+
"in-projects-band": { "auth": true, "actions": [["wait", 400], ["click", "#projTrig"], ["wait", 300]], "expect": { "visible": ["#menuProjects"], "count": [["#menuProjects .knowCell:not([hidden])", 1]] } },
|
|
15
17
|
"out-projects-band": { "auth": false, "actions": [["wait", 400], ["click", "#projTrig"], ["wait", 300]], "expect": { "visible": ["#menuProjects"], "attr": [["#menuProjects a[href=\"/community\"]", "aria-current", "page"]] } },
|
|
16
18
|
"out-find": { "auth": false, "url": "/community/find", "actions": [["wait", 400]], "expect": { "visible": ["#find", "#findQ", "#findCraft", "#findBtn"], "hidden": ["#board", "#recruit"], "attr": [["#menuCommunity a[href=\"/community/find\"]", "aria-current", "page"]] } },
|
|
17
19
|
"out-find-search": { "auth": false, "url": "/community/find", "actions": [["wait", 400], ["fill", "#findQ", "pri"], ["click", "#findBtn"], ["wait", 300]], "expect": { "count": [["#findList .mineRow", 2]], "text": [["#findStatus", "2 builders found."], ["#findList .mineRow:first-child .mineRow__hint", "engineer · designer"]] } },
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_": "The connections page with nothing to suggest, opened by the Community menu's \"Builders you may know\" item (task 1004256): the graph is fixtures/connections-nosuggest.json, so the panel stands with its one empty line instead of vanishing. Any other visit keeps \"no suggestions, no empty shell\".",
|
|
3
|
+
"page": "/connections",
|
|
4
|
+
"surface": "public-landing",
|
|
5
|
+
"modes": ["dark"],
|
|
6
|
+
"modeQuery": false,
|
|
7
|
+
"stub": { "fixtures": { "connections": "connections-nosuggest" } },
|
|
8
|
+
"ignoreRequests": ["/api/(gds|bongos)/me$", "/my-projects", "/me/guild-"],
|
|
9
|
+
"ignoreConsole": ["/api/(gds|bongos)/me", "\\b401\\b", "Unauthorized"],
|
|
10
|
+
"ignoreControls": [".vh"],
|
|
11
|
+
"states": {
|
|
12
|
+
"in-suggest-none": { "auth": true, "url": "/connections#connSuggest", "actions": [["wait", 500]], "expect": { "visible": ["#connSuggest", "#suggestNone"], "count": [["#suggestList .mineRow", 0]] } },
|
|
13
|
+
"in-plain-none": { "auth": true, "actions": [["wait", 500]], "expect": { "visible": ["#connBody"], "hidden": ["#connSuggest"] } }
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -55,6 +55,8 @@
|
|
|
55
55
|
rows; a row with ONE button (Remove, Connect, Withdraw) keeps it beside the name */
|
|
56
56
|
@media (max-width:480px){.mineRow.connOne{flex-wrap:nowrap;}.connOne .mineRow__actions{flex-basis:auto;margin-top:0;}}
|
|
57
57
|
.connSub{margin:26px 0 4px;font-size:14px;font-weight:600;color:var(--ink-soft);}
|
|
58
|
+
/* opened as /connections#connSuggest, the panel's heading clears the fixed bar */
|
|
59
|
+
#connSuggest{scroll-margin-top:calc(var(--top-h) + 16px);}
|
|
58
60
|
</style>
|
|
59
61
|
</head>
|
|
60
62
|
<body>
|
|
@@ -91,6 +93,7 @@
|
|
|
91
93
|
<li class="bandCell"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li>
|
|
92
94
|
<li class="bandCell"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li>
|
|
93
95
|
<li class="bandCell"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li>
|
|
96
|
+
<li class="bandCell knowCell" hidden><a class="bandT" href="/connections#connSuggest">Builders you may know</a><span class="bandC">connections or projects in common</span></li>
|
|
94
97
|
</ul>
|
|
95
98
|
</div>
|
|
96
99
|
</div>
|
|
@@ -101,7 +104,7 @@
|
|
|
101
104
|
<li class="bandCell"><a class="bandT" href="/projects?view=map&sub=table">Table</a><span class="bandC">the same projects as rows</span></li>
|
|
102
105
|
<li class="bandCell" id="mineCell"><a class="bandT" href="/projects?view=mine">Your projects</a><span class="bandC">the ones you own</span></li>
|
|
103
106
|
<li class="bandCell"><a class="bandT" href="/projects?view=new">New project</a><span class="bandC">five questions and a home</span></li>
|
|
104
|
-
<li class="bandCell bandFold"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li>
|
|
107
|
+
<li class="bandCell bandFold"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li><li class="bandCell bandFold knowCell" hidden><a class="bandT" href="/connections#connSuggest">Builders you may know</a><span class="bandC">connections or projects in common</span></li>
|
|
105
108
|
</ul>
|
|
106
109
|
</div>
|
|
107
110
|
</div>
|
|
@@ -157,9 +160,11 @@
|
|
|
157
160
|
|
|
158
161
|
<!-- "Builders you may know" (ADR 0202 D5, ADR 0337 D4.2): the server's own
|
|
159
162
|
suggestions and their one-line reasons, rendered as they come. One panel:
|
|
160
|
-
the
|
|
163
|
+
the Community menu's "Builders you may know" item opens it here
|
|
164
|
+
(#connSuggest, task 1004256) rather than drawing a second one. -->
|
|
161
165
|
<section id="connSuggest" aria-labelledby="connSuggestH" hidden>
|
|
162
166
|
<h2 id="connSuggestH">Builders you may know</h2>
|
|
167
|
+
<p class="mineEmpty" id="suggestNone" hidden>No one to suggest yet. Suggestions come from the connections and projects you have in common with other builders.</p>
|
|
163
168
|
<ul class="mineRows" id="suggestList"></ul>
|
|
164
169
|
</section>
|
|
165
170
|
|
|
@@ -333,7 +338,11 @@
|
|
|
333
338
|
p.row.className += ' connOne';
|
|
334
339
|
sug.appendChild(p.row);
|
|
335
340
|
});
|
|
336
|
-
|
|
341
|
+
// Arriving by the Community menu's item, an empty panel says so instead of
|
|
342
|
+
// vanishing; any other visit keeps "no suggestions, no empty shell".
|
|
343
|
+
var asked = location.hash === '#connSuggest' && lists.suggestionsRead;
|
|
344
|
+
$('suggestNone').hidden = !!sug.children.length || !asked;
|
|
345
|
+
$('connSuggest').hidden = !sug.children.length && !asked;
|
|
337
346
|
|
|
338
347
|
var out = $('outgoingList');
|
|
339
348
|
out.textContent = '';
|
|
@@ -351,6 +360,7 @@
|
|
|
351
360
|
$('sentH').hidden = !outgoing.length;
|
|
352
361
|
}
|
|
353
362
|
|
|
363
|
+
var landed = false;
|
|
354
364
|
function load() {
|
|
355
365
|
return Promise.all([read('/connections'), read('/connections/requests'), read('/connections/suggestions')]).then(function (r) {
|
|
356
366
|
var list = r[0], reqs = r[1], sugg = r[2];
|
|
@@ -365,7 +375,11 @@
|
|
|
365
375
|
outgoing: arr(reqs.data.outgoing),
|
|
366
376
|
// additive, never load-bearing: a failed suggestions read only omits that panel
|
|
367
377
|
suggestions: sugg.ok ? arr(sugg.data.suggestions) : [],
|
|
378
|
+
suggestionsRead: sugg.ok,
|
|
368
379
|
});
|
|
380
|
+
// the panel draws after the browser's own jump to #connSuggest, so make it once
|
|
381
|
+
if (!landed && location.hash === '#connSuggest' && !$('connSuggest').hidden) $('connSuggest').scrollIntoView();
|
|
382
|
+
landed = true;
|
|
369
383
|
});
|
|
370
384
|
}
|
|
371
385
|
|
|
@@ -446,6 +460,12 @@
|
|
|
446
460
|
if (id !== 'connBody') $('connMsg').hidden = true;
|
|
447
461
|
}
|
|
448
462
|
function showDoor() { show('door'); }
|
|
463
|
+
// the menu item pressed while already here moves only the hash: answer it as an arrival
|
|
464
|
+
window.addEventListener('hashchange', function () {
|
|
465
|
+
if (location.hash !== '#connSuggest' || $('connBody').hidden) return;
|
|
466
|
+
landed = false;
|
|
467
|
+
load();
|
|
468
|
+
});
|
|
449
469
|
bar.ready.then(function (me) {
|
|
450
470
|
if (!me) { showDoor(); return; }
|
|
451
471
|
load();
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"states": {
|
|
11
11
|
"out": { "auth": false, "actions": [["wait", 300]], "expect": { "visible": ["#door", "#signin", "#signinTop", "#projTrig"], "hidden": ["#connBody", "#who", "#loading", "#inactive", "#readFailed"] } },
|
|
12
12
|
"in": { "auth": true, "actions": [["wait", 500]], "expect": { "visible": ["#connBody", "#connAsks", "#connSuggest", "#sentH", "#askHandle", "#askBtn", "#who"], "hidden": ["#door", "#loading", "#inactive", "#readFailed", "#menuProfile"], "count": [["#incomingList .mineRow", 2], ["#connList .mineRow", 3], ["#suggestList .mineRow", 3], ["#outgoingList .mineRow", 1]], "text": [["#connCount", "3 connections."], ["#incomingList .mineRow:first-child .mineRow__name", "Priya Nair"], ["#incomingList .mineRow:first-child .connNote", "We were both on the Tidepool hall last month. Good working with you."], ["#suggestList .mineRow:first-child .mineRow__hint", "2 connections in common"], ["#outgoingList .mineRow:first-child .mineRow__hint", "Request sent"]] } },
|
|
13
|
+
"in-suggest-linked": { "auth": true, "url": "/connections#connSuggest", "actions": [["wait", 500]], "expect": { "visible": ["#connSuggest"], "hidden": ["#suggestNone"], "count": [["#suggestList .mineRow", 3]] } },
|
|
13
14
|
"in-profile-band": { "auth": true, "actions": [["wait", 400], ["click", "#who"], ["wait", 300]], "expect": { "visible": ["#menuProfile"], "hidden": ["#menuProjects"], "text": [["#bandWhoLogin", "builder"], ["#menuProfile [aria-current=\"page\"]", "Connections"]] } },
|
|
14
15
|
"in-ask-filled": { "auth": true, "actions": [["wait", 500], ["fill", "#askHandle", "nadia"], ["fill", "#askNote", "We met on the Tidepool hall."]], "expect": { "value": [["#askHandle", "nadia"], ["#askNote", "We met on the Tidepool hall."]] } }
|
|
15
16
|
},
|
|
@@ -73,6 +73,7 @@
|
|
|
73
73
|
<li class="bandCell"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li>
|
|
74
74
|
<li class="bandCell"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li>
|
|
75
75
|
<li class="bandCell"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li>
|
|
76
|
+
<li class="bandCell knowCell" hidden><a class="bandT" href="/connections#connSuggest">Builders you may know</a><span class="bandC">connections or projects in common</span></li>
|
|
76
77
|
</ul>
|
|
77
78
|
</div>
|
|
78
79
|
</div><!--apex-only:end-->
|
|
@@ -83,7 +84,7 @@
|
|
|
83
84
|
<li class="bandCell"><a class="bandT" href="/projects?view=map&sub=table">Table</a><span class="bandC">the same projects as rows</span></li>
|
|
84
85
|
<li class="bandCell" id="mineCell"><a class="bandT" href="/projects?view=mine">Your projects</a><span class="bandC">the ones you own</span></li>
|
|
85
86
|
<li class="bandCell"><a class="bandT" href="/projects?view=new">New project</a><span class="bandC">five questions and a home</span></li>
|
|
86
|
-
<!--apex-only:start--><li class="bandCell bandFold"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li><!--apex-only:end-->
|
|
87
|
+
<!--apex-only:start--><li class="bandCell bandFold"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li><li class="bandCell bandFold knowCell" hidden><a class="bandT" href="/connections#connSuggest">Builders you may know</a><span class="bandC">connections or projects in common</span></li><!--apex-only:end-->
|
|
87
88
|
</ul>
|
|
88
89
|
</div>
|
|
89
90
|
</div>
|
|
@@ -148,6 +148,7 @@
|
|
|
148
148
|
<li class="bandCell"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li>
|
|
149
149
|
<li class="bandCell"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li>
|
|
150
150
|
<li class="bandCell"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li>
|
|
151
|
+
<li class="bandCell knowCell" hidden><a class="bandT" href="/connections#connSuggest">Builders you may know</a><span class="bandC">connections or projects in common</span></li>
|
|
151
152
|
</ul>
|
|
152
153
|
</div>
|
|
153
154
|
</div>
|
|
@@ -158,7 +159,7 @@
|
|
|
158
159
|
<li class="bandCell"><a class="bandT" href="/projects?view=map&sub=table">Table</a><span class="bandC">the same projects as rows</span></li>
|
|
159
160
|
<li class="bandCell" id="mineCell"><a class="bandT" href="/projects?view=mine">Your projects</a><span class="bandC">the ones you own</span></li>
|
|
160
161
|
<li class="bandCell"><a class="bandT" href="/projects?view=new">New project</a><span class="bandC">five questions and a home</span></li>
|
|
161
|
-
<li class="bandCell bandFold"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li>
|
|
162
|
+
<li class="bandCell bandFold"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li><li class="bandCell bandFold knowCell" hidden><a class="bandT" href="/connections#connSuggest">Builders you may know</a><span class="bandC">connections or projects in common</span></li>
|
|
162
163
|
</ul>
|
|
163
164
|
</div>
|
|
164
165
|
</div>
|
|
@@ -170,6 +170,8 @@ main:focus{outline:none;box-shadow:none}
|
|
|
170
170
|
room for it (the New account pill and the chip), so its three items fold into the
|
|
171
171
|
Projects band as its last cells; above 900 those cells are not drawn */
|
|
172
172
|
.bandFold{display:none}
|
|
173
|
+
/* no global [hidden] rule on the landing: a signed-in-only fold cell stays down when the fold shows */
|
|
174
|
+
.bandFold[hidden]{display:none}
|
|
173
175
|
.whoSlot{display:inline-flex;align-items:center}
|
|
174
176
|
.who{gap:9px}
|
|
175
177
|
.who img{width:26px;height:26px;border-radius:var(--radius-pill);object-fit:cover;flex:none;border:1px solid var(--rule)}
|
|
@@ -720,6 +722,7 @@ composition A; landing composition v3, picked by the owner 2026-08-27. No roll,
|
|
|
720
722
|
<li class="bandCell"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li>
|
|
721
723
|
<li class="bandCell"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li>
|
|
722
724
|
<li class="bandCell"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li>
|
|
725
|
+
<li class="bandCell knowCell" hidden><a class="bandT" href="/connections#connSuggest">Builders you may know</a><span class="bandC">connections or projects in common</span></li>
|
|
723
726
|
</ul>
|
|
724
727
|
</div>
|
|
725
728
|
</div><!--apex-only:end-->
|
|
@@ -730,7 +733,7 @@ composition A; landing composition v3, picked by the owner 2026-08-27. No roll,
|
|
|
730
733
|
<li class="bandCell"><a class="bandT" href="/projects?view=map&sub=table">Table</a><span class="bandC">sky project directory</span></li>
|
|
731
734
|
<li class="bandCell" id="mineCell" hidden><a class="bandT" href="/projects?view=mine">Your projects</a><span class="bandC">the ones you own</span></li>
|
|
732
735
|
<li class="bandCell"><a class="bandT" href="/projects?view=new">+ Create New Project</a><span class="bandC">fresh start/fresh idea</span></li>
|
|
733
|
-
<!--apex-only:start--><li class="bandCell bandFold"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li><!--apex-only:end-->
|
|
736
|
+
<!--apex-only:start--><li class="bandCell bandFold"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li><li class="bandCell bandFold knowCell" hidden><a class="bandT" href="/connections#connSuggest">Builders you may know</a><span class="bandC">connections or projects in common</span></li><!--apex-only:end-->
|
|
734
737
|
</ul>
|
|
735
738
|
<!-- About and Docs are site pages, not project views: they live in the footer row with
|
|
736
739
|
Privacy / Terms / Contact (owner, 2026-08-28; task 1003332). -->
|
|
@@ -1053,9 +1056,10 @@ composition A; landing composition v3, picked by the owner 2026-08-27. No roll,
|
|
|
1053
1056
|
chip.appendChild(cv);
|
|
1054
1057
|
slot.appendChild(chip);
|
|
1055
1058
|
wireTrigger(chip);
|
|
1056
|
-
/* a member sees the Your-projects cell of the Projects band */
|
|
1059
|
+
/* a member sees the Your-projects cell of the Projects band, and Builders you may know */
|
|
1057
1060
|
var mine = document.getElementById('mineCell');
|
|
1058
1061
|
if (mine) mine.hidden = false;
|
|
1062
|
+
document.querySelectorAll('.knowCell').forEach(function (c) { c.hidden = false; });
|
|
1059
1063
|
});
|
|
1060
1064
|
/* the sign-out anchor keeps its honest href; the click is the real POST */
|
|
1061
1065
|
var signout = document.querySelector('#menuProfile a.signout');
|
|
@@ -103,6 +103,7 @@
|
|
|
103
103
|
<li class="bandCell"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li>
|
|
104
104
|
<li class="bandCell"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li>
|
|
105
105
|
<li class="bandCell"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li>
|
|
106
|
+
<li class="bandCell knowCell" hidden><a class="bandT" href="/connections#connSuggest">Builders you may know</a><span class="bandC">connections or projects in common</span></li>
|
|
106
107
|
</ul>
|
|
107
108
|
</div>
|
|
108
109
|
</div>
|
|
@@ -113,7 +114,7 @@
|
|
|
113
114
|
<li class="bandCell"><a class="bandT" href="/projects?view=map&sub=table">Table</a><span class="bandC">the same projects as rows</span></li>
|
|
114
115
|
<li class="bandCell" id="mineCell"><a class="bandT" href="/projects?view=mine">Your projects</a><span class="bandC">the ones you own</span></li>
|
|
115
116
|
<li class="bandCell"><a class="bandT" href="/projects?view=new">New project</a><span class="bandC">five questions and a home</span></li>
|
|
116
|
-
<li class="bandCell bandFold"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li>
|
|
117
|
+
<li class="bandCell bandFold"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li><li class="bandCell bandFold knowCell" hidden><a class="bandT" href="/connections#connSuggest">Builders you may know</a><span class="bandC">connections or projects in common</span></li>
|
|
117
118
|
</ul>
|
|
118
119
|
</div>
|
|
119
120
|
</div>
|
|
@@ -72,6 +72,7 @@
|
|
|
72
72
|
<li class="bandCell"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li>
|
|
73
73
|
<li class="bandCell"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li>
|
|
74
74
|
<li class="bandCell"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li>
|
|
75
|
+
<li class="bandCell knowCell" hidden><a class="bandT" href="/connections#connSuggest">Builders you may know</a><span class="bandC">connections or projects in common</span></li>
|
|
75
76
|
</ul>
|
|
76
77
|
</div>
|
|
77
78
|
</div><!--apex-only:end-->
|
|
@@ -82,7 +83,7 @@
|
|
|
82
83
|
<li class="bandCell"><a class="bandT" href="/projects?view=map&sub=table">Table</a><span class="bandC">the same projects as rows</span></li>
|
|
83
84
|
<li class="bandCell" id="mineCell"><a class="bandT" href="/projects?view=mine">Your projects</a><span class="bandC">the ones you own</span></li>
|
|
84
85
|
<li class="bandCell"><a class="bandT" href="/projects?view=new">New project</a><span class="bandC">five questions and a home</span></li>
|
|
85
|
-
<!--apex-only:start--><li class="bandCell bandFold"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li><!--apex-only:end-->
|
|
86
|
+
<!--apex-only:start--><li class="bandCell bandFold"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li><li class="bandCell bandFold knowCell" hidden><a class="bandT" href="/connections#connSuggest">Builders you may know</a><span class="bandC">connections or projects in common</span></li><!--apex-only:end-->
|
|
86
87
|
</ul>
|
|
87
88
|
</div>
|
|
88
89
|
</div>
|
|
@@ -861,6 +861,7 @@ summary{min-height:24px;padding:3px 0;}
|
|
|
861
861
|
<li class="bandCell"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li>
|
|
862
862
|
<li class="bandCell"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li>
|
|
863
863
|
<li class="bandCell"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li>
|
|
864
|
+
<li class="bandCell knowCell" hidden><a class="bandT" href="/connections#connSuggest">Builders you may know</a><span class="bandC">connections or projects in common</span></li>
|
|
864
865
|
</ul>
|
|
865
866
|
</div>
|
|
866
867
|
</div><!--apex-only:end-->
|
|
@@ -873,7 +874,7 @@ summary{min-height:24px;padding:3px 0;}
|
|
|
873
874
|
<li class="bandCell"><a class="bandT" href="?view=map&sub=table" data-nav="map" data-sub="table">Table</a><span class="bandC">the same projects as rows</span></li>
|
|
874
875
|
<li class="bandCell"><a class="bandT" href="?view=mine" data-nav="mine">Your projects</a><span class="bandC">the ones you own</span></li>
|
|
875
876
|
<li class="bandCell"><a class="bandT" href="?view=new" data-nav="new">New project</a><span class="bandC">five questions and a home</span></li>
|
|
876
|
-
<!--apex-only:start--><li class="bandCell bandFold"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li><!--apex-only:end-->
|
|
877
|
+
<!--apex-only:start--><li class="bandCell bandFold"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li><li class="bandCell bandFold knowCell" hidden><a class="bandT" href="/connections#connSuggest">Builders you may know</a><span class="bandC">connections or projects in common</span></li><!--apex-only:end-->
|
|
877
878
|
</ul>
|
|
878
879
|
<!-- About and Docs are site pages, not project views: they live in the
|
|
879
880
|
footer row with Privacy / Terms / Contact (owner, 2026-08-28; task 1003332). -->
|
|
@@ -11808,6 +11809,8 @@ summary{min-height:24px;padding:3px 0;}
|
|
|
11808
11809
|
/* every Your-projects item a band carries (§6 asked for querySelectorAll so
|
|
11809
11810
|
a second data-nav="mine" item could never become a signed-out leak) */
|
|
11810
11811
|
document.querySelectorAll('[data-nav="mine"]').forEach(function (a) { (a.closest('.bandCell') || a).hidden = !signedIn; });
|
|
11812
|
+
/* Builders you may know reads your own connections (task 1004256) */
|
|
11813
|
+
document.querySelectorAll('.knowCell').forEach(function (c) { c.hidden = !signedIn; });
|
|
11811
11814
|
$('onlyMine').closest('.switch').hidden = !signedIn;
|
|
11812
11815
|
if (!signedIn) closeMenus();
|
|
11813
11816
|
if (!signedIn && $('onlyMine').checked) { $('onlyMine').checked = false; applyMapFilter(); }
|
|
@@ -72,6 +72,7 @@
|
|
|
72
72
|
<li class="bandCell"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li>
|
|
73
73
|
<li class="bandCell"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li>
|
|
74
74
|
<li class="bandCell"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li>
|
|
75
|
+
<li class="bandCell knowCell" hidden><a class="bandT" href="/connections#connSuggest">Builders you may know</a><span class="bandC">connections or projects in common</span></li>
|
|
75
76
|
</ul>
|
|
76
77
|
</div>
|
|
77
78
|
</div><!--apex-only:end-->
|
|
@@ -82,7 +83,7 @@
|
|
|
82
83
|
<li class="bandCell"><a class="bandT" href="/projects?view=map&sub=table">Table</a><span class="bandC">the same projects as rows</span></li>
|
|
83
84
|
<li class="bandCell" id="mineCell"><a class="bandT" href="/projects?view=mine">Your projects</a><span class="bandC">the ones you own</span></li>
|
|
84
85
|
<li class="bandCell"><a class="bandT" href="/projects?view=new">New project</a><span class="bandC">five questions and a home</span></li>
|
|
85
|
-
<!--apex-only:start--><li class="bandCell bandFold"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li><!--apex-only:end-->
|
|
86
|
+
<!--apex-only:start--><li class="bandCell bandFold"><a class="bandT" href="/community">Leaderboard</a><span class="bandC">who earned the most, across every project</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/find">Find a builder</a><span class="bandC">anyone building here, by name or role</span></li><li class="bandCell bandFold"><a class="bandT" href="/community/recruiters">Open to recruiters</a><span class="bandC">who is open to recruiting, for project owners</span></li><li class="bandCell bandFold knowCell" hidden><a class="bandT" href="/connections#connSuggest">Builders you may know</a><span class="bandC">connections or projects in common</span></li><!--apex-only:end-->
|
|
86
87
|
</ul>
|
|
87
88
|
</div>
|
|
88
89
|
</div>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_": "The connections graph with nothing to suggest (task 1004256): one connection, nothing pending, no builder you may know. Opened by the Community menu's item (/connections#connSuggest), the panel says so rather than vanishing.",
|
|
3
|
+
"connections": [
|
|
4
|
+
{ "id": "41", "connected_at": "2026-09-30T10:00:00Z", "handle": "mira", "display_name": "Mira Okafor", "avatar_url": "/__kit/avatar.svg" }
|
|
5
|
+
],
|
|
6
|
+
"incoming": [],
|
|
7
|
+
"outgoing": [],
|
|
8
|
+
"suggestions": [],
|
|
9
|
+
"directory": [
|
|
10
|
+
{ "handle": "nadia", "display_name": "Nadia Haddad", "avatar_url": "/__kit/avatar.svg" }
|
|
11
|
+
]
|
|
12
|
+
}
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.23.
|
|
3
|
+
"version": "1.23.11",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.23.
|
|
9
|
+
"version": "1.23.11",
|
|
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.23.
|
|
3
|
+
"version": "1.23.11",
|
|
4
4
|
"description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"main": "src/platform-server.js",
|
package/release-notes.json
CHANGED
|
@@ -10447,5 +10447,11 @@
|
|
|
10447
10447
|
"id": "1003363",
|
|
10448
10448
|
"text": "cloudbongos.com now has a Community menu: a leaderboard of builders across every project (by week, month, year or all time, and by craft), a search for builders by name, and, for project owners, a list of builders who keep the"
|
|
10449
10449
|
}
|
|
10450
|
+
],
|
|
10451
|
+
"1.23.11": [
|
|
10452
|
+
{
|
|
10453
|
+
"id": "1004256",
|
|
10454
|
+
"text": "Signed-in builders now find 'Builders you may know' in the Community menu; it opens their suggestions on the Connections page, which says so plainly when there's no one to suggest yet."
|
|
10455
|
+
}
|
|
10450
10456
|
]
|
|
10451
10457
|
}
|
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.23.
|
|
84
|
+
const CORE_VERSION = '1.23.11'; // 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');
|
|
@@ -137,6 +137,7 @@ test('the bands say what the hub’s say and lead into /projects; Account is the
|
|
|
137
137
|
['Your projects', '/projects?view=mine'], ['New project', '/projects?view=new'],
|
|
138
138
|
// the Community menu's three sub-pages, folded into the band under 480px (task 1003363)
|
|
139
139
|
['Leaderboard', '/community'], ['Find a builder', '/community/find'], ['Open to recruiters', '/community/recruiters'],
|
|
140
|
+
['Builders you may know', '/connections#connSuggest'],
|
|
140
141
|
], 'this page has no views of its own, so every item names /projects in full');
|
|
141
142
|
assert.deepEqual(bandLinks(bandOf(PAGE, 'menuProfile')), [
|
|
142
143
|
['My projects', '/projects?view=mine'], ['Invitations', '/invitations'], ['Connections', '/connections'], ['Account', '/account'], ['Sign out', '/api/bongos/auth/logout'],
|
|
@@ -213,6 +214,8 @@ function boot(answer) {
|
|
|
213
214
|
// The bar: the two triggers, and each band with its links in markup order. An
|
|
214
215
|
// item's cell is its <li>; only #mineCell carries an id, so only it can hide.
|
|
215
216
|
const trigs = [...els.values()].filter((e) => /\btrig\b/.test(e.attrs.class || ''));
|
|
217
|
+
// the signed-in-only "Builders you may know" cells (task 1004256), by class: a band and its phone fold
|
|
218
|
+
const knowCells = [...PAGE.matchAll(/<li class="bandCell(?: bandFold)? knowCell" hidden>/g)].map(() => ({ hidden: true }));
|
|
216
219
|
const bands = [...PAGE.matchAll(/<div class="menuBand" id="(\w+)"[\s\S]*?\n<\/div>/g)].map((m) => {
|
|
217
220
|
const band = els.get(m[1]);
|
|
218
221
|
band.items = [...m[0].matchAll(/<li class="bandCell"(?: id="(\w+)")?><a class="([^"]+)" href="([^"]+)"([^>]*)>([^<]+)<\/a>/g)].map((a) => ({
|
|
@@ -243,7 +246,7 @@ function boot(answer) {
|
|
|
243
246
|
});
|
|
244
247
|
const calls = [];
|
|
245
248
|
const dom = {
|
|
246
|
-
els, radios, calls, focused: null, assigned: null,
|
|
249
|
+
els, radios, calls, knowCells, focused: null, assigned: null,
|
|
247
250
|
active: () => document.activeElement,
|
|
248
251
|
// a click bubbles: the target's own listeners, its band's, then the document's
|
|
249
252
|
click(target, detail = 1) {
|
|
@@ -274,6 +277,7 @@ function boot(answer) {
|
|
|
274
277
|
},
|
|
275
278
|
querySelectorAll(sel) {
|
|
276
279
|
if (sel === '#profileForm [data-link]') return links;
|
|
280
|
+
if (sel === '.knowCell') return knowCells;
|
|
277
281
|
if (sel === '.trig') return trigs;
|
|
278
282
|
if (sel === '.menuBand') return bands;
|
|
279
283
|
const names = [...sel.matchAll(/input\[name="(\w+)"\]/g)].map((m) => m[1]);
|
|
@@ -311,6 +315,7 @@ test('signed out: a 401 opens the door and shows nothing else', async () => {
|
|
|
311
315
|
assert.equal(dom.els.get('who').hidden, true, 'no chip without a session');
|
|
312
316
|
assert.equal(dom.els.get('signinTop').hidden, false, 'the sign-in door takes its slot');
|
|
313
317
|
assert.equal(dom.els.get('mineCell').hidden, true, 'and the Projects band offers no Your projects');
|
|
318
|
+
assert.deepEqual(dom.knowCells.map((c) => c.hidden), [true, true], 'nor Builders you may know, in the Community band or its fold');
|
|
314
319
|
});
|
|
315
320
|
|
|
316
321
|
test('signed in: every control is painted from the server’s answer', async () => {
|
|
@@ -680,6 +685,7 @@ test('the chip is the hub’s identity read: GET /me fills the trigger and the p
|
|
|
680
685
|
assert.equal(dom.els.get(id).hidden, false);
|
|
681
686
|
}
|
|
682
687
|
assert.equal(dom.els.get('mineCell').hidden, false);
|
|
688
|
+
assert.deepEqual(dom.knowCells.map((c) => c.hidden), [false, false]);
|
|
683
689
|
});
|
|
684
690
|
|
|
685
691
|
test('an account with no avatar gets a chip with no picture rather than a broken one', async () => {
|
|
@@ -330,13 +330,17 @@ const ITEMS = [
|
|
|
330
330
|
['/community/find', 'Find a builder', 'anyone building here, by name or role'],
|
|
331
331
|
['/community/recruiters', 'Open to recruiters', 'who is open to recruiting, for project owners'],
|
|
332
332
|
];
|
|
333
|
+
// signed in only, and it opens /connections' own panel rather than a second one here (task 1004256)
|
|
334
|
+
const KNOW = '<a class="bandT" href="/connections#connSuggest">Builders you may know</a><span class="bandC">connections or projects in common</span></li>';
|
|
333
335
|
|
|
334
336
|
test('every page that wears the hub’s bar carries the Community menu before Projects; apex-only where the page serves a child', () => {
|
|
335
337
|
const { stripApexOnly } = require('../src/platform-server.js');
|
|
336
338
|
const trig = '<button class="trig commTrig" type="button" id="commTrig" data-menu="community" aria-expanded="false" aria-controls="menuCommunity"';
|
|
337
339
|
const band = ['<div class="menuBand" id="menuCommunity" data-menu="community" hidden>', ' <div class="bandIn">', ' <ul class="bandRow">',
|
|
338
|
-
...ITEMS.map(([h, t, c]) => ` <li class="bandCell"><a class="bandT" href="${h}">${t}</a><span class="bandC">${c}</span></li>`),
|
|
339
|
-
|
|
340
|
+
...ITEMS.map(([h, t, c]) => ` <li class="bandCell"><a class="bandT" href="${h}">${t}</a><span class="bandC">${c}</span></li>`),
|
|
341
|
+
` <li class="bandCell knowCell" hidden>${KNOW}`, ' </ul>', ' </div>', '</div>'].join('\n');
|
|
342
|
+
const fold = ITEMS.map(([h, t, c]) => `<li class="bandCell bandFold"><a class="bandT" href="${h}">${t}</a><span class="bandC">${c}</span></li>`).join('')
|
|
343
|
+
+ `<li class="bandCell bandFold knowCell" hidden>${KNOW}`;
|
|
340
344
|
for (const f of [...SERVES_A_CHILD, ...HUB_ONLY]) {
|
|
341
345
|
const html = read(f);
|
|
342
346
|
const apex = SERVES_A_CHILD.includes(f);
|
|
@@ -346,10 +350,20 @@ test('every page that wears the hub’s bar carries the Community menu before Pr
|
|
|
346
350
|
assert.ok(html.includes(wrap(apex, band)), `${f}: the Community band, its three sub-pages`);
|
|
347
351
|
assert.ok(html.indexOf('id="menuCommunity"') < html.indexOf('id="menuProjects"'), `${f}: the bands in the bar’s order`);
|
|
348
352
|
assert.ok(html.includes(wrap(apex, fold)), `${f}: the three folded into the Projects band for phones`);
|
|
349
|
-
if (apex) assert.doesNotMatch(stripApexOnly(html, false).split('<body>')[1], /\/community|commTrig|menuCommunity/, `${f}: a child has no community pages, so no trace of the menu`);
|
|
353
|
+
if (apex) assert.doesNotMatch(stripApexOnly(html, false).split('<body>')[1], /\/community|commTrig|menuCommunity|connSuggest/, `${f}: a child has no community pages, so no trace of the menu`);
|
|
350
354
|
}
|
|
351
355
|
});
|
|
352
356
|
|
|
357
|
+
test('Builders you may know: shown only once GET /me names someone, and drawn once, on /connections', () => {
|
|
358
|
+
// every bar script that paints the signed-in state shows or hides both cells with it
|
|
359
|
+
assert.match(read('assets/hub-bar.js'), /\$\('mineCell'\)\.hidden = !me;\n\s*Array\.prototype\.forEach\.call\(document\.querySelectorAll\('\.knowCell'\), function \(c\) \{ c\.hidden = !me; \}\);/);
|
|
360
|
+
assert.match(read('projects.html'), /function paintShellIdentity\(\) \{[\s\S]*?document\.querySelectorAll\('\.knowCell'\)\.forEach\(function \(c\) \{ c\.hidden = !signedIn; \}\);/);
|
|
361
|
+
assert.match(read('index.html'), /if \(mine\) mine\.hidden = false;\n\s*document\.querySelectorAll\('\.knowCell'\)\.forEach\(function \(c\) \{ c\.hidden = false; \}\);/);
|
|
362
|
+
// the panel it opens exists, and the community page reads no suggestions of its own
|
|
363
|
+
assert.match(read('connections.html'), /<section id="connSuggest" aria-labelledby="connSuggestH" hidden>/);
|
|
364
|
+
assert.doesNotMatch(read('community.html').split('<script>')[1], /connections\/suggestions/);
|
|
365
|
+
});
|
|
366
|
+
|
|
353
367
|
test('the menu folds into the Projects band under 480px on the hub and 900px on the landing; the arrows skip what CSS does not draw', () => {
|
|
354
368
|
const css = fs.readFileSync(path.join(LANDING, 'assets', 'cosmos.css'), 'utf8').replace(/\r\n/g, '\n');
|
|
355
369
|
assert.match(css, /\.trig\[aria-expanded="true"\],\.trig\[aria-current="true"\]\{color:var\(--ink\);text-decoration:underline;/, 'on its own pages the menu reads as the current section');
|
|
@@ -357,6 +371,10 @@ test('the menu folds into the Projects band under 480px on the hub and 900px on
|
|
|
357
371
|
assert.match(css.split('@media (max-width:480px){')[1].split('\n}')[0], /\.commTrig\{display:none;\}\s*\.bandFold\{display:block;\}/);
|
|
358
372
|
const index = read('index.html');
|
|
359
373
|
assert.match(index, /\n\.bandFold\{display:none\}\n/);
|
|
374
|
+
// a hidden fold cell (signed in only, task 1004256) must stay down where the fold shows:
|
|
375
|
+
// cosmos.css's [hidden] rule is !important; the landing has none, so it carries its own
|
|
376
|
+
assert.match(css, /\n\[hidden\]\{display:none !important;\}\n/);
|
|
377
|
+
assert.match(index, /\n\.bandFold\[hidden\]\{display:none\}\n/);
|
|
360
378
|
assert.match(index.split('@media (max-width:900px){')[1], /^[\s\S]*?\.commTrig\{display:none\}\s*\.bandFold\{display:block\}/);
|
|
361
379
|
for (const f of ['assets/hub-bar.js', 'projects.html', 'index.html']) {
|
|
362
380
|
assert.match(read(f), /return !a\.closest\('\[hidden\]'\) && a\.offsetParent !== null; \}\);/, `${f}: the arrows skip a cell CSS does not draw`);
|