@cerebro-labs/agentnava-sdk 0.74.0 → 0.75.1
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/package.json +1 -1
- package/react.css +190 -25
- package/react.js +134 -22
- package/react.js.map +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.js.map +1 -1
package/package.json
CHANGED
package/react.css
CHANGED
|
@@ -12,17 +12,17 @@
|
|
|
12
12
|
--an-w-ink: #16181d;
|
|
13
13
|
--an-w-muted: #6b7280;
|
|
14
14
|
--an-w-line: #e5e7eb;
|
|
15
|
-
--an-w-surface: #
|
|
16
|
-
--an-w-tint: #
|
|
15
|
+
--an-w-surface: #f8f8f6;
|
|
16
|
+
--an-w-tint: #f1f0ec;
|
|
17
17
|
--an-w-accent: #1f2937;
|
|
18
18
|
--an-w-accent-ink: #ffffff;
|
|
19
|
-
--an-w-s0: #
|
|
20
|
-
--an-w-s1: #
|
|
21
|
-
--an-w-s2: #
|
|
22
|
-
--an-w-s3: #
|
|
23
|
-
--an-w-high: #
|
|
19
|
+
--an-w-s0: #2f6b55;
|
|
20
|
+
--an-w-s1: #b08a3e;
|
|
21
|
+
--an-w-s2: #4a6c8f;
|
|
22
|
+
--an-w-s3: #b4472f;
|
|
23
|
+
--an-w-high: #b4472f;
|
|
24
24
|
--an-w-medium: #d97706;
|
|
25
|
-
--an-w-good: #
|
|
25
|
+
--an-w-good: #3e7c59;
|
|
26
26
|
--an-w-info: #2563eb;
|
|
27
27
|
--an-w-radius: 8px;
|
|
28
28
|
}
|
|
@@ -156,23 +156,39 @@
|
|
|
156
156
|
.an-w-stat {
|
|
157
157
|
display: flex;
|
|
158
158
|
flex-direction: column;
|
|
159
|
-
gap:
|
|
160
|
-
padding:
|
|
161
|
-
border
|
|
162
|
-
|
|
159
|
+
gap: 4px;
|
|
160
|
+
padding: 18px 20px 16px;
|
|
161
|
+
border: 1px solid var(--an-w-line);
|
|
162
|
+
border-radius: 14px;
|
|
163
|
+
background: linear-gradient(180deg, #ffffff, var(--an-w-surface));
|
|
164
|
+
box-shadow: 0 1px 2px rgba(16, 16, 16, 0.04), 0 6px 18px rgba(16, 16, 16, 0.05);
|
|
163
165
|
}
|
|
164
|
-
.an-w-stat
|
|
165
|
-
font-size: 1.25em;
|
|
166
|
+
.an-w-stat span {
|
|
166
167
|
font-weight: 600;
|
|
167
|
-
font-
|
|
168
|
+
font-size: 0.95em;
|
|
169
|
+
color: var(--an-w-ink);
|
|
168
170
|
}
|
|
169
|
-
.an-w-stat
|
|
170
|
-
font-
|
|
171
|
+
.an-w-stat strong {
|
|
172
|
+
font-size: 2.1em;
|
|
173
|
+
line-height: 1.1;
|
|
174
|
+
font-weight: 700;
|
|
175
|
+
letter-spacing: -0.03em;
|
|
176
|
+
color: var(--an-w-ink);
|
|
177
|
+
font-variant-numeric: tabular-nums;
|
|
171
178
|
}
|
|
172
179
|
.an-w-stat small {
|
|
173
180
|
color: var(--an-w-muted);
|
|
174
|
-
font-size: 0.
|
|
175
|
-
line-height: 1.
|
|
181
|
+
font-size: 0.9em;
|
|
182
|
+
line-height: 1.35;
|
|
183
|
+
}
|
|
184
|
+
.an-w-stat small b {
|
|
185
|
+
font-weight: 600;
|
|
186
|
+
}
|
|
187
|
+
.an-w-stat small b.is-up {
|
|
188
|
+
color: var(--an-w-good);
|
|
189
|
+
}
|
|
190
|
+
.an-w-stat small b.is-down {
|
|
191
|
+
color: var(--an-w-high);
|
|
176
192
|
}
|
|
177
193
|
|
|
178
194
|
.an-w-kv dl > div {
|
|
@@ -200,6 +216,19 @@
|
|
|
200
216
|
|
|
201
217
|
.an-w-table {
|
|
202
218
|
overflow-x: auto;
|
|
219
|
+
border: 1px solid rgba(16, 16, 16, 0.06);
|
|
220
|
+
border-radius: 14px;
|
|
221
|
+
background: linear-gradient(180deg, #ffffff, #f6f6f4);
|
|
222
|
+
box-shadow: 0 1px 2px rgba(16, 16, 16, 0.05), 0 2px 8px rgba(16, 16, 16, 0.04), inset 0 1px 0 rgba(255, 255, 255, 0.75);
|
|
223
|
+
}
|
|
224
|
+
.an-w-table > .an-w-title {
|
|
225
|
+
margin: 0;
|
|
226
|
+
padding: 14px 16px;
|
|
227
|
+
font-size: 1em;
|
|
228
|
+
font-weight: 600;
|
|
229
|
+
color: var(--an-w-ink);
|
|
230
|
+
background: #fff;
|
|
231
|
+
border-bottom: 1px solid var(--an-w-line);
|
|
203
232
|
}
|
|
204
233
|
.an-w-table table {
|
|
205
234
|
border-collapse: collapse;
|
|
@@ -208,14 +237,61 @@
|
|
|
208
237
|
.an-w-table th,
|
|
209
238
|
.an-w-table td {
|
|
210
239
|
text-align: left;
|
|
211
|
-
padding:
|
|
240
|
+
padding: 12px 16px;
|
|
212
241
|
border-bottom: 1px solid var(--an-w-line);
|
|
213
242
|
white-space: nowrap;
|
|
214
243
|
}
|
|
215
|
-
.an-w-table
|
|
244
|
+
.an-w-table tbody tr:last-child td {
|
|
245
|
+
border-bottom: 0;
|
|
246
|
+
}
|
|
247
|
+
.an-w-table > .an-w-title {
|
|
248
|
+
display: flex;
|
|
249
|
+
justify-content: space-between;
|
|
250
|
+
align-items: baseline;
|
|
251
|
+
}
|
|
252
|
+
.an-w-table > .an-w-title span {
|
|
216
253
|
color: var(--an-w-muted);
|
|
254
|
+
font-size: 0.8em;
|
|
217
255
|
font-weight: 500;
|
|
218
256
|
}
|
|
257
|
+
.an-w-table tbody tr {
|
|
258
|
+
transition: background 0.12s ease;
|
|
259
|
+
}
|
|
260
|
+
.an-w-table tbody tr:hover {
|
|
261
|
+
background: rgba(47, 107, 85, 0.05);
|
|
262
|
+
}
|
|
263
|
+
.an-w-table td em {
|
|
264
|
+
display: inline-block;
|
|
265
|
+
font-style: normal;
|
|
266
|
+
font-weight: 600;
|
|
267
|
+
font-size: 0.9em;
|
|
268
|
+
padding: 2px 8px;
|
|
269
|
+
border-radius: 999px;
|
|
270
|
+
}
|
|
271
|
+
.an-w-table td em.is-up {
|
|
272
|
+
color: var(--an-w-good);
|
|
273
|
+
background: color-mix(in srgb, var(--an-w-good) 11%, transparent);
|
|
274
|
+
}
|
|
275
|
+
.an-w-table td em.is-down {
|
|
276
|
+
color: var(--an-w-high);
|
|
277
|
+
background: color-mix(in srgb, var(--an-w-high) 10%, transparent);
|
|
278
|
+
}
|
|
279
|
+
.an-w-table th {
|
|
280
|
+
color: var(--an-w-muted);
|
|
281
|
+
font-size: 0.72em;
|
|
282
|
+
font-weight: 600;
|
|
283
|
+
letter-spacing: 0.06em;
|
|
284
|
+
text-transform: uppercase;
|
|
285
|
+
padding-top: 10px;
|
|
286
|
+
padding-bottom: 10px;
|
|
287
|
+
}
|
|
288
|
+
.an-w-table td {
|
|
289
|
+
color: var(--an-w-ink);
|
|
290
|
+
}
|
|
291
|
+
.an-w-table td:first-child {
|
|
292
|
+
font-weight: 600;
|
|
293
|
+
}
|
|
294
|
+
.an-w-table th.is-num,
|
|
219
295
|
.an-w-table td.is-num {
|
|
220
296
|
text-align: right;
|
|
221
297
|
font-variant-numeric: tabular-nums;
|
|
@@ -227,16 +303,103 @@
|
|
|
227
303
|
font-weight: 500;
|
|
228
304
|
margin-bottom: 6px;
|
|
229
305
|
}
|
|
306
|
+
.an-w-chart-head {
|
|
307
|
+
display: flex;
|
|
308
|
+
align-items: baseline;
|
|
309
|
+
flex-wrap: wrap;
|
|
310
|
+
gap: 4px 10px;
|
|
311
|
+
margin: -2px 0 6px;
|
|
312
|
+
}
|
|
313
|
+
.an-w-chart-head strong {
|
|
314
|
+
font-size: 1.9em;
|
|
315
|
+
font-weight: 700;
|
|
316
|
+
letter-spacing: -0.03em;
|
|
317
|
+
color: var(--an-w-ink);
|
|
318
|
+
font-variant-numeric: tabular-nums;
|
|
319
|
+
}
|
|
320
|
+
.an-w-chart-head span {
|
|
321
|
+
color: var(--an-w-muted);
|
|
322
|
+
font-size: 0.9em;
|
|
323
|
+
font-variant-numeric: tabular-nums;
|
|
324
|
+
}
|
|
325
|
+
.an-w-chart-box {
|
|
326
|
+
position: relative;
|
|
327
|
+
width: 100%;
|
|
328
|
+
}
|
|
230
329
|
.an-w-chart svg {
|
|
231
330
|
display: block;
|
|
232
|
-
width: 100%;
|
|
233
|
-
height: auto;
|
|
331
|
+
max-width: 100%;
|
|
234
332
|
overflow: visible;
|
|
235
333
|
}
|
|
236
334
|
.an-w-chart text {
|
|
237
|
-
font-size:
|
|
335
|
+
font-size: 11px;
|
|
238
336
|
fill: var(--an-w-muted);
|
|
337
|
+
font-variant-numeric: tabular-nums;
|
|
338
|
+
}
|
|
339
|
+
.an-w-chart text.an-w-val {
|
|
340
|
+
fill: var(--an-w-ink);
|
|
341
|
+
font-weight: 500;
|
|
342
|
+
}
|
|
343
|
+
.an-w-grid line {
|
|
344
|
+
stroke: var(--an-w-line);
|
|
345
|
+
stroke-width: 1;
|
|
346
|
+
}
|
|
347
|
+
.an-w-zero {
|
|
348
|
+
stroke: var(--an-w-muted);
|
|
349
|
+
stroke-opacity: 0.5;
|
|
350
|
+
}
|
|
351
|
+
.an-w-cross {
|
|
352
|
+
stroke: var(--an-w-muted);
|
|
353
|
+
stroke-opacity: 0.4;
|
|
354
|
+
stroke-dasharray: 3 3;
|
|
355
|
+
}
|
|
356
|
+
.an-w-chart rect.is-dim {
|
|
357
|
+
opacity: 0.45;
|
|
358
|
+
}
|
|
359
|
+
.an-w-chart circle {
|
|
360
|
+
stroke: #fff;
|
|
361
|
+
stroke-width: 2;
|
|
362
|
+
filter: drop-shadow(0 1px 3px rgba(16, 16, 16, 0.25));
|
|
363
|
+
}
|
|
364
|
+
.an-w-area {
|
|
365
|
+
stroke: none;
|
|
366
|
+
}
|
|
367
|
+
.an-w-stop.an-w-s0 { stop-color: var(--an-w-s0); }
|
|
368
|
+
.an-w-stop.an-w-s1 { stop-color: var(--an-w-s1); }
|
|
369
|
+
.an-w-stop.an-w-s2 { stop-color: var(--an-w-s2); }
|
|
370
|
+
.an-w-stop.an-w-s3 { stop-color: var(--an-w-s3); }
|
|
371
|
+
.an-w-tip {
|
|
372
|
+
position: absolute;
|
|
373
|
+
top: 8px;
|
|
374
|
+
pointer-events: none;
|
|
375
|
+
display: flex;
|
|
376
|
+
flex-direction: column;
|
|
377
|
+
gap: 2px;
|
|
378
|
+
padding: 6px 9px;
|
|
379
|
+
border: 1px solid var(--an-w-line);
|
|
380
|
+
border-radius: 8px;
|
|
381
|
+
background: rgba(255, 255, 255, 0.78);
|
|
382
|
+
-webkit-backdrop-filter: blur(14px) saturate(1.5);
|
|
383
|
+
backdrop-filter: blur(14px) saturate(1.5);
|
|
384
|
+
box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.6) inset, 0 6px 20px rgba(16, 16, 16, 0.1);
|
|
385
|
+
font-size: 12px;
|
|
386
|
+
white-space: nowrap;
|
|
387
|
+
}
|
|
388
|
+
.an-w-tip b {
|
|
389
|
+
color: var(--an-w-muted);
|
|
390
|
+
font-weight: 500;
|
|
239
391
|
}
|
|
392
|
+
.an-w-tip i {
|
|
393
|
+
display: inline-block;
|
|
394
|
+
width: 8px;
|
|
395
|
+
height: 8px;
|
|
396
|
+
border-radius: 50%;
|
|
397
|
+
margin-right: 6px;
|
|
398
|
+
}
|
|
399
|
+
.an-w-tip i.an-w-s0 { background: var(--an-w-s0); }
|
|
400
|
+
.an-w-tip i.an-w-s1 { background: var(--an-w-s1); }
|
|
401
|
+
.an-w-tip i.an-w-s2 { background: var(--an-w-s2); }
|
|
402
|
+
.an-w-tip i.an-w-s3 { background: var(--an-w-s3); }
|
|
240
403
|
.an-w-chart rect.an-w-s0,
|
|
241
404
|
.an-w-chart circle.an-w-s0 {
|
|
242
405
|
fill: var(--an-w-s0);
|
|
@@ -255,7 +418,9 @@
|
|
|
255
418
|
}
|
|
256
419
|
.an-w-line {
|
|
257
420
|
fill: none;
|
|
258
|
-
stroke-width: 2;
|
|
421
|
+
stroke-width: 2.25;
|
|
422
|
+
stroke-linejoin: round;
|
|
423
|
+
stroke-linecap: round;
|
|
259
424
|
}
|
|
260
425
|
.an-w-line.an-w-s0 {
|
|
261
426
|
stroke: var(--an-w-s0);
|
package/react.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx,
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// Ready-made React views for the widgets an agent draws in its replies.
|
|
3
3
|
//
|
|
4
4
|
// import { ReplyView } from '@cerebro-labs/agentnava-sdk/react'
|
|
@@ -16,7 +16,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
16
16
|
// once, even if two containers name it; links and pictures open only over
|
|
17
17
|
// https:// (narrow it further with `allowUrl`); and a widget that throws while
|
|
18
18
|
// drawing is left out rather than breaking the screen around it.
|
|
19
|
-
import { Component, Fragment } from 'react';
|
|
19
|
+
import { Component, Fragment, useEffect, useId, useRef, useState } from 'react';
|
|
20
20
|
import { placeWidgets } from "./widgets.js";
|
|
21
21
|
export { placeWidgets } from "./widgets.js";
|
|
22
22
|
const str = (v) => (typeof v === 'string' || typeof v === 'number' ? String(v) : '');
|
|
@@ -34,7 +34,63 @@ class Boundary extends Component {
|
|
|
34
34
|
return this.state.failed ? null : this.props.children;
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
|
+
/** A caption's leading figure is bold; a signed one ("-1.55%", "+12") is red or green too. */
|
|
38
|
+
function caption(text) {
|
|
39
|
+
const m = /^([+\-\u2212]?[$\u20ac\u00a3\u20b9]?\d[\d,.]*[%KMBTx]?)(.*)$/s.exec(text);
|
|
40
|
+
if (!m)
|
|
41
|
+
return text;
|
|
42
|
+
// Only a signed figure says which way it moved; "12 errors" is not good news.
|
|
43
|
+
const dir = /^[-\u2212]/.test(m[1]) ? 'is-down' : m[1].startsWith('+') ? 'is-up' : '';
|
|
44
|
+
return (_jsxs(_Fragment, { children: [_jsx("b", { className: dir || undefined, children: m[1] }), m[2]] }));
|
|
45
|
+
}
|
|
46
|
+
/** Round numbers for the y axis: about `count` steps of 1, 2, 2.5 or 5 x 10^n. */
|
|
47
|
+
function niceTicks(lo, hi, count = 4) {
|
|
48
|
+
if (lo === hi) {
|
|
49
|
+
const pad = Math.abs(lo) * 0.1 || 1;
|
|
50
|
+
lo -= pad;
|
|
51
|
+
hi += pad;
|
|
52
|
+
}
|
|
53
|
+
const raw = (hi - lo) / count;
|
|
54
|
+
const mag = 10 ** Math.floor(Math.log10(raw));
|
|
55
|
+
const step = ([1, 2, 2.5, 5, 10].find((m) => m * mag >= raw) ?? 10) * mag;
|
|
56
|
+
const ticks = [];
|
|
57
|
+
for (let t = Math.floor(lo / step) * step; t <= hi + step * 1e-9; t += step)
|
|
58
|
+
ticks.push(Number(t.toPrecision(12)));
|
|
59
|
+
if (ticks[ticks.length - 1] < hi)
|
|
60
|
+
ticks.push(Number((ticks[ticks.length - 1] + step).toPrecision(12)));
|
|
61
|
+
return ticks;
|
|
62
|
+
}
|
|
63
|
+
/** Short axis numbers: 1.2K, 3.4M, 5B. */
|
|
64
|
+
function compact(n, locale) {
|
|
65
|
+
try {
|
|
66
|
+
return new Intl.NumberFormat(locale, {
|
|
67
|
+
notation: 'compact',
|
|
68
|
+
maximumFractionDigits: 1,
|
|
69
|
+
}).format(n);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return String(n);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
37
75
|
function Chart({ part, ctx }) {
|
|
76
|
+
const box = useRef(null);
|
|
77
|
+
const gid = `an-w-g${useId().replace(/:/g, '')}`;
|
|
78
|
+
// Drawn in real pixels at the box's own width, so text stays at body size
|
|
79
|
+
// however wide the card is (a scaled viewBox blew 10px labels up to 40px).
|
|
80
|
+
const [W, setW] = useState(560);
|
|
81
|
+
const [hover, setHover] = useState(null);
|
|
82
|
+
useEffect(() => {
|
|
83
|
+
const el = box.current;
|
|
84
|
+
if (!el || typeof ResizeObserver === 'undefined')
|
|
85
|
+
return;
|
|
86
|
+
const ro = new ResizeObserver(([e]) => {
|
|
87
|
+
const w = Math.round(e.contentRect.width);
|
|
88
|
+
if (w > 0)
|
|
89
|
+
setW(w);
|
|
90
|
+
});
|
|
91
|
+
ro.observe(el);
|
|
92
|
+
return () => ro.disconnect();
|
|
93
|
+
}, []);
|
|
38
94
|
const series = list(part.series)
|
|
39
95
|
.map((s) => ({
|
|
40
96
|
name: str(s?.name),
|
|
@@ -44,26 +100,70 @@ function Chart({ part, ctx }) {
|
|
|
44
100
|
if (series.length === 0)
|
|
45
101
|
return null;
|
|
46
102
|
const xs = series[0].points.map((p) => str(p.x));
|
|
103
|
+
const n = Math.max(...series.map((s) => s.points.length));
|
|
47
104
|
const ref = part.reference;
|
|
48
105
|
const refY = typeof ref?.y === 'number' && Number.isFinite(ref.y) ? ref.y : undefined;
|
|
106
|
+
const isBar = part.type === 'bar';
|
|
49
107
|
const ys = [...series.flatMap((s) => s.points.map((p) => p.y)), ...(refY === undefined ? [] : [refY])];
|
|
50
|
-
//
|
|
51
|
-
//
|
|
52
|
-
const
|
|
53
|
-
const
|
|
54
|
-
const
|
|
55
|
-
const
|
|
56
|
-
const
|
|
57
|
-
const
|
|
58
|
-
const
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
108
|
+
// Bars measure from zero, so zero is always in range. A line shows change,
|
|
109
|
+
// so it fits its own range: a price moving 520 to 540 must not draw flat.
|
|
110
|
+
const dataLo = Math.min(...ys);
|
|
111
|
+
const dataHi = Math.max(...ys);
|
|
112
|
+
const ticks = isBar ? niceTicks(Math.min(dataLo, 0), Math.max(dataHi, 0)) : niceTicks(dataLo, dataHi);
|
|
113
|
+
const lo = ticks[0];
|
|
114
|
+
const hi = ticks[ticks.length - 1];
|
|
115
|
+
const span = hi - lo || 1;
|
|
116
|
+
const fmt = (v) => (part.unit === 'currency' ? ctx.money(v) : part.unit === 'percent' ? `${ctx.number(v)}%` : ctx.number(v));
|
|
117
|
+
const axis = (v) => {
|
|
118
|
+
const short = Math.abs(hi) >= 10000 || Math.abs(lo) >= 10000 ? compact(v, ctx.props.locale) : ctx.number(v);
|
|
119
|
+
return part.unit === 'currency' ? (fmt(0).replace(/[\d.,\s]+/g, '') || '') + short : part.unit === 'percent' ? `${short}%` : short;
|
|
120
|
+
};
|
|
121
|
+
const H = 220;
|
|
122
|
+
const top = 12;
|
|
123
|
+
const bottom = 26;
|
|
124
|
+
const left = Math.max(...ticks.map((t) => axis(t).length)) * 6.5 + 10;
|
|
125
|
+
const right = Math.max(12, Math.max(...xs.map((x) => x.length), 1) * 3.3);
|
|
126
|
+
const plotW = Math.max(W - left - right, 40);
|
|
127
|
+
const plotH = H - top - bottom;
|
|
128
|
+
const yOf = (y) => top + plotH - ((y - lo) / span) * plotH;
|
|
129
|
+
const step = plotW / Math.max(n, 1);
|
|
130
|
+
const xOf = (i) => (isBar ? left + i * step + step / 2 : left + (n === 1 ? plotW / 2 : (i / (n - 1)) * plotW));
|
|
131
|
+
const zero = yOf(Math.max(lo, Math.min(0, hi)));
|
|
132
|
+
// Thin the x labels until each fits in the room it has.
|
|
133
|
+
const longest = Math.max(...xs.map((x) => x.length), 1);
|
|
134
|
+
const every = Math.max(1, Math.ceil((longest * 6.5 + 12) / (plotW / Math.max(n, 1))));
|
|
135
|
+
const showDots = false;
|
|
136
|
+
const pick = (e) => {
|
|
137
|
+
const r = e.currentTarget.getBoundingClientRect();
|
|
138
|
+
const px = ((e.clientX - r.left) / r.width) * W;
|
|
139
|
+
let best = 0;
|
|
140
|
+
for (let i = 1; i < n; i++)
|
|
141
|
+
if (Math.abs(xOf(i) - px) < Math.abs(xOf(best) - px))
|
|
142
|
+
best = i;
|
|
143
|
+
setHover(best);
|
|
144
|
+
};
|
|
145
|
+
const tipX = hover === null ? 0 : xOf(hover);
|
|
146
|
+
// One trend line leads with where it ended and how far it moved, like a stat.
|
|
147
|
+
const only = series.length === 1 && !isBar && series[0].points.length >= 2 ? series[0].points : undefined;
|
|
148
|
+
const headline = only
|
|
149
|
+
? (() => {
|
|
150
|
+
const first = only[0].y;
|
|
151
|
+
const last = only[only.length - 1].y;
|
|
152
|
+
const delta = last - first;
|
|
153
|
+
const abs = part.unit === 'percent' ? `${ctx.number(Math.abs(delta))} pts` : fmt(Math.abs(delta)).replace('-', '');
|
|
154
|
+
const pct = part.unit !== 'percent' && first > 0 && last >= 0 ? ` (${ctx.number(Math.round((Math.abs(delta) / first) * 1000) / 10)}%)` : '';
|
|
155
|
+
return { last, delta, change: abs + pct, from: str(only[0].x) };
|
|
156
|
+
})()
|
|
157
|
+
: undefined;
|
|
158
|
+
return (_jsxs("figure", { className: "an-w-chart", children: [str(part.title) && _jsx("figcaption", { children: str(part.title) }), headline && (_jsxs("div", { className: "an-w-chart-head", children: [_jsx("strong", { children: fmt(headline.last) }), _jsxs("span", { children: [headline.delta === 0 ? 'No change' : `${headline.delta > 0 ? '\u25B2' : '\u25BC'} ${headline.change}`, " since ", headline.from] })] })), _jsxs("div", { ref: box, className: "an-w-chart-box", children: [_jsxs("svg", { width: W, height: H, viewBox: `0 0 ${W} ${H}`, role: "img", "aria-label": str(part.title) || 'Chart', onMouseMove: pick, onMouseLeave: () => setHover(null), children: [_jsx("defs", { children: [0, 1, 2, 3].map((k) => (_jsxs("linearGradient", { id: `${gid}-${k}`, x1: "0", x2: "0", y1: "0", y2: "1", children: [_jsx("stop", { offset: "0%", className: `an-w-stop an-w-s${k}`, stopOpacity: part.type === 'area' ? 0.28 : 0.18 }), _jsx("stop", { offset: "100%", className: `an-w-stop an-w-s${k}`, stopOpacity: 0 })] }, k))) }), ticks.map((t) => (_jsxs("g", { className: "an-w-grid", children: [_jsx("line", { x1: left, x2: W - right, y1: yOf(t), y2: yOf(t) }), _jsx("text", { x: left - 8, y: yOf(t), dy: "0.32em", textAnchor: "end", children: axis(t) })] }, t))), series.map((s, si) => isBar ? (s.points.map((p, i) => {
|
|
159
|
+
const bw = Math.min((step * 0.7) / series.length, 48);
|
|
160
|
+
const x = xOf(i) - (bw * series.length) / 2 + si * bw;
|
|
161
|
+
const y = yOf(p.y);
|
|
162
|
+
return (_jsxs("g", { children: [_jsx("rect", { className: `an-w-s${si % 4}${hover !== null && hover !== i ? ' is-dim' : ''}`, x: x + 1, y: Math.min(y, zero), width: Math.max(bw - 2, 1), height: Math.max(Math.abs(zero - y), 1), rx: 3 }), series.length === 1 && n <= 8 && (_jsx("text", { className: "an-w-val", x: x + bw / 2, y: Math.min(y, zero) - 6, textAnchor: "middle", children: fmt(p.y) }))] }, `${si}-${i}`));
|
|
163
|
+
})) : (_jsxs("g", { children: [(part.type === 'area' || series.length === 1) && (_jsx("path", { className: `an-w-area an-w-s${si % 4}`, fill: `url(#${gid}-${si % 4})`, d: `M${xOf(0)},${zero} ${s.points.map((p, i) => `L${xOf(i)},${yOf(p.y)}`).join(' ')} L${xOf(s.points.length - 1)},${zero}Z` })), _jsx("polyline", { className: `an-w-line an-w-s${si % 4}`, points: s.points.map((p, i) => `${xOf(i)},${yOf(p.y)}`).join(' ') }), s.points.map((p, i) => showDots || hover === i || (series.length === 1 && i === s.points.length - 1) ? (_jsx("circle", { className: `an-w-s${si % 4}`, cx: xOf(i), cy: yOf(p.y), r: hover === i ? 4.5 : 4 }, i)) : null)] }, si))), lo < 0 && hi > 0 && _jsx("line", { className: "an-w-zero", x1: left, x2: W - right, y1: zero, y2: zero }), refY !== undefined && (_jsxs("g", { className: "an-w-ref", children: [_jsx("line", { x1: left, x2: W - right, y1: yOf(refY), y2: yOf(refY) }), str(ref?.label) && (_jsx("text", { x: W - right, y: yOf(refY) - 5, textAnchor: "end", children: str(ref?.label) }))] })), xs.map((x, i) => i % every === 0 ? (_jsx("text", { x: xOf(i), y: H - 8, textAnchor: "middle", children: x }, i)) : null), hover !== null && !isBar && _jsx("line", { className: "an-w-cross", x1: tipX, x2: tipX, y1: top, y2: top + plotH })] }), hover !== null && (_jsxs("div", { className: "an-w-tip", style: {
|
|
164
|
+
left: tipX,
|
|
165
|
+
transform: `translateX(${tipX > W / 2 ? 'calc(-100% - 10px)' : '10px'})`,
|
|
166
|
+
}, children: [_jsx("b", { children: xs[hover] }), series.map((s, si) => s.points[hover] ? (_jsxs("span", { children: [_jsx("i", { className: `an-w-s${si % 4}` }), series.length > 1 && `${s.name} `, _jsx("strong", { children: fmt(s.points[hover].y) })] }, si)) : null)] }))] }), series.length > 1 && (_jsx("div", { className: "an-w-legend", children: series.map((s, si) => (_jsxs("span", { children: [_jsx("i", { className: `an-w-s${si % 4}` }), s.name] }, si))) }))] }));
|
|
67
167
|
}
|
|
68
168
|
/** The default look of one part. `kids` is its children, already drawn. */
|
|
69
169
|
function defaultPart(part, kids, ctx) {
|
|
@@ -96,7 +196,7 @@ function defaultPart(part, kids, ctx) {
|
|
|
96
196
|
case 'Stat':
|
|
97
197
|
if (!str(part.value))
|
|
98
198
|
return null;
|
|
99
|
-
return (_jsxs("div", { className: "an-w-stat", children: [_jsx("
|
|
199
|
+
return (_jsxs("div", { className: "an-w-stat", children: [str(part.label) && _jsx("span", { children: str(part.label) }), _jsx("strong", { children: str(part.value) }), str(part.caption) && _jsx("small", { children: caption(str(part.caption)) })] }));
|
|
100
200
|
case 'KeyValue': {
|
|
101
201
|
const rows = list(part.rows).filter((r) => str(r?.label) || str(r?.value));
|
|
102
202
|
if (rows.length === 0)
|
|
@@ -108,7 +208,15 @@ function defaultPart(part, kids, ctx) {
|
|
|
108
208
|
const rows = list(part.rows).filter(Array.isArray);
|
|
109
209
|
if (cols.length === 0 && rows.length === 0)
|
|
110
210
|
return null;
|
|
111
|
-
|
|
211
|
+
// A column is numeric when every filled cell is a figure ("521.91", "-1.55%", "$3.2B"),
|
|
212
|
+
// and then its header lines up with its numbers on the right.
|
|
213
|
+
const figure = (c) => typeof c === 'number' || (typeof c === 'string' && /^[+\-\u2212]?[$\u20ac\u00a3\u20b9]?\d[\d,.]*\s?[%KMBTx]?$/.test(c.trim()));
|
|
214
|
+
const numCol = (j) => {
|
|
215
|
+
const filled = rows.map((r) => r[j]).filter((c) => c !== null && c !== undefined && c !== '');
|
|
216
|
+
return filled.length > 0 && filled.every(figure);
|
|
217
|
+
};
|
|
218
|
+
const nums = Array.from({ length: Math.max(cols.length, ...rows.map((r) => r.length)) }, (_, j) => numCol(j));
|
|
219
|
+
return (_jsxs("div", { className: "an-w-table", children: [str(part.title) && (_jsxs("div", { className: "an-w-title", children: [str(part.title), rows.length > 3 && _jsxs("span", { children: [rows.length, " rows"] })] })), _jsxs("table", { children: [cols.length > 0 && (_jsx("thead", { children: _jsx("tr", { children: cols.map((c, j) => (_jsx("th", { className: nums[j] ? 'is-num' : undefined, children: c }, j))) }) })), _jsx("tbody", { children: rows.map((r, i) => (_jsx("tr", { children: r.map((c, j) => (_jsx("td", { className: nums[j] ? 'is-num' : undefined, children: typeof c === 'string' && /^[+\-\u2212]\d/.test(c.trim()) ? (_jsx("em", { className: /^\+/.test(c.trim()) ? 'is-up' : 'is-down', children: c })) : typeof c === 'number' ? (ctx.number(c)) : (str(c)) }, j))) }, i))) })] })] }));
|
|
112
220
|
}
|
|
113
221
|
case 'Chart':
|
|
114
222
|
return _jsx(Chart, { part: part, ctx: ctx });
|
|
@@ -179,7 +287,11 @@ export function WidgetView(props) {
|
|
|
179
287
|
return null;
|
|
180
288
|
let moneyFormat;
|
|
181
289
|
try {
|
|
182
|
-
moneyFormat = new Intl.NumberFormat(locale, {
|
|
290
|
+
moneyFormat = new Intl.NumberFormat(locale, {
|
|
291
|
+
style: 'currency',
|
|
292
|
+
currency,
|
|
293
|
+
maximumFractionDigits: 0,
|
|
294
|
+
});
|
|
183
295
|
}
|
|
184
296
|
catch {
|
|
185
297
|
moneyFormat = new Intl.NumberFormat(locale, { maximumFractionDigits: 0 });
|
package/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"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","sourcesContent":["// Ready-made React views for the widgets an agent draws in its replies.\n//\n// import { ReplyView } from '@cerebro-labs/agentnava-sdk/react'\n// import '@cerebro-labs/agentnava-sdk/react/styles.css'\n//\n// <ReplyView text={reply} widgets={widgets} onAsk={send} />\n//\n// React is optional for the SDK: only this entry needs it, and the rest of the\n// package never imports it. Every kind of part has a default look (styles.css,\n// themed through CSS variables), and any kind can be swapped for your own\n// component with `parts`.\n//\n// A widget is written by the model, so it is drawn defensively: a kind this\n// does not know, or a part missing a field, is skipped; each part is drawn\n// once, even if two containers name it; links and pictures open only over\n// https:// (narrow it further with `allowUrl`); and a widget that throws while\n// drawing is left out rather than breaking the screen around it.\n\nimport { Component, Fragment, type ReactNode } from 'react';\nimport type { Widget, WidgetPart } from './types.ts';\nimport { placeWidgets } from './widgets.ts';\n\nexport { placeWidgets, type ReplyPiece } from './widgets.ts';\n\n/** Every kind of part an agent may draw. */\nexport type WidgetKind =\n\t| 'Column'\n\t| 'Row'\n\t| 'Card'\n\t| 'Text'\n\t| 'Stat'\n\t| 'KeyValue'\n\t| 'Table'\n\t| 'Chart'\n\t| 'Image'\n\t| 'List'\n\t| 'Note'\n\t| 'Badge'\n\t| 'Link'\n\t| 'Button'\n\t| 'Suggestions'\n\t| 'Divider';\n\n/** What a replacement for one kind of part receives. */\nexport interface PartProps {\n\tpart: WidgetPart;\n\t/** The part's children, already drawn (containers only). */\n\tchildren?: ReactNode;\n\t/** Send words as the reader's next message (Button, Suggestions). */\n\tonAsk?: ((text: string) => void) | undefined;\n}\n\nexport interface WidgetViewProps {\n\twidget: Widget;\n\t/** Called with a Button's label or a tapped suggestion: send it as the next message. */\n\tonAsk?: (text: string) => void;\n\t/** Your own component for any kind of part, in place of the default. */\n\tparts?: Partial<Record<WidgetKind, (props: PartProps) => ReactNode>>;\n\t/** ISO currency code for charts and numbers marked as money. Default \"USD\". */\n\tcurrency?: string;\n\t/** Locale for numbers. Default: the reader's. */\n\tlocale?: string;\n\t/** Whether a link or picture address may be opened. Default: https:// only. */\n\tallowUrl?: (url: string, use: 'link' | 'image') => boolean;\n\tclassName?: string;\n}\n\nexport interface ReplyViewProps extends Omit<WidgetViewProps, 'widget' | 'className'> {\n\t/** The reply's words, as `text` events or `done.reply` give them. */\n\ttext: string;\n\t/** The reply's widgets, as `widget` events or `done.widgets` give them. */\n\twidgets?: readonly Widget[] | undefined;\n\t/** How to draw the words. Default: paragraphs. Pass your markdown renderer here. */\n\trenderText?: (text: string) => ReactNode;\n\tclassName?: string;\n}\n\nconst str = (v: unknown): string => (typeof v === 'string' || typeof v === 'number' ? String(v) : '');\nconst list = <T = unknown,>(v: unknown): T[] => (Array.isArray(v) ? (v as T[]) : []);\nconst TONES = new Set(['high', 'medium', 'low', 'good', 'info']);\nconst toneOf = (v: unknown): string => (typeof v === 'string' && TONES.has(v) ? v : 'info');\nconst httpsOnly = (url: string) => /^https:\\/\\//i.test(url);\n\n/** A widget that throws while drawing is left out, never a crash of the screen. */\nclass Boundary extends Component<{ children: ReactNode }, { failed: boolean }> {\n\toverride state = { failed: false };\n\tstatic getDerivedStateFromError() {\n\t\treturn { failed: true };\n\t}\n\toverride render() {\n\t\treturn this.state.failed ? null : this.props.children;\n\t}\n}\n\ninterface Ctx {\n\tbyId: Map<string, WidgetPart>;\n\tseen: Set<string>;\n\tprops: WidgetViewProps;\n\tmoney: (n: number) => string;\n\tnumber: (n: number) => string;\n\turl: (v: unknown, use: 'link' | 'image') => string | undefined;\n}\n\nfunction Chart({ part, ctx }: { part: WidgetPart; ctx: Ctx }) {\n\tconst series = list<{ name?: unknown; points?: unknown }>(part.series)\n\t\t.map((s) => ({\n\t\t\tname: str(s?.name),\n\t\t\tpoints: list<{ x?: unknown; y?: unknown }>(s?.points).filter((p) => typeof p?.y === 'number' && Number.isFinite(p.y)),\n\t\t}))\n\t\t.filter((s) => s.points.length > 0);\n\tif (series.length === 0) return null;\n\tconst xs = series[0]!.points.map((p) => str(p.x));\n\tconst ref = part.reference as { y?: unknown; label?: unknown } | undefined;\n\tconst refY = typeof ref?.y === 'number' && Number.isFinite(ref.y) ? ref.y : undefined;\n\tconst ys = [...series.flatMap((s) => s.points.map((p) => p.y as number)), ...(refY === undefined ? [] : [refY])];\n\t// Zero sits between the extremes, so a negative value draws below the zero\n\t// line instead of collapsing onto it and reading as 0.\n\tconst lo = Math.min(...ys, 0);\n\tconst span = Math.max(...ys, 0) - lo || 1;\n\tconst W = 320;\n\tconst H = 140;\n\tconst step = W / Math.max(xs.length, 1);\n\tconst fmt = (n: number) => (part.unit === 'currency' ? ctx.money(n) : part.unit === 'percent' ? `${ctx.number(n)}%` : ctx.number(n));\n\tconst yOf = (y: number) => H - ((y - lo) / span) * (H - 18);\n\tconst zero = yOf(0);\n\tconst labelled = series.length === 1 && xs.length <= 6;\n\treturn (\n\t\t<figure className=\"an-w-chart\">\n\t\t\t{str(part.title) && <figcaption>{str(part.title)}</figcaption>}\n\t\t\t<svg viewBox={`0 0 ${W} ${H + 18}`} role=\"img\" aria-label={str(part.title) || 'Chart'}>\n\t\t\t\t{series.map((s, si) =>\n\t\t\t\t\tpart.type === 'bar' ? (\n\t\t\t\t\t\ts.points.map((p, i) => {\n\t\t\t\t\t\t\tconst bw = (step * 0.7) / series.length;\n\t\t\t\t\t\t\tconst x = i * step + step * 0.15 + si * bw;\n\t\t\t\t\t\t\tconst y = yOf(p.y as number);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<g key={`${si}-${i}`}>\n\t\t\t\t\t\t\t\t\t<rect className={`an-w-s${si % 4}`} x={x} y={Math.min(y, zero)} width={bw} height={Math.abs(zero - y)} rx={2}>\n\t\t\t\t\t\t\t\t\t\t<title>{`${str(p.x)}: ${fmt(p.y as number)}`}</title>\n\t\t\t\t\t\t\t\t\t</rect>\n\t\t\t\t\t\t\t\t\t{labelled && (\n\t\t\t\t\t\t\t\t\t\t<text x={x + bw / 2} y={Math.min(y, zero) - 4} textAnchor=\"middle\">\n\t\t\t\t\t\t\t\t\t\t\t{fmt(p.y as number)}\n\t\t\t\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<g key={si}>\n\t\t\t\t\t\t\t<polyline\n\t\t\t\t\t\t\t\tclassName={`an-w-line an-w-s${si % 4}${part.type === 'area' ? ' is-area' : ''}`}\n\t\t\t\t\t\t\t\tpoints={s.points.map((p, i) => `${i * step + step / 2},${yOf(p.y as number)}`).join(' ')}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{s.points.map((p, i) => (\n\t\t\t\t\t\t\t\t<g key={i}>\n\t\t\t\t\t\t\t\t\t<circle className={`an-w-s${si % 4}`} cx={i * step + step / 2} cy={yOf(p.y as number)} r={3}>\n\t\t\t\t\t\t\t\t\t\t<title>{`${str(p.x)}: ${fmt(p.y as number)}`}</title>\n\t\t\t\t\t\t\t\t\t</circle>\n\t\t\t\t\t\t\t\t\t{labelled && (\n\t\t\t\t\t\t\t\t\t\t<text x={i * step + step / 2} y={yOf(p.y as number) - 7} textAnchor=\"middle\">\n\t\t\t\t\t\t\t\t\t\t\t{fmt(p.y as number)}\n\t\t\t\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</g>\n\t\t\t\t\t),\n\t\t\t\t)}\n\t\t\t\t{lo < 0 && <line x1={0} x2={W} y1={zero} y2={zero} stroke=\"currentColor\" strokeOpacity={0.4} />}\n\t\t\t\t{refY !== undefined && (\n\t\t\t\t\t<g className=\"an-w-ref\">\n\t\t\t\t\t\t<line x1={0} x2={W} y1={yOf(refY)} y2={yOf(refY)} />\n\t\t\t\t\t\t{str(ref?.label) && (\n\t\t\t\t\t\t\t<text x={W} y={yOf(refY) - 4} textAnchor=\"end\">\n\t\t\t\t\t\t\t\t{str(ref?.label)}\n\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</g>\n\t\t\t\t)}\n\t\t\t\t{xs.map((x, i) => (\n\t\t\t\t\t<text key={i} x={i * step + step / 2} y={H + 14} textAnchor=\"middle\">\n\t\t\t\t\t\t{x}\n\t\t\t\t\t</text>\n\t\t\t\t))}\n\t\t\t</svg>\n\t\t\t{series.length > 1 && (\n\t\t\t\t<div className=\"an-w-legend\">\n\t\t\t\t\t{series.map((s, si) => (\n\t\t\t\t\t\t<span key={si}>\n\t\t\t\t\t\t\t<i className={`an-w-s${si % 4}`} />\n\t\t\t\t\t\t\t{s.name}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</figure>\n\t);\n}\n\n/** The default look of one part. `kids` is its children, already drawn. */\nfunction defaultPart(part: WidgetPart, kids: ReactNode, ctx: Ctx): ReactNode {\n\tconst onAsk = ctx.props.onAsk;\n\tswitch (part.component) {\n\t\tcase 'Column':\n\t\t\treturn <div className={`an-w-col an-w-gap-${['small', 'large'].includes(str(part.gap)) ? str(part.gap) : 'medium'}`}>{kids}</div>;\n\t\tcase 'Row':\n\t\t\treturn <div className={`an-w-row${part.scroll === true ? ' is-scroll' : ''}`}>{kids}</div>;\n\t\tcase 'Card': {\n\t\t\tconst image = ctx.url(part.image, 'image');\n\t\t\tconst href = ctx.url(part.href, 'link');\n\t\t\tconst actionHref = ctx.url(part.actionHref, 'link');\n\t\t\tconst actionLabel = str(part.actionLabel);\n\t\t\tif (actionHref && actionLabel) {\n\t\t\t\t// The card's one button (\"Add to cart\") is a link beside the card's\n\t\t\t\t// own link, never inside it.\n\t\t\t\tconst inner = (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{image && <img src={image} alt={str(part.imageAlt)} referrerPolicy=\"no-referrer\" loading=\"lazy\" />}\n\t\t\t\t\t\t<div className=\"an-w-card-body\">{kids}</div>\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t\t\treturn (\n\t\t\t\t\t<div className=\"an-w-card has-action\">\n\t\t\t\t\t\t{href ? (\n\t\t\t\t\t\t\t<a className=\"an-w-card-main\" href={href} target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t\t\t\t\t{inner}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div className=\"an-w-card-main\">{inner}</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<a className=\"an-w-card-action\" href={actionHref} target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t\t\t\t{actionLabel}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst body = (\n\t\t\t\t<div className=\"an-w-card\">\n\t\t\t\t\t{image && <img src={image} alt={str(part.imageAlt)} referrerPolicy=\"no-referrer\" loading=\"lazy\" />}\n\t\t\t\t\t<div className=\"an-w-card-body\">{kids}</div>\n\t\t\t\t</div>\n\t\t\t);\n\t\t\treturn href ? (\n\t\t\t\t<a className=\"an-w-card-link\" href={href} target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t\t{body}\n\t\t\t\t</a>\n\t\t\t) : (\n\t\t\t\tbody\n\t\t\t);\n\t\t}\n\t\tcase 'Text': {\n\t\t\tif (!str(part.text)) return null;\n\t\t\tconst v = ['title', 'heading', 'caption'].includes(str(part.variant)) ? str(part.variant) : 'body';\n\t\t\treturn <p className={`an-w-text is-${v}`}>{str(part.text)}</p>;\n\t\t}\n\t\tcase 'Stat':\n\t\t\tif (!str(part.value)) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-stat\">\n\t\t\t\t\t<strong>{str(part.value)}</strong>\n\t\t\t\t\t{str(part.label) && <span>{str(part.label)}</span>}\n\t\t\t\t\t{str(part.caption) && <small>{str(part.caption)}</small>}\n\t\t\t\t</div>\n\t\t\t);\n\t\tcase 'KeyValue': {\n\t\t\tconst rows = list<{ label?: unknown; value?: unknown; emphasis?: unknown }>(part.rows).filter((r) => str(r?.label) || str(r?.value));\n\t\t\tif (rows.length === 0) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-kv\">\n\t\t\t\t\t{str(part.title) && <div className=\"an-w-title\">{str(part.title)}</div>}\n\t\t\t\t\t<dl>\n\t\t\t\t\t\t{rows.map((r, i) => (\n\t\t\t\t\t\t\t<div key={i} className={r?.emphasis ? 'is-total' : undefined}>\n\t\t\t\t\t\t\t\t<dt>{str(r?.label)}</dt>\n\t\t\t\t\t\t\t\t<dd>{str(r?.value)}</dd>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</dl>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t\tcase 'Table': {\n\t\t\tconst cols = list(part.columns).map(str);\n\t\t\tconst rows = list(part.rows).filter(Array.isArray) as unknown[][];\n\t\t\tif (cols.length === 0 && rows.length === 0) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-table\">\n\t\t\t\t\t{str(part.title) && <div className=\"an-w-title\">{str(part.title)}</div>}\n\t\t\t\t\t<table>\n\t\t\t\t\t\t{cols.length > 0 && (\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t{cols.map((c, j) => (\n\t\t\t\t\t\t\t\t\t\t<th key={j}>{c}</th>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t{rows.map((r, i) => (\n\t\t\t\t\t\t\t\t<tr key={i}>\n\t\t\t\t\t\t\t\t\t{r.map((c, j) => (\n\t\t\t\t\t\t\t\t\t\t<td key={j} className={typeof c === 'number' ? 'is-num' : undefined}>\n\t\t\t\t\t\t\t\t\t\t\t{typeof c === 'number' ? ctx.number(c) : str(c)}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t\tcase 'Chart':\n\t\t\treturn <Chart part={part} ctx={ctx} />;\n\t\tcase 'Image': {\n\t\t\tconst url = ctx.url(part.url, 'image');\n\t\t\treturn url ? (\n\t\t\t\t<figure className=\"an-w-image\">\n\t\t\t\t\t<img src={url} alt={str(part.alt)} referrerPolicy=\"no-referrer\" loading=\"lazy\" />\n\t\t\t\t\t{str(part.caption) && <figcaption>{str(part.caption)}</figcaption>}\n\t\t\t\t</figure>\n\t\t\t) : null;\n\t\t}\n\t\tcase 'List': {\n\t\t\tconst items = list<{ title?: unknown; detail?: unknown; meta?: unknown; tone?: unknown }>(part.items).filter((it) => str(it?.title));\n\t\t\tif (items.length === 0) return null;\n\t\t\tconst Tag = part.ordered === true ? 'ol' : 'ul';\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-list\">\n\t\t\t\t\t{str(part.title) && <div className=\"an-w-title\">{str(part.title)}</div>}\n\t\t\t\t\t<Tag>\n\t\t\t\t\t\t{items.map((it, i) => (\n\t\t\t\t\t\t\t<li key={i}>\n\t\t\t\t\t\t\t\t<i className={`an-w-dot is-${toneOf(it?.tone)}`} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<strong>{str(it?.title)}</strong>\n\t\t\t\t\t\t\t\t\t{str(it?.detail) && <span>{str(it?.detail)}</span>}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{str(it?.meta) && <small>{str(it?.meta)}</small>}\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</Tag>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t\tcase 'Note':\n\t\t\tif (!str(part.text)) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-note\">\n\t\t\t\t\t{str(part.title) && <strong>{str(part.title)}</strong>}\n\t\t\t\t\t<span>{str(part.text)}</span>\n\t\t\t\t</div>\n\t\t\t);\n\t\tcase 'Badge':\n\t\t\treturn str(part.text) ? <span className={`an-w-badge is-${toneOf(part.tone)}`}>{str(part.text)}</span> : null;\n\t\tcase 'Link': {\n\t\t\tconst url = ctx.url(part.url, 'link');\n\t\t\treturn url && str(part.label) ? (\n\t\t\t\t<a className=\"an-w-link\" href={url} target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t\t{str(part.label)}\n\t\t\t\t</a>\n\t\t\t) : null;\n\t\t}\n\t\tcase 'Button':\n\t\t\tif (!str(part.label)) return null;\n\t\t\treturn (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={`an-w-button is-${part.variant === 'secondary' ? 'secondary' : 'primary'}`}\n\t\t\t\t\tdisabled={!onAsk}\n\t\t\t\t\tonClick={() => onAsk?.(str(part.label))}\n\t\t\t\t>\n\t\t\t\t\t{str(part.label)}\n\t\t\t\t</button>\n\t\t\t);\n\t\tcase 'Suggestions': {\n\t\t\tconst options = list(part.options).map(str).filter(Boolean);\n\t\t\tif (options.length === 0) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-suggest\">\n\t\t\t\t\t{options.map((o, i) => (\n\t\t\t\t\t\t<button key={i} type=\"button\" disabled={!onAsk} onClick={() => onAsk?.(o)}>\n\t\t\t\t\t\t\t{o}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t\tcase 'Divider':\n\t\t\treturn <hr className=\"an-w-divider\" />;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\nconst CONTAINERS = new Set(['Column', 'Row', 'Card']);\n\n// A plain function, not a component: the set of parts already drawn lives for\n// one render of the widget. As a component, React's development mode would draw\n// each part twice and find every one \"already drawn\" on its second pass.\nfunction draw(id: string, ctx: Ctx): ReactNode {\n\tconst part = ctx.byId.get(id);\n\t// A part listed twice, or a loop of containers, is drawn once.\n\tif (!part || ctx.seen.has(id)) return null;\n\tctx.seen.add(id);\n\tconst kids = CONTAINERS.has(part.component)\n\t\t? list(part.children)\n\t\t\t\t.filter((k): k is string => typeof k === 'string')\n\t\t\t\t.map((k) => <Fragment key={k}>{draw(k, ctx)}</Fragment>)\n\t\t: undefined;\n\tconst own = ctx.props.parts?.[part.component as WidgetKind];\n\treturn own ? own({ part, children: kids, onAsk: ctx.props.onAsk }) : defaultPart(part, kids, ctx);\n}\n\n/** One widget, drawn from its root part. Draws nothing when there is no root yet. */\nexport function WidgetView(props: WidgetViewProps) {\n\tconst { widget, currency = 'USD', locale, allowUrl } = props;\n\tconst byId = new Map<string, WidgetPart>();\n\tfor (const p of Array.isArray(widget?.components) ? widget.components : []) {\n\t\tif (p && typeof p === 'object' && typeof p.id === 'string' && typeof p.component === 'string' && !byId.has(p.id)) byId.set(p.id, p);\n\t}\n\tif (!byId.has('root')) return null;\n\tlet moneyFormat: Intl.NumberFormat;\n\ttry {\n\t\tmoneyFormat = new Intl.NumberFormat(locale, { style: 'currency', currency, maximumFractionDigits: 0 });\n\t} catch {\n\t\tmoneyFormat = new Intl.NumberFormat(locale, { maximumFractionDigits: 0 });\n\t}\n\tconst numberFormat = new Intl.NumberFormat(locale);\n\tconst ctx: Ctx = {\n\t\tbyId,\n\t\tseen: new Set(),\n\t\tprops,\n\t\tmoney: (n) => moneyFormat.format(n),\n\t\tnumber: (n) => numberFormat.format(n),\n\t\turl: (v, use) => (typeof v === 'string' && httpsOnly(v) && (allowUrl ? allowUrl(v, use) : true) ? v : undefined),\n\t};\n\treturn (\n\t\t<Boundary>\n\t\t\t<div className={`an-w${props.className ? ` ${props.className}` : ''}`} data-surface={widget.surfaceId}>\n\t\t\t\t{draw('root', ctx)}\n\t\t\t</div>\n\t\t</Boundary>\n\t);\n}\n\nfunction Paragraphs({ text }: { text: string }) {\n\treturn (\n\t\t<>\n\t\t\t{text\n\t\t\t\t.trim()\n\t\t\t\t.split(/\\n{2,}/)\n\t\t\t\t.map((p, i) => (\n\t\t\t\t\t<p key={i} className=\"an-reply-text\">\n\t\t\t\t\t\t{p.split('\\n').map((line, j) => (\n\t\t\t\t\t\t\t<Fragment key={j}>\n\t\t\t\t\t\t\t\t{j > 0 && <br />}\n\t\t\t\t\t\t\t\t{line}\n\t\t\t\t\t\t\t</Fragment>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</p>\n\t\t\t\t))}\n\t\t</>\n\t);\n}\n\n/** A whole reply: its words, with each widget drawn where it sits. */\nexport function ReplyView({ text, widgets, renderText, className, ...widgetProps }: ReplyViewProps) {\n\treturn (\n\t\t<div className={`an-reply${className ? ` ${className}` : ''}`}>\n\t\t\t{placeWidgets(text, widgets ?? []).map((piece, i) =>\n\t\t\t\tpiece.kind === 'text' ? (\n\t\t\t\t\t<Fragment key={`t${i}`}>{renderText ? renderText(piece.text) : <Paragraphs text={piece.text} />}</Fragment>\n\t\t\t\t) : (\n\t\t\t\t\t<WidgetView key={piece.widget.surfaceId} widget={piece.widget} {...widgetProps} />\n\t\t\t\t),\n\t\t\t)}\n\t\t</div>\n\t);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"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","sourcesContent":["// Ready-made React views for the widgets an agent draws in its replies.\n//\n// import { ReplyView } from '@cerebro-labs/agentnava-sdk/react'\n// import '@cerebro-labs/agentnava-sdk/react/styles.css'\n//\n// <ReplyView text={reply} widgets={widgets} onAsk={send} />\n//\n// React is optional for the SDK: only this entry needs it, and the rest of the\n// package never imports it. Every kind of part has a default look (styles.css,\n// themed through CSS variables), and any kind can be swapped for your own\n// component with `parts`.\n//\n// A widget is written by the model, so it is drawn defensively: a kind this\n// does not know, or a part missing a field, is skipped; each part is drawn\n// once, even if two containers name it; links and pictures open only over\n// https:// (narrow it further with `allowUrl`); and a widget that throws while\n// drawing is left out rather than breaking the screen around it.\n\nimport { Component, Fragment, type ReactNode, useEffect, useId, useRef, useState } from 'react';\nimport type { Widget, WidgetPart } from './types.ts';\nimport { placeWidgets } from './widgets.ts';\n\nexport { placeWidgets, type ReplyPiece } from './widgets.ts';\n\n/** Every kind of part an agent may draw. */\nexport type WidgetKind =\n\t| 'Column'\n\t| 'Row'\n\t| 'Card'\n\t| 'Text'\n\t| 'Stat'\n\t| 'KeyValue'\n\t| 'Table'\n\t| 'Chart'\n\t| 'Image'\n\t| 'List'\n\t| 'Note'\n\t| 'Badge'\n\t| 'Link'\n\t| 'Button'\n\t| 'Suggestions'\n\t| 'Divider';\n\n/** What a replacement for one kind of part receives. */\nexport interface PartProps {\n\tpart: WidgetPart;\n\t/** The part's children, already drawn (containers only). */\n\tchildren?: ReactNode;\n\t/** Send words as the reader's next message (Button, Suggestions). */\n\tonAsk?: ((text: string) => void) | undefined;\n}\n\nexport interface WidgetViewProps {\n\twidget: Widget;\n\t/** Called with a Button's label or a tapped suggestion: send it as the next message. */\n\tonAsk?: (text: string) => void;\n\t/** Your own component for any kind of part, in place of the default. */\n\tparts?: Partial<Record<WidgetKind, (props: PartProps) => ReactNode>>;\n\t/** ISO currency code for charts and numbers marked as money. Default \"USD\". */\n\tcurrency?: string;\n\t/** Locale for numbers. Default: the reader's. */\n\tlocale?: string;\n\t/** Whether a link or picture address may be opened. Default: https:// only. */\n\tallowUrl?: (url: string, use: 'link' | 'image') => boolean;\n\tclassName?: string;\n}\n\nexport interface ReplyViewProps extends Omit<WidgetViewProps, 'widget' | 'className'> {\n\t/** The reply's words, as `text` events or `done.reply` give them. */\n\ttext: string;\n\t/** The reply's widgets, as `widget` events or `done.widgets` give them. */\n\twidgets?: readonly Widget[] | undefined;\n\t/** How to draw the words. Default: paragraphs. Pass your markdown renderer here. */\n\trenderText?: (text: string) => ReactNode;\n\tclassName?: string;\n}\n\nconst str = (v: unknown): string => (typeof v === 'string' || typeof v === 'number' ? String(v) : '');\nconst list = <T = unknown,>(v: unknown): T[] => (Array.isArray(v) ? (v as T[]) : []);\nconst TONES = new Set(['high', 'medium', 'low', 'good', 'info']);\nconst toneOf = (v: unknown): string => (typeof v === 'string' && TONES.has(v) ? v : 'info');\nconst httpsOnly = (url: string) => /^https:\\/\\//i.test(url);\n\n/** A widget that throws while drawing is left out, never a crash of the screen. */\nclass Boundary extends Component<{ children: ReactNode }, { failed: boolean }> {\n\toverride state = { failed: false };\n\tstatic getDerivedStateFromError() {\n\t\treturn { failed: true };\n\t}\n\toverride render() {\n\t\treturn this.state.failed ? null : this.props.children;\n\t}\n}\n\ninterface Ctx {\n\tbyId: Map<string, WidgetPart>;\n\tseen: Set<string>;\n\tprops: WidgetViewProps;\n\tmoney: (n: number) => string;\n\tnumber: (n: number) => string;\n\turl: (v: unknown, use: 'link' | 'image') => string | undefined;\n}\n\n/** A caption's leading figure is bold; a signed one (\"-1.55%\", \"+12\") is red or green too. */\nfunction caption(text: string): ReactNode {\n\tconst m = /^([+\\-\\u2212]?[$\\u20ac\\u00a3\\u20b9]?\\d[\\d,.]*[%KMBTx]?)(.*)$/s.exec(text);\n\tif (!m) return text;\n\t// Only a signed figure says which way it moved; \"12 errors\" is not good news.\n\tconst dir = /^[-\\u2212]/.test(m[1]!) ? 'is-down' : m[1]!.startsWith('+') ? 'is-up' : '';\n\treturn (\n\t\t<>\n\t\t\t<b className={dir || undefined}>{m[1]}</b>\n\t\t\t{m[2]}\n\t\t</>\n\t);\n}\n\n/** Round numbers for the y axis: about `count` steps of 1, 2, 2.5 or 5 x 10^n. */\nfunction niceTicks(lo: number, hi: number, count = 4): number[] {\n\tif (lo === hi) {\n\t\tconst pad = Math.abs(lo) * 0.1 || 1;\n\t\tlo -= pad;\n\t\thi += pad;\n\t}\n\tconst raw = (hi - lo) / count;\n\tconst mag = 10 ** Math.floor(Math.log10(raw));\n\tconst step = ([1, 2, 2.5, 5, 10].find((m) => m * mag >= raw) ?? 10) * mag;\n\tconst ticks: number[] = [];\n\tfor (let t = Math.floor(lo / step) * step; t <= hi + step * 1e-9; t += step) ticks.push(Number(t.toPrecision(12)));\n\tif (ticks[ticks.length - 1]! < hi) ticks.push(Number((ticks[ticks.length - 1]! + step).toPrecision(12)));\n\treturn ticks;\n}\n\n/** Short axis numbers: 1.2K, 3.4M, 5B. */\nfunction compact(n: number, locale?: string): string {\n\ttry {\n\t\treturn new Intl.NumberFormat(locale, {\n\t\t\tnotation: 'compact',\n\t\t\tmaximumFractionDigits: 1,\n\t\t}).format(n);\n\t} catch {\n\t\treturn String(n);\n\t}\n}\n\nfunction Chart({ part, ctx }: { part: WidgetPart; ctx: Ctx }) {\n\tconst box = useRef<HTMLDivElement>(null);\n\tconst gid = `an-w-g${useId().replace(/:/g, '')}`;\n\t// Drawn in real pixels at the box's own width, so text stays at body size\n\t// however wide the card is (a scaled viewBox blew 10px labels up to 40px).\n\tconst [W, setW] = useState(560);\n\tconst [hover, setHover] = useState<number | null>(null);\n\tuseEffect(() => {\n\t\tconst el = box.current;\n\t\tif (!el || typeof ResizeObserver === 'undefined') return;\n\t\tconst ro = new ResizeObserver(([e]) => {\n\t\t\tconst w = Math.round(e!.contentRect.width);\n\t\t\tif (w > 0) setW(w);\n\t\t});\n\t\tro.observe(el);\n\t\treturn () => ro.disconnect();\n\t}, []);\n\tconst series = list<{ name?: unknown; points?: unknown }>(part.series)\n\t\t.map((s) => ({\n\t\t\tname: str(s?.name),\n\t\t\tpoints: list<{ x?: unknown; y?: unknown }>(s?.points).filter((p) => typeof p?.y === 'number' && Number.isFinite(p.y)),\n\t\t}))\n\t\t.filter((s) => s.points.length > 0);\n\tif (series.length === 0) return null;\n\tconst xs = series[0]!.points.map((p) => str(p.x));\n\tconst n = Math.max(...series.map((s) => s.points.length));\n\tconst ref = part.reference as { y?: unknown; label?: unknown } | undefined;\n\tconst refY = typeof ref?.y === 'number' && Number.isFinite(ref.y) ? ref.y : undefined;\n\tconst isBar = part.type === 'bar';\n\tconst ys = [...series.flatMap((s) => s.points.map((p) => p.y as number)), ...(refY === undefined ? [] : [refY])];\n\t// Bars measure from zero, so zero is always in range. A line shows change,\n\t// so it fits its own range: a price moving 520 to 540 must not draw flat.\n\tconst dataLo = Math.min(...ys);\n\tconst dataHi = Math.max(...ys);\n\tconst ticks = isBar ? niceTicks(Math.min(dataLo, 0), Math.max(dataHi, 0)) : niceTicks(dataLo, dataHi);\n\tconst lo = ticks[0]!;\n\tconst hi = ticks[ticks.length - 1]!;\n\tconst span = hi - lo || 1;\n\tconst fmt = (v: number) => (part.unit === 'currency' ? ctx.money(v) : part.unit === 'percent' ? `${ctx.number(v)}%` : ctx.number(v));\n\tconst axis = (v: number) => {\n\t\tconst short = Math.abs(hi) >= 10000 || Math.abs(lo) >= 10000 ? compact(v, ctx.props.locale) : ctx.number(v);\n\t\treturn part.unit === 'currency' ? (fmt(0).replace(/[\\d.,\\s]+/g, '') || '') + short : part.unit === 'percent' ? `${short}%` : short;\n\t};\n\tconst H = 220;\n\tconst top = 12;\n\tconst bottom = 26;\n\tconst left = Math.max(...ticks.map((t) => axis(t).length)) * 6.5 + 10;\n\tconst right = Math.max(12, Math.max(...xs.map((x) => x.length), 1) * 3.3);\n\tconst plotW = Math.max(W - left - right, 40);\n\tconst plotH = H - top - bottom;\n\tconst yOf = (y: number) => top + plotH - ((y - lo) / span) * plotH;\n\tconst step = plotW / Math.max(n, 1);\n\tconst xOf = (i: number) => (isBar ? left + i * step + step / 2 : left + (n === 1 ? plotW / 2 : (i / (n - 1)) * plotW));\n\tconst zero = yOf(Math.max(lo, Math.min(0, hi)));\n\t// Thin the x labels until each fits in the room it has.\n\tconst longest = Math.max(...xs.map((x) => x.length), 1);\n\tconst every = Math.max(1, Math.ceil((longest * 6.5 + 12) / (plotW / Math.max(n, 1))));\n\tconst showDots = false;\n\tconst pick = (e: { clientX: number; currentTarget: SVGSVGElement }) => {\n\t\tconst r = e.currentTarget.getBoundingClientRect();\n\t\tconst px = ((e.clientX - r.left) / r.width) * W;\n\t\tlet best = 0;\n\t\tfor (let i = 1; i < n; i++) if (Math.abs(xOf(i) - px) < Math.abs(xOf(best) - px)) best = i;\n\t\tsetHover(best);\n\t};\n\tconst tipX = hover === null ? 0 : xOf(hover);\n\t// One trend line leads with where it ended and how far it moved, like a stat.\n\tconst only = series.length === 1 && !isBar && series[0]!.points.length >= 2 ? series[0]!.points : undefined;\n\tconst headline = only\n\t\t? (() => {\n\t\t\t\tconst first = only[0]!.y as number;\n\t\t\t\tconst last = only[only.length - 1]!.y as number;\n\t\t\t\tconst delta = last - first;\n\t\t\t\tconst abs = part.unit === 'percent' ? `${ctx.number(Math.abs(delta))} pts` : fmt(Math.abs(delta)).replace('-', '');\n\t\t\t\tconst pct = part.unit !== 'percent' && first > 0 && last >= 0 ? ` (${ctx.number(Math.round((Math.abs(delta) / first) * 1000) / 10)}%)` : '';\n\t\t\t\treturn { last, delta, change: abs + pct, from: str(only[0]!.x) };\n\t\t\t})()\n\t\t: undefined;\n\treturn (\n\t\t<figure className=\"an-w-chart\">\n\t\t\t{str(part.title) && <figcaption>{str(part.title)}</figcaption>}\n\t\t\t{headline && (\n\t\t\t\t<div className=\"an-w-chart-head\">\n\t\t\t\t\t<strong>{fmt(headline.last)}</strong>\n\t\t\t\t\t<span>\n\t\t\t\t\t\t{headline.delta === 0 ? 'No change' : `${headline.delta > 0 ? '\\u25B2' : '\\u25BC'} ${headline.change}`} since {headline.from}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<div ref={box} className=\"an-w-chart-box\">\n\t\t\t\t<svg\n\t\t\t\t\twidth={W}\n\t\t\t\t\theight={H}\n\t\t\t\t\tviewBox={`0 0 ${W} ${H}`}\n\t\t\t\t\trole=\"img\"\n\t\t\t\t\taria-label={str(part.title) || 'Chart'}\n\t\t\t\t\tonMouseMove={pick}\n\t\t\t\t\tonMouseLeave={() => setHover(null)}\n\t\t\t\t>\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t{[0, 1, 2, 3].map((k) => (\n\t\t\t\t\t\t\t<linearGradient key={k} id={`${gid}-${k}`} x1=\"0\" x2=\"0\" y1=\"0\" y2=\"1\">\n\t\t\t\t\t\t\t\t<stop offset=\"0%\" className={`an-w-stop an-w-s${k}`} stopOpacity={part.type === 'area' ? 0.28 : 0.18} />\n\t\t\t\t\t\t\t\t<stop offset=\"100%\" className={`an-w-stop an-w-s${k}`} stopOpacity={0} />\n\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</defs>\n\t\t\t\t\t{ticks.map((t) => (\n\t\t\t\t\t\t<g key={t} className=\"an-w-grid\">\n\t\t\t\t\t\t\t<line x1={left} x2={W - right} y1={yOf(t)} y2={yOf(t)} />\n\t\t\t\t\t\t\t<text x={left - 8} y={yOf(t)} dy=\"0.32em\" textAnchor=\"end\">\n\t\t\t\t\t\t\t\t{axis(t)}\n\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t))}\n\t\t\t\t\t{series.map((s, si) =>\n\t\t\t\t\t\tisBar ? (\n\t\t\t\t\t\t\ts.points.map((p, i) => {\n\t\t\t\t\t\t\t\tconst bw = Math.min((step * 0.7) / series.length, 48);\n\t\t\t\t\t\t\t\tconst x = xOf(i) - (bw * series.length) / 2 + si * bw;\n\t\t\t\t\t\t\t\tconst y = yOf(p.y as number);\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<g key={`${si}-${i}`}>\n\t\t\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\t\t\tclassName={`an-w-s${si % 4}${hover !== null && hover !== i ? ' is-dim' : ''}`}\n\t\t\t\t\t\t\t\t\t\t\tx={x + 1}\n\t\t\t\t\t\t\t\t\t\t\ty={Math.min(y, zero)}\n\t\t\t\t\t\t\t\t\t\t\twidth={Math.max(bw - 2, 1)}\n\t\t\t\t\t\t\t\t\t\t\theight={Math.max(Math.abs(zero - y), 1)}\n\t\t\t\t\t\t\t\t\t\t\trx={3}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t{series.length === 1 && n <= 8 && (\n\t\t\t\t\t\t\t\t\t\t\t<text className=\"an-w-val\" x={x + bw / 2} y={Math.min(y, zero) - 6} textAnchor=\"middle\">\n\t\t\t\t\t\t\t\t\t\t\t\t{fmt(p.y as number)}\n\t\t\t\t\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<g key={si}>\n\t\t\t\t\t\t\t\t{(part.type === 'area' || series.length === 1) && (\n\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\tclassName={`an-w-area an-w-s${si % 4}`}\n\t\t\t\t\t\t\t\t\t\tfill={`url(#${gid}-${si % 4})`}\n\t\t\t\t\t\t\t\t\t\td={`M${xOf(0)},${zero} ${s.points.map((p, i) => `L${xOf(i)},${yOf(p.y as number)}`).join(' ')} L${xOf(s.points.length - 1)},${zero}Z`}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<polyline className={`an-w-line an-w-s${si % 4}`} points={s.points.map((p, i) => `${xOf(i)},${yOf(p.y as number)}`).join(' ')} />\n\t\t\t\t\t\t\t\t{s.points.map((p, i) =>\n\t\t\t\t\t\t\t\t\tshowDots || hover === i || (series.length === 1 && i === s.points.length - 1) ? (\n\t\t\t\t\t\t\t\t\t\t<circle key={i} className={`an-w-s${si % 4}`} cx={xOf(i)} cy={yOf(p.y as number)} r={hover === i ? 4.5 : 4} />\n\t\t\t\t\t\t\t\t\t) : null,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t),\n\t\t\t\t\t)}\n\t\t\t\t\t{lo < 0 && hi > 0 && <line className=\"an-w-zero\" x1={left} x2={W - right} y1={zero} y2={zero} />}\n\t\t\t\t\t{refY !== undefined && (\n\t\t\t\t\t\t<g className=\"an-w-ref\">\n\t\t\t\t\t\t\t<line x1={left} x2={W - right} y1={yOf(refY)} y2={yOf(refY)} />\n\t\t\t\t\t\t\t{str(ref?.label) && (\n\t\t\t\t\t\t\t\t<text x={W - right} y={yOf(refY) - 5} textAnchor=\"end\">\n\t\t\t\t\t\t\t\t\t{str(ref?.label)}\n\t\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</g>\n\t\t\t\t\t)}\n\t\t\t\t\t{xs.map((x, i) =>\n\t\t\t\t\t\ti % every === 0 ? (\n\t\t\t\t\t\t\t<text key={i} x={xOf(i)} y={H - 8} textAnchor=\"middle\">\n\t\t\t\t\t\t\t\t{x}\n\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t) : null,\n\t\t\t\t\t)}\n\t\t\t\t\t{hover !== null && !isBar && <line className=\"an-w-cross\" x1={tipX} x2={tipX} y1={top} y2={top + plotH} />}\n\t\t\t\t</svg>\n\t\t\t\t{hover !== null && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"an-w-tip\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tleft: tipX,\n\t\t\t\t\t\t\ttransform: `translateX(${tipX > W / 2 ? 'calc(-100% - 10px)' : '10px'})`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<b>{xs[hover]}</b>\n\t\t\t\t\t\t{series.map((s, si) =>\n\t\t\t\t\t\t\ts.points[hover] ? (\n\t\t\t\t\t\t\t\t<span key={si}>\n\t\t\t\t\t\t\t\t\t<i className={`an-w-s${si % 4}`} />\n\t\t\t\t\t\t\t\t\t{series.length > 1 && `${s.name} `}\n\t\t\t\t\t\t\t\t\t<strong>{fmt(s.points[hover]!.y as number)}</strong>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t) : null,\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{series.length > 1 && (\n\t\t\t\t<div className=\"an-w-legend\">\n\t\t\t\t\t{series.map((s, si) => (\n\t\t\t\t\t\t<span key={si}>\n\t\t\t\t\t\t\t<i className={`an-w-s${si % 4}`} />\n\t\t\t\t\t\t\t{s.name}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</figure>\n\t);\n}\n\n/** The default look of one part. `kids` is its children, already drawn. */\nfunction defaultPart(part: WidgetPart, kids: ReactNode, ctx: Ctx): ReactNode {\n\tconst onAsk = ctx.props.onAsk;\n\tswitch (part.component) {\n\t\tcase 'Column':\n\t\t\treturn <div className={`an-w-col an-w-gap-${['small', 'large'].includes(str(part.gap)) ? str(part.gap) : 'medium'}`}>{kids}</div>;\n\t\tcase 'Row':\n\t\t\treturn <div className={`an-w-row${part.scroll === true ? ' is-scroll' : ''}`}>{kids}</div>;\n\t\tcase 'Card': {\n\t\t\tconst image = ctx.url(part.image, 'image');\n\t\t\tconst href = ctx.url(part.href, 'link');\n\t\t\tconst actionHref = ctx.url(part.actionHref, 'link');\n\t\t\tconst actionLabel = str(part.actionLabel);\n\t\t\tif (actionHref && actionLabel) {\n\t\t\t\t// The card's one button (\"Add to cart\") is a link beside the card's\n\t\t\t\t// own link, never inside it.\n\t\t\t\tconst inner = (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{image && <img src={image} alt={str(part.imageAlt)} referrerPolicy=\"no-referrer\" loading=\"lazy\" />}\n\t\t\t\t\t\t<div className=\"an-w-card-body\">{kids}</div>\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t\t\treturn (\n\t\t\t\t\t<div className=\"an-w-card has-action\">\n\t\t\t\t\t\t{href ? (\n\t\t\t\t\t\t\t<a className=\"an-w-card-main\" href={href} target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t\t\t\t\t{inner}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div className=\"an-w-card-main\">{inner}</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<a className=\"an-w-card-action\" href={actionHref} target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t\t\t\t{actionLabel}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst body = (\n\t\t\t\t<div className=\"an-w-card\">\n\t\t\t\t\t{image && <img src={image} alt={str(part.imageAlt)} referrerPolicy=\"no-referrer\" loading=\"lazy\" />}\n\t\t\t\t\t<div className=\"an-w-card-body\">{kids}</div>\n\t\t\t\t</div>\n\t\t\t);\n\t\t\treturn href ? (\n\t\t\t\t<a className=\"an-w-card-link\" href={href} target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t\t{body}\n\t\t\t\t</a>\n\t\t\t) : (\n\t\t\t\tbody\n\t\t\t);\n\t\t}\n\t\tcase 'Text': {\n\t\t\tif (!str(part.text)) return null;\n\t\t\tconst v = ['title', 'heading', 'caption'].includes(str(part.variant)) ? str(part.variant) : 'body';\n\t\t\treturn <p className={`an-w-text is-${v}`}>{str(part.text)}</p>;\n\t\t}\n\t\tcase 'Stat':\n\t\t\tif (!str(part.value)) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-stat\">\n\t\t\t\t\t{str(part.label) && <span>{str(part.label)}</span>}\n\t\t\t\t\t<strong>{str(part.value)}</strong>\n\t\t\t\t\t{str(part.caption) && <small>{caption(str(part.caption))}</small>}\n\t\t\t\t</div>\n\t\t\t);\n\t\tcase 'KeyValue': {\n\t\t\tconst rows = list<{\n\t\t\t\tlabel?: unknown;\n\t\t\t\tvalue?: unknown;\n\t\t\t\temphasis?: unknown;\n\t\t\t}>(part.rows).filter((r) => str(r?.label) || str(r?.value));\n\t\t\tif (rows.length === 0) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-kv\">\n\t\t\t\t\t{str(part.title) && <div className=\"an-w-title\">{str(part.title)}</div>}\n\t\t\t\t\t<dl>\n\t\t\t\t\t\t{rows.map((r, i) => (\n\t\t\t\t\t\t\t<div key={i} className={r?.emphasis ? 'is-total' : undefined}>\n\t\t\t\t\t\t\t\t<dt>{str(r?.label)}</dt>\n\t\t\t\t\t\t\t\t<dd>{str(r?.value)}</dd>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</dl>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t\tcase 'Table': {\n\t\t\tconst cols = list(part.columns).map(str);\n\t\t\tconst rows = list(part.rows).filter(Array.isArray) as unknown[][];\n\t\t\tif (cols.length === 0 && rows.length === 0) return null;\n\t\t\t// A column is numeric when every filled cell is a figure (\"521.91\", \"-1.55%\", \"$3.2B\"),\n\t\t\t// and then its header lines up with its numbers on the right.\n\t\t\tconst figure = (c: unknown) => typeof c === 'number' || (typeof c === 'string' && /^[+\\-\\u2212]?[$\\u20ac\\u00a3\\u20b9]?\\d[\\d,.]*\\s?[%KMBTx]?$/.test(c.trim()));\n\t\t\tconst numCol = (j: number) => {\n\t\t\t\tconst filled = rows.map((r) => r[j]).filter((c) => c !== null && c !== undefined && c !== '');\n\t\t\t\treturn filled.length > 0 && filled.every(figure);\n\t\t\t};\n\t\t\tconst nums = Array.from({ length: Math.max(cols.length, ...rows.map((r) => r.length)) }, (_, j) => numCol(j));\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-table\">\n\t\t\t\t\t{str(part.title) && (\n\t\t\t\t\t\t<div className=\"an-w-title\">\n\t\t\t\t\t\t\t{str(part.title)}\n\t\t\t\t\t\t\t{rows.length > 3 && <span>{rows.length} rows</span>}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<table>\n\t\t\t\t\t\t{cols.length > 0 && (\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t{cols.map((c, j) => (\n\t\t\t\t\t\t\t\t\t\t<th key={j} className={nums[j] ? 'is-num' : undefined}>\n\t\t\t\t\t\t\t\t\t\t\t{c}\n\t\t\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t{rows.map((r, i) => (\n\t\t\t\t\t\t\t\t<tr key={i}>\n\t\t\t\t\t\t\t\t\t{r.map((c, j) => (\n\t\t\t\t\t\t\t\t\t\t<td key={j} className={nums[j] ? 'is-num' : undefined}>\n\t\t\t\t\t\t\t\t\t\t\t{typeof c === 'string' && /^[+\\-\\u2212]\\d/.test(c.trim()) ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<em className={/^\\+/.test(c.trim()) ? 'is-up' : 'is-down'}>{c}</em>\n\t\t\t\t\t\t\t\t\t\t\t) : typeof c === 'number' ? (\n\t\t\t\t\t\t\t\t\t\t\t\tctx.number(c)\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\tstr(c)\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t\tcase 'Chart':\n\t\t\treturn <Chart part={part} ctx={ctx} />;\n\t\tcase 'Image': {\n\t\t\tconst url = ctx.url(part.url, 'image');\n\t\t\treturn url ? (\n\t\t\t\t<figure className=\"an-w-image\">\n\t\t\t\t\t<img src={url} alt={str(part.alt)} referrerPolicy=\"no-referrer\" loading=\"lazy\" />\n\t\t\t\t\t{str(part.caption) && <figcaption>{str(part.caption)}</figcaption>}\n\t\t\t\t</figure>\n\t\t\t) : null;\n\t\t}\n\t\tcase 'List': {\n\t\t\tconst items = list<{\n\t\t\t\ttitle?: unknown;\n\t\t\t\tdetail?: unknown;\n\t\t\t\tmeta?: unknown;\n\t\t\t\ttone?: unknown;\n\t\t\t}>(part.items).filter((it) => str(it?.title));\n\t\t\tif (items.length === 0) return null;\n\t\t\tconst Tag = part.ordered === true ? 'ol' : 'ul';\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-list\">\n\t\t\t\t\t{str(part.title) && <div className=\"an-w-title\">{str(part.title)}</div>}\n\t\t\t\t\t<Tag>\n\t\t\t\t\t\t{items.map((it, i) => (\n\t\t\t\t\t\t\t<li key={i}>\n\t\t\t\t\t\t\t\t<i className={`an-w-dot is-${toneOf(it?.tone)}`} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<strong>{str(it?.title)}</strong>\n\t\t\t\t\t\t\t\t\t{str(it?.detail) && <span>{str(it?.detail)}</span>}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{str(it?.meta) && <small>{str(it?.meta)}</small>}\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</Tag>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t\tcase 'Note':\n\t\t\tif (!str(part.text)) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-note\">\n\t\t\t\t\t{str(part.title) && <strong>{str(part.title)}</strong>}\n\t\t\t\t\t<span>{str(part.text)}</span>\n\t\t\t\t</div>\n\t\t\t);\n\t\tcase 'Badge':\n\t\t\treturn str(part.text) ? <span className={`an-w-badge is-${toneOf(part.tone)}`}>{str(part.text)}</span> : null;\n\t\tcase 'Link': {\n\t\t\tconst url = ctx.url(part.url, 'link');\n\t\t\treturn url && str(part.label) ? (\n\t\t\t\t<a className=\"an-w-link\" href={url} target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t\t{str(part.label)}\n\t\t\t\t</a>\n\t\t\t) : null;\n\t\t}\n\t\tcase 'Button':\n\t\t\tif (!str(part.label)) return null;\n\t\t\treturn (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={`an-w-button is-${part.variant === 'secondary' ? 'secondary' : 'primary'}`}\n\t\t\t\t\tdisabled={!onAsk}\n\t\t\t\t\tonClick={() => onAsk?.(str(part.label))}\n\t\t\t\t>\n\t\t\t\t\t{str(part.label)}\n\t\t\t\t</button>\n\t\t\t);\n\t\tcase 'Suggestions': {\n\t\t\tconst options = list(part.options).map(str).filter(Boolean);\n\t\t\tif (options.length === 0) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-suggest\">\n\t\t\t\t\t{options.map((o, i) => (\n\t\t\t\t\t\t<button key={i} type=\"button\" disabled={!onAsk} onClick={() => onAsk?.(o)}>\n\t\t\t\t\t\t\t{o}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t\tcase 'Divider':\n\t\t\treturn <hr className=\"an-w-divider\" />;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\nconst CONTAINERS = new Set(['Column', 'Row', 'Card']);\n\n// A plain function, not a component: the set of parts already drawn lives for\n// one render of the widget. As a component, React's development mode would draw\n// each part twice and find every one \"already drawn\" on its second pass.\nfunction draw(id: string, ctx: Ctx): ReactNode {\n\tconst part = ctx.byId.get(id);\n\t// A part listed twice, or a loop of containers, is drawn once.\n\tif (!part || ctx.seen.has(id)) return null;\n\tctx.seen.add(id);\n\tconst kids = CONTAINERS.has(part.component)\n\t\t? list(part.children)\n\t\t\t\t.filter((k): k is string => typeof k === 'string')\n\t\t\t\t.map((k) => <Fragment key={k}>{draw(k, ctx)}</Fragment>)\n\t\t: undefined;\n\tconst own = ctx.props.parts?.[part.component as WidgetKind];\n\treturn own ? own({ part, children: kids, onAsk: ctx.props.onAsk }) : defaultPart(part, kids, ctx);\n}\n\n/** One widget, drawn from its root part. Draws nothing when there is no root yet. */\nexport function WidgetView(props: WidgetViewProps) {\n\tconst { widget, currency = 'USD', locale, allowUrl } = props;\n\tconst byId = new Map<string, WidgetPart>();\n\tfor (const p of Array.isArray(widget?.components) ? widget.components : []) {\n\t\tif (p && typeof p === 'object' && typeof p.id === 'string' && typeof p.component === 'string' && !byId.has(p.id)) byId.set(p.id, p);\n\t}\n\tif (!byId.has('root')) return null;\n\tlet moneyFormat: Intl.NumberFormat;\n\ttry {\n\t\tmoneyFormat = new Intl.NumberFormat(locale, {\n\t\t\tstyle: 'currency',\n\t\t\tcurrency,\n\t\t\tmaximumFractionDigits: 0,\n\t\t});\n\t} catch {\n\t\tmoneyFormat = new Intl.NumberFormat(locale, { maximumFractionDigits: 0 });\n\t}\n\tconst numberFormat = new Intl.NumberFormat(locale);\n\tconst ctx: Ctx = {\n\t\tbyId,\n\t\tseen: new Set(),\n\t\tprops,\n\t\tmoney: (n) => moneyFormat.format(n),\n\t\tnumber: (n) => numberFormat.format(n),\n\t\turl: (v, use) => (typeof v === 'string' && httpsOnly(v) && (allowUrl ? allowUrl(v, use) : true) ? v : undefined),\n\t};\n\treturn (\n\t\t<Boundary>\n\t\t\t<div className={`an-w${props.className ? ` ${props.className}` : ''}`} data-surface={widget.surfaceId}>\n\t\t\t\t{draw('root', ctx)}\n\t\t\t</div>\n\t\t</Boundary>\n\t);\n}\n\nfunction Paragraphs({ text }: { text: string }) {\n\treturn (\n\t\t<>\n\t\t\t{text\n\t\t\t\t.trim()\n\t\t\t\t.split(/\\n{2,}/)\n\t\t\t\t.map((p, i) => (\n\t\t\t\t\t<p key={i} className=\"an-reply-text\">\n\t\t\t\t\t\t{p.split('\\n').map((line, j) => (\n\t\t\t\t\t\t\t<Fragment key={j}>\n\t\t\t\t\t\t\t\t{j > 0 && <br />}\n\t\t\t\t\t\t\t\t{line}\n\t\t\t\t\t\t\t</Fragment>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</p>\n\t\t\t\t))}\n\t\t</>\n\t);\n}\n\n/** A whole reply: its words, with each widget drawn where it sits. */\nexport function ReplyView({ text, widgets, renderText, className, ...widgetProps }: ReplyViewProps) {\n\treturn (\n\t\t<div className={`an-reply${className ? ` ${className}` : ''}`}>\n\t\t\t{placeWidgets(text, widgets ?? []).map((piece, i) =>\n\t\t\t\tpiece.kind === 'text' ? (\n\t\t\t\t\t<Fragment key={`t${i}`}>{renderText ? renderText(piece.text) : <Paragraphs text={piece.text} />}</Fragment>\n\t\t\t\t) : (\n\t\t\t\t\t<WidgetView key={piece.widget.surfaceId} widget={piece.widget} {...widgetProps} />\n\t\t\t\t),\n\t\t\t)}\n\t\t</div>\n\t);\n}\n"]}
|
package/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const SDK_VERSION = "0.
|
|
1
|
+
export declare const SDK_VERSION = "0.75.1";
|
package/version.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// GENERATED by scripts/regen-version.mjs. Do not edit: run `bun run regen:version`
|
|
2
2
|
// after bumping the version in package.json. tests/version.test.ts fails if
|
|
3
3
|
// this drifts.
|
|
4
|
-
export const SDK_VERSION = '0.
|
|
4
|
+
export const SDK_VERSION = '0.75.1';
|
|
5
5
|
//# sourceMappingURL=version.js.map
|
package/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,4EAA4E;AAC5E,eAAe;AACf,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC","sourcesContent":["// GENERATED by scripts/regen-version.mjs. Do not edit: run `bun run regen:version`\n// after bumping the version in package.json. tests/version.test.ts fails if\n// this drifts.\nexport const SDK_VERSION = '0.
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,4EAA4E;AAC5E,eAAe;AACf,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC","sourcesContent":["// GENERATED by scripts/regen-version.mjs. Do not edit: run `bun run regen:version`\n// after bumping the version in package.json. tests/version.test.ts fails if\n// this drifts.\nexport const SDK_VERSION = '0.75.1';\n"]}
|