@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.
- package/CLAUDE.md +32 -1
- package/THIRD_PARTY_NOTICES.md +51 -0
- package/dist/components/BulkActionBar.svelte +32 -2
- package/dist/components/BulkActionBar.svelte.d.ts +5 -1
- package/dist/components/FloatingActionBar.svelte +102 -34
- package/dist/components/FloatingActionBar.svelte.d.ts +9 -0
- package/dist/components/MediaExplorer.svelte +249 -0
- package/dist/components/MediaExplorer.svelte.d.ts +37 -0
- package/dist/components/NotificationCenter.svelte +481 -0
- package/dist/components/NotificationCenter.svelte.d.ts +29 -0
- package/dist/components/SearchDropdown.svelte +54 -8
- package/dist/components/SearchDropdown.svelte.d.ts +12 -0
- package/dist/components/VideoPlayer.svelte +269 -3
- package/dist/components/agent/AgentLog.svelte +217 -0
- package/dist/components/agent/AgentLog.svelte.d.ts +72 -0
- package/dist/components/agent/AgentLogRow.svelte +281 -0
- package/dist/components/agent/AgentLogRow.svelte.d.ts +21 -0
- package/dist/components/agent/AgentTaskList.svelte +607 -0
- package/dist/components/agent/AgentTaskList.svelte.d.ts +40 -0
- package/dist/components/agent/AgentThinking.svelte +280 -0
- package/dist/components/agent/AgentThinking.svelte.d.ts +22 -0
- package/dist/components/agent/ComposerGlow.svelte +265 -0
- package/dist/components/agent/ComposerGlow.svelte.d.ts +18 -0
- package/dist/components/agent/ContextMeter.svelte +277 -0
- package/dist/components/agent/ContextMeter.svelte.d.ts +21 -0
- package/dist/components/agent/Questionnaire.svelte +767 -0
- package/dist/components/agent/Questionnaire.svelte.d.ts +29 -0
- package/dist/components/agent/ShimmerText.svelte +100 -0
- package/dist/components/agent/ShimmerText.svelte.d.ts +19 -0
- package/dist/components/agent/StreamedText.svelte +135 -0
- package/dist/components/agent/StreamedText.svelte.d.ts +13 -0
- package/dist/components/agent/agentLog.d.ts +22 -0
- package/dist/components/agent/agentLog.js +26 -0
- package/dist/components/agent/agentTaskList.d.ts +90 -0
- package/dist/components/agent/agentTaskList.js +93 -0
- package/dist/components/agent/agentThinking.d.ts +46 -0
- package/dist/components/agent/agentThinking.js +78 -0
- package/dist/components/agent/contextMeter.d.ts +97 -0
- package/dist/components/agent/contextMeter.js +156 -0
- package/dist/components/agent/questionnaire.d.ts +104 -0
- package/dist/components/agent/questionnaire.js +225 -0
- package/dist/components/agent/revealCore.d.ts +74 -0
- package/dist/components/agent/revealCore.js +160 -0
- package/dist/components/agent/revealTicker.d.ts +34 -0
- package/dist/components/agent/revealTicker.js +73 -0
- package/dist/components/agent/streamedText.d.ts +28 -0
- package/dist/components/agent/streamedText.js +59 -0
- package/dist/components/messaging/MessageInput.svelte +34 -4
- package/dist/components/messaging/MessageInput.svelte.d.ts +7 -0
- package/dist/components/messaging/MessageItem.svelte +2 -2
- package/dist/components/notificationCenter.d.ts +65 -0
- package/dist/components/notificationCenter.js +110 -0
- package/dist/components/progress/Steps.svelte +269 -5
- package/dist/components/progress/Steps.svelte.d.ts +16 -1
- package/dist/components/progress/stepsSummary.d.ts +14 -0
- package/dist/components/progress/stepsSummary.js +32 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.js +29 -0
- package/dist/selection/clickSelection.d.ts +89 -0
- package/dist/selection/clickSelection.js +152 -0
- package/dist/selection/createClickSelection.d.ts +79 -0
- package/dist/selection/createClickSelection.js +134 -0
- package/dist/video/keys.d.ts +5 -5
- package/dist/video/keys.js +9 -5
- package/dist/video/transcriptSearch.d.ts +80 -0
- package/dist/video/transcriptSearch.js +153 -0
- 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;
|