@bongos/core 1.19.781 → 1.19.782

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.
@@ -3,9 +3,9 @@
3
3
  "generator": "scripts/gds/copy-inventory.js",
4
4
  "goal": 1000074,
5
5
  "counts": {
6
- "strings": 1771,
7
- "unique_ids": 1530,
8
- "certain": 1771,
6
+ "strings": 1773,
7
+ "unique_ids": 1532,
8
+ "certain": 1773,
9
9
  "heuristic": 0,
10
10
  "duplicate_ids": 167
11
11
  },
@@ -13,7 +13,7 @@
13
13
  "builders-hall": {
14
14
  "at": "modules/hall-ui/public",
15
15
  "files": 82,
16
- "strings": 1281
16
+ "strings": 1283
17
17
  },
18
18
  "status-dashboard": {
19
19
  "at": "modules/status-ui/public",
@@ -247,7 +247,7 @@
247
247
  "modules/hall-ui/public/hall-render.js:275",
248
248
  "modules/hall-ui/public/hall-render.js:346",
249
249
  "modules/hall-ui/public/hall-render.js:415",
250
- "modules/hall-ui/public/shell.js:416"
250
+ "modules/hall-ui/public/shell.js:418"
251
251
  ]
252
252
  },
253
253
  {
@@ -548,7 +548,7 @@
548
548
  "text": "Asked {…}",
549
549
  "occurrences": 2,
550
550
  "at": [
551
- "modules/hall-ui/public/collab.js:41",
551
+ "modules/hall-ui/public/collab.js:49",
552
552
  "modules/hall-ui/public/watch.js:488"
553
553
  ]
554
554
  },
@@ -1348,8 +1348,8 @@
1348
1348
  "text": "Sign out",
1349
1349
  "occurrences": 2,
1350
1350
  "at": [
1351
- "modules/hall-ui/public/shell.js:434",
1352
- "modules/hall-ui/public/shell.js:591"
1351
+ "modules/hall-ui/public/shell.js:436",
1352
+ "modules/hall-ui/public/shell.js:593"
1353
1353
  ]
1354
1354
  },
1355
1355
  {
@@ -2257,7 +2257,7 @@
2257
2257
  "surface": "builders-hall",
2258
2258
  "text": "A {…} — you are a {…}. Mingle pairs across crafts.",
2259
2259
  "file": "modules/hall-ui/public/collab.js",
2260
- "line": 196,
2260
+ "line": 278,
2261
2261
  "origin": "js-markup",
2262
2262
  "confidence": "certain"
2263
2263
  },
@@ -2378,6 +2378,15 @@
2378
2378
  "origin": "html-text",
2379
2379
  "confidence": "certain"
2380
2380
  },
2381
+ {
2382
+ "id": "9c34bccb06ef",
2383
+ "surface": "builders-hall",
2384
+ "text": "All open asks",
2385
+ "file": "modules/hall-ui/public/collab.html",
2386
+ "line": 64,
2387
+ "origin": "html-text",
2388
+ "confidence": "certain"
2389
+ },
2381
2390
  {
2382
2391
  "id": "bea7817e57a4",
2383
2392
  "surface": "builders-hall",
@@ -2450,6 +2459,15 @@
2450
2459
  "origin": "js-markup",
2451
2460
  "confidence": "certain"
2452
2461
  },
2462
+ {
2463
+ "id": "05761b08ec8f",
2464
+ "surface": "builders-hall",
2465
+ "text": "Answering is optional and declining costs nothing. Nobody is assigned by being asked.",
2466
+ "file": "modules/hall-ui/public/collab.html",
2467
+ "line": 90,
2468
+ "origin": "html-text",
2469
+ "confidence": "certain"
2470
+ },
2453
2471
  {
2454
2472
  "id": "52ed0e2e3470",
2455
2473
  "surface": "builders-hall",
@@ -2581,7 +2599,7 @@
2581
2599
  "surface": "builders-hall",
2582
2600
  "text": "Asked of you",
2583
2601
  "file": "modules/hall-ui/public/collab.html",
2584
- "line": 37,
2602
+ "line": 41,
2585
2603
  "origin": "html-text",
2586
2604
  "confidence": "certain"
2587
2605
  },
@@ -2590,7 +2608,7 @@
2590
2608
  "surface": "builders-hall",
2591
2609
  "text": "Asked {…}",
2592
2610
  "file": "modules/hall-ui/public/collab.js",
2593
- "line": 41,
2611
+ "line": 49,
2594
2612
  "origin": "js-markup",
2595
2613
  "confidence": "certain"
2596
2614
  },
@@ -3769,7 +3787,7 @@
3769
3787
  "surface": "builders-hall",
3770
3788
  "text": "Could not load requests.",
3771
3789
  "file": "modules/hall-ui/public/collab.js",
3772
- "line": 274,
3790
+ "line": 367,
3773
3791
  "origin": "js-text-assign",
3774
3792
  "confidence": "certain"
3775
3793
  },
@@ -5866,7 +5884,7 @@
5866
5884
  "surface": "builders-hall",
5867
5885
  "text": "Jump to a page or record",
5868
5886
  "file": "modules/hall-ui/public/shell.js",
5869
- "line": 455,
5887
+ "line": 457,
5870
5888
  "origin": "js-markup",
5871
5889
  "confidence": "certain"
5872
5890
  },
@@ -5875,7 +5893,7 @@
5875
5893
  "surface": "builders-hall",
5876
5894
  "text": "Jump to…",
5877
5895
  "file": "modules/hall-ui/public/shell.js",
5878
- "line": 457,
5896
+ "line": 459,
5879
5897
  "origin": "js-markup",
5880
5898
  "confidence": "certain"
5881
5899
  },
@@ -6366,11 +6384,11 @@
6366
6384
  "confidence": "certain"
6367
6385
  },
6368
6386
  {
6369
- "id": "1c485c956f90",
6387
+ "id": "d3fa05c5e3fe",
6370
6388
  "surface": "builders-hall",
6371
- "text": "Mingle pairs you with someone from a different craft. Saying no costs nothing at all — no rank, no karma, no streak, and it does not change how often you are paired again.",
6389
+ "text": "Mingle pairs you with someone from another craft. Saying no costs nothing.",
6372
6390
  "file": "modules/hall-ui/public/collab.html",
6373
- "line": 57,
6391
+ "line": 80,
6374
6392
  "origin": "html-text",
6375
6393
  "confidence": "certain"
6376
6394
  },
@@ -6717,11 +6735,11 @@
6717
6735
  "confidence": "certain"
6718
6736
  },
6719
6737
  {
6720
- "id": "9b84e98cfc3b",
6738
+ "id": "139ec3636c22",
6721
6739
  "surface": "builders-hall",
6722
- "text": "No introductions right now. You will see one here when a pairing round runs.",
6740
+ "text": "No introductions right now. One appears here when a pairing round runs.",
6723
6741
  "file": "modules/hall-ui/public/collab.html",
6724
- "line": 64,
6742
+ "line": 83,
6725
6743
  "origin": "html-text",
6726
6744
  "confidence": "certain"
6727
6745
  },
@@ -6851,6 +6869,24 @@
6851
6869
  "origin": "js-markup",
6852
6870
  "confidence": "certain"
6853
6871
  },
6872
+ {
6873
+ "id": "1967d2176f2e",
6874
+ "surface": "builders-hall",
6875
+ "text": "Nobody has an open ask right now.",
6876
+ "file": "modules/hall-ui/public/collab.html",
6877
+ "line": 68,
6878
+ "origin": "html-text",
6879
+ "confidence": "certain"
6880
+ },
6881
+ {
6882
+ "id": "b54cb5ce7f73",
6883
+ "surface": "builders-hall",
6884
+ "text": "Nobody is waiting on you. Requests reach you by craft —",
6885
+ "file": "modules/hall-ui/public/collab.html",
6886
+ "line": 46,
6887
+ "origin": "html-text",
6888
+ "confidence": "certain"
6889
+ },
6854
6890
  {
6855
6891
  "id": "91c409a4aea5",
6856
6892
  "surface": "builders-hall",
@@ -6892,7 +6928,7 @@
6892
6928
  "surface": "builders-hall",
6893
6929
  "text": "Not now",
6894
6930
  "file": "modules/hall-ui/public/collab.js",
6895
- "line": 196,
6931
+ "line": 278,
6896
6932
  "origin": "js-markup",
6897
6933
  "confidence": "certain"
6898
6934
  },
@@ -6986,15 +7022,6 @@
6986
7022
  "origin": "js-markup",
6987
7023
  "confidence": "certain"
6988
7024
  },
6989
- {
6990
- "id": "2c6e0dfbd781",
6991
- "surface": "builders-hall",
6992
- "text": "Nothing is waiting on you. Requests reach you by your craft — set yours in",
6993
- "file": "modules/hall-ui/public/collab.html",
6994
- "line": 44,
6995
- "origin": "html-text",
6996
- "confidence": "certain"
6997
- },
6998
7025
  {
6999
7026
  "id": "2ec0fbb20a42",
7000
7027
  "surface": "builders-hall",
@@ -7148,15 +7175,6 @@
7148
7175
  "origin": "js-notice",
7149
7176
  "confidence": "certain"
7150
7177
  },
7151
- {
7152
- "id": "0c471e06cfc1",
7153
- "surface": "builders-hall",
7154
- "text": "Only you can settle your own request — mark it answered when someone helped, or withdraw it when you no longer need it.",
7155
- "file": "modules/hall-ui/public/collab.html",
7156
- "line": 70,
7157
- "origin": "html-text",
7158
- "confidence": "certain"
7159
- },
7160
7178
  {
7161
7179
  "id": "261d123970e8",
7162
7180
  "surface": "builders-hall",
@@ -7189,7 +7207,7 @@
7189
7207
  "surface": "builders-hall",
7190
7208
  "text": "Open navigation",
7191
7209
  "file": "modules/hall-ui/public/shell.js",
7192
- "line": 446,
7210
+ "line": 448,
7193
7211
  "origin": "js-markup",
7194
7212
  "confidence": "certain"
7195
7213
  },
@@ -8201,15 +8219,6 @@
8201
8219
  "origin": "js-notice",
8202
8220
  "confidence": "certain"
8203
8221
  },
8204
- {
8205
- "id": "61f862ffb9eb",
8206
- "surface": "builders-hall",
8207
- "text": "Requests addressed to your craft, or to you by name. Answering is optional and declining costs nothing — nobody is assigned by being asked.",
8208
- "file": "modules/hall-ui/public/collab.html",
8209
- "line": 38,
8210
- "origin": "html-text",
8211
- "confidence": "certain"
8212
- },
8213
8222
  {
8214
8223
  "id": "a030881168b5",
8215
8224
  "surface": "builders-hall",
@@ -8413,7 +8422,7 @@
8413
8422
  "surface": "builders-hall",
8414
8423
  "text": "Say yes",
8415
8424
  "file": "modules/hall-ui/public/collab.js",
8416
- "line": 196,
8425
+ "line": 278,
8417
8426
  "origin": "js-markup",
8418
8427
  "confidence": "certain"
8419
8428
  },
@@ -8705,6 +8714,15 @@
8705
8714
  "origin": "js-markup",
8706
8715
  "confidence": "certain"
8707
8716
  },
8717
+ {
8718
+ "id": "6dde12eb0c78",
8719
+ "surface": "builders-hall",
8720
+ "text": "Show all {…}",
8721
+ "file": "modules/hall-ui/public/collab.js",
8722
+ "line": 211,
8723
+ "origin": "js-text-assign",
8724
+ "confidence": "certain"
8725
+ },
8708
8726
  {
8709
8727
  "id": "14d32a35c15f",
8710
8728
  "surface": "builders-hall",
@@ -8827,7 +8845,7 @@
8827
8845
  "surface": "builders-hall",
8828
8846
  "text": "Sign in with GitHub",
8829
8847
  "file": "modules/hall-ui/public/shell.js",
8830
- "line": 416,
8848
+ "line": 418,
8831
8849
  "origin": "js-markup",
8832
8850
  "confidence": "certain"
8833
8851
  },
@@ -8836,7 +8854,7 @@
8836
8854
  "surface": "builders-hall",
8837
8855
  "text": "Sign out",
8838
8856
  "file": "modules/hall-ui/public/shell.js",
8839
- "line": 434,
8857
+ "line": 436,
8840
8858
  "origin": "js-markup",
8841
8859
  "confidence": "certain"
8842
8860
  },
@@ -8845,7 +8863,7 @@
8845
8863
  "surface": "builders-hall",
8846
8864
  "text": "Sign out",
8847
8865
  "file": "modules/hall-ui/public/shell.js",
8848
- "line": 591,
8866
+ "line": 593,
8849
8867
  "origin": "js-markup",
8850
8868
  "confidence": "certain"
8851
8869
  },
@@ -8872,7 +8890,7 @@
8872
8890
  "surface": "builders-hall",
8873
8891
  "text": "Skip to content",
8874
8892
  "file": "modules/hall-ui/public/shell.js",
8875
- "line": 582,
8893
+ "line": 584,
8876
8894
  "origin": "js-text-assign",
8877
8895
  "confidence": "certain"
8878
8896
  },
@@ -8899,7 +8917,7 @@
8899
8917
  "surface": "builders-hall",
8900
8918
  "text": "Someone helped",
8901
8919
  "file": "modules/hall-ui/public/collab.js",
8902
- "line": 113,
8920
+ "line": 161,
8903
8921
  "origin": "js-markup",
8904
8922
  "confidence": "certain"
8905
8923
  },
@@ -9052,7 +9070,7 @@
9052
9070
  "surface": "builders-hall",
9053
9071
  "text": "Switch theme",
9054
9072
  "file": "modules/hall-ui/public/shell.js",
9055
- "line": 461,
9073
+ "line": 463,
9056
9074
  "origin": "js-markup",
9057
9075
  "confidence": "certain"
9058
9076
  },
@@ -9214,7 +9232,7 @@
9214
9232
  "surface": "builders-hall",
9215
9233
  "text": "Text size",
9216
9234
  "file": "modules/hall-ui/public/shell.js",
9217
- "line": 460,
9235
+ "line": 462,
9218
9236
  "origin": "js-markup",
9219
9237
  "confidence": "certain"
9220
9238
  },
@@ -10699,7 +10717,7 @@
10699
10717
  "surface": "builders-hall",
10700
10718
  "text": "You have no open asks.",
10701
10719
  "file": "modules/hall-ui/public/collab.html",
10702
- "line": 75,
10720
+ "line": 57,
10703
10721
  "origin": "html-text",
10704
10722
  "confidence": "certain"
10705
10723
  },
@@ -10753,7 +10771,7 @@
10753
10771
  "surface": "builders-hall",
10754
10772
  "text": "Your asks",
10755
10773
  "file": "modules/hall-ui/public/collab.html",
10756
- "line": 69,
10774
+ "line": 54,
10757
10775
  "origin": "html-text",
10758
10776
  "confidence": "certain"
10759
10777
  },
@@ -11576,15 +11594,6 @@
11576
11594
  "origin": "js-markup",
11577
11595
  "confidence": "certain"
11578
11596
  },
11579
- {
11580
- "id": "2123a62d69e3",
11581
- "surface": "builders-hall",
11582
- "text": "if this stays empty.",
11583
- "file": "modules/hall-ui/public/collab.html",
11584
- "line": 45,
11585
- "origin": "html-text",
11586
- "confidence": "certain"
11587
- },
11588
11597
  {
11589
11598
  "id": "b2b399fdd6a4",
11590
11599
  "surface": "builders-hall",
@@ -12107,6 +12116,15 @@
12107
12116
  "origin": "js-markup",
12108
12117
  "confidence": "certain"
12109
12118
  },
12119
+ {
12120
+ "id": "a13ee0cde7f2",
12121
+ "surface": "builders-hall",
12122
+ "text": "set yours in Settings",
12123
+ "file": "modules/hall-ui/public/collab.html",
12124
+ "line": 47,
12125
+ "origin": "html-text",
12126
+ "confidence": "certain"
12127
+ },
12110
12128
  {
12111
12129
  "id": "a6f55d7aa6f7",
12112
12130
  "surface": "builders-hall",
@@ -2036,5 +2036,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
2036
2036
  landed since 1.19.779 with no explicit bump. run 35147229585. (task 1002620)
2037
2037
  1.19.781 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2038
2038
  landed since 1.19.780 with no explicit bump. run 35150109281. (task 1002620)
2039
+ 1.19.782 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2040
+ landed since 1.19.781 with no explicit bump. run 35150844959. (task 1002620)
2039
2041
  ---------------------------------------------------------------------------
2040
2042
  ```
@@ -110,12 +110,18 @@ function helpRequestsNeed(ctx) {
110
110
  const verb = n === 1 ? 'has' : 'have';
111
111
  return {
112
112
  id: 'help_requests',
113
+ // The number, machine-readable (task 1003942) — the field boardVotesNeed
114
+ // already carries, and the whole badge contract: shell.js names this need's
115
+ // id on the Collab nav item and reads this count into the badge.
116
+ count: n,
113
117
  title: n === 1 ? 'Someone asked for your help' : 'People asked for your help',
114
118
  what: 'A builder who is stuck addressed a request to your craft, or to you by name.',
115
119
  state: 'action_needed',
116
120
  severity: 'info',
117
121
  message: `${people} ${verb} asked for help you can give. Answering is optional and declining costs nothing.`,
118
- action: { label: n === 1 ? 'See the request' : 'See the requests', href: '/#/collab' },
122
+ // Collab is its own page since task 1003172; the retired '/#/collab' hash
123
+ // form pointed at a view the index no longer routes.
124
+ action: { label: n === 1 ? 'See the request' : 'See the requests', href: '/collab' },
119
125
  };
120
126
  }
121
127
 
@@ -152,7 +158,7 @@ function taskRecommendationsNeed(ctx) {
152
158
  state: 'action_needed',
153
159
  severity: 'info',
154
160
  message: `${subject} ${verb} recommended to you. Nothing has been assigned — you would still claim it yourself, and declining costs nothing.`,
155
- action: { label: n === 1 ? 'See the recommendation' : 'See the recommendations', href: '/#/collab' },
161
+ action: { label: n === 1 ? 'See the recommendation' : 'See the recommendations', href: '/collab' },
156
162
  };
157
163
  }
158
164
 
@@ -230,7 +236,7 @@ function mingleIntroductionsNeed(ctx) {
230
236
  severity: 'info',
231
237
  message: `${subject} waiting on you. Saying no costs nothing at all — no rank, no karma, no streak, `
232
238
  + 'and it does not change how often you are paired again.',
233
- action: { label: n === 1 ? 'See the introduction' : 'See the introductions', href: '/#/collab' },
239
+ action: { label: n === 1 ? 'See the introduction' : 'See the introductions', href: '/collab' },
234
240
  };
235
241
  }
236
242
 
@@ -468,6 +468,8 @@ function createClient(opts = {}) {
468
468
  getHealthz: (args) => request("GET", "/healthz", { hasBody: false }, args),
469
469
  },
470
470
  "helpRequests": {
471
+ // GET /help-requests — rank: any-builder — GET /help-requests
472
+ getHelpRequests: (args) => request("GET", "/help-requests", { hasBody: false }, args),
471
473
  // POST /help-requests — rank: any-builder — POST /help-requests
472
474
  postHelpRequests: (args) => request("POST", "/help-requests", { hasBody: true }, args),
473
475
  // PATCH /help-requests/{id} — rank: any-builder — PATCH /help-requests/:id
@@ -128,10 +128,102 @@
128
128
  return { id: 'other', label: 'asked' };
129
129
  }
130
130
 
131
+ // ---- the FACES (task 1003942, owner report: "doesn't feel collaborative") ----
132
+ //
133
+ // A board of builders reaching builders should read as people before it reads
134
+ // as prose, so every row now leads with a face and the top strip stacks the
135
+ // faces of everyone waiting. These are the pure halves: which person a row
136
+ // leads with, what to draw when there is no picture, and the figure strip's
137
+ // numbers. collab.js only turns the result into markup.
138
+
139
+ // Defence in depth on an avatar src (roster.js's rule): escaping alone cannot
140
+ // stop a non-http scheme reaching an attribute the browser resolves, so a src
141
+ // this page did not vouch for renders as the initial instead.
142
+ function httpUrl(u) {
143
+ return /^https?:\/\//i.test(String(u || '')) ? String(u) : null;
144
+ }
145
+
146
+ // The letter a faceless person shows: the first character of their name,
147
+ // uppercased, with a leading @ or # dropped. Never empty — '?' stands in.
148
+ function initialOf(name) {
149
+ var n = String(name == null ? '' : name).replace(/^[@#]/, '').trim();
150
+ return (n.charAt(0) || '?').toUpperCase();
151
+ }
152
+
153
+ // The person a row LEADS with. Incoming ('in') is always the asker — the
154
+ // human waiting on an answer. Outgoing ('out') is who you asked: the one
155
+ // person on a by-name ask, else the craft, drawn as a lettered disc so a craft
156
+ // ask never borrows a person's face. Same dir contract as directionLine.
157
+ function faceOf(req, dir) {
158
+ if (!req) return null;
159
+ if (dir === 'out') {
160
+ if (req.needs_builder_id != null) {
161
+ var to = req.needs_builder_name || req.needs_builder_login || '';
162
+ return {
163
+ kind: 'person', id: req.needs_builder_id, name: to,
164
+ avatar: httpUrl(req.needs_builder_avatar_url), initial: initialOf(to),
165
+ };
166
+ }
167
+ var craft = req.needs_craft ? String(req.needs_craft) : '';
168
+ return { kind: 'craft', id: null, name: craft ? craft + 's' : 'anyone', avatar: null, initial: craft ? initialOf(craft) : '?' };
169
+ }
170
+ var who = askerOf(req);
171
+ return {
172
+ kind: 'person', id: req.requested_by != null ? req.requested_by : null, name: who,
173
+ avatar: httpUrl(req.requested_by_avatar_url), initial: initialOf(who),
174
+ };
175
+ }
176
+
177
+ // The DISTINCT people asking, in list order — the face stack in the top strip.
178
+ // Two asks from one person are one face; keyed by id when the server sent one,
179
+ // by name otherwise, so an older server still dedupes.
180
+ function askers(rows) {
181
+ var seen = {};
182
+ var out = [];
183
+ for (var i = 0; i < (rows || []).length; i += 1) {
184
+ var f = faceOf(rows[i], 'in');
185
+ if (!f) continue;
186
+ var key = f.id != null ? 'id:' + f.id : 'name:' + f.name;
187
+ if (seen[key]) continue;
188
+ seen[key] = true;
189
+ out.push(f);
190
+ }
191
+ return out;
192
+ }
193
+
194
+ // Newest first — the order the three-block board reads in (owner direction,
195
+ // task 1003942: "only show the three most recent, then expand"). The ageing
196
+ // criterion is still met by the band on every row; this is a display order,
197
+ // and the oldest-first comparator stays for the callers that want risk first.
198
+ function byNewestFirst(a, b) {
199
+ return byAgeOldestFirst(b, a);
200
+ }
201
+
202
+ // The first N rows are shown, the rest wait behind "show all": a pure split so
203
+ // the count on the button and the rows it reveals come from one place.
204
+ function splitShown(rows, n) {
205
+ var list = rows || [];
206
+ var cap = typeof n === 'number' && n >= 0 ? n : list.length;
207
+ return { shown: list.slice(0, cap), hidden: list.slice(cap) };
208
+ }
209
+
210
+ // The THIRD-PERSON line, for the board of everyone's asks: neither "you" nor
211
+ // "asked you". "Gamma asked builders" / "Alpha asked Beta by name".
212
+ function boardLine(req) {
213
+ if (!req) return '';
214
+ var who = askerOf(req) || 'Someone';
215
+ if (req.needs_builder_id != null) {
216
+ var to = req.needs_builder_name || req.needs_builder_login;
217
+ return to ? who + ' asked ' + to + ' by name' : who + ' asked one person';
218
+ }
219
+ return req.needs_craft ? who + ' asked ' + req.needs_craft + 's' : who + ' asked';
220
+ }
221
+
131
222
  window.OTBCollabLib = {
132
- BANDS: BANDS, ageBand: ageBand, byAgeOldestFirst: byAgeOldestFirst,
223
+ BANDS: BANDS, ageBand: ageBand, byAgeOldestFirst: byAgeOldestFirst, byNewestFirst: byNewestFirst,
133
224
  askerOf: askerOf, contextOf: contextOf,
134
- directionLine: directionLine,
225
+ directionLine: directionLine, boardLine: boardLine,
135
226
  titleOf: titleOf, groupOf: groupOf,
227
+ httpUrl: httpUrl, initialOf: initialOf, faceOf: faceOf, askers: askers, splitShown: splitShown,
136
228
  };
137
229
  })();
@@ -1,11 +1,18 @@
1
1
  /* modules/hall-ui/public/collab.css — the Collab page (task 1003172 / C02),
2
- rebuilt on the hall's row archetype by task 1003471: the panel is the shell's
3
- .scroll, the row is oversight.css's .ov-row, the age is a .fact-pill, the
4
- context a .fact-chip. This sheet holds only what Collab has and no other
5
- page does — the colour of each age band.
2
+ rebuilt on the hall's row archetype by task 1003471, and made a THREE-BLOCK
3
+ room of people by task 1003942 (owner direction: "way too text heavy, doesn't
4
+ feel collaborative" — asked of you left, your asks right, every open ask
5
+ below, each condensed to the newest three with a show-all). The panel is the
6
+ shell's .scroll, the two-up is the shell's .view-zone--band, the row is
7
+ oversight.css's .ov-row--lead (a face, then the words, then the state), the
8
+ age is a .fact-pill, the context a .fact-chip, the expander the shell's
9
+ .btn-ghost. This sheet holds only what Collab has and no other page does: the
10
+ colour of each age band, the faces, the block head, the lit personal call, and
11
+ the foot.
6
12
  Tokens only from style.css's real set: inventing one renders as nothing,
7
13
  which is how copy-desk.css once ended up with invisible fallbacks (idea
8
- 1000821). */
14
+ 1000821). Every colour here is a var() of the fifteen or the hall's measured
15
+ status vocabulary, so the dark tier needs no twin in this file. */
9
16
 
10
17
  /* THE AGEING SIGNAL. The criterion asks that a request nobody takes be visibly
11
18
  aging rather than silently dead — so the age is a state pill in the row's
@@ -18,3 +25,101 @@
18
25
  .cb-age--waiting { color: var(--ink-soft); }
19
26
  .cb-age--aging { color: var(--warn); }
20
27
  .cb-age--stale { color: var(--danger); font-weight: 600; }
28
+
29
+ /* ---- the blocks ------------------------------------------------------------------
30
+ The top band is the shell's two-up grid (it stacks to one column at the
31
+ shell's phone breakpoint). A block is the shell's panel with a head row: the
32
+ heading, its count in mono, and the faces of whoever is asking on the right. */
33
+ .cb-band { margin: 0 0 var(--sp-md); }
34
+ .cb-block__head { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin: 0 0 6px; }
35
+ .cb-block__head .scroll__h { margin: 0; }
36
+ .cb-block__n {
37
+ font-family: var(--font-mono);
38
+ font-size: 13px;
39
+ font-weight: 400;
40
+ letter-spacing: 0;
41
+ color: var(--ink-faint);
42
+ font-variant-numeric: tabular-nums;
43
+ margin-left: 6px;
44
+ }
45
+ .cb-block__head .cb-faces { margin-left: auto; }
46
+
47
+ /* "Show all N" / "Show fewer": the shell's ghost pill, on its own line under
48
+ the rows, so the condensed block ends on its door to the rest. */
49
+ .cb-more { margin-top: 12px; }
50
+
51
+ /* ---- the face -----------------------------------------------------------------
52
+ A row leads with WHO: a 36px disc, the picture when the server sent one, the
53
+ initial on the glass when it did not (people.css's .dir-avatar, at the row's
54
+ size). A craft ask wears the craft's letter in the label face, so it never
55
+ passes for a person. Decorative — the name beside it is the door. */
56
+ .cb-face {
57
+ width: 36px; height: 36px; flex: none;
58
+ border-radius: 50%;
59
+ object-fit: cover;
60
+ background: var(--skeleton);
61
+ border: 1px solid var(--rule);
62
+ margin-top: 1px;
63
+ }
64
+ .cb-face--initial {
65
+ display: inline-grid; place-items: center;
66
+ font-size: 14px; font-weight: 500; line-height: 1;
67
+ color: var(--ink-soft);
68
+ background: var(--glass-strong);
69
+ }
70
+ .cb-face--craft {
71
+ font-family: var(--label-face);
72
+ font-size: 12px;
73
+ letter-spacing: 0;
74
+ color: var(--ink-faint);
75
+ background: none;
76
+ border-style: dashed;
77
+ }
78
+
79
+ /* The stack of everyone asking: 24px faces at -7px overlap, each ringed in the
80
+ panel ground (the poster card's face-row grammar). */
81
+ .cb-faces { display: inline-flex; align-items: center; }
82
+ .cb-faces .cb-face {
83
+ width: 24px; height: 24px;
84
+ margin: 0 0 0 -7px;
85
+ border: 2px solid var(--bg-card);
86
+ font-size: 10px;
87
+ }
88
+ .cb-faces .cb-face:first-child { margin-left: 0; }
89
+ .cb-faces .cb-face--initial { background: var(--glass-strong); }
90
+
91
+ /* ---- the personal call ------------------------------------------------------------
92
+ An ask addressed to you BY NAME is the one live thing on the board — the
93
+ personal call this reader owes an answer — so its direction line takes the
94
+ accent ink. Accent goes only on what is live, and this is. */
95
+ .cb-row--live .ov-row__facts > .ov-fact { color: var(--accent-ink); }
96
+
97
+ /* ---- the rows, as people -------------------------------------------------------
98
+ The archetype's --lead grid puts the face in its own column. A row lights on
99
+ hover with the glass the family's button rows use, so the board feels awake
100
+ without any motion; the Kill Switch has nothing to kill here. */
101
+ .cb-row { padding-left: 10px; padding-right: 10px; margin: 0 -10px; border-radius: var(--radius-sm); }
102
+ .cb-row:hover { background: var(--glass); }
103
+ .cb-row .ov-row__facts a { color: var(--accent-ink); }
104
+ /* Inside the two condensed blocks a row has half the page: the state and the
105
+ actions drop UNDER the words as one line (the archetype's own phone shape),
106
+ the date yields to the age pill, and the two-up itself becomes one column
107
+ before the shell's phone breakpoint, at the width where two half-rows stop
108
+ holding a sentence. The wide block below keeps the archetype's two columns. */
109
+ .cb-band .ov-row--lead { grid-template-columns: auto minmax(0, 1fr); row-gap: 8px; }
110
+ .cb-band .ov-row--lead > .ov-row__right {
111
+ grid-column: 2;
112
+ flex-direction: row;
113
+ flex-wrap: wrap;
114
+ align-items: center;
115
+ text-align: left;
116
+ }
117
+ .cb-band .ov-row__actions { justify-content: flex-start; }
118
+ .cb-band .ov-row__when { display: none; }
119
+ @media (max-width: 1100px) {
120
+ .cb-band { grid-template-columns: 1fr; }
121
+ }
122
+
123
+ /* ---- empties and the foot -------------------------------------------------- */
124
+ .cb-empty p { font-size: 14px; }
125
+ .cb-foot { margin: var(--sp-sm) 0 0; font-size: 12.5px; color: var(--ink-faint); max-width: var(--measure); }