@bongos/core 1.19.439 → 1.19.441
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 +19 -19
- package/docs/copy-inventory.md +175 -168
- package/docs/copy-registry.json +284 -220
- package/docs/design/mocks/hub/mine.html +89 -1
- package/docs/design/projects-hub-direction-v2.md +56 -0
- package/docs/module-api-changelog.md +4 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/public-landing/assets/cosmos.css +98 -87
- package/public-landing/projects.html +310 -377
- package/public-landing/projects.probes.json +26 -21
- package/public-landing/projects.states.json +7 -5
- package/src/module-api.js +1 -1
- package/tests/projects_hub.mjs +104 -69
- package/tests/projects_hub_pre_uat.mjs +122 -78
|
@@ -84,6 +84,36 @@ body{
|
|
|
84
84
|
.door.danger{border-color:color-mix(in srgb,var(--err) 45%,transparent);color:var(--err);}
|
|
85
85
|
.door.danger:hover{border-color:var(--err);}
|
|
86
86
|
|
|
87
|
+
/* ── the every-project table, in the ledger row's grammar (task 1003356): the
|
|
88
|
+
SAME tracks the mine row lays (72px planet, then 1.1fr 1.3fr 1fr 232px), the
|
|
89
|
+
facts as label-face lines, the module list where the mine row draws its rail,
|
|
90
|
+
and at most two doors. No header row, no cell borders: the sort left the
|
|
91
|
+
column head and became a hairline pill group, the mine view's own control. ── */
|
|
92
|
+
.tblSort{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:16px 0 8px;}
|
|
93
|
+
.tblSort .sLbl{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:uppercase;color:var(--ink-faint);margin-right:6px;}
|
|
94
|
+
.tblSort .dir{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);}
|
|
95
|
+
.trows{list-style:none;margin:8px 0 0;padding:0;}
|
|
96
|
+
.trow{display:grid;grid-template-columns:72px minmax(0,1.1fr) minmax(0,1.3fr) minmax(0,1fr) 232px;grid-template-areas:"orb who facts runs doors" "orb who tag runs doors";gap:0 22px;align-items:center;padding:22px 0;border-top:1px solid var(--rule-soft);}
|
|
97
|
+
.trow>.worldOrb{grid-area:orb;}
|
|
98
|
+
.trow .tWho{grid-area:who;}
|
|
99
|
+
.trow .facts{grid-area:facts;align-self:end;}
|
|
100
|
+
.trow .ptag{grid-area:tag;align-self:start;margin:5px 0 0;font-size:13.5px;font-weight:400;line-height:1.45;color:var(--ink-soft);}
|
|
101
|
+
.trow .runs{grid-area:runs;}
|
|
102
|
+
.trow .doors{grid-area:doors;}
|
|
103
|
+
.trows .trow:last-child{border-bottom:1px solid var(--rule-soft);}
|
|
104
|
+
.tWho{display:grid;gap:8px;justify-items:start;align-content:center;min-width:0;}
|
|
105
|
+
.tWho .mname{font-family:var(--font-body);font-weight:500;font-size:17px;letter-spacing:-.015em;color:var(--ink);}
|
|
106
|
+
.tWho .chip{white-space:normal;line-height:1.3;}
|
|
107
|
+
.trow .runs{display:grid;gap:6px;min-width:0;}
|
|
108
|
+
.trow .runs .rLbl{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:uppercase;color:var(--ink-faint);}
|
|
109
|
+
.trow .tags{display:flex;gap:6px;flex-wrap:wrap;}
|
|
110
|
+
.trow .tags span{font-family:var(--font-mono);font-size:10.5px;padding:2px 8px;border-radius:999px;border:1px solid var(--rule);color:var(--ink-faint);white-space:nowrap;}
|
|
111
|
+
.trow .pill{display:inline-block;font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:uppercase;padding:3px 9px;border-radius:999px;border:1px solid var(--rule);color:var(--ink-faint);}
|
|
112
|
+
.trow .typeTag{font-family:var(--font-mono);font-size:10.5px;font-weight:500;color:var(--ink-soft);border:1px solid var(--rule);border-radius:999px;padding:2px 9px;}
|
|
113
|
+
.rowHall{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;border:1px solid var(--rule);border-radius:var(--radius-pill);color:var(--ink-soft);}
|
|
114
|
+
.rowHall svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.4;}
|
|
115
|
+
.rowHall:hover{border-color:var(--ink-faint);color:var(--ink);}
|
|
116
|
+
|
|
87
117
|
/* ── v2 · the poster row: the planet large, the name in the display voice, the rail full width ── */
|
|
88
118
|
.prow{display:grid;grid-template-columns:132px 1fr auto;gap:0 28px;align-items:start;padding:30px 0;border-top:1px solid var(--rule-soft);}
|
|
89
119
|
.prow .pname{font-family:var(--font-display);font-weight:300;font-size:30px;letter-spacing:-.035em;line-height:1.04;text-transform:lowercase;color:var(--ink);margin:0 0 8px;}
|
|
@@ -146,6 +176,7 @@ body[data-state="list"] section[data-state="list"],
|
|
|
146
176
|
body[data-state="cards"] section[data-state="cards"],
|
|
147
177
|
body[data-state="manage"] section[data-state="manage"],
|
|
148
178
|
body[data-state="empty"] section[data-state="empty"]{display:block;}
|
|
179
|
+
body[data-state="table"] section[data-state="table"]{display:block;}
|
|
149
180
|
.vh{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;}
|
|
150
181
|
.skip{position:absolute;left:12px;top:-60px;background:var(--bg-card);color:var(--ink);padding:11px 18px;border-radius:999px;}
|
|
151
182
|
.skip:focus{top:12px;}
|
|
@@ -171,6 +202,9 @@ a:focus-visible,button:focus-visible,label:focus-within{outline:2px solid var(--
|
|
|
171
202
|
.choice label{border-left:0;padding-left:0;border-top:1px solid var(--rule-soft);}
|
|
172
203
|
.choice label:first-child{border-top:0;}
|
|
173
204
|
.planetRow{grid-template-columns:72px 1fr;}
|
|
205
|
+
.trow{grid-template-columns:56px 1fr;gap:14px 16px;padding:20px 0;}
|
|
206
|
+
.trow .worldOrb{--d:56px;}
|
|
207
|
+
.trow{grid-template-areas:"orb who" "tag tag" "facts facts" "runs runs" "doors doors";}
|
|
174
208
|
}
|
|
175
209
|
</style>
|
|
176
210
|
</head>
|
|
@@ -181,6 +215,8 @@ a:focus-visible,button:focus-visible,label:focus-within{outline:2px solid var(--
|
|
|
181
215
|
?state=cards the three row treatments side by side: v1 the ledger, v2 the poster row, v3 the shelf
|
|
182
216
|
?state=manage the manage page: the ledger of facts, the rail, the doors, hairline sections, the planet slot
|
|
183
217
|
?state=empty the mine view with no projects: a band of the Projects band's grammar
|
|
218
|
+
?state=table the every-project table (task 1003356) in the SAME ledger grammar: the masthead,
|
|
219
|
+
the sort as hairline pills, one row per project on the mine row's tracks
|
|
184
220
|
-->
|
|
185
221
|
<a class="skip" href="#main">Skip to content</a>
|
|
186
222
|
<header class="bar">Cloud Bongos</header>
|
|
@@ -352,6 +388,58 @@ a:focus-visible,button:focus-visible,label:focus-within{outline:2px solid var(--
|
|
|
352
388
|
</div>
|
|
353
389
|
</section>
|
|
354
390
|
|
|
391
|
+
<section data-state="table">
|
|
392
|
+
<div class="view">
|
|
393
|
+
<div class="tblMast">
|
|
394
|
+
<h2 class="tblTitle">every project</h2>
|
|
395
|
+
<span class="mastObj" aria-hidden="true"></span>
|
|
396
|
+
</div>
|
|
397
|
+
<div class="tblSort" role="group" aria-label="Sort the projects">
|
|
398
|
+
<span class="sLbl">sort</span>
|
|
399
|
+
<button type="button" class="hpill" aria-pressed="true">name <span class="dir">a to z</span></button>
|
|
400
|
+
<button type="button" class="hpill" aria-pressed="false">builders</button>
|
|
401
|
+
</div>
|
|
402
|
+
<ul class="trows">
|
|
403
|
+
<li class="trow">
|
|
404
|
+
<span class="worldOrb" data-shape="pair" data-material="chrome" data-style="plain" style="--acc:var(--accent);--d:64px"><span class="disc"></span></span>
|
|
405
|
+
<div class="tWho"><span class="mname">Cloud Bongos</span><span class="pill">this platform</span><span class="chip calm"><span class="cdot"></span>not checked</span></div>
|
|
406
|
+
<span class="ptag">the AI-first build platform this map is drawn on.</span><div class="facts"><span class="fact">9 builders</span><span class="fact">30+ shipped in 30 days</span><span class="fact">listed 12 jul 2026</span></div>
|
|
407
|
+
<div class="runs"><span class="rLbl">runs</span><span class="tags"><span>core</span></span></div>
|
|
408
|
+
<div class="doors"><a class="door" href="#">view</a><a class="rowHall" href="#" aria-label="Builders' hall" title="Builders' hall"><svg viewBox="0 0 20 20" aria-hidden="true"><path d="M2.8 7.4 10 3.5l7.2 3.9"/><path d="M5.2 8.8v5.6M10 8.8v5.6M14.8 8.8v5.6"/><path d="M3.4 16.3h13.2"/></svg></a></div>
|
|
409
|
+
</li>
|
|
410
|
+
<li class="trow">
|
|
411
|
+
<span class="worldOrb" data-shape="bead" data-material="chrome" data-style="wash" style="--acc:var(--terracotta);--d:64px"><span class="disc"></span></span>
|
|
412
|
+
<div class="tWho"><span class="mname">Off the Boats</span><span class="pill">you build here</span><span class="chip calm"><span class="cdot"></span>not checked</span></div>
|
|
413
|
+
<span class="ptag">A singular shop, and a broader videogame in a persistent ancient Greek world.</span><div class="facts"><span class="fact"><span class="typeTag">Game</span></span><span class="fact">11 builders</span><span class="fact">0 shipped in 30 days</span><span class="fact">listed 15 jul 2026</span></div>
|
|
414
|
+
<div class="runs"><span class="rLbl">runs</span><span class="tags"><span>art-pipeline</span><span>character-anim</span><span>demo</span><span>+1</span></span></div>
|
|
415
|
+
<div class="doors"><a class="door" href="#">view</a><a class="rowHall" href="#" aria-label="Builders' hall" title="Builders' hall"><svg viewBox="0 0 20 20" aria-hidden="true"><path d="M2.8 7.4 10 3.5l7.2 3.9"/><path d="M5.2 8.8v5.6M10 8.8v5.6M14.8 8.8v5.6"/><path d="M3.4 16.3h13.2"/></svg></a></div>
|
|
416
|
+
</li>
|
|
417
|
+
<li class="trow">
|
|
418
|
+
<span class="worldOrb" data-shape="pair" data-material="obsidian" data-style="tint" style="--acc:var(--sea);--d:64px"><span class="disc"></span></span>
|
|
419
|
+
<div class="tWho"><span class="mname">Demo</span><span class="pill">yours</span><span class="chip live"><span class="cdot"></span>live <span class="rec">checked 3m ago</span></span></div>
|
|
420
|
+
<span class="ptag">A live demo instance on Cloud Bongos.</span><div class="facts"><span class="fact">type not declared</span><span class="fact">builders not known</span><span class="fact">listed 14 jul 2026</span></div>
|
|
421
|
+
<div class="runs"><span class="rLbl">runs</span><span class="fact">not known</span></div>
|
|
422
|
+
<div class="doors"><a class="door" href="#">view</a></div>
|
|
423
|
+
</li>
|
|
424
|
+
<li class="trow">
|
|
425
|
+
<span class="worldOrb" data-shape="blob" data-material="frost" data-style="wash" style="--acc:var(--gold-soft);--d:64px"><span class="disc"></span></span>
|
|
426
|
+
<div class="tWho"><span class="mname">Emersonian Circles</span><span class="chip calm"><span class="cdot"></span>not checked</span></div>
|
|
427
|
+
<span class="ptag">An independent project built on Cloud Bongos.</span><div class="facts"><span class="fact">type not declared</span><span class="fact">1 builder</span><span class="fact">30+ shipped in 30 days</span><span class="fact">listed 25 jul 2026</span></div>
|
|
428
|
+
<div class="runs"><span class="rLbl">runs</span><span class="tags"><span>core</span></span></div>
|
|
429
|
+
<div class="doors"><a class="door" href="#">view</a></div>
|
|
430
|
+
</li>
|
|
431
|
+
<li class="trow">
|
|
432
|
+
<span class="worldOrb" data-shape="blob" data-material="chrome" data-style="tint" style="--acc:var(--sun-lit);--d:64px"><span class="disc"></span></span>
|
|
433
|
+
<div class="tWho"><span class="mname">Tidewater</span><span class="chip calm"><span class="cdot"></span>not checked</span></div>
|
|
434
|
+
<span class="ptag">A project that has declared nothing yet.</span><div class="facts"><span class="fact">type not declared</span><span class="fact">builders not known</span><span class="fact">listed 20 jul 2026</span></div>
|
|
435
|
+
<div class="runs"><span class="rLbl">runs</span><span class="fact">not known</span></div>
|
|
436
|
+
<div class="doors"><a class="door" href="#">view</a></div>
|
|
437
|
+
</li>
|
|
438
|
+
</ul>
|
|
439
|
+
<p class="vLede" role="status" style="margin-top:22px">Sorted by name, A to Z.</p>
|
|
440
|
+
</div>
|
|
441
|
+
</section>
|
|
442
|
+
|
|
355
443
|
<section data-state="empty">
|
|
356
444
|
<div class="view">
|
|
357
445
|
<div class="vHead"><h2 class="vTitle">your projects</h2></div>
|
|
@@ -369,7 +457,7 @@ a:focus-visible,button:focus-visible,label:focus-within{outline:2px solid var(--
|
|
|
369
457
|
No motion in script; nothing is built here. */
|
|
370
458
|
(function () {
|
|
371
459
|
var state = new URLSearchParams(location.search || location.hash.slice(1) || (window.__Q || '')).get('state') || 'list';
|
|
372
|
-
if (['list', 'cards', 'manage', 'empty'].indexOf(state) === -1) state = 'list';
|
|
460
|
+
if (['list', 'cards', 'manage', 'empty', 'table'].indexOf(state) === -1) state = 'list';
|
|
373
461
|
document.body.setAttribute('data-state', state);
|
|
374
462
|
})();
|
|
375
463
|
</script>
|
|
@@ -256,3 +256,59 @@ Three mastheads, rendered dark and light at 1440 / 390 / 320 (ALL CLEAN) and mea
|
|
|
256
256
|
**The kit.** The stub remembers a saved planet for the run (a `PLANETS` map, the teardown-ask precedent) and answers the route's own receipt shapes, so the page's re-read finds its choice; both featured fixtures carry the keys on every row and Demo's owner has chosen `pair-obsidian-tint` on sea (the feed path — kept the pair's box so the sky's composition, and a signed-out Shift probe's blank-spot click, stand); Harbor's row carries `blob-frost-tint` on sun-lit (the row path — the list draws it with no catalog row). A state, `in-manage-planet`, renders the section on Demo; three probes save a pick and read the receipt, the head and the ledger row back, hand the pick back to the platform, and save through the pills at 390. `render.js --page /projects` ALL CLEAN (67 states), the empty and floor siblings ALL CLEAN, probes 44/44.
|
|
257
257
|
|
|
258
258
|
**Retargeted.** `tests/projects_hub.mjs`: the mine-row and walk pins name the owner's choice first, the field-path pin reads Demo's choice over the curated template, and five new pins hold the vocabulary lockstep (client ↔ provisioning ↔ platform-identity), the section's markup and fold, the script (the preview, the radiogroups, the tick and late-catalog rules, the PATCH body, no open-intent re-read), the sheet by scope with the 900px pills, the kit's state/probes/fixtures/stub, and the seam. `tests/provisioning_settings.mjs` (the planet: saved, echoed, audited, no push; null clears; no change; no re-kick; a mixed save; off-vocabulary → 400), `modules/provisioning/tests/provisioning.mjs` (the mirror, `planetChoice`, `publicInstance`), `tests/provisioning_settings_env.mjs` (never in the env). The API docs regenerated; the copy registry regenerated.
|
|
259
|
+
|
|
260
|
+
## 17. Your projects: two doors a row, and every control on the project's own page (task 1003355)
|
|
261
|
+
|
|
262
|
+
**Date:** 2026-08-30 · the owner, on the shipped Your-projects list (§14.1): "for the buttons on the your projects page, I think we should consolidate to one or two buttons which would be 'view' or 'view' and 'manage' and move the other buttons inside the project page."
|
|
263
|
+
|
|
264
|
+
**No composition round.** The grammar the round already settled (§14.1: the doors as hairline pills, the accent only on the one that acts) answers a two-door row without a new sheet, and the round's method reserves a sheet for a reading the page cannot already draw. What changed is *which* controls a row holds, not how a door looks — so this is a build against the existing pick, recorded here.
|
|
265
|
+
|
|
266
|
+
**The row.** `renderCard` renders one `.actions` strip and nothing else: **View**, a plain link to the project's site, only where it is `active` and has an address; **Manage**, a real link to `?view=manage&id=N`, on every row. Neither acts, so neither takes the accent. Gone from the row: try again, bring it back, restart it, the two-press ender, and the bring-your-own-domain fold. What stays is everything that *says* rather than does — the planet, the name and its chip, the facts, the lifecycle rail, the honest snag paragraph, the torn-down note and the live region the watch writes into. The row's own `id="act-…"`, its confirm prompt (`cardAsking`/`askTeardown`/`unAskTeardown`), its four senders (`doTeardown`, `reProvision`, `doRestart`, `doAttach`), `quietActions`, `watchOnce` and `canTeardown` went with them; the delegated list handler is down to the one Manage anchor it upgrades. The focus-restore across the heartbeat re-render stays, shrunk to the two doors.
|
|
267
|
+
|
|
268
|
+
**The manage page gains "its address".** The fold's field is now a settings section of the project's own page (`#mAddress`, between the ledger and repository visibility), in the `.mSec` grammar the three sections below it wear: the title and its fold on the left, the control on the right, the field as one hairline, the receipt as the section's own status line. The section's heading is the disclosure, so the field needs no `<details>` of its own and `.attachFold` left the sheet with it. Every server truth came across unchanged — `canAttachDomain` mirrors `DOMAIN_ATTACH_FROM`, the section hides itself where there is nothing to point an address at (a snagged or torn-down project), no second control renders while one is wiring, and the re-kick (F19) and correction (task 1003237) doors keep their pre-filled fields. What the fold said by *opening itself*, the section says in a sentence above the field. `renderAddress` is fetch-free like its neighbours, so the minute tick repaints it; the half-typed domain, the caret and the receipt all survive that repaint, the receipt keyed by project so a different one never wears the last one's.
|
|
269
|
+
|
|
270
|
+
**Copy that pointed at the row, corrected.** Three sentences named a control the row no longer has, and each would now have been a dead end. `addressRow` takes a second argument for the surface reading it: on the manage page the unreachable line still says "or restart it yourself below" and the no-address line says "give it an address below"; on a row they name the project's own page instead, the second as a `data-manage` link the list opens in place. The ender's torn-down state pointed at "your projects" for the revive door that now sits at the top of the same page, and says so — dropping the clause where `canRevive` renders no button. The create flow's done panel named the list five times for controls that now live on the project's page — three "attach an address", one "retry it", one "bring it back" — and all five go through `projectPageLink`, which names the project by id whenever the flow has one. Its two remaining pointers at the list ("watch it there", "follow it there") stay: the list does still show the project.
|
|
271
|
+
|
|
272
|
+
**Carried, not lost.** `teardownFailure` gives the ender the refusal vocabulary the row's sender held (`intent_conflict`, `not_teardownable` — the tasks 1002691/1002692 rule), which the truthful-refusal pin in `tests/<redacted>.mjs` caught the moment the row's copy went. `canTeardown` did not survive: `renderDelete` already carried each of its three exclusions as its own honest state, so with the row's button gone it mirrored nothing — the gate pin moved onto `renderDelete` itself.
|
|
273
|
+
|
|
274
|
+
**The kit.** One new state, `in-manage-address`; `in-manage` now expects the section, `in-manage-snag` and `in-manage-gone` expect it hidden; `in-mine` counts the doors (seven anchors over five rows, zero buttons). Six row probes became five page ones: attach, restart, revive and retry drive the stub from `?view=manage&id=N`, the two row-teardown presses fold into the ender probe that already drove the same flow there, and a new probe holds the row itself to its two doors. `render.js --page /projects` ALL CLEAN (68 states), the empty and floor siblings ALL CLEAN, probes 43/43.
|
|
275
|
+
|
|
276
|
+
**Retargeted.** `tests/projects_hub.mjs` (`renderManage` reads `addressRow(inst, true)`; the delete gate reads off `renderDelete`) and `tests/projects_hub_pre_uat.mjs` (the restart door's one home, the restart sender, the one remaining confirm, the field's move and its section, the F19 and correction doors, the minute tick, the manifest snag's link, the announcements, the no-address door). The copy registry regenerated.
|
|
277
|
+
|
|
278
|
+
**Flagged to the copy desk, not changed here.** The manage page's own site door still reads "Open site →" while the row now reads "View" — each reads naturally in place (the row pairs two doors, the page sits among verbs), so neither was churned. `stripMarkup`'s queued-flow notes still say "this card updates when it starts" on a page that is not a card. And a prose pointer inside a row's address line inherits the mono face meant for the address itself — true before this build too, and left alone rather than churned.
|
|
279
|
+
|
|
280
|
+
## 18. The every-project table takes the Your-projects row: the table is gone, the ledger stands (task 1003356)
|
|
281
|
+
|
|
282
|
+
**Date:** 2026-08-30 · the owner, after the Your-projects makeover (task 1003345) and the table's fixed tracks (task 1003348): *"also the your projects page has a better design than the every project table."* This is the every-project half. The masthead the owner picked in §9.4 (T1, the ledger, "every project") is untouched; what changed is everything under it.
|
|
283
|
+
|
|
284
|
+
**The round.** One reading, so no pick page (the round's own rule: a pick page only where two readings compete). A `?state=table` variant on `docs/design/mocks/hub/mine.html` — the sheet the Your-projects round already used, so the two views could be read side by side in one file — `check-mock` **ALL RULES PASS**, shot through the kit's stub at 1440 / 390 / 320 dark, **ALL CLEAN**. Two things the render caught before any page file was touched:
|
|
285
|
+
|
|
286
|
+
- The row's name and its pill were being clipped at 14ch and then hidden outright under 900px. `cosmos.css:593` and `:672` own a `.who` for the landing's face rows, and the mock's row had reached for the same name. Renamed `.tWho`. (The mine mock's `?state=list` has the same latent collision from its own round; the *shipped* mine view does not — it renders `.projHead` — so the mock is left as the record it is.)
|
|
287
|
+
- The tagline had no home in the first reading, and dropping it would have taken the only sentence saying what a project *is* out of the browse list. It went to the mine row's second line — the area the mine row gives its address — which is what made the two rows the same grammar rather than a family resemblance.
|
|
288
|
+
|
|
289
|
+
**The markup call, and why.** The task left the `<table>` to the builder: *"the `<table>` markup, its header row and cell borders go, or stay as the accessible structure under the row's look if the sort's a11y needs it."* **The table is gone.** Three reasons, in order of weight:
|
|
290
|
+
|
|
291
|
+
1. Once every fact is a self-describing label-face line stacked inside one track, the rows share no columns — so there is nothing for a header row to head, and `aria-sort` (valid only on a `columnheader`) has no host. A row is a record now, not a set of cells on shared axes, and the honest markup for a list of records is a list.
|
|
292
|
+
2. A `<table>` whose `<tr>` is `display:grid` loses its table role in every engine. Keeping the element would have meant re-declaring `role="table" / "row" / "cell"` by hand — markup wearing a role the layout had already taken off it.
|
|
293
|
+
3. The sort's accessibility is *better* off the header, not worse: two `aria-pressed` toggles in a `role="group"` — the mine view's own filter-pill pattern, already shipped and already keyboard-reachable — plus a `role="status"` sentence under the list (`#mapSorted`, "Sorted by name, a to z.") that states the live order for a reader who never saw the press. Pressing the pressed pill reverses, exactly as the column header did.
|
|
294
|
+
|
|
295
|
+
**What was built.** `#mapRows` is a `<ul class="tbl">` of `<li class="tblRow">`, one grid, five tracks — `72px minmax(0,1.1fr) minmax(0,1.3fr) minmax(0,1fr) 232px` — and two area rows, `"orb who facts runs doors" / "orb who tag runs doors"`: the same five tracks `#view-mine .proj` + `.projBody` compose, with **runs where the mine row draws its rail** and **the tagline where it puts its address**. The planet is the project's own (`planetAttrs(templateOf(p))` + `accentOf(p)`, the owner's choice first — task 1003347), decorative, since the name beside it is the row's door. The facts are `factLines()`: the declared type through `typeHtml`, builders, shipped in 30 days, the Listed date. At most two doors: `view` as the mine row's hairline pill, and the hall — member-gated and address-gated as before, now standing at the door's 40px rather than riding a text link's cell as a 28px glyph. Hairlines above each row, the last one closing; a row's hover is its hairline taking ink. The platform's own row keeps its static apex-only markup and its ids, and now paints its own shipped-in-30-days figure from the feed it was already reading — the callout §9.4's T3 flagged and never wired.
|
|
296
|
+
|
|
297
|
+
**The truths that had to survive the move, and how.** The columns drew a distinction the ledger had to keep in words:
|
|
298
|
+
|
|
299
|
+
| Fact | Was | Is |
|
|
300
|
+
|---|---|---|
|
|
301
|
+
| builders, null | `—` in the figure voice | `builders not known` |
|
|
302
|
+
| builders, 0 | `0` | `0 builders` — still a real answer, not an absence |
|
|
303
|
+
| type, not declared | `—` | `type not declared` (through the same `typeHtml`) |
|
|
304
|
+
| runs, null vs `[]` | `—` vs `core` | unchanged — under an explicit `runs` label, where a dash is the value of a labelled field rather than a sentence standing on its own |
|
|
305
|
+
| liveness, unprobed | `• —` | `• not checked` beside the name (v1's §5 proposal, taken now that the chip sits where a reader looks) |
|
|
306
|
+
| shipped / listed | never a column | rendered only where there is an answer — the poster card's own rule, so nothing new is claimed |
|
|
307
|
+
|
|
308
|
+
**Kept.** The masthead and its object; the sort keys and the comparator (unknown builders still sort to the bottom in both directions); the search in the bar; the platform's row pinned first, apex-only; an owned row's name as a manage anchor and its plain click routing to manage; the row-click-opens-the-card contract; `#sub-table-body`'s scroll as the floor under a very long row.
|
|
309
|
+
|
|
310
|
+
**The kit.** `render.js --page /projects` **ALL CLEAN** (13 states + a new `in-table-by-builders`), `--states projects-empty` and `--states projects-floor` ALL CLEAN, `probe.js --page /projects` **45/45 ALL PASS** (43 + two new: the pills carry the order and the sentence states it; pressing the pressed one reverses). `tests/projects_hub.mjs` 134/134, `projects_hub_pre_uat.mjs` 56/56, `<redacted>.mjs` 34/34, `fitness.js` all checks passed, the copy registry regenerated.
|
|
311
|
+
|
|
312
|
+
**Retargeted.** Every table pin: the self row's extraction (`<li class="tblRow" id="selfRow">`), the generated-row template, the six-cell parity test (now "every row lays the same five parts", which reads the planet expression too, so dropping the planet cannot pass), the column-source test (now fact-source), the fixed-tracks test (now asserts the two views' tracks line for line and that **no table rule outlived the table**), the `—`/0 pin, the Runs pin, `.rowHall`'s box, the placeholder-href guard, and `projects_hub_pre_uat.mjs`'s keyboard-sort test. One test is new: the sort control's own contract.
|
|
313
|
+
|
|
314
|
+
**Flagged to the copy desk, not changed here.** `typeHtml`'s "not declared" now speaks in the row's voice but is still the formatter the create wizard's review reads through `typeLabel`; the two are not in conflict, but a copy pass over the row's four fact lines as a set would be worth one sitting.
|
|
@@ -1315,5 +1315,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
1315
1315
|
landed since 1.19.437 with no explicit bump. run 33290212472. (task 1002620)
|
|
1316
1316
|
1.19.439 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1317
1317
|
landed since 1.19.438 with no explicit bump. run 33290633434. (task 1002620)
|
|
1318
|
+
1.19.440 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1319
|
+
landed since 1.19.439 with no explicit bump. run 33321131006. (task 1002620)
|
|
1320
|
+
1.19.441 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1321
|
+
landed since 1.19.440 with no explicit bump. run 33323478836. (task 1002620)
|
|
1318
1322
|
---------------------------------------------------------------------------
|
|
1319
1323
|
```
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.441",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.19.
|
|
9
|
+
"version": "1.19.441",
|
|
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.19.
|
|
3
|
+
"version": "1.19.441",
|
|
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",
|
|
@@ -407,12 +407,9 @@ h1{font-family:var(--font-display);font-weight:700;font-size:clamp(24px,3.4vw,32
|
|
|
407
407
|
.attach input[type=text]{flex:1;min-width:220px;font-family:var(--font-body);font-size:15px;font-weight:600;color:var(--ink);background:var(--bg-card);border:2px solid var(--ctl-line);border-radius:12px;padding:9px 14px;outline:none;transition:border-color .15s ease, box-shadow .15s ease;}
|
|
408
408
|
.attach input[type=text]::placeholder{color:var(--ink-faint);font-weight:500;}
|
|
409
409
|
.attach input[type=text]:focus{border-color:var(--accent);box-shadow:0 0 0 4px color-mix(in srgb,var(--accent) 13%,transparent);}
|
|
410
|
-
/* the bring-your-own-domain
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
.attachFold{margin-top:12px;}
|
|
414
|
-
.attachFold summary{cursor:pointer;width:fit-content;font-size:13px;font-weight:700;color:var(--ink-faint);}
|
|
415
|
-
.attachFold summary:hover,.attachFold[open] summary{color:var(--ink-soft);}
|
|
410
|
+
/* the bring-your-own-domain field. It sat behind a fold on the list card until
|
|
411
|
+
task 1003355 moved it to the project's own page, where the section's heading
|
|
412
|
+
is the disclosure and the row it left carries only its two doors. */
|
|
416
413
|
.attachNote{margin:8px 0 0;font-size:13px;line-height:1.45;color:var(--ink-faint);}
|
|
417
414
|
.attachNote code{font-family:var(--font-mono);}
|
|
418
415
|
.projMsg{font-size:13.5px;font-weight:600;margin-top:10px;min-height:18px;color:var(--ink-soft);line-height:1.5;}
|
|
@@ -865,73 +862,88 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
865
862
|
background-repeat:no-repeat;background-size:calc(var(--dia) * 6.89655) auto;
|
|
866
863
|
background-position:calc(var(--dia) * -5.58621) calc(var(--dia) * -2.14014);filter:var(--mast-shadow);}
|
|
867
864
|
|
|
868
|
-
|
|
869
|
-
.
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
.
|
|
873
|
-
.
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
.tbl
|
|
879
|
-
|
|
865
|
+
/* ── THE LEDGER ROW (task 1003356; the owner: "the your projects page has a
|
|
866
|
+
better design than the every project table"). The table is gone — not
|
|
867
|
+
restyled: once every fact is a self-describing label-face line inside the
|
|
868
|
+
row, the rows share no columns to head, and a <table> whose <tr> is a grid
|
|
869
|
+
loses its table role in every engine anyway. So the rows are a LIST, the
|
|
870
|
+
sort left the column head for a pill group (.tblSort), and the whole view
|
|
871
|
+
takes the Your-projects row's grammar (#view-mine .proj, direction §14.1):
|
|
872
|
+
the SAME five tracks, the planet as the row's object, the facts stacked,
|
|
873
|
+
the tagline where the mine row puts its address, the module list where the
|
|
874
|
+
mine row draws its rail, and at most two doors. ── */
|
|
875
|
+
.tbl{list-style:none;margin:0;padding:0;}
|
|
876
|
+
.tbl .tblRow{display:grid;
|
|
877
|
+
grid-template-columns:72px minmax(0,1.1fr) minmax(0,1.3fr) minmax(0,1fr) 232px;
|
|
878
|
+
grid-template-areas:"orb who facts runs doors" "orb who tag runs doors";
|
|
879
|
+
gap:0 22px;align-items:center;padding:22px 0;
|
|
880
|
+
border-top:1px solid var(--rule-soft);transition:border-color .2s cubic-bezier(.2,.7,.3,1);}
|
|
881
|
+
.tbl .tblRow:last-child{border-bottom:1px solid var(--rule-soft);}
|
|
880
882
|
/* the whole row opens the project card, so it must look like it does: the
|
|
881
|
-
hairline
|
|
882
|
-
.tbl
|
|
883
|
-
.tbl
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
.tbl .
|
|
883
|
+
hairline above it takes ink, as a band cell's does */
|
|
884
|
+
.tbl .tblRow{cursor:pointer;}
|
|
885
|
+
.tbl .tblRow:hover{border-top-color:var(--ink-faint);}
|
|
886
|
+
/* the planet, docked: the sky's object, relative instead of absolute, and the
|
|
887
|
+
row's decoration — the name beside it is the accessible door (#view-mine's rule) */
|
|
888
|
+
.tbl .worldOrb{grid-area:orb;position:relative;left:auto;top:auto;transform:none;display:block;
|
|
889
|
+
cursor:inherit;opacity:1;pointer-events:none;}
|
|
890
|
+
.tbl .worldOrb .disc{display:block;margin:0;}
|
|
891
|
+
.tbl .tWho{grid-area:who;display:grid;gap:8px;justify-items:start;align-content:center;min-width:0;}
|
|
892
|
+
.tbl .ptitle{font-family:var(--font-body);font-weight:500;font-size:17px;letter-spacing:-.015em;color:var(--ink);text-decoration:none;}
|
|
893
|
+
.tbl a.ptitle{display:inline-flex;align-items:center;min-height:24px;}
|
|
887
894
|
.tbl a.ptitle:hover{text-decoration:underline;}
|
|
888
|
-
.tbl .
|
|
889
|
-
|
|
890
|
-
|
|
895
|
+
.tbl .tWho .chip{white-space:normal;line-height:1.3;}
|
|
896
|
+
/* the facts: label-face lines, one fact each, the mine row's .projMeta */
|
|
897
|
+
.tbl .facts{grid-area:facts;align-self:end;display:grid;gap:5px;min-width:0;
|
|
898
|
+
font-family:var(--label-face);font-size:var(--label-size);font-weight:400;
|
|
899
|
+
letter-spacing:var(--label-space);text-transform:uppercase;color:var(--ink-faint);}
|
|
900
|
+
/* the tagline, where the mine row puts its address: the honest clause in the body face */
|
|
901
|
+
.tbl .ptag{grid-area:tag;align-self:start;margin:5px 0 0;font-size:13.5px;font-weight:400;
|
|
902
|
+
line-height:1.45;color:var(--ink-soft);}
|
|
903
|
+
/* Runs, where the mine row draws its rail: the module list under its own label */
|
|
904
|
+
.tbl .runs{grid-area:runs;display:grid;gap:6px;min-width:0;font-size:13.5px;color:var(--ink-soft);}
|
|
905
|
+
.tbl .rLbl{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);
|
|
906
|
+
text-transform:uppercase;color:var(--ink-faint);}
|
|
891
907
|
.tbl .tags{display:flex;gap:6px;flex-wrap:wrap;}
|
|
892
908
|
.tbl .tags span{font-family:var(--font-mono);font-size:10.5px;padding:2px 8px;border-radius:999px;
|
|
893
909
|
border:1px solid var(--rule);color:var(--ink-faint);white-space:nowrap;}
|
|
894
910
|
.tbl .pill{display:inline-block;font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);
|
|
895
911
|
text-transform:uppercase;padding:3px 9px;border-radius:999px;border:1px solid var(--rule);color:var(--ink-faint);}
|
|
896
|
-
/* the
|
|
897
|
-
|
|
898
|
-
.
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
.
|
|
904
|
-
/*
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
.
|
|
908
|
-
|
|
909
|
-
.
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
right-aligned column's header is right-aligned too. Below the table's minimum
|
|
917
|
-
the wrap scrolls (#sub-table-body), never the page. ── */
|
|
918
|
-
.tbl{table-layout:fixed;min-width:860px;}
|
|
919
|
-
.tbl th.colName{padding-left:22px;}
|
|
920
|
-
.tbl th.right{text-align:right;}
|
|
921
|
-
.tbl th.colType{width:88px;}
|
|
922
|
-
.tbl th.colBuilders{width:96px;}
|
|
923
|
-
.tbl th.colTags{width:168px;}
|
|
924
|
-
.tbl th.colStatus{width:224px;}
|
|
925
|
-
.tbl th.colGo{width:112px;}
|
|
912
|
+
/* the doors: hairline pills, lowercase, right of the row — the mine row's
|
|
913
|
+
.btn.small.ghost, with the hall glyph as the second (task 1003356) */
|
|
914
|
+
.tbl .rowDoors{grid-area:doors;display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end;align-items:center;}
|
|
915
|
+
.rowGo{display:inline-flex;align-items:center;justify-content:center;min-height:40px;padding:0 18px;
|
|
916
|
+
font-family:var(--font-body);font-weight:400;font-size:14.5px;text-transform:lowercase;
|
|
917
|
+
color:var(--ink);background:none;border:1px solid var(--rule);border-radius:var(--radius-pill);
|
|
918
|
+
text-decoration:none;white-space:nowrap;transition:border-color .15s ease;}
|
|
919
|
+
.rowGo:hover{border-color:var(--ink-faint);color:var(--ink);}
|
|
920
|
+
/* ── the sort, off the column head (task 1003356): the mine view's filter
|
|
921
|
+
pills — hairline, lowercase, the pressed one inverted to ink ── */
|
|
922
|
+
.tblSort{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 8px;}
|
|
923
|
+
.tblSort .sortLbl{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);
|
|
924
|
+
text-transform:uppercase;color:var(--ink-faint);margin-right:6px;}
|
|
925
|
+
.tblSort button{display:inline-flex;align-items:center;gap:8px;min-height:36px;padding:0 15px;
|
|
926
|
+
font-family:var(--font-body);font-weight:400;font-size:14.5px;text-transform:lowercase;
|
|
927
|
+
color:var(--ink-soft);background:none;border:1px solid var(--rule);border-radius:var(--radius-pill);cursor:pointer;}
|
|
928
|
+
.tblSort button:hover{border-color:var(--ink-faint);color:var(--ink);}
|
|
929
|
+
.tblSort button[aria-pressed="true"]{background:var(--ink);border-color:var(--ink);color:var(--bg);}
|
|
930
|
+
.tblSort button:focus-visible{outline:2px solid var(--accent);outline-offset:2px;}
|
|
931
|
+
.tblSort .dir{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);}
|
|
926
932
|
/* the declared-type tag (task 1002772) — its own vocabulary: not the relationship
|
|
927
933
|
.pill, not the liveness .chip. Two different facts never wear the same chrome. */
|
|
928
934
|
.typeTag{font-family:var(--font-mono);font-size:10.5px;font-weight:500;color:var(--ink-soft);border:1px solid var(--rule);border-radius:999px;padding:2px 9px;white-space:nowrap;}
|
|
929
|
-
@media (max-width:780px){.tbl .colTags,.tbl .colType{display:none;}.tbl{min-width:600px;}}
|
|
930
935
|
@media (max-width:900px){
|
|
931
936
|
.tblMast{gap:16px;padding:22px 0 20px;}
|
|
932
937
|
.tblTitle{font-size:clamp(28px,7.4vw,34px);}
|
|
933
938
|
.mastObj{--dia:clamp(72px,18vw,96px);}
|
|
934
|
-
|
|
939
|
+
/* a phone stacks the row the way the Your-projects row stacks: the planet
|
|
940
|
+
and the name together, then everything else full width */
|
|
941
|
+
.tbl .tblRow{grid-template-columns:56px minmax(0,1fr);
|
|
942
|
+
grid-template-areas:"orb who" "tag tag" "facts facts" "runs runs" "doors doors";
|
|
943
|
+
gap:14px 16px;padding:20px 0;}
|
|
944
|
+
.tbl .tblRow .worldOrb{--d:56px;}
|
|
945
|
+
.tbl .facts,.tbl .ptag,.tbl .runs{align-self:auto;}
|
|
946
|
+
.tbl .rowDoors{justify-content:flex-start;}
|
|
935
947
|
}
|
|
936
948
|
|
|
937
949
|
/* ── the living sky (task 1002762): camera, spotlight, hover card ──
|
|
@@ -1074,10 +1086,13 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
1074
1086
|
.projCard .cardHall:hover{text-decoration-color:var(--accent-deep);}
|
|
1075
1087
|
.cardHall svg,.rowHall svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.5;
|
|
1076
1088
|
stroke-linecap:round;stroke-linejoin:round;}
|
|
1077
|
-
/* the
|
|
1078
|
-
.
|
|
1079
|
-
|
|
1080
|
-
.rowHall
|
|
1089
|
+
/* the row's second door (task 1003356): a member's hall, only where the hall is
|
|
1090
|
+
elsewhere. It stands beside "view" in the row's door slot, so it takes the
|
|
1091
|
+
door's hairline pill at the same 40px height rather than a glyph's 28px. */
|
|
1092
|
+
.rowHall{display:inline-flex;align-items:center;justify-content:center;width:44px;height:40px;
|
|
1093
|
+
color:var(--ink-soft);border:1px solid var(--rule);border-radius:var(--radius-pill);
|
|
1094
|
+
transition:border-color .15s ease,color .15s ease;}
|
|
1095
|
+
.rowHall:hover{border-color:var(--ink-faint);color:var(--ink);}
|
|
1081
1096
|
@media (max-width:640px){
|
|
1082
1097
|
.projCard h3{font-size:26px;padding:0 20px;}
|
|
1083
1098
|
.projCard .cardTag,.projCard .cardRel,.projCard .cardFaces,.projCard .cardFigs,.projCard .cardMeta,
|
|
@@ -1151,12 +1166,9 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
1151
1166
|
.mineBar .search .count{display:none;} /* the "All 16" pill already carries the number */
|
|
1152
1167
|
}
|
|
1153
1168
|
/* the carried surfaces: only the hit-area floors the world asks for (direction
|
|
1154
|
-
record §5, travelling with the pick) — the footer links
|
|
1155
|
-
|
|
1156
|
-
on a phone instead of pushing the page sideways */
|
|
1169
|
+
record §5, travelling with the pick) — the footer links; the sort pills carry
|
|
1170
|
+
their own 36px. The wrap keeps its scroll as the floor under a very long row. */
|
|
1157
1171
|
#sub-table-body{overflow-x:auto;}
|
|
1158
|
-
.tbl th button{min-height:24px;display:inline-flex;align-items:center;}
|
|
1159
|
-
.tbl a.ptitle{display:inline-flex;align-items:center;min-height:24px;}
|
|
1160
1172
|
.foot a,.finePrint a{display:inline-block;padding:3px 0;min-height:24px;}
|
|
1161
1173
|
/* ═══════════════════════════════════════════════════════════════════════
|
|
1162
1174
|
YOUR PROJECTS + THE MANAGE PAGE, IN THE WORLD (task 1003345; direction
|
|
@@ -1166,9 +1178,10 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
1166
1178
|
structure, the project's own planet as the row's object, the strip drawn
|
|
1167
1179
|
as the lifecycle rail, the doors as hairline pills with the accent only on
|
|
1168
1180
|
the one that acts. One set of FIXED tracks across every row, so the list
|
|
1169
|
-
reads as one ledger —
|
|
1170
|
-
in its `.tbl`
|
|
1171
|
-
1003348
|
|
1181
|
+
reads as one ledger — and since task 1003356 the every-project table lays
|
|
1182
|
+
the SAME five tracks in its `.tbl .tblRow` rule, so the two views are one
|
|
1183
|
+
grammar (task 1003348 aligned them; both halves are pinned together in
|
|
1184
|
+
tests/projects_hub.mjs). Dark only
|
|
1172
1185
|
(ADR 0204); every colour a token; halos are outlines, never box-shadow.
|
|
1173
1186
|
═══════════════════════════════════════════════════════════════════════ */
|
|
1174
1187
|
#view-mine .wrap,#view-manage .wrap{max-width:1180px;}
|
|
@@ -1222,14 +1235,12 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
1222
1235
|
#view-mine .addr{grid-area:addr;align-self:start;}
|
|
1223
1236
|
#view-mine .strip{grid-area:rail;}
|
|
1224
1237
|
#view-mine .actions{grid-area:doors;}
|
|
1225
|
-
/* everything else on a
|
|
1226
|
-
|
|
1227
|
-
#view-mine .projBody>.projMsg
|
|
1238
|
+
/* everything else on a row (a snag, a status line, the torn-down note) is a
|
|
1239
|
+
full row under the ledger line */
|
|
1240
|
+
#view-mine .projBody>.projMsg{grid-column:1/-1;}
|
|
1228
1241
|
#view-mine .projMsg{min-height:0;margin:0;font-weight:400;}
|
|
1229
1242
|
#view-mine .projMsg:not(:empty){margin-top:10px;}
|
|
1230
1243
|
#view-mine .projMsg.err{margin-top:12px;}
|
|
1231
|
-
#view-mine .attachFold{margin-top:10px;}
|
|
1232
|
-
#view-mine .actions:has(.confirmRow){grid-area:auto;grid-column:1/-1;justify-content:flex-start;margin-top:12px;}
|
|
1233
1244
|
/* the name in the body face; the chip beneath it, allowed to wrap */
|
|
1234
1245
|
#view-mine .projName{font-family:var(--font-body);font-weight:500;font-size:17px;letter-spacing:-.015em;color:var(--ink);}
|
|
1235
1246
|
#view-mine .proj.gone .projName{color:var(--ink-soft);}
|
|
@@ -1245,14 +1256,12 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
1245
1256
|
box; the address clause's mono link may run long and must wrap inside the
|
|
1246
1257
|
prose, so it stays inline and takes the floor as vertical padding (an inline's
|
|
1247
1258
|
rect is its content box plus padding, never the line box) */
|
|
1248
|
-
#view-mine .projMsg a,#view-
|
|
1259
|
+
#view-mine .projMsg a,#view-manage .ledger a,#view-manage .backRow a,#view-manage .mSec a{display:inline-block;padding:3px 0;min-height:24px;line-height:18px;font-weight:400;text-decoration:none;}
|
|
1249
1260
|
#view-mine .addr{line-height:1.6;}
|
|
1250
1261
|
#view-mine .addr a{display:inline;padding:4px 0;font-weight:400;text-decoration:none;}
|
|
1251
1262
|
#view-mine .addr a,#view-manage .ledger a{font-family:var(--font-mono);font-size:12.5px;color:var(--ink-soft);}
|
|
1252
1263
|
#view-mine .addr a:hover,#view-manage .ledger a:hover{color:var(--ink);text-decoration:underline;}
|
|
1253
1264
|
#view-mine .projMsg a,#view-manage .mSec a{color:var(--ink);text-decoration:underline;}
|
|
1254
|
-
#view-mine .attachFold summary{display:inline-flex;align-items:center;min-height:24px;font-weight:400;font-size:13.5px;color:var(--ink-soft);}
|
|
1255
|
-
#view-mine .attachFold summary:hover,#view-mine .attachFold[open] summary{color:var(--ink);}
|
|
1256
1265
|
|
|
1257
1266
|
/* ── the lifecycle rail (DESIGN.md): stripMarkup's markup, drawn as three
|
|
1258
1267
|
hairlines with a 7px dot and one lit step — no plate, no connector, no
|
|
@@ -1294,13 +1303,15 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
1294
1303
|
#view-mine .btn.small.danger,#view-manage .btn.small.danger{border-color:color-mix(in srgb,var(--err) 45%,transparent);color:var(--err);}
|
|
1295
1304
|
#view-mine .btn.small.danger:hover,#view-manage .btn.small.danger:hover{background:none;border-color:var(--err);color:var(--err);}
|
|
1296
1305
|
#view-mine .btn.small:disabled,#view-manage .btn.small:disabled{background:none;border-color:var(--rule-soft);color:var(--ink-faint);}
|
|
1297
|
-
/* the
|
|
1298
|
-
|
|
1299
|
-
#view-
|
|
1300
|
-
#view-
|
|
1301
|
-
#view-
|
|
1302
|
-
#view-
|
|
1303
|
-
#view-
|
|
1306
|
+
/* the address field and the ender's typed-back name: a hairline field. Both
|
|
1307
|
+
live on the project's own page now (task 1003355), so the scope is one. */
|
|
1308
|
+
#view-manage .attach{gap:10px 14px;margin-top:12px;align-items:center;}
|
|
1309
|
+
#view-manage .attach input[type=text]{min-width:220px;min-height:40px;font-family:var(--font-body);font-size:15.5px;font-weight:400;color:var(--ink);background:none;border:0;border-bottom:1px solid var(--rule);border-radius:0;padding:8px 0;}
|
|
1310
|
+
#view-manage .attach input[type=text]::placeholder{font-weight:400;}
|
|
1311
|
+
#view-manage .attach input[type=text]:focus{border-bottom-color:var(--ink);box-shadow:none;}
|
|
1312
|
+
#view-manage .attachNote{margin:0;font-size:13.5px;line-height:1.5;}
|
|
1313
|
+
#view-manage .confirmRow{font-weight:400;}
|
|
1314
|
+
#view-manage .confirmRow .plain{font-weight:400;font-size:14.5px;line-height:1.5;}
|
|
1304
1315
|
|
|
1305
1316
|
/* ── the empty state: a band of the Projects band's grammar, one door ── */
|
|
1306
1317
|
#view-mine .empty{display:grid;gap:14px;justify-items:start;text-align:left;background:var(--bg-card);border:0;border-top:1px solid var(--rule);border-bottom:1px solid var(--rule);border-radius:0;padding:58px var(--gutter) 62px;}
|
|
@@ -1392,7 +1403,7 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
1392
1403
|
#view-mine .proj .worldOrb{--orb-scale:.875;grid-column:1;grid-row:1;}
|
|
1393
1404
|
#view-mine .projBody{display:contents;}
|
|
1394
1405
|
#view-mine .projHead{grid-area:auto;grid-column:2;grid-row:1;}
|
|
1395
|
-
#view-mine .projMeta,#view-mine .addr,#view-mine .strip,#view-mine .actions,#view-mine .projBody>.projMsg
|
|
1406
|
+
#view-mine .projMeta,#view-mine .addr,#view-mine .strip,#view-mine .actions,#view-mine .projBody>.projMsg{grid-area:auto;grid-column:1/-1;}
|
|
1396
1407
|
#view-mine .projMeta{margin-top:14px;}
|
|
1397
1408
|
#view-mine .strip{margin-top:16px;}
|
|
1398
1409
|
#view-mine .actions{margin-top:16px;justify-content:flex-start;flex-direction:row;align-items:center;}
|