typebulb 0.14.6 → 0.14.8

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.
@@ -157,7 +157,8 @@ body {
157
157
  .picker, .servers-pop {
158
158
  --menu-h: 428px; /* one height for both statusbar menus — they sit side by side, so a
159
159
  mismatched cap reads as a glitch; .picker grows to it, .servers-pop
160
- is fixed at it (see its comment). Sized to show exactly 12 rows
160
+ too (the drilled-in console is the one fixed-height exception, see
161
+ .log-mode). Sized to show exactly 12 rows
161
162
  (12 × --menu-row-h + 11 gaps + filter + padding) — recognition fades
162
163
  past ~12 and search owns the tail. Plain px: desktop-only surface,
163
164
  every desktop window fits it. 428, not 427: at 427 the two menus land
@@ -166,6 +167,16 @@ body {
166
167
  --menu-row-h: 29px; /* one row height for both menus' lists — rows must match pitch exactly
167
168
  or the side-by-side menus read as two designs. Whole px, eyeball-tuned;
168
169
  the row paddings are kept below it so this floor is what governs. */
170
+ /* ONE geometry contract for both menus — sizing policy, padding, stacking. Stating it twice is
171
+ how every sibling discrepancy of June '26 happened (row pitch, gaps, fixed-vs-grow). max-height,
172
+ not height: a menu hugs its content and caps at the 12 rows above — a fixed height left a
173
+ 1-bulb project with a row floating atop a 400px void. Per-menu rules keep only width. */
174
+ max-height: var(--menu-h);
175
+ overflow: hidden;
176
+ padding: .35rem;
177
+ display: flex;
178
+ flex-direction: column;
179
+ gap: .15rem;
169
180
  position: absolute;
170
181
  bottom: calc(100% + .35rem);
171
182
  right: 0;
@@ -220,15 +231,7 @@ body {
220
231
 
221
232
  /* Session list — shares the popover chrome (.picker above); these are
222
233
  just its own dimensions. */
223
- .picker {
224
- width: min(440px, calc(100vw - 2rem));
225
- max-height: var(--menu-h);
226
- overflow: hidden;
227
- padding: .35rem;
228
- display: flex;
229
- flex-direction: column;
230
- gap: .15rem;
231
- }
234
+ .picker { width: min(440px, calc(100vw - 2rem)); }
232
235
  /* The filter (.bulb-filter-control) pins at the bottom — the popover's anchored edge, so it never
233
236
  jumps as the filtered list changes height; the row list scrolls inside the capped box, resting at
234
237
  its end (newest-at-bottom) — same shape as the launcher's .servers-pop / .bulb-list. */
@@ -298,18 +301,8 @@ body {
298
301
  and the metadata/controls form a right-aligned cluster of fixed-width columns (logs · trust ·
299
302
  time/port) that line up row-to-row — right-anchored, so the rightmost (time/port) always aligns and
300
303
  the rest stack inward (logs and time/port share a width; trust is wider, to fit "restricted"). The
301
- box is a FIXED size shared with the drilled-in console (.log-mode below): flipping list⇄console
302
- swaps only the contents, not the frame, so it doesn't jump. The filter pins to the top and the list
303
- scrolls inside (see .bulb-list). */
304
- .servers-pop {
305
- width: min(560px, calc(100vw - 2rem));
306
- height: var(--menu-h);
307
- overflow: hidden;
308
- padding: .35rem;
309
- display: flex;
310
- flex-direction: column;
311
- gap: .15rem;
312
- }
304
+ filter pins at the bottom and the list scrolls inside (see .bulb-list). */
305
+ .servers-pop { width: min(560px, calc(100vw - 2rem)); }
313
306
  .server-row {
314
307
  /* Subgrid: all rows share ONE set of column tracks (defined on .bulb-list). A per-row grid sizes
315
308
  its columns independently — which is exactly what broke alignment (a stopped row with no
@@ -372,7 +365,7 @@ a.server-port:hover { text-decoration: underline; }
372
365
  }
373
366
  .bulb-filter-clear:hover { color: var(--accent); }
374
367
  /* Filter-mode toggle (full-text search) — inset at the input's right edge; the clear × shifts
375
- inward beside it. Only rendered when the host passes a trailing control (the session picker). */
368
+ inward beside it. Both comboboxes render it (SearchComboboxPill's modeToggle). */
376
369
  .bulb-filter-control.has-trailing .bulb-filter { padding-right: 3.8rem; }
377
370
  .bulb-filter-control.has-trailing .bulb-filter-clear { right: 2.5rem; }
378
371
  .bulb-filter-mode {
@@ -393,9 +386,19 @@ a.server-port:hover { text-decoration: underline; }
393
386
  /* The shared grid for the launcher rows: each .server-row is a subgrid spanning these tracks, so
394
387
  columns line up row-to-row. auto cols size to their widest content (tight, no slack); 1fr is the
395
388
  name. A small right padding keeps the selected-row highlight off the scrollbar. */
396
- .bulb-list { display: grid; grid-template-columns: auto 1fr auto auto auto; column-gap: .6rem; row-gap: .15rem; align-items: center; align-content: start; padding-right: 4px; flex: 1; min-height: 0; overflow-y: auto; }
389
+ /* grid-auto-rows: max-content the grid twin of .picker-row's flex:none: when the list overflows
390
+ the popover cap, plain auto rows compress to each row's min-height contribution, so a full-text
391
+ row's snippet line bleeds under the next row as overlapping text. max-content tracks never
392
+ compress; the list scrolls, rows keep their content height. */
393
+ .bulb-list { display: grid; grid-template-columns: auto 1fr auto auto auto; grid-auto-rows: max-content; column-gap: .6rem; row-gap: .15rem; align-items: center; align-content: start; padding-right: 4px; flex: 1; min-height: 0; overflow-y: auto; }
397
394
  /* A stopped bulb's name isn't a link (no running URL), so it stays plain foreground. */
398
395
  .server-name.stopped { color: var(--fg); }
396
+ /* The 1fr name column: name + (in full-text mode) its hit count read together, the badge
397
+ right-aligned at the column's end by the name's flex:1 — the session row's preview/hits layout. */
398
+ .bulb-name-cell { display: flex; align-items: baseline; gap: .6rem; min-width: 0; }
399
+ /* Full-text snippet in the launcher: a second internal row of the row's subgrid, aligned under the
400
+ name column (the session picker indents past its dot gutter instead — override that margin). */
401
+ .bulb-list .picker-snippet { grid-column: 2 / -1; margin: 0 .4rem .2rem 0; }
399
402
  .bulb-time { color: var(--muted); font-size: .72rem; font-variant-numeric: tabular-nums; text-align: right; margin-right: .4rem; }
400
403
  /* The row's chrome buttons share one reset; sizing + colour differ below. Play/stop are round icon
401
404
  buttons (friendlier, space-economic); the trust switch is text. Logs is a link, not a button
@@ -457,7 +460,10 @@ a.server-port:hover { text-decoration: underline; }
457
460
  body fills the popover's height. overflow:hidden lets the rounded popover border clip the
458
461
  square head/body; the body scrolls internally. */
459
462
  .servers-pop.log-mode {
460
- padding: 0; /* same fixed width/height as the list (.servers-pop); only the chrome differs */
463
+ padding: 0;
464
+ /* The one fixed-height surface: a console wants its full frame regardless of how little it has
465
+ logged yet — a height that tracked the log would grow line by line. */
466
+ height: var(--menu-h);
461
467
  }
462
468
  .servers-pop.log-mode:focus { outline: none; }
463
469
  .bulb-log-head {