@workerdeck/ui 2.10.0 → 2.12.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.
Files changed (37) hide show
  1. package/build/{SessionPanel-BVbau2eR.d.mts → SessionPanel-CJwp5B3q.d.mts} +8 -3
  2. package/build/index.d.mts +39 -20
  3. package/build/index.mjs +119 -52
  4. package/build/index.mjs.map +1 -1
  5. package/build/scoped.css +60 -11
  6. package/build/{use-path-links-CvcxdUXL.mjs → use-path-links-CepFsMdW.mjs} +541 -254
  7. package/build/use-path-links-CepFsMdW.mjs.map +1 -0
  8. package/build/workspace.d.mts +1 -1
  9. package/build/workspace.mjs +1 -1
  10. package/package.json +4 -4
  11. package/src/components/agent/Composer.tsx +28 -5
  12. package/src/components/agent/PromptTokenText.tsx +9 -1
  13. package/src/components/agent/SessionBrowser.tsx +17 -1
  14. package/src/components/agent/SessionItem.tsx +10 -26
  15. package/src/components/agent/SessionPanel.tsx +12 -0
  16. package/src/components/agent/SessionSteps.tsx +15 -55
  17. package/src/components/agent/SubagentToggle.tsx +69 -0
  18. package/src/components/agent/Transcript.tsx +91 -80
  19. package/src/components/agent/TranscriptItemView.tsx +2 -0
  20. package/src/components/agent/TranscriptRows.tsx +60 -56
  21. package/src/components/agent/UsageDialog.tsx +19 -6
  22. package/src/components/agent/composer-commands.ts +18 -0
  23. package/src/components/agent/pulse.tsx +53 -16
  24. package/src/components/agent/use-transcript-jumps.ts +25 -0
  25. package/src/components/terminal/TerminalTranscript.tsx +31 -27
  26. package/src/components/terminal/blocks.ts +15 -7
  27. package/src/components/terminal/height.ts +14 -5
  28. package/src/components/terminal/items.tsx +97 -11
  29. package/src/components/terminal/peer-names.tsx +16 -0
  30. package/src/components/terminal/row.tsx +1 -1
  31. package/src/components/terminal/tool-run.ts +68 -0
  32. package/src/index.ts +10 -2
  33. package/src/lib/session-cost.ts +12 -2
  34. package/src/lib/tool-icon.ts +5 -1
  35. package/src/styles/terminal.css +102 -1
  36. package/src/styles/theme.css +1 -1
  37. package/build/use-path-links-CvcxdUXL.mjs.map +0 -1
@@ -79,11 +79,24 @@
79
79
  --term-faint: #6a6a6a;
80
80
 
81
81
  --term-mark: #d97757;
82
+ /* The working mark in motion. Five stops travelling violet to cyan and back,
83
+ lifted from box's `paint()` so an in-progress line reads the same here as
84
+ it does in the terminal. Deliberately not the clay accent: the mark states
85
+ whose turn it is, the shimmer states that something is still moving. */
86
+ --term-shimmer-1: #c5a3e8;
87
+ --term-shimmer-2: #a3a4e8;
88
+ --term-shimmer-3: #7b7ef5;
89
+ --term-shimmer-4: #8aaeea;
90
+ --term-shimmer-5: #a8e5ed;
82
91
  --term-blue: #afb9fe;
83
92
  --term-green: #4ec9a0;
84
93
  --term-red: #f14c4c;
85
94
  --term-yellow: #d7ba7d;
86
95
  --term-magenta: #c586c0;
96
+ /* Peer traffic - a message from or to another session. Cyan is the one ANSI slot
97
+ the theme had left, and peer rows must not be confusable with a tool call
98
+ (blue), a success (green) or a wait (yellow). */
99
+ --term-peer: #56d4dd;
87
100
 
88
101
  /* Diff bands. Full-bleed backgrounds, so they are tuned to sit under body
89
102
  text rather than to be looked at: the CLI's added block is a dark green
@@ -118,11 +131,19 @@
118
131
  --term-faint: #8d8d8d;
119
132
 
120
133
  --term-mark: #bf5b3d;
134
+ /* Same five stops walked down for a light ground; the dark set's cyan is
135
+ invisible on white. */
136
+ --term-shimmer-1: #7a4fb0;
137
+ --term-shimmer-2: #5457b8;
138
+ --term-shimmer-3: #4347c9;
139
+ --term-shimmer-4: #3f6fb5;
140
+ --term-shimmer-5: #1f7d8c;
121
141
  --term-blue: #0a66c2;
122
142
  --term-green: #16794a;
123
143
  --term-red: #c62828;
124
144
  --term-yellow: #8a6d00;
125
145
  --term-magenta: #8b3a8b;
146
+ --term-peer: #0e7490;
126
147
 
127
148
  --term-add-fg: #12492a;
128
149
  --term-add-bg: #e2f6e5;
@@ -262,6 +283,63 @@
262
283
  [data-terminal] [data-tone='magenta'] {
263
284
  color: var(--term-magenta);
264
285
  }
286
+ [data-terminal] [data-tone='peer'] {
287
+ color: var(--term-peer);
288
+ }
289
+
290
+ /* Work in progress. One element, never a span per character: the transcript
291
+ measures its own rows and supports text selection, and both break the moment
292
+ a line is shredded into glyphs. The tile is periodic (it ends on the colour
293
+ it starts on) and the animation travels exactly one tile width, so the loop
294
+ has no seam. Scoped under `[data-terminal]` to outrank the tone rules, which
295
+ would otherwise repaint the clipped text opaque. */
296
+ [data-terminal] .term-shimmer {
297
+ background-image: linear-gradient(
298
+ 90deg,
299
+ var(--term-shimmer-1),
300
+ var(--term-shimmer-2),
301
+ var(--term-shimmer-3),
302
+ var(--term-shimmer-4),
303
+ var(--term-shimmer-5),
304
+ var(--term-shimmer-4),
305
+ var(--term-shimmer-3),
306
+ var(--term-shimmer-2),
307
+ var(--term-shimmer-1)
308
+ );
309
+ background-size: 200% 100%;
310
+ -webkit-background-clip: text;
311
+ background-clip: text;
312
+ -webkit-text-fill-color: transparent;
313
+ color: transparent;
314
+ animation: term-shimmer 3s linear infinite;
315
+ }
316
+
317
+ @keyframes term-shimmer {
318
+ from {
319
+ background-position: 0% 0;
320
+ }
321
+ to {
322
+ background-position: 200% 0;
323
+ }
324
+ }
325
+
326
+ /* Clipped text with a transparent fill selects invisibly - the highlight paints
327
+ under glyphs that have no colour of their own. */
328
+ [data-terminal] .term-shimmer::selection {
329
+ color: var(--term-bright);
330
+ -webkit-text-fill-color: var(--term-bright);
331
+ }
332
+
333
+ @media (prefers-reduced-motion: reduce) {
334
+ [data-terminal] .term-shimmer {
335
+ animation: none;
336
+ background-image: none;
337
+ -webkit-background-clip: border-box;
338
+ background-clip: border-box;
339
+ -webkit-text-fill-color: var(--term-shimmer-3);
340
+ color: var(--term-shimmer-3);
341
+ }
342
+ }
265
343
 
266
344
  /* Weight is the only other axis. A terminal has one type size, so emphasis has
267
345
  to be carried by weight and colour - never by a larger glyph. */
@@ -411,6 +489,12 @@
411
489
  cursor: text;
412
490
  }
413
491
 
492
+ /* A peer's message is not what you typed, so it drops the prompt band: the peer
493
+ tone and the arrow carry it, and the band is reserved for the human's turn. */
494
+ [data-terminal] .term-user[data-peer] {
495
+ background: none;
496
+ }
497
+
414
498
  [data-terminal] .term-link {
415
499
  text-decoration: underline;
416
500
  text-underline-offset: 2px;
@@ -615,10 +699,18 @@ button.term-link {
615
699
  /* The head's own strip: the full lane, out of flow, so the head needs no
616
700
  footprint-cancelling margin - sticky confinement clamps the margin box, and
617
701
  a negative margin shrinks it to nothing, letting the head overshoot the
618
- lane's end by its own height (two pinned prompts on screen at once). */
702
+ lane's end by its own height (two pinned prompts on screen at once).
703
+
704
+ The z-index is what makes the head's ground actually cover: the row it
705
+ overlays is a later sibling and carries `term-hoverable`, which is
706
+ `position: relative` for the row actions, so at `z-index: auto` the row's
707
+ text painted OVER the pinned head and the two read as one line of overlap.
708
+ Raising the strip - inside the lane's own stacking context, so it still
709
+ sits under nothing else - puts it back above the row it is there to hide. */
619
710
  [data-terminal] [data-sticky-lane] > [data-sticky-headlane] {
620
711
  position: absolute;
621
712
  inset: 0;
713
+ z-index: 1;
622
714
  pointer-events: none;
623
715
  }
624
716
 
@@ -1130,6 +1222,15 @@ button.term-link {
1130
1222
  overflow: hidden;
1131
1223
  }
1132
1224
 
1225
+ /* A closed peer send: one row, ellipsised. The row must stay exactly one line
1226
+ tall or the virtualizer's estimate for it is wrong. */
1227
+ .term-clip-1 {
1228
+ display: block;
1229
+ overflow: hidden;
1230
+ white-space: nowrap;
1231
+ text-overflow: ellipsis;
1232
+ }
1233
+
1133
1234
  .term-scrubber .term-scrub-ex {
1134
1235
  display: -webkit-box;
1135
1236
  -webkit-line-clamp: 4;
@@ -271,7 +271,7 @@
271
271
  --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
272
272
 
273
273
  --cw-font-sans: 'Inter', system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
274
- --cw-font-mono: 'JetBrains Mono', ui-monospace, 'SF Mono', 'Cascadia Code', Menlo, Consolas, monospace;
274
+ --cw-font-mono: 'JetBrains Mono', ui-monospace, 'SF Mono', 'Cascadia Code', Menlo, Consolas, 'DejaVu Sans Mono', monospace;
275
275
 
276
276
  --motion-fast: 120ms;
277
277
  --motion-base: 150ms;