@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.
@@ -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
- /* ── the persistent shell header. It belongs to the PAGE, not to the orb
464
- field, so it never drifts, scales or pans with the sky — and it renders in
465
- EVERY view including the table, which is what the gate's
466
- `body:not(.view-space)` rule got wrong. ── */
467
- .shell{position:relative;z-index:40;display:flex;align-items:center;justify-content:space-between;
468
- gap:clamp(10px,2vw,22px);padding:16px clamp(16px,4vw,34px);flex-wrap:wrap;}
469
- /* The wordmark TYPES, so its width changes every ~190ms. As the middle child of
470
- a space-between row the nav would slide with it. Equal `flex:1 1 0` flanks
471
- compute to the same width regardless of content, which pins the nav dead
472
- centre and lets the mark change width inside its own box. Measured: 0px drift
473
- across seven typed states. */
474
- .shell .mark{flex:1 1 0;min-width:0;
475
- font-family:var(--font-display);font-weight:700;font-size:22px;letter-spacing:-0.5px;
476
- text-transform:lowercase;color:var(--chrome-ink);text-decoration:none;text-shadow:var(--chrome-glow);
477
- white-space:nowrap;}
478
- .shell .mark span{color:var(--chrome-accent);}
479
- /* Two colors, one system (task 1002793): the landing's static mark wraps only
480
- bongos in a span, so the shared rule above already colors it alone there.
481
- Here both words are spans, so the typed prefix opts back into the base ink
482
- by id — the shared rule must not change, the landing leans on it. */
483
- .shell .mark #markPrefix{color:var(--chrome-ink);}
484
- /* the prefix's width-pinned box: bongos holds still while letters come and go;
485
- the width transition covers the between-words change only */
486
- .shell .markLeft{display:inline-block;text-align:left;white-space:nowrap;transition:width .18s ease;}
487
- /* (no reduced-motion guard here: the global kill switch at the end of this
488
- file already zeroes every transition, and the test that pins it extracts
489
- the FIRST reduced-motion block — an earlier one would shadow it) */
490
- .shell .markMeasure{position:absolute;visibility:hidden;white-space:pre;pointer-events:none;}
491
- /* a drawn 2px bar, not a glyph: a block glyph keeps a full character cell of
492
- width even while blinked invisible, and + the literal space it read as two
493
- characters of air between the words */
494
- .shell .caret{display:inline-block;width:2px;height:.85em;margin-left:1px;vertical-align:-.1em;
495
- background:var(--chrome-accent);animation:cbBlink 1s step-end infinite;}
496
- @keyframes cbBlink{50%{opacity:0;}}
497
- .shell-right{flex:1 1 0;display:flex;align-items:center;justify-content:flex-end;
498
- gap:clamp(8px,1.6vw,14px);flex-wrap:wrap;}
499
-
500
- /* the three destinations, in the .btn-space glass voice so the nav and the
501
- chrome buttons read as one family */
502
- .navrow{flex:0 0 auto;display:flex;align-items:center;gap:4px;background:var(--glass-bg);
503
- border:1.5px solid var(--glass-border);border-radius:999px;padding:4px;backdrop-filter:blur(4px);}
504
- .navrow a{font-family:var(--font-display);font-weight:700;font-size:13.5px;color:var(--glass-ink);
505
- text-decoration:none;padding:7px 15px;border-radius:999px;white-space:nowrap;text-shadow:var(--chrome-glow);}
506
- .navrow a:hover{color:var(--chrome-accent);}
507
- .navrow a[aria-current="page"]{background:var(--accent);color:var(--accent-on);text-shadow:none;}
508
- /* Home LEAVES the hub, so it never takes the current-view pill and a hairline
509
- sets it apart. Without it the header offered no way back to the landing page
510
- except the wordmark, which nothing announced as a link. */
511
- .navrow .navHome{color:var(--glass-ink);}
512
- .navrow .navHome:hover{color:var(--chrome-accent);}
513
- .navSep{width:1px;align-self:stretch;margin:4px 3px;background:var(--glass-border);flex:0 0 auto;}
514
- /* below the mid breakpoint the three groups stack and centre rather than
515
- fighting for one row — equal flanks only buy a centred nav while it fits */
516
- @media (max-width:1079px){
517
- .shell{justify-content:center;}
518
- .shell .mark{flex:0 0 auto;}
519
- /* the signed-in cluster must SHRINK and wrap inside the viewport — pinned at
520
- max-content it overran a 390px phone by 16px and body{overflow-x:hidden}
521
- clipped "Sign out" off the screen (task 1003232) */
522
- .shell-right{flex:0 1 auto;min-width:0;max-width:100%;justify-content:center;}
523
- .navrow{order:3;flex-basis:100%;justify-content:center;max-width:100%;}
524
- }
525
- /* wide: centre the nav absolutely and let both flanks size to content. Equal
526
- flanks (394px each at 1280) were narrower than the signed-in cluster (418px),
527
- so the identity chip dropped to a second row the moment a founder signed in.
528
- Absolute centring keeps the 0px nav drift the mark's width-pin protects. */
529
- @media (min-width:1080px){
530
- .shell{position:relative;}
531
- .shell .navrow{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);}
532
- .shell .mark,.shell .shell-right{flex:1 1 auto;}
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 rather than navigating */
562
- .switch{display:inline-flex;align-items:center;gap:9px;cursor:pointer;background:var(--glass-bg);
563
- border:1.5px solid var(--glass-border);border-radius:999px;padding:7px 15px 7px 11px;
564
- font-family:var(--font-display);font-weight:700;font-size:13px;color:var(--glass-ink);
565
- backdrop-filter:blur(4px);text-shadow:var(--chrome-glow);white-space:nowrap;}
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:999px;background:color-mix(in srgb,var(--ink) 22%,transparent);
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:#fff;transition:transform .16s ease;box-shadow:0 1px 3px rgba(0,0,0,.3);}
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(--accent);outline-offset:2px;}
574
- .switch:has(input:checked){color:var(--chrome-accent);border-color:var(--accent);}
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 - 232px);min-height:340px;overflow:hidden;
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
  }