@bongos/core 1.19.392 → 1.19.394
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 +35 -25
- package/clients/bongos-client/index.d.ts +1 -1
- package/docs/api/openapi.json +4 -0
- package/docs/api-reference.md +1 -1
- package/docs/copy-inventory.md +248 -235
- package/docs/copy-registry.json +542 -323
- package/modules/platform-identity/migrations/platform_identity_011_project_visibility.sql +57 -0
- package/modules/platform-identity/platform-identity.js +73 -10
- package/modules/platform-identity/routes/projects.js +7 -1
- package/modules/platform-identity/tests/platform-identity.mjs +106 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/public-landing/assets/cosmos.css +235 -103
- package/public-landing/index.html +228 -75
- package/public-landing/projects.html +256 -140
- package/scripts/gds/run-unit-tests.js +5 -0
- package/src/module-api.js +5 -1
- package/tests/landing_page.mjs +72 -2
- package/tests/project_visibility_db.mjs +175 -0
- package/tests/projects_hub.mjs +52 -73
- package/tests/projects_hub_pre_uat.mjs +10 -8
|
@@ -77,7 +77,6 @@
|
|
|
77
77
|
--glass-ink:var(--ink-soft);
|
|
78
78
|
--glass-bg:rgba(255,255,255,0.62);
|
|
79
79
|
--glass-border:color-mix(in srgb, var(--accent) 42%, transparent);
|
|
80
|
-
--ava-shadow:0 2px 8px rgba(0,0,0,0.14);
|
|
81
80
|
--hero-lede:var(--ink-soft);
|
|
82
81
|
--hero-b:var(--accent-deep);
|
|
83
82
|
--foot-ink:var(--ink-faint);
|
|
@@ -118,12 +117,19 @@
|
|
|
118
117
|
--glass-ink:var(--accent-deep);
|
|
119
118
|
--glass-bg:rgba(255,255,255,0.07);
|
|
120
119
|
--glass-border:color-mix(in srgb, var(--accent) 42%, transparent);
|
|
121
|
-
--ava-shadow:0 0 14px color-mix(in srgb, var(--accent) 45%, transparent);
|
|
122
120
|
--hero-lede:var(--ink-soft);
|
|
123
121
|
--hero-b:var(--accent-deep);
|
|
124
122
|
--foot-ink:var(--ink-faint);
|
|
125
123
|
--foot-code:var(--accent-deep);
|
|
126
124
|
--shadow-card:0 24px 60px -24px rgba(0,0,0,.6), 0 6px 22px -8px rgba(0,0,0,.4);
|
|
125
|
+
--glass:rgba(255,255,255,.11);
|
|
126
|
+
--glass-strong:rgba(255,255,255,.17);
|
|
127
|
+
--glass-edge:rgba(255,255,255,.13);
|
|
128
|
+
--focus:var(--accent);
|
|
129
|
+
--type-halo:0 2px 18px rgba(0,0,0,.94), 0 0 54px rgba(0,0,0,.72);
|
|
130
|
+
--label-face:var(--font-body);
|
|
131
|
+
--label-size:11.5px;
|
|
132
|
+
--label-space:.1em;
|
|
127
133
|
color-scheme:dark;
|
|
128
134
|
}
|
|
129
135
|
@media (prefers-color-scheme: dark){
|
|
@@ -146,12 +152,19 @@
|
|
|
146
152
|
--glass-ink:var(--accent-deep);
|
|
147
153
|
--glass-bg:rgba(255,255,255,0.07);
|
|
148
154
|
--glass-border:color-mix(in srgb, var(--accent) 42%, transparent);
|
|
149
|
-
--ava-shadow:0 0 14px color-mix(in srgb, var(--accent) 45%, transparent);
|
|
150
155
|
--hero-lede:var(--ink-soft);
|
|
151
156
|
--hero-b:var(--accent-deep);
|
|
152
157
|
--foot-ink:var(--ink-faint);
|
|
153
158
|
--foot-code:var(--accent-deep);
|
|
154
159
|
--shadow-card:0 24px 60px -24px rgba(0,0,0,.6), 0 6px 22px -8px rgba(0,0,0,.4);
|
|
160
|
+
--glass:rgba(255,255,255,.11);
|
|
161
|
+
--glass-strong:rgba(255,255,255,.17);
|
|
162
|
+
--glass-edge:rgba(255,255,255,.13);
|
|
163
|
+
--focus:var(--accent);
|
|
164
|
+
--type-halo:0 2px 18px rgba(0,0,0,.94), 0 0 54px rgba(0,0,0,.72);
|
|
165
|
+
--label-face:var(--font-body);
|
|
166
|
+
--label-size:11.5px;
|
|
167
|
+
--label-space:.1em;
|
|
155
168
|
color-scheme:dark;
|
|
156
169
|
}
|
|
157
170
|
}
|
|
@@ -210,6 +223,40 @@
|
|
|
210
223
|
--pad-lg:clamp(19px,2.6vw,28px); /* padding inside a marketing panel */
|
|
211
224
|
--pad-xl:clamp(38px,6vw,78px); /* rhythm between sections */
|
|
212
225
|
--fs-h2:clamp(22px,3vw,29px); --fs-h3:17.5px; --fs-lede:15.5px; --fs-body:14.5px;
|
|
226
|
+
|
|
227
|
+
/* the world's derived tier for the hub's chrome (task 1003300; ADR 0196 §3:
|
|
228
|
+
"the hub's sheet moves onto the world's derived tier the way world.css
|
|
229
|
+
did"). The same names world.css and DESIGN.md use, so the bar and the
|
|
230
|
+
bands are a port of the landing's world, not an invention. --line stays
|
|
231
|
+
the hub's hairline COLOUR and --ok/--warn/--err its fixed status
|
|
232
|
+
vocabulary; neither is restated. The eight that flip with the mode
|
|
233
|
+
(--glass*, --focus, --type-halo, --label-*) are in both dark blocks. */
|
|
234
|
+
--bar-bg:var(--bg); /* the bar's ground IS the page ground; one hairline closes it */
|
|
235
|
+
--glass:color-mix(in srgb, var(--ink) 5%, transparent);
|
|
236
|
+
--glass-strong:color-mix(in srgb, var(--ink) 8%, transparent);
|
|
237
|
+
--glass-edge:color-mix(in srgb, var(--ink) 12%, transparent);
|
|
238
|
+
--accent-lift:color-mix(in srgb, var(--accent) 58%, #ffffff);
|
|
239
|
+
--void-pill:rgba(0,0,0,.55);
|
|
240
|
+
--void-ink:#ffffff;
|
|
241
|
+
--focus:var(--accent-deep);
|
|
242
|
+
--type-halo:none;
|
|
243
|
+
--label-face:var(--font-mono);
|
|
244
|
+
--label-size:11px;
|
|
245
|
+
--label-space:.12em;
|
|
246
|
+
--radius:16px; --radius-sm:10px; --radius-pill:999px;
|
|
247
|
+
--top-h:64px;
|
|
248
|
+
--gutter:clamp(16px,4vw,34px);
|
|
249
|
+
/* the footer's measured height per width — the sky is 100vh minus the bar and
|
|
250
|
+
this, so the map fits the viewport with no scrollbar (T2's rule); the
|
|
251
|
+
toolbar row that used to be in that sum is gone (task 1003300) */
|
|
252
|
+
--foot-h:90px;
|
|
253
|
+
}
|
|
254
|
+
/* narrow: the bar tightens to one 60px row (the landing's own switch) */
|
|
255
|
+
@media (max-width:900px){
|
|
256
|
+
:root{--top-h:60px;--foot-h:108px;}
|
|
257
|
+
}
|
|
258
|
+
@media (max-width:360px){
|
|
259
|
+
:root{--foot-h:126px;}
|
|
213
260
|
}
|
|
214
261
|
|
|
215
262
|
*{box-sizing:border-box;margin:0;padding:0;}
|
|
@@ -233,17 +280,8 @@ body{font-family:var(--font-body);color:var(--ink);background:var(--page-bg);min
|
|
|
233
280
|
.top .mark{font-family:var(--font-display);font-weight:700;font-size:22px;letter-spacing:-0.5px;text-transform:lowercase;color:var(--chrome-ink);text-decoration:none;text-shadow:var(--chrome-glow);}
|
|
234
281
|
.top .mark span{color:var(--chrome-accent);}
|
|
235
282
|
.top-right{display:flex;align-items:center;gap:clamp(10px,2vw,18px);}
|
|
236
|
-
.who{display:flex;align-items:center;gap:10px;font-size:14px;font-weight:600;color:var(--chrome-ink-dim);min-height:34px;text-shadow:var(--chrome-glow);}
|
|
237
|
-
.who img{width:30px;height:30px;border-radius:50%;border:2px solid rgba(255,255,255,0.85);box-shadow:var(--ava-shadow);}
|
|
238
|
-
/* sign-out rides inside the identity chip, so it exists exactly when a session
|
|
239
|
-
does — the same glass voice as .btn-space, one size down (task 1002952) */
|
|
240
|
-
.who .signout{font-family:var(--font-display);font-weight:700;font-size:12.5px;color:var(--glass-ink);background:var(--glass-bg);border:1.5px solid var(--glass-border);border-radius:999px;padding:5px 12px;text-decoration:none;text-shadow:var(--chrome-glow);backdrop-filter:blur(4px);}
|
|
241
|
-
.who .signout:hover{border-color:var(--chrome-accent);color:var(--chrome-accent);}
|
|
242
283
|
.btn-space{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-family:var(--font-display);font-weight:700;font-size:13.5px;color:var(--glass-ink);background:var(--glass-bg);border:1.5px solid var(--glass-border);border-radius:999px;padding:8px 16px;text-decoration:none;text-shadow:var(--chrome-glow);backdrop-filter:blur(4px);}
|
|
243
284
|
.btn-space:hover{border-color:var(--chrome-accent);color:var(--chrome-accent);}
|
|
244
|
-
/* the light/dark switch — same glass voice as .btn-space, icon-only */
|
|
245
|
-
.mode-toggle{display:inline-flex;align-items:center;justify-content:center;cursor:pointer;width:36px;height:36px;border-radius:50%;font-size:15px;line-height:1;color:var(--glass-ink);background:var(--glass-bg);border:1.5px solid var(--glass-border);backdrop-filter:blur(4px);}
|
|
246
|
-
.mode-toggle:hover{border-color:var(--chrome-accent);color:var(--chrome-accent);}
|
|
247
285
|
|
|
248
286
|
/* ── the hero (page title over the sky) ── */
|
|
249
287
|
.hero{position:relative;z-index:1;max-width:880px;margin:0 auto;padding:clamp(6px,1.5vw,18px) clamp(16px,4vw,40px) 26px;}
|
|
@@ -460,92 +498,90 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
460
498
|
prefers-color-scheme twin); tests/cosmos_token_contrast.mjs compares them.
|
|
461
499
|
═══════════════════════════════════════════════════════════════════════ */
|
|
462
500
|
|
|
463
|
-
/* ──
|
|
464
|
-
field, so it never drifts, scales or
|
|
465
|
-
EVERY view including the table
|
|
466
|
-
|
|
467
|
-
.
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
.
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
.
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
.
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
.
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
.
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
.
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
.
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
.
|
|
512
|
-
.
|
|
513
|
-
|
|
514
|
-
/*
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
501
|
+
/* ── THE BAR (task 1003300; v2 "the hairline", direction record §7). It
|
|
502
|
+
belongs to the PAGE, not to the orb field, so it never drifts, scales or
|
|
503
|
+
pans with the sky — and it renders in EVERY view including the table. No
|
|
504
|
+
pill: its ground is the page ground (--bar-bg), closed by one hairline, and
|
|
505
|
+
the only filled shape it can hold is the sign-in door. z-index 50 — over
|
|
506
|
+
everything in flow, under the card scrim (60). Not sticky. ── */
|
|
507
|
+
.shell{position:relative;z-index:50;}
|
|
508
|
+
.bar{display:flex;align-items:center;gap:22px;height:var(--top-h);padding:0 var(--gutter);
|
|
509
|
+
background:var(--bar-bg);border-bottom:1px solid var(--rule);}
|
|
510
|
+
.barLeft{display:flex;align-items:center;gap:26px;flex:1 1 auto;min-width:0;}
|
|
511
|
+
.barRight{display:flex;align-items:center;gap:20px;flex:none;}
|
|
512
|
+
/* the static mark: the bongo pair + the product name as plain type, the only way home */
|
|
513
|
+
.barMark{display:inline-flex;align-items:center;gap:10px;min-height:44px;flex:none;
|
|
514
|
+
font-family:var(--font-display);font-size:17px;font-weight:500;letter-spacing:-.015em;
|
|
515
|
+
color:var(--ink);text-decoration:none;text-shadow:var(--type-halo);}
|
|
516
|
+
.barMark svg{width:23px;height:18px;display:block;flex:none;}
|
|
517
|
+
.barMark:hover{color:var(--ink);}
|
|
518
|
+
/* the two-tone focus ring on the bar's and the bands' controls (DESIGN.md
|
|
519
|
+
"Accessibility floors"): a 2px --focus outline at 3px offset inside an 8px
|
|
520
|
+
--bg halo, so the ring keeps its own edge over whatever it lands on */
|
|
521
|
+
.bar :focus-visible,.menuBand :focus-visible,.qField:focus-within{outline:2px solid var(--focus);outline-offset:3px;box-shadow:0 0 0 8px var(--bg);}
|
|
522
|
+
.qInput:focus-visible{outline:none;box-shadow:none;}
|
|
523
|
+
/* the map's search: no field chrome, one bottom hairline that takes the ink on
|
|
524
|
+
focus. NOT .search — that is the mine view's glass pill and keeps its rules.
|
|
525
|
+
The count and the only-mine switch ride inside the wrapper, so all three
|
|
526
|
+
hide together off the map and fold together under 480. */
|
|
527
|
+
.qWrap{display:flex;align-items:center;gap:14px;flex:0 1 480px;min-width:0;}
|
|
528
|
+
.qField{flex:1 1 auto;min-width:110px;display:flex;align-items:center;min-height:44px;
|
|
529
|
+
border-bottom:1px solid var(--rule);transition:border-color .2s cubic-bezier(.2,.7,.3,1);}
|
|
530
|
+
.qWrap:focus-within .qField{border-bottom-color:var(--ink);}
|
|
531
|
+
.qInput{width:100%;min-width:0;min-height:32px;padding:0 0 4px;background:none;border:0;outline:none;
|
|
532
|
+
color:var(--ink);font-family:var(--label-face);font-size:13px;letter-spacing:.01em;}
|
|
533
|
+
.qInput::placeholder{color:var(--ink-faint);font-family:var(--label-face);}
|
|
534
|
+
.qIcon{display:none;flex:none;width:17px;height:17px;margin-right:8px;color:var(--ink-faint);}
|
|
535
|
+
.qCount{flex:none;font-family:var(--font-mono);font-size:11.5px;color:var(--ink-faint);
|
|
536
|
+
font-variant-numeric:tabular-nums;white-space:nowrap;}
|
|
537
|
+
/* under 480 the field folds into this magnifier (see the 480 query); above it, never shown */
|
|
538
|
+
.qToggle{display:none;align-items:center;justify-content:center;width:44px;height:44px;flex:none;
|
|
539
|
+
cursor:pointer;background:none;border:0;border-radius:var(--radius-pill);color:var(--ink-soft);
|
|
540
|
+
transition:color .2s cubic-bezier(.2,.7,.3,1);}
|
|
541
|
+
.qToggle svg{width:19px;height:19px;}
|
|
542
|
+
.qToggle:hover,.qToggle[aria-expanded="true"]{color:var(--ink);}
|
|
543
|
+
/* the right group is lowercase text; the OPEN trigger is underlined in the
|
|
544
|
+
accent, because an open menu is the live thing on the bar */
|
|
545
|
+
.trig{display:inline-flex;align-items:center;gap:7px;min-height:44px;padding:0;cursor:pointer;
|
|
546
|
+
background:none;border:0;border-radius:var(--radius-sm);
|
|
547
|
+
font-family:var(--font-body);font-size:15px;font-weight:400;text-transform:lowercase;
|
|
548
|
+
color:var(--ink-soft);transition:color .2s cubic-bezier(.2,.7,.3,1);}
|
|
549
|
+
.trig:hover{color:var(--ink);}
|
|
550
|
+
.trig[aria-expanded="true"]{color:var(--ink);text-decoration:underline;text-decoration-color:var(--accent);
|
|
551
|
+
text-decoration-thickness:2px;text-underline-offset:7px;}
|
|
552
|
+
/* the chevron — NOT .caret, which was the typing wordmark's blinking bar */
|
|
553
|
+
.trig .cv{width:13px;height:13px;flex:none;fill:none;stroke:currentColor;stroke-width:1.4;
|
|
554
|
+
stroke-linecap:round;stroke-linejoin:round;transition:transform .2s cubic-bezier(.2,.7,.3,1);}
|
|
555
|
+
.trig[aria-expanded="true"] .cv{transform:rotate(180deg);}
|
|
556
|
+
/* the identity chip is the profile trigger: avatar + login + the chevron */
|
|
557
|
+
.who{gap:9px;}
|
|
558
|
+
.who img{width:26px;height:26px;border-radius:var(--radius-pill);object-fit:cover;flex:none;
|
|
559
|
+
border:1px solid var(--rule);}
|
|
560
|
+
.modeBtn{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;
|
|
561
|
+
cursor:pointer;background:none;border:0;border-radius:var(--radius-pill);color:var(--ink-soft);
|
|
562
|
+
transition:color .2s cubic-bezier(.2,.7,.3,1);}
|
|
563
|
+
.modeBtn:hover{color:var(--ink);}
|
|
564
|
+
.modeBtn svg{width:20px;height:20px;}
|
|
565
|
+
/* the glyph shows the mode you would GET: the moon in light, the sun in dark */
|
|
566
|
+
.modeBtn .sun{display:none;}
|
|
567
|
+
:root[data-mode="dark"] .modeBtn .sun{display:block;}
|
|
568
|
+
:root[data-mode="dark"] .modeBtn .moon{display:none;}
|
|
569
|
+
@media (prefers-color-scheme:dark){
|
|
570
|
+
:root:not([data-mode="light"]) .modeBtn .sun{display:block;}
|
|
571
|
+
:root:not([data-mode="light"]) .modeBtn .moon{display:none;}
|
|
533
572
|
}
|
|
573
|
+
/* the one filled shape on a bar with no pills: the landing's sign-in door */
|
|
574
|
+
.signinDoor{display:inline-flex;align-items:center;justify-content:center;min-height:44px;padding:0 26px;
|
|
575
|
+
border-radius:var(--radius-pill);background:color-mix(in srgb,var(--ink) 92%,var(--bg));color:var(--bg);
|
|
576
|
+
font-size:15px;font-weight:500;text-transform:lowercase;text-decoration:none;
|
|
577
|
+
transition:background .2s cubic-bezier(.2,.7,.3,1);}
|
|
578
|
+
.signinDoor:hover{background:var(--ink);color:var(--bg);}
|
|
534
579
|
/* a long GitHub login truncates instead of pushing Sign out off the screen */
|
|
535
580
|
.who>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:14ch;}
|
|
536
581
|
/* keyboard focus on the two search pills is VISIBLE — the input's own outline
|
|
537
582
|
is off by design, so the pill carries the ring */
|
|
538
583
|
.search:focus-within{box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 40%,transparent);}
|
|
539
584
|
|
|
540
|
-
/* ── the per-view control strip: Sky|Table, the only-mine filter, search ── */
|
|
541
|
-
.toolbar{position:relative;z-index:30;display:flex;align-items:center;gap:12px;flex-wrap:wrap;
|
|
542
|
-
padding:0 clamp(16px,4vw,34px) 16px;}
|
|
543
|
-
.seg{display:inline-flex;background:var(--glass-bg);border:1.5px solid var(--glass-border);
|
|
544
|
-
border-radius:999px;padding:4px;gap:4px;backdrop-filter:blur(4px);}
|
|
545
|
-
.seg button{font-family:var(--font-display);font-weight:700;font-size:13px;color:var(--glass-ink);
|
|
546
|
-
background:none;border:none;cursor:pointer;padding:7px 16px;border-radius:999px;text-shadow:var(--chrome-glow);}
|
|
547
|
-
.seg button[aria-pressed="true"]{background:var(--accent);color:var(--accent-on);text-shadow:none;}
|
|
548
|
-
|
|
549
585
|
.search{flex:1;min-width:190px;max-width:460px;display:flex;align-items:center;gap:9px;
|
|
550
586
|
background:var(--glass-bg);border:1.5px solid var(--glass-border);border-radius:999px;
|
|
551
587
|
padding:8px 16px;backdrop-filter:blur(4px);}
|
|
@@ -558,20 +594,110 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
558
594
|
.search .count{font-family:var(--font-mono);font-size:11.5px;color:var(--glass-ink);white-space:nowrap;}
|
|
559
595
|
|
|
560
596
|
/* the only-mine filter — a real two-state control, not a link: it filters the
|
|
561
|
-
SAME data in place
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
font-family:var(--font-
|
|
565
|
-
|
|
597
|
+
SAME data in place. Lowercase text and a track, no pill: nothing on the bar
|
|
598
|
+
is boxed (v2). The track takes the accent only when it is ON — live. */
|
|
599
|
+
.switch{display:inline-flex;align-items:center;gap:9px;flex:none;min-height:44px;cursor:pointer;
|
|
600
|
+
font-family:var(--font-body);font-size:13.5px;text-transform:lowercase;color:var(--ink-soft);white-space:nowrap;
|
|
601
|
+
transition:color .2s cubic-bezier(.2,.7,.3,1);}
|
|
602
|
+
.switch:hover{color:var(--ink);}
|
|
566
603
|
.switch input{position:absolute;opacity:0;pointer-events:none;}
|
|
567
|
-
.switch .track{width:32px;height:18px;border-radius:
|
|
604
|
+
.switch .track{width:32px;height:18px;border-radius:var(--radius-pill);background:color-mix(in srgb,var(--ink) 22%,transparent);
|
|
568
605
|
position:relative;flex:0 0 auto;transition:background .16s ease;}
|
|
569
606
|
.switch .track::after{content:"";position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;
|
|
570
|
-
background
|
|
607
|
+
background:var(--bg-card);transition:transform .16s ease;}
|
|
571
608
|
.switch input:checked + .track{background:var(--accent);}
|
|
572
|
-
.switch input:checked + .track::after{transform:translateX(14px);}
|
|
573
|
-
.switch input:focus-visible + .track{outline:2px solid var(--
|
|
574
|
-
.switch:has(input:checked){color:var(--
|
|
609
|
+
.switch input:checked + .track::after{transform:translateX(14px);background:var(--accent-on);}
|
|
610
|
+
.switch input:focus-visible + .track{outline:2px solid var(--focus);outline-offset:3px;box-shadow:0 0 0 8px var(--bg);}
|
|
611
|
+
.switch:has(input:checked){color:var(--ink);}
|
|
612
|
+
|
|
613
|
+
/* ── THE BANDS: a menu is not a floating card. It unfolds under the bar's edge,
|
|
614
|
+
full width on the card ground, closed by one hairline, and PUSHES the page
|
|
615
|
+
down. Cells in a hairline-separated row, each a lowercase display title over
|
|
616
|
+
one clause; the whole cell is the target. The current view carries a 2px
|
|
617
|
+
accent hairline on its top edge — the rail-step-lit grammar from DESIGN.md,
|
|
618
|
+
moved onto a menu. One authored move, a 6px rise + fade on the world's
|
|
619
|
+
exponential ease-out, dead under the kill switch at the end of this file. ── */
|
|
620
|
+
.menuBand{position:relative;z-index:49;background:var(--bg-card);border-bottom:1px solid var(--rule);
|
|
621
|
+
animation:bandIn .22s cubic-bezier(.16,1,.3,1) both;}
|
|
622
|
+
@keyframes bandIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
|
|
623
|
+
.bandIn{padding:20px var(--gutter) 28px;}
|
|
624
|
+
.bandRow{display:grid;grid-template-columns:repeat(4,1fr);gap:0 34px;list-style:none;margin:0;padding:0;}
|
|
625
|
+
.bandCell{position:relative;border-top:1px solid var(--rule-soft);padding:15px 0 0;}
|
|
626
|
+
.bandCell:has([aria-current="page"])::before{content:"";position:absolute;left:0;right:0;top:-1px;height:2px;background:var(--accent);}
|
|
627
|
+
.bandT{display:inline-block;padding:2px 0;font-family:var(--font-display);font-size:24px;
|
|
628
|
+
font-weight:300;line-height:1.14;letter-spacing:-.03em;text-transform:lowercase;
|
|
629
|
+
color:var(--ink-soft);text-decoration:none;transition:color .2s cubic-bezier(.2,.7,.3,1);}
|
|
630
|
+
.bandT::after{content:"";position:absolute;inset:0;}
|
|
631
|
+
.bandCell:has([aria-current="page"]) .bandT,.bandCell:hover .bandT{color:var(--ink);}
|
|
632
|
+
.bandCell:hover{border-top-color:var(--ink-faint);}
|
|
633
|
+
.bandC{display:block;margin-top:5px;font-size:13.5px;line-height:1.45;color:var(--ink-soft);}
|
|
634
|
+
.bandProfile{display:flex;align-items:flex-end;justify-content:space-between;gap:34px;flex-wrap:wrap;}
|
|
635
|
+
.bandWho{display:flex;align-items:center;gap:10px;padding-top:15px;border-top:1px solid var(--rule-soft);
|
|
636
|
+
flex:0 1 auto;font-family:var(--label-face);font-size:var(--label-size);
|
|
637
|
+
letter-spacing:var(--label-space);text-transform:uppercase;color:var(--ink-faint);}
|
|
638
|
+
.bandWho img{width:30px;height:30px;border-radius:var(--radius-pill);object-fit:cover;
|
|
639
|
+
border:1px solid var(--rule);}
|
|
640
|
+
.bandProfile .bandRow{display:flex;justify-content:flex-end;gap:30px;flex:0 1 auto;}
|
|
641
|
+
.bandProfile .bandCell,.bandProfile .bandSlot{flex:0 0 168px;text-align:right;}
|
|
642
|
+
/* the deferred Settings slot: a place it would go, rendering nothing at all —
|
|
643
|
+
not even the hairline that declares a list item in this band */
|
|
644
|
+
.bandSlot{border:0;}
|
|
645
|
+
/* the row under the hairline: About and Docs, a rung smaller than the views */
|
|
646
|
+
.bandMore{margin-top:18px;}
|
|
647
|
+
.bandMore .bandT{font-size:17px;font-weight:400;min-height:24px;display:inline-flex;align-items:center;}
|
|
648
|
+
|
|
649
|
+
@media (max-width:900px){
|
|
650
|
+
.bar{gap:10px;padding:0 12px;}
|
|
651
|
+
.barLeft{gap:12px;}
|
|
652
|
+
.barRight{gap:12px;}
|
|
653
|
+
/* the wordmark folds away so the bar holds ONE row down to 320; the glyph stays */
|
|
654
|
+
.barMark{min-width:44px;justify-content:center;}
|
|
655
|
+
.barMark span{display:none;}
|
|
656
|
+
.qWrap{flex:1 1 90px;max-width:480px;gap:10px;}
|
|
657
|
+
.trig{font-size:13.5px;}
|
|
658
|
+
.who>span{display:none;}
|
|
659
|
+
.modeBtn{width:40px;height:40px;}
|
|
660
|
+
.modeBtn svg{width:18px;height:18px;}
|
|
661
|
+
.signinDoor{padding:0 16px;font-size:13.5px;}
|
|
662
|
+
.bandIn{padding:0 12px 16px;}
|
|
663
|
+
.bandRow{grid-template-columns:1fr;gap:0;}
|
|
664
|
+
.bandT{font-size:20px;}
|
|
665
|
+
.bandProfile{display:block;}
|
|
666
|
+
.bandProfile .bandRow{display:block;text-align:left;}
|
|
667
|
+
.bandProfile .bandCell,.bandProfile .bandSlot{flex:none;text-align:left;}
|
|
668
|
+
.bandWho{padding-bottom:14px;}
|
|
669
|
+
}
|
|
670
|
+
@media (max-width:640px){
|
|
671
|
+
.bar{gap:8px;padding:0 10px;}
|
|
672
|
+
.barRight{gap:8px;}
|
|
673
|
+
/* the count leaves the bar (the sky and the table show what matched); the
|
|
674
|
+
folded row under 480 brings it back where it has the width */
|
|
675
|
+
.qCount{display:none;}
|
|
676
|
+
.switch{font-size:12.5px;gap:7px;}
|
|
677
|
+
}
|
|
678
|
+
@media (max-width:480px){
|
|
679
|
+
/* no field this narrow can hold a query beside the controls, so the search
|
|
680
|
+
folds into a magnifier in the field's place; pressed, it drops ONE hairline
|
|
681
|
+
row of the page ground under the bar carrying the full-width field, its
|
|
682
|
+
count and the only-mine switch. Escape, or an opening band, folds it back. */
|
|
683
|
+
.qToggle{display:inline-flex;}
|
|
684
|
+
.qWrap{display:none;}
|
|
685
|
+
.qWrap.is-open{display:flex;position:absolute;left:0;right:0;top:100%;z-index:51;
|
|
686
|
+
align-items:center;gap:12px;max-width:none;height:52px;padding:0 10px;
|
|
687
|
+
background:var(--bar-bg);border-bottom:1px solid var(--rule);}
|
|
688
|
+
.qWrap.is-open .qField{min-height:40px;}
|
|
689
|
+
.qWrap.is-open .qCount{display:inline;}
|
|
690
|
+
.qIcon{display:block;}
|
|
691
|
+
.bar{gap:6px;}
|
|
692
|
+
.barLeft{gap:8px;}
|
|
693
|
+
.barRight{gap:6px;}
|
|
694
|
+
.signinDoor{padding:0 13px;}
|
|
695
|
+
}
|
|
696
|
+
@media (max-width:360px){
|
|
697
|
+
/* the field measured 95px with the count and the switch beside it; the
|
|
698
|
+
switch is a control, the count is a nicety — it yields */
|
|
699
|
+
.qWrap.is-open .qCount{display:none;}
|
|
700
|
+
}
|
|
575
701
|
|
|
576
702
|
/* ── the orb field. Ground B (owner, 2026-08-13): dual-mode full-bleed — the
|
|
577
703
|
sky IS the page and follows light/dark, which is what --sky-bg/--star-display
|
|
@@ -579,7 +705,7 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
579
705
|
sky moves is not. Component-scoped custom properties only — a page-local or
|
|
580
706
|
component `:root` would outrank the branding pack spliced after this file. ── */
|
|
581
707
|
.fieldWrap{padding:0;max-width:none;}
|
|
582
|
-
.field{position:relative;height:calc(100vh -
|
|
708
|
+
.field{position:relative;height:calc(100vh - var(--top-h) - var(--foot-h));min-height:340px;overflow:hidden;
|
|
583
709
|
--grid-ink:color-mix(in srgb,var(--rule) 92%,transparent);}
|
|
584
710
|
.field .ground{position:absolute;inset:0;background:var(--sky-bg);}
|
|
585
711
|
/* the gravity sheet, flattened: two gradients under a radial mask */
|
|
@@ -804,8 +930,14 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
804
930
|
.proj{flex-direction:column;}
|
|
805
931
|
.orb{width:44px;height:44px;flex-basis:44px;}
|
|
806
932
|
.mineBar .search .count{display:none;} /* the "All 16" pill already carries the number */
|
|
807
|
-
.navrow a{padding:7px 11px;}
|
|
808
933
|
}
|
|
934
|
+
/* the carried surfaces: only the hit-area floors the world asks for (direction
|
|
935
|
+
record §5, travelling with the pick) — the footer links, the table's sort
|
|
936
|
+
buttons (after their all:unset) — and the table scrolls inside its own wrap
|
|
937
|
+
on a phone instead of pushing the page sideways */
|
|
938
|
+
#sub-table-body{overflow-x:auto;}
|
|
939
|
+
.tbl th button{min-height:24px;display:inline-flex;align-items:center;}
|
|
940
|
+
.foot a,.finePrint a{display:inline-block;padding:3px 0;min-height:24px;}
|
|
809
941
|
@media (prefers-reduced-motion:reduce){
|
|
810
942
|
*,*::before,*::after{animation:none !important;transition:none !important;}
|
|
811
943
|
}
|