typebulb 0.39.3 → 0.40.0

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.
@@ -118,21 +118,27 @@ body {
118
118
  gap: .4rem;
119
119
  align-items: center;
120
120
  }
121
- /* Chip shape shared by EVERY word-label control — the status-bar pills (interactive and
122
- passive) AND the floating overlay pills (copy, breakout, code⇄run). One rule = one source
123
- of vertical alignment; when these drift apart it reads as amateurish.
124
- THE CENTERING RECIPE (don't re-tweak per button — fix it here or nowhere): Segoe UI's font
121
+ /* THE CENTERING RECIPE for EVERY word-label control on any surface — the status-bar pills and
122
+ floating overlay pills below, and the launcher row's trust switch + B scope chip. One rule = one
123
+ source of vertical alignment; when these drift apart it reads as amateurish, so a new word
124
+ control joins this selector rather than centering itself (don't re-tweak per button — fix it
125
+ here or nowhere). Icon buttons opt back out, keeping flex (see .pill.glyph). Segoe UI's font
125
126
  ascent (~1.08em) dwarfs its descent (~0.25em), so anything that centers the LINE BOX —
126
127
  flex, line-height, padding — parks the glyphs ~2px low at pill sizes. `text-box` trims the
127
128
  line box to the glyphs (cap→baseline) so centering centers the letters themselves. It only
128
129
  applies to block containers (not flex), hence inline-block + align-content, not inline-flex
129
- + align-items. Browsers without text-box (Firefox) fall back to plain line-box centering.
130
- Opaque so pills read cleanly over the message text the transparent strip lets through. */
131
- .pill, .token, .overlay-pill {
130
+ + align-items. Browsers without text-box (Firefox) fall back to plain line-box centering. */
131
+ .pill, .token, .overlay-pill, .trust-toggle, .batch-b {
132
132
  display: inline-block;
133
133
  align-content: center;
134
134
  text-align: center;
135
135
  text-box: trim-both cap alphabetic;
136
+ }
137
+ /* Chip shape shared by the status-bar pills (interactive and passive) AND the floating overlay
138
+ pills (copy, breakout, code⇄run) — opaque, so they read cleanly over the message text the
139
+ transparent strip lets through. The launcher row's pills take only the recipe above; their
140
+ shape is the row's (.trust-toggle, .batch-b). */
141
+ .pill, .token, .overlay-pill {
136
142
  height: var(--pill-h);
137
143
  padding: 0 .7rem;
138
144
  border-radius: 7px;
@@ -821,9 +827,10 @@ a.server-port:hover { text-decoration: underline; }
821
827
  row's snippet line bleeds under the next row as overlapping text. max-content tracks never
822
828
  compress; the list scrolls, rows keep their content height. */
823
829
  .bulb-list { display: grid; grid-template-columns: auto 1fr auto 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; }
824
- /* The scope column (TB-Batch.md Invariant 7): a seventh track between name and the control
825
- cluster, present only while some row carries a scope (bulbsPill.ts anyScope — rows emit a
826
- matching cell, spacer included). The B affordance keeps it ~1.3rem wide. */
830
+ /* The scope column (TB-Batch.md Invariant 7): a seventh track heading the control cluster (before
831
+ trust — a launch scope is an execution concern, like a trust tier), present only while some row
832
+ carries a scope (bulbsPill.ts anyScope — rows emit a matching cell, spacer included). The B
833
+ affordance keeps it one --pill-h square. */
827
834
  .bulb-list.has-scope { grid-template-columns: auto 1fr auto auto auto auto auto; }
828
835
  /* A stopped bulb's name isn't a link (no running URL), so it stays plain foreground. */
829
836
  .server-name.stopped { color: var(--fg); }
@@ -839,7 +846,11 @@ a.server-port:hover { text-decoration: underline; }
839
846
  the row shows THAT a scope applies, the tooltip and click-menu name it. Dim = batches exist but
840
847
  launch is unscoped; lit (.on) = play launches scoped (newest default) or running scoped.
841
848
  Static (running) keeps the lit look without the hand cursor. */
842
- .batch-b { font-size: .72rem; font-family: ui-monospace, monospace; line-height: 1; color: var(--muted); background: transparent; border: 1px solid var(--border); border-radius: 4px; width: 1.3rem; height: 1.15rem; padding: 0; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; }
849
+ /* Square (its one glyph has no text pill's width to earn) and otherwise typography-free: the shared
850
+ pill box, font and trim, so its B is the same size and sits on the same baseline as the trust
851
+ switch beside it. Its own font-family was the bug — a monospace cap is a different size from a
852
+ Segoe cap at one font-size, which reads as two badly-aligned widgets. */
853
+ .batch-b { font-size: var(--pill-font); color: var(--muted); background: transparent; border: 1px solid var(--border); border-radius: 5px; width: var(--pill-h); height: var(--pill-h); padding: 0; cursor: pointer; }
843
854
  .batch-b.on { color: var(--accent); border-color: var(--accent); }
844
855
  .batch-b.static { cursor: default; }
845
856
  /* The B's menu rides the composer popup register (.at-popup/.at-row/.dlg-catcher — one mini-menu
@@ -876,18 +887,21 @@ a.server-port:hover { text-decoration: underline; }
876
887
  .bulb-list .picker-snippet { grid-column: 2 / -1; margin: 0 .4rem .2rem 0; }
877
888
  .bulb-time { color: var(--muted); font-size: .72rem; font-variant-numeric: tabular-nums; text-align: right; margin-right: .4rem; }
878
889
  /* The row's chrome buttons share one reset; sizing + colour differ below. Play/stop are round icon
879
- buttons (friendlier, space-economic); the trust switch is text. Logs is a link, not a button
880
- (see .server-logs above), so it's not in this group. */
890
+ buttons (friendlier, space-economic) and stay flex — a replaced SVG mis-seats under the
891
+ word-pill trim, the .pill.glyph case; the trust switch is a word, so it seats via the shared
892
+ recipe. Logs is a link, not a button (see .server-logs above), so it's not in this group. */
881
893
  .server-stop, .bulb-launch, .trust-toggle {
882
894
  font: inherit; appearance: none; margin: 0; cursor: pointer; box-sizing: border-box;
883
895
  background: transparent; border: 1px solid var(--border); border-radius: 5px;
884
- height: 1.7rem; display: inline-flex; align-items: center; justify-content: center;
896
+ height: 1.7rem;
885
897
  }
886
898
  /* Shorter than the icon buttons: a bordered text pill at full row height reads as cramped, where
887
- the round play/stop icons are meant to fill it. */
888
- .trust-toggle { font-size: .76rem; height: 1.45rem; padding: 0 .5rem; color: var(--muted); justify-self: center; }
899
+ the round play/stop icons are meant to fill it. The shared pill box + font, not a bespoke pair —
900
+ its own .76rem/1.45rem seated the word a full 1px below every statusbar pill, which is exactly how
901
+ this drifts (measured: a per-control size is a per-control seating). */
902
+ .trust-toggle { font-size: var(--pill-font); height: var(--pill-h); padding: 0 .5rem; color: var(--muted); justify-self: center; }
889
903
  .trust-toggle:hover, .trust-toggle.on { color: var(--accent); border-color: var(--accent); }
890
- .server-stop, .bulb-launch { width: 1.7rem; padding: 0; border-radius: 50%; margin-left: .4rem; }
904
+ .server-stop, .bulb-launch { display: inline-flex; align-items: center; justify-content: center; width: 1.7rem; padding: 0; border-radius: 50%; margin-left: .4rem; }
891
905
  .btn-icon { width: 16px; height: 16px; }
892
906
  /* A stopped bulb's play button is dormant — the title is the primary launch target — so it's
893
907
  hidden until the row is hovered or keyboard-selected. visibility (not display) reserves its slot,
@@ -895,9 +909,10 @@ a.server-port:hover { text-decoration: underline; }
895
909
  :port link: green is the live-app axis (play to launch → :port to open it), distinct from the
896
910
  blue source/name. The green even travels left→right as a bulb goes stopped→running. */
897
911
  .bulb-launch { color: var(--fold-marker); visibility: hidden; }
898
- /* A right triangle's visual mass sits left of its bounding box, so geometric centring reads
899
- too-far-left in a round button — shift the play glyph. */
900
- .bulb-launch .icon svg { transform: translateX(1px); }
912
+ /* No optical nudge on the play glyph, deliberately: Material's play_arrow already carries one (its
913
+ path spans 320→760 in a 0→960 frame — ~1px right at icon size, compensating a right triangle's
914
+ left-leaning mass). Our own translateX(1px) stacked a second correction and measured 2px right of
915
+ the button's centre. Any glyph that reads off-centre here is the frame's business, not the app's. */
901
916
  .server-row:hover .bulb-launch, .server-row.active .bulb-launch { visibility: visible; }
902
917
  .bulb-launch:hover { border-color: var(--fold-marker); background: color-mix(in srgb, var(--fold-marker) 12%, transparent); }
903
918
  /* Launching: stays visible (hover-independent) and shimmers until the row flips to a stop button,