@joewinke/jatui 0.38.5 → 0.39.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 (67) hide show
  1. package/CLAUDE.md +32 -1
  2. package/THIRD_PARTY_NOTICES.md +51 -0
  3. package/dist/components/BulkActionBar.svelte +32 -2
  4. package/dist/components/BulkActionBar.svelte.d.ts +5 -1
  5. package/dist/components/FloatingActionBar.svelte +102 -34
  6. package/dist/components/FloatingActionBar.svelte.d.ts +9 -0
  7. package/dist/components/MediaExplorer.svelte +249 -0
  8. package/dist/components/MediaExplorer.svelte.d.ts +37 -0
  9. package/dist/components/NotificationCenter.svelte +481 -0
  10. package/dist/components/NotificationCenter.svelte.d.ts +29 -0
  11. package/dist/components/SearchDropdown.svelte +54 -8
  12. package/dist/components/SearchDropdown.svelte.d.ts +12 -0
  13. package/dist/components/VideoPlayer.svelte +269 -3
  14. package/dist/components/agent/AgentLog.svelte +217 -0
  15. package/dist/components/agent/AgentLog.svelte.d.ts +72 -0
  16. package/dist/components/agent/AgentLogRow.svelte +281 -0
  17. package/dist/components/agent/AgentLogRow.svelte.d.ts +21 -0
  18. package/dist/components/agent/AgentTaskList.svelte +607 -0
  19. package/dist/components/agent/AgentTaskList.svelte.d.ts +40 -0
  20. package/dist/components/agent/AgentThinking.svelte +280 -0
  21. package/dist/components/agent/AgentThinking.svelte.d.ts +22 -0
  22. package/dist/components/agent/ComposerGlow.svelte +265 -0
  23. package/dist/components/agent/ComposerGlow.svelte.d.ts +18 -0
  24. package/dist/components/agent/ContextMeter.svelte +277 -0
  25. package/dist/components/agent/ContextMeter.svelte.d.ts +21 -0
  26. package/dist/components/agent/Questionnaire.svelte +767 -0
  27. package/dist/components/agent/Questionnaire.svelte.d.ts +29 -0
  28. package/dist/components/agent/ShimmerText.svelte +100 -0
  29. package/dist/components/agent/ShimmerText.svelte.d.ts +19 -0
  30. package/dist/components/agent/StreamedText.svelte +135 -0
  31. package/dist/components/agent/StreamedText.svelte.d.ts +13 -0
  32. package/dist/components/agent/agentLog.d.ts +22 -0
  33. package/dist/components/agent/agentLog.js +26 -0
  34. package/dist/components/agent/agentTaskList.d.ts +90 -0
  35. package/dist/components/agent/agentTaskList.js +93 -0
  36. package/dist/components/agent/agentThinking.d.ts +46 -0
  37. package/dist/components/agent/agentThinking.js +78 -0
  38. package/dist/components/agent/contextMeter.d.ts +97 -0
  39. package/dist/components/agent/contextMeter.js +156 -0
  40. package/dist/components/agent/questionnaire.d.ts +104 -0
  41. package/dist/components/agent/questionnaire.js +225 -0
  42. package/dist/components/agent/revealCore.d.ts +74 -0
  43. package/dist/components/agent/revealCore.js +160 -0
  44. package/dist/components/agent/revealTicker.d.ts +34 -0
  45. package/dist/components/agent/revealTicker.js +73 -0
  46. package/dist/components/agent/streamedText.d.ts +28 -0
  47. package/dist/components/agent/streamedText.js +59 -0
  48. package/dist/components/messaging/MessageInput.svelte +34 -4
  49. package/dist/components/messaging/MessageInput.svelte.d.ts +7 -0
  50. package/dist/components/messaging/MessageItem.svelte +2 -2
  51. package/dist/components/notificationCenter.d.ts +65 -0
  52. package/dist/components/notificationCenter.js +110 -0
  53. package/dist/components/progress/Steps.svelte +269 -5
  54. package/dist/components/progress/Steps.svelte.d.ts +16 -1
  55. package/dist/components/progress/stepsSummary.d.ts +14 -0
  56. package/dist/components/progress/stepsSummary.js +32 -0
  57. package/dist/index.d.ts +34 -0
  58. package/dist/index.js +29 -0
  59. package/dist/selection/clickSelection.d.ts +89 -0
  60. package/dist/selection/clickSelection.js +152 -0
  61. package/dist/selection/createClickSelection.d.ts +79 -0
  62. package/dist/selection/createClickSelection.js +134 -0
  63. package/dist/video/keys.d.ts +5 -5
  64. package/dist/video/keys.js +9 -5
  65. package/dist/video/transcriptSearch.d.ts +80 -0
  66. package/dist/video/transcriptSearch.js +153 -0
  67. package/package.json +3 -2
@@ -0,0 +1,277 @@
1
+ <!--
2
+ ContextMeter — a context-window meter segmented by token bucket.
3
+
4
+ A stacked bar (one segment per bucket, palette-coloured from theme tokens)
5
+ with the free space as the remaining track, a "820k / 1M (82%)" total line,
6
+ and an expand button that reveals a per-bucket <table> breakdown including
7
+ "Free space". Deferred buckets are listed with a dash and count for nothing
8
+ — they are neither drawn in the bar nor added to the total. Segments may
9
+ carry `group` to fold under a collapsible header row in the breakdown.
10
+ Tints warning at `warnAt`, error at >= 100%. Math lives in contextMeter.ts.
11
+
12
+ Clean-room implementation (behaviour description only).
13
+ -->
14
+ <script lang="ts">
15
+ import { SvelteSet } from 'svelte/reactivity';
16
+ import { motionSlide } from '../../motion';
17
+ import {
18
+ buildBreakdown,
19
+ computeContextMeter,
20
+ formatCompact,
21
+ formatPercent,
22
+ meterValueText,
23
+ type ContextGroup,
24
+ type ContextSegment,
25
+ type MeterSegment
26
+ } from './contextMeter';
27
+
28
+ interface Props {
29
+ /** Context window size. */
30
+ max: number;
31
+ segments: ContextSegment[];
32
+ /** Labels / initial fold state for the `group` ids segments carry. */
33
+ groups?: ContextGroup[];
34
+ label?: string;
35
+ /** Unit noun for the breakdown header and screen-reader text. */
36
+ unit?: string;
37
+ /** Breakdown open (bindable). */
38
+ expanded?: boolean;
39
+ /** Fraction (0..1) at which the meter turns warning. Default 0.8. */
40
+ warnAt?: number;
41
+ /** Hide the expand button (bar + total only). */
42
+ collapsible?: boolean;
43
+ class?: string;
44
+ }
45
+
46
+ let {
47
+ max,
48
+ segments,
49
+ groups = [],
50
+ label = 'Context',
51
+ unit = 'tokens',
52
+ expanded = $bindable(false),
53
+ warnAt = 0.8,
54
+ collapsible = true,
55
+ class: className = ''
56
+ }: Props = $props();
57
+
58
+ const uid = $props.id();
59
+
60
+ const model = $derived(computeContextMeter(max, segments, warnAt));
61
+ const rows = $derived(buildBreakdown(model, groups));
62
+ const barSegments = $derived(model.segments.filter((s) => !s.deferred && s.width > 0));
63
+ const valueText = $derived(meterValueText(model, unit));
64
+ const totalText = $derived(
65
+ `${formatCompact(model.used)} / ${formatCompact(model.max)} (${formatPercent(model.ratio)})`
66
+ );
67
+ const toneText = $derived(
68
+ model.tone === 'error' ? 'text-error' : model.tone === 'warning' ? 'text-warning' : 'text-base-content/70'
69
+ );
70
+
71
+ // svelte-ignore state_referenced_locally
72
+ const openGroups = new SvelteSet<string>(groups.filter((g) => g.defaultExpanded).map((g) => g.id));
73
+ function toggleGroup(id: string) {
74
+ if (openGroups.has(id)) openGroups.delete(id);
75
+ else openGroups.add(id);
76
+ }
77
+
78
+ const segTitle = (s: MeterSegment) =>
79
+ `${s.label}: ${formatCompact(s.tokens)} (${formatPercent(s.share)})`;
80
+ </script>
81
+
82
+ <div class="cm flex min-w-48 flex-col gap-1.5 {className}" data-tone={model.tone}>
83
+ <div class="flex items-baseline justify-between gap-3 text-xs">
84
+ <span id="{uid}-label" class="font-medium">{label}</span>
85
+ <span class="tabular-nums {toneText}" aria-hidden="true">{totalText}</span>
86
+ </div>
87
+
88
+ <div
89
+ class="cm-bar flex h-2 w-full overflow-hidden"
90
+ role="meter"
91
+ aria-labelledby="{uid}-label"
92
+ aria-valuemin={0}
93
+ aria-valuemax={model.max}
94
+ aria-valuenow={Math.min(model.used, model.max)}
95
+ aria-valuetext={valueText}
96
+ >
97
+ {#each barSegments as seg (seg.key)}
98
+ <span class="cm-seg h-full" style:width="{seg.width}%" style:background={seg.color} title={segTitle(seg)}
99
+ ></span>
100
+ {/each}
101
+ </div>
102
+
103
+ {#if collapsible}
104
+ <button
105
+ type="button"
106
+ class="cm-toggle rounded-field text-base-content/60 hover:text-base-content inline-flex w-fit items-center gap-1 text-xs"
107
+ aria-expanded={expanded}
108
+ aria-controls="{uid}-breakdown"
109
+ onclick={() => (expanded = !expanded)}
110
+ >
111
+ <svg
112
+ class="cm-chevron size-3"
113
+ class:cm-chevron-open={expanded}
114
+ viewBox="0 0 16 16"
115
+ fill="none"
116
+ stroke="currentColor"
117
+ stroke-width="1.8"
118
+ stroke-linecap="round"
119
+ stroke-linejoin="round"
120
+ aria-hidden="true"><path d="m6 4 4 4-4 4" /></svg
121
+ >
122
+ {expanded ? 'Hide breakdown' : 'Show breakdown'}
123
+ </button>
124
+ {/if}
125
+
126
+ <div id="{uid}-breakdown">
127
+ {#if collapsible && expanded}
128
+ <div transition:motionSlide>
129
+ <table class="table-xs table w-full">
130
+ <caption class="sr-only">{label} breakdown</caption>
131
+ <thead>
132
+ <tr>
133
+ <th scope="col">Bucket</th>
134
+ <th scope="col" class="text-right capitalize">{unit || 'Amount'}</th>
135
+ <th scope="col" class="text-right">Share</th>
136
+ </tr>
137
+ </thead>
138
+ {#each rows as row (row.kind === 'group' ? `g:${row.id}` : row.segment.key)}
139
+ {#if row.kind === 'segment'}
140
+ <tbody>{@render segmentRow(row.segment, false)}</tbody>
141
+ {:else}
142
+ {@const open = openGroups.has(row.id)}
143
+ <tbody>
144
+ <tr>
145
+ <th scope="rowgroup" class="font-medium">
146
+ <button
147
+ type="button"
148
+ class="cm-toggle rounded-field inline-flex items-center gap-1"
149
+ aria-expanded={open}
150
+ onclick={() => toggleGroup(row.id)}
151
+ >
152
+ <svg
153
+ class="cm-chevron size-3"
154
+ class:cm-chevron-open={open}
155
+ viewBox="0 0 16 16"
156
+ fill="none"
157
+ stroke="currentColor"
158
+ stroke-width="1.8"
159
+ stroke-linecap="round"
160
+ stroke-linejoin="round"
161
+ aria-hidden="true"><path d="m6 4 4 4-4 4" /></svg
162
+ >
163
+ {row.label}
164
+ <span class="text-base-content/50 font-normal">({row.members.length})</span>
165
+ </button>
166
+ </th>
167
+ {#if row.allDeferred}
168
+ <td class="text-base-content/50 text-right"
169
+ ><span aria-hidden="true">—</span><span class="sr-only">deferred, not counted</span></td
170
+ >
171
+ <td class="text-base-content/50 text-right"><span aria-hidden="true">—</span></td>
172
+ {:else}
173
+ <td class="text-right tabular-nums">{formatCompact(row.tokens)}</td>
174
+ <td class="text-right tabular-nums">{formatPercent(row.share)}</td>
175
+ {/if}
176
+ </tr>
177
+ {#if open}
178
+ {#each row.members as m (m.key)}
179
+ {@render segmentRow(m, true)}
180
+ {/each}
181
+ {/if}
182
+ </tbody>
183
+ {/if}
184
+ {/each}
185
+ <tbody>
186
+ <tr>
187
+ <th scope="row" class="font-normal">
188
+ <span class="inline-flex items-center gap-2">
189
+ <span class="cm-swatch cm-swatch-free" aria-hidden="true"></span>
190
+ Free space
191
+ </span>
192
+ </th>
193
+ <td class="text-right tabular-nums">{formatCompact(model.free)}</td>
194
+ <td class="text-right tabular-nums"
195
+ >{formatPercent(model.max > 0 ? model.free / model.max : 0)}</td
196
+ >
197
+ </tr>
198
+ </tbody>
199
+ </table>
200
+ </div>
201
+ {/if}
202
+ </div>
203
+ </div>
204
+
205
+ {#snippet segmentRow(seg: MeterSegment, nested: boolean)}
206
+ <tr>
207
+ <th scope="row" class="font-normal" class:pl-8={nested}>
208
+ <span class="inline-flex items-center gap-2" class:text-base-content={!seg.deferred}>
209
+ <span
210
+ class="cm-swatch"
211
+ class:cm-swatch-deferred={seg.deferred}
212
+ style:background={seg.deferred ? undefined : seg.color}
213
+ aria-hidden="true"
214
+ ></span>
215
+ <span class:opacity-60={seg.deferred}>{seg.label}</span>
216
+ {#if seg.deferred}<span class="badge badge-ghost badge-xs">deferred</span>{/if}
217
+ </span>
218
+ </th>
219
+ {#if seg.deferred}
220
+ <td class="text-base-content/50 text-right"
221
+ ><span aria-hidden="true">—</span><span class="sr-only">deferred, not counted</span></td
222
+ >
223
+ <td class="text-base-content/50 text-right"><span aria-hidden="true">—</span></td>
224
+ {:else}
225
+ <td class="text-right tabular-nums" title={seg.tokens.toLocaleString()}>{formatCompact(seg.tokens)}</td>
226
+ <td class="text-right tabular-nums">{formatPercent(seg.share)}</td>
227
+ {/if}
228
+ </tr>
229
+ {/snippet}
230
+
231
+ <style>
232
+ .cm-bar {
233
+ gap: 1px;
234
+ border-radius: var(--jatui-radius-selector);
235
+ background: var(--color-base-300);
236
+ }
237
+ .cm[data-tone='warning'] .cm-bar {
238
+ box-shadow: 0 0 0 1px color-mix(in oklab, var(--color-warning) 55%, transparent);
239
+ }
240
+ .cm[data-tone='error'] .cm-bar {
241
+ box-shadow: 0 0 0 1px var(--color-error);
242
+ background: color-mix(in oklab, var(--color-error) 20%, var(--color-base-300));
243
+ }
244
+ .cm-seg {
245
+ flex: none;
246
+ transition: width var(--motion-move, 300ms) var(--motion-standard, ease);
247
+ }
248
+ .cm-swatch {
249
+ display: inline-block;
250
+ width: 0.625rem;
251
+ height: 0.625rem;
252
+ flex: none;
253
+ border-radius: 2px;
254
+ }
255
+ .cm-swatch-free {
256
+ background: var(--color-base-300);
257
+ }
258
+ .cm-swatch-deferred {
259
+ border: 1px dashed color-mix(in oklab, var(--color-base-content) 40%, transparent);
260
+ }
261
+ .cm-chevron {
262
+ transition: transform var(--motion-fast, 150ms) var(--motion-glide, ease-out);
263
+ }
264
+ .cm-chevron-open {
265
+ transform: rotate(90deg);
266
+ }
267
+ .cm-toggle:focus-visible {
268
+ outline: 2px solid var(--color-primary);
269
+ outline-offset: 2px;
270
+ }
271
+ @media (prefers-reduced-motion: reduce) {
272
+ .cm-seg,
273
+ .cm-chevron {
274
+ transition: none;
275
+ }
276
+ }
277
+ </style>
@@ -0,0 +1,21 @@
1
+ import { type ContextGroup, type ContextSegment } from './contextMeter';
2
+ interface Props {
3
+ /** Context window size. */
4
+ max: number;
5
+ segments: ContextSegment[];
6
+ /** Labels / initial fold state for the `group` ids segments carry. */
7
+ groups?: ContextGroup[];
8
+ label?: string;
9
+ /** Unit noun for the breakdown header and screen-reader text. */
10
+ unit?: string;
11
+ /** Breakdown open (bindable). */
12
+ expanded?: boolean;
13
+ /** Fraction (0..1) at which the meter turns warning. Default 0.8. */
14
+ warnAt?: number;
15
+ /** Hide the expand button (bar + total only). */
16
+ collapsible?: boolean;
17
+ class?: string;
18
+ }
19
+ declare const ContextMeter: import("svelte").Component<Props, {}, "expanded">;
20
+ type ContextMeter = ReturnType<typeof ContextMeter>;
21
+ export default ContextMeter;