typebulb 0.52.0 → 0.52.2

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.
@@ -161,13 +161,10 @@ body {
161
161
  /* `.on` latches the hover accent — the bar's only persistent state cue (every other
162
162
  pill accents on hover alone). */
163
163
  .pill:hover, .pill.on { border-color: var(--accent); color: var(--accent); }
164
- /* Square glyph pill (the prose-mode toggle): width pinned to the pill height rather than
165
- padding-driven — the bar's first non-word pill. The emoji can't take currentColor, so it
166
- carries state itself: grayscale at rest, color while hovered or on — filtered on the
167
- inner span, never the button, or it would wash the accent border too.
168
- Glyph content (emoji span / the Anthropic SVG) is vertically symmetric, so plain flex
169
- centering is exact for it — and cap/alphabetic trim mis-seats a replaced SVG (it trims to
170
- TEXT metrics), so opt glyph pills back out of the word-pill recipe. */
164
+ /* Square glyph pill: width pinned to the pill height rather than padding-driven. Glyph content
165
+ (emoji span / the Anthropic SVG) is vertically symmetric, so plain flex centering is exact for it
166
+ — and cap/alphabetic trim mis-seats a replaced SVG (it trims to TEXT metrics), so opt glyph pills
167
+ back out of the word-pill recipe. */
171
168
  .pill.glyph {
172
169
  display: inline-flex;
173
170
  align-items: center;
@@ -320,19 +317,25 @@ body {
320
317
  -webkit-text-fill-color: transparent;
321
318
  }
322
319
  .shimmer-slow { --shimmer-speed: 7s; }
320
+ /* Summary's text-only working cue sits on a white surface in the light theme. Widen and deepen its
321
+ blue sweep there so the seven-second motion remains plainly visible; dark's calibrated treatment
322
+ stays untouched. */
323
+ html:not([data-theme="dark"]) .turn-view > .shimmer-text {
324
+ background-image: linear-gradient(100deg, currentColor 20%, var(--accent) 40%, color-mix(in srgb, var(--accent) 70%, var(--fg)) 50%, var(--accent) 60%, currentColor 80%) !important;
325
+ }
323
326
  @keyframes bulb-shimmer { from { background-position: 250% 0; } to { background-position: -250% 0; } }
324
327
  @media (prefers-reduced-motion: reduce) {
325
328
  .shimmer { animation: none !important; background: color-mix(in srgb, var(--accent) 15%, var(--shimmer-base, transparent)) !important; }
326
329
  .shimmer-text { animation: none !important; background: none !important; -webkit-text-fill-color: currentColor; }
327
330
  }
328
331
 
329
- /* CC mid-turn: the token pill doubles as the working indicator — an accent shimmer
330
- over the chip, the count frozen until the turn flushes. Passive — driven by the
331
- live-chain leaf, not a live token stream (the JSONL is flushed in batches, so this
332
- can sit lit through a multi-minute buffering window — hence shimmer-slow). The sweep
333
- blends with --panel, not transparent like the launch buttons': statusbar pills must
334
- stay opaque over the message text the strip lets through. */
335
- .token.busy { border-color: var(--accent); --shimmer-base: var(--panel); --shimmer-mix: 25%; }
332
+ /* THE WORKING STATE for an opaque word pill — the token chip mid-turn. Only the shimmer's knobs live
333
+ here; the sweep itself is the shared .shimmer above, composed by `busyPill()` (ui.ts) so a new busy
334
+ pill cannot land at its own speed or its own base colour. The sweep blends with --panel, not
335
+ transparent like the launch buttons': a word pill sits over message text and must keep covering it.
336
+ shimmer-slow because these can sit lit for minutes (the JSONL flushes in batches, so the token chip
337
+ rides a whole buffering window). */
338
+ .pill-busy { border-color: var(--accent); --shimmer-base: var(--panel); --shimmer-mix: 25%; }
336
339
 
337
340
  /* ── The composer (TB-Agent-Composer.md): the prompt panel under the transcript. In flow (not
338
341
  overlaid like the statusbar) — it owns real height and must never cover content. ── */
@@ -701,8 +704,8 @@ body {
701
704
  .reasoning-select:hover { border-color: var(--accent); }
702
705
  .reasoning-select:focus { outline: none; border-color: var(--accent); }
703
706
 
704
- /* The Anthropic brand glyph stands in for the word on the default pill (same square footprint as the
705
- prose toggle). currentColor tracks the pill's muted→accent state; grayscale at rest like the monkey. */
707
+ /* The Anthropic brand glyph stands in for the word on the default pill. currentColor tracks the
708
+ pill's muted→accent state; grayscale at rest like the other compact glyph controls. */
706
709
  .anthropic-glyph { display: block; }
707
710
  .pill.glyph .anthropic-glyph { filter: grayscale(1); opacity: .8; }
708
711
  .pill.glyph:hover .anthropic-glyph { filter: none; opacity: 1; }
@@ -1013,6 +1016,19 @@ a.server-port:hover { text-decoration: underline; }
1013
1016
  .trust-modal-h { font-size: 1rem; font-weight: 600; color: var(--fg); }
1014
1017
  .trust-modal-b { font-size: .85rem; color: var(--fg); line-height: 1.45; }
1015
1018
  .trust-modal-warn { font-size: .78rem; color: var(--muted); line-height: 1.4; }
1019
+ /* Summary’s first-use setup is deliberately informational: the normal interruption chrome makes
1020
+ the compact .env recipe legible without pretending the reader made a risky choice. */
1021
+ .summary-setup { width: min(390px, 100%); }
1022
+ .summary-setup-keys {
1023
+ padding: .55rem .65rem;
1024
+ border: 1px solid var(--border);
1025
+ border-radius: 7px;
1026
+ background: var(--bg);
1027
+ color: var(--fg);
1028
+ font: .78rem/1.6 ui-monospace, Menlo, Consolas, monospace;
1029
+ white-space: pre-line;
1030
+ user-select: text;
1031
+ }
1016
1032
  .trust-modal-acts { display: flex; justify-content: flex-end; gap: .5rem; margin-top: .2rem; }
1017
1033
  .trust-no, .trust-yes {
1018
1034
  font: inherit; font-size: .82rem; appearance: none; margin: 0; cursor: pointer;
@@ -1100,10 +1116,10 @@ a.server-port:hover { text-decoration: underline; }
1100
1116
  .gitdiff-close { flex: none; display: inline-flex; padding: 0 .15rem; color: var(--muted); }
1101
1117
  .gitdiff-close .icon { width: 10px; height: 10px; }
1102
1118
  .gitdiff-close:hover { color: var(--accent); }
1103
- /* Doc open ⇒ the transcript-scoped pills hide: prose toggle, model switcher, session picker all act
1104
- on the conversation, which isn't on screen (the token pill stays — its shimmer says the live diff
1105
- may still grow). display only, never unmount — the model pill's superSelect must keep its mount. */
1106
- .statusbar-actions.doc-open :is(.prose-pill, .model-wrap, .sid-wrap) { display: none; }
1119
+ /* Doc open ⇒ transcript-scoped pills hide: model switcher and session picker act on a conversation
1120
+ that is not on screen (the token pill stays — its shimmer says the live diff may still grow).
1121
+ Display only, never unmount — the model pill's superSelect must keep its mount. */
1122
+ .statusbar-actions.doc-open :is(.model-wrap, .sid-wrap) { display: none; }
1107
1123
 
1108
1124
  /* The diff doc — takes the transcript's slot in .chat (same flex geometry as .messages). Full-bleed
1109
1125
  like a code surface (no --content-max column: diff lines want the width); the body is the scroll
@@ -1870,8 +1886,18 @@ html[data-theme="dark"] .masthead-logo.dark { display: block; }
1870
1886
  (#draftThinkingPre). Durable rows stay uncapped: finished thinking IS reading material. */
1871
1887
  .draft .thinking pre { max-height: 220px; overflow-y: auto; }
1872
1888
 
1873
- /* Copy button: an .overlay-pill revealed on bubble-hover. */
1874
- .bubble:hover .copy { opacity: 1; }
1889
+ /* The bubble's hover-revealed copy-pill row. The direct-child reveal avoids firing an inline bulb's
1890
+ own controls when the reader merely hovers the outer assistant bubble. */
1891
+ .bubble-controls {
1892
+ position: absolute;
1893
+ bottom: .5rem;
1894
+ right: 0; /* flush with the content column's right edge (prose / statusbar pills) */
1895
+ display: flex;
1896
+ gap: .4rem;
1897
+ }
1898
+ .bubble-controls .overlay-pill { position: static; }
1899
+ .bubble:hover > .bubble-controls .overlay-pill,
1900
+ .bubble-controls .overlay-pill:focus-visible { opacity: 1; }
1875
1901
  /* "copied" flash: eases into accent on click (CopyButton is a Component, so its
1876
1902
  node persists across re-renders and the transition actually runs). The color
1877
1903
  transition lives only on .done, not the base pill, so hover stays instant — the
@@ -1884,4 +1910,33 @@ html[data-theme="dark"] .masthead-logo.dark { display: block; }
1884
1910
  }
1885
1911
  /* Assistant bubbles carry no padding, so the shared .5rem bottom would float the
1886
1912
  pill above the last line — pin it to the text's bottom edge. */
1887
- .bubble.assistant .copy { bottom: 0; }
1913
+ .bubble.assistant > .bubble-controls { bottom: 0; }
1914
+
1915
+ /* A turn's local representation selector (turnView.ts). It is a tab bar made of restrained
1916
+ hyperlink-like buttons, not pills: Raw is the full chronological trace for one turn, Reply is its
1917
+ exact prose, and Summary is the generated compression. Normal flow above the selected body means
1918
+ every switch resizes only below itself. */
1919
+ .turn-views-row {
1920
+ display: flex;
1921
+ align-items: baseline;
1922
+ gap: .35rem;
1923
+ margin: 0 0 .35rem;
1924
+ font-size: .8rem;
1925
+ line-height: 1.3;
1926
+ }
1927
+ .turn-view {
1928
+ appearance: none;
1929
+ margin: 0;
1930
+ padding: 0;
1931
+ border: 0;
1932
+ border-bottom: 1px solid transparent;
1933
+ background: none;
1934
+ color: var(--muted);
1935
+ font: inherit;
1936
+ cursor: pointer;
1937
+ }
1938
+ .turn-view:hover, .turn-view.on { color: var(--accent); }
1939
+ .turn-view.on { border-bottom-color: var(--accent); }
1940
+ .turn-view.err { color: var(--err); }
1941
+ .turn-view:focus-visible { outline: 1px solid var(--accent); outline-offset: 2px; border-radius: 2px; }
1942
+ .turn-view-sep { color: var(--border); user-select: none; }