@assistant-ui/react-generative-ui 0.0.23 → 0.1.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/README.md +2 -0
- package/dist/a2ui.d.ts +1 -4
- package/dist/a2ui.d.ts.map +1 -1
- package/dist/a2ui.js +1 -4
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -10
- package/dist/index.server.d.ts +1 -2
- package/dist/index.server.d.ts.map +1 -1
- package/dist/index.server.js +1 -10
- package/dist/ir.d.ts +1 -111
- package/dist/ir.d.ts.map +1 -1
- package/dist/ir.js +1 -175
- package/dist/slack.d.ts +1 -4
- package/dist/slack.d.ts.map +1 -1
- package/dist/slack.js +1 -4
- package/dist/teams.d.ts +1 -4
- package/dist/teams.d.ts.map +1 -1
- package/dist/teams.js +1 -4
- package/package.json +5 -5
- package/src/a2ui.ts +1 -22
- package/src/index.server.ts +1 -2
- package/src/index.test.ts +75 -0
- package/src/index.ts +1 -2
- package/src/ir.ts +1 -279
- package/src/slack.ts +1 -39
- package/src/teams.ts +1 -35
- package/dist/JSONGenerativeUI.client.d.ts +0 -28
- package/dist/JSONGenerativeUI.client.d.ts.map +0 -1
- package/dist/JSONGenerativeUI.client.js +0 -101
- package/dist/JSONGenerativeUI.client.js.map +0 -1
- package/dist/JSONGenerativeUI.server.d.ts +0 -21
- package/dist/JSONGenerativeUI.server.d.ts.map +0 -1
- package/dist/JSONGenerativeUI.server.js +0 -32
- package/dist/JSONGenerativeUI.server.js.map +0 -1
- package/dist/JSONGenerativeUI.shared.d.ts +0 -63
- package/dist/JSONGenerativeUI.shared.d.ts.map +0 -1
- package/dist/JSONGenerativeUI.shared.js +0 -31
- package/dist/JSONGenerativeUI.shared.js.map +0 -1
- package/dist/RadioGroupScope.d.ts +0 -6
- package/dist/RadioGroupScope.d.ts.map +0 -1
- package/dist/RadioGroupScope.js +0 -25
- package/dist/RadioGroupScope.js.map +0 -1
- package/dist/a2ui/BindingContext.d.ts +0 -11
- package/dist/a2ui/BindingContext.d.ts.map +0 -1
- package/dist/a2ui/BindingContext.js +0 -12
- package/dist/a2ui/BindingContext.js.map +0 -1
- package/dist/a2ui/PresentRenderer.d.ts +0 -11
- package/dist/a2ui/PresentRenderer.d.ts.map +0 -1
- package/dist/a2ui/PresentRenderer.js +0 -39
- package/dist/a2ui/PresentRenderer.js.map +0 -1
- package/dist/a2ui/convert.d.ts +0 -15
- package/dist/a2ui/convert.d.ts.map +0 -1
- package/dist/a2ui/convert.js +0 -728
- package/dist/a2ui/convert.js.map +0 -1
- package/dist/a2ui/dataModel.d.ts +0 -9
- package/dist/a2ui/dataModel.d.ts.map +0 -1
- package/dist/a2ui/dataModel.js +0 -44
- package/dist/a2ui/dataModel.js.map +0 -1
- package/dist/a2ui/reducer.d.ts +0 -8
- package/dist/a2ui/reducer.d.ts.map +0 -1
- package/dist/a2ui/reducer.js +0 -242
- package/dist/a2ui/reducer.js.map +0 -1
- package/dist/a2ui/snapshot.d.ts +0 -3
- package/dist/a2ui/snapshot.d.ts.map +0 -1
- package/dist/a2ui/snapshot.js +0 -33
- package/dist/a2ui/snapshot.js.map +0 -1
- package/dist/a2ui/types.d.ts +0 -88
- package/dist/a2ui/types.d.ts.map +0 -1
- package/dist/a2ui/types.js +0 -6
- package/dist/a2ui/types.js.map +0 -1
- package/dist/a2ui/valueFunctions.d.ts +0 -16
- package/dist/a2ui/valueFunctions.d.ts.map +0 -1
- package/dist/a2ui/valueFunctions.js +0 -332
- package/dist/a2ui/valueFunctions.js.map +0 -1
- package/dist/actionRegistry.d.ts +0 -29
- package/dist/actionRegistry.d.ts.map +0 -1
- package/dist/actionRegistry.js +0 -41
- package/dist/actionRegistry.js.map +0 -1
- package/dist/answeredValues.d.ts +0 -16
- package/dist/answeredValues.d.ts.map +0 -1
- package/dist/answeredValues.js +0 -37
- package/dist/answeredValues.js.map +0 -1
- package/dist/buildPresentParameters.d.ts +0 -21
- package/dist/buildPresentParameters.d.ts.map +0 -1
- package/dist/buildPresentParameters.js +0 -95
- package/dist/buildPresentParameters.js.map +0 -1
- package/dist/constants.d.ts +0 -15
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -19
- package/dist/constants.js.map +0 -1
- package/dist/convert/boundSpec.d.ts +0 -48
- package/dist/convert/boundSpec.d.ts.map +0 -1
- package/dist/convert/boundSpec.js +0 -108
- package/dist/convert/boundSpec.js.map +0 -1
- package/dist/convert/copyBounded.d.ts +0 -25
- package/dist/convert/copyBounded.d.ts.map +0 -1
- package/dist/convert/copyBounded.js +0 -38
- package/dist/convert/copyBounded.js.map +0 -1
- package/dist/convert/isElement.d.ts +0 -3
- package/dist/convert/isElement.d.ts.map +0 -1
- package/dist/convert/isElement.js +0 -6
- package/dist/convert/isElement.js.map +0 -1
- package/dist/convert/takeRun.d.ts +0 -6
- package/dist/convert/takeRun.d.ts.map +0 -1
- package/dist/convert/takeRun.js +0 -20
- package/dist/convert/takeRun.js.map +0 -1
- package/dist/defineGenerativeComponents.d.ts +0 -29
- package/dist/defineGenerativeComponents.d.ts.map +0 -1
- package/dist/defineGenerativeComponents.js +0 -34
- package/dist/defineGenerativeComponents.js.map +0 -1
- package/dist/fieldReferences.d.ts +0 -9
- package/dist/fieldReferences.d.ts.map +0 -1
- package/dist/fieldReferences.js +0 -53
- package/dist/fieldReferences.js.map +0 -1
- package/dist/generativeUIToJSX.d.ts +0 -18
- package/dist/generativeUIToJSX.d.ts.map +0 -1
- package/dist/generativeUIToJSX.js +0 -76
- package/dist/generativeUIToJSX.js.map +0 -1
- package/dist/index.shared.d.ts +0 -15
- package/dist/index.shared.d.ts.map +0 -1
- package/dist/index.shared.js +0 -9
- package/dist/ir.js.map +0 -1
- package/dist/renderGenerativeUI.d.ts +0 -14
- package/dist/renderGenerativeUI.d.ts.map +0 -1
- package/dist/renderGenerativeUI.js +0 -83
- package/dist/renderGenerativeUI.js.map +0 -1
- package/dist/scopeSchema.d.ts +0 -6
- package/dist/scopeSchema.d.ts.map +0 -1
- package/dist/scopeSchema.js +0 -56
- package/dist/scopeSchema.js.map +0 -1
- package/dist/slack/constants.d.ts +0 -93
- package/dist/slack/constants.d.ts.map +0 -1
- package/dist/slack/constants.js +0 -146
- package/dist/slack/constants.js.map +0 -1
- package/dist/slack/decodeBlockAction.d.ts +0 -10
- package/dist/slack/decodeBlockAction.d.ts.map +0 -1
- package/dist/slack/decodeBlockAction.js +0 -129
- package/dist/slack/decodeBlockAction.js.map +0 -1
- package/dist/slack/fromSlackBlocks.d.ts +0 -27
- package/dist/slack/fromSlackBlocks.d.ts.map +0 -1
- package/dist/slack/fromSlackBlocks.js +0 -483
- package/dist/slack/fromSlackBlocks.js.map +0 -1
- package/dist/slack/toSlackBlocks.d.ts +0 -4
- package/dist/slack/toSlackBlocks.d.ts.map +0 -1
- package/dist/slack/toSlackBlocks.js +0 -901
- package/dist/slack/toSlackBlocks.js.map +0 -1
- package/dist/slack/types.d.ts +0 -204
- package/dist/slack/types.d.ts.map +0 -1
- package/dist/slack/types.js +0 -0
- package/dist/teams/constants.d.ts +0 -34
- package/dist/teams/constants.d.ts.map +0 -1
- package/dist/teams/constants.js +0 -68
- package/dist/teams/constants.js.map +0 -1
- package/dist/teams/decodeSubmitData.d.ts +0 -26
- package/dist/teams/decodeSubmitData.d.ts.map +0 -1
- package/dist/teams/decodeSubmitData.js +0 -70
- package/dist/teams/decodeSubmitData.js.map +0 -1
- package/dist/teams/temporalId.d.ts +0 -5
- package/dist/teams/temporalId.d.ts.map +0 -1
- package/dist/teams/temporalId.js +0 -28
- package/dist/teams/temporalId.js.map +0 -1
- package/dist/teams/toAdaptiveCard.d.ts +0 -45
- package/dist/teams/toAdaptiveCard.d.ts.map +0 -1
- package/dist/teams/toAdaptiveCard.js +0 -642
- package/dist/teams/toAdaptiveCard.js.map +0 -1
- package/dist/teams/toTeamsAttachments.d.ts +0 -10
- package/dist/teams/toTeamsAttachments.d.ts.map +0 -1
- package/dist/teams/toTeamsAttachments.js +0 -99
- package/dist/teams/toTeamsAttachments.js.map +0 -1
- package/dist/teams/types.d.ts +0 -224
- package/dist/teams/types.d.ts.map +0 -1
- package/dist/teams/types.js +0 -0
- package/dist/temporal.d.ts +0 -33
- package/dist/temporal.d.ts.map +0 -1
- package/dist/temporal.js +0 -152
- package/dist/temporal.js.map +0 -1
- package/dist/types.d.ts +0 -99
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -0
- package/dist/vocabulary/alert.d.ts +0 -32
- package/dist/vocabulary/alert.d.ts.map +0 -1
- package/dist/vocabulary/alert.js +0 -160
- package/dist/vocabulary/alert.js.map +0 -1
- package/dist/vocabulary/collectFormValues.d.ts +0 -23
- package/dist/vocabulary/collectFormValues.d.ts.map +0 -1
- package/dist/vocabulary/collectFormValues.js +0 -44
- package/dist/vocabulary/collectFormValues.js.map +0 -1
- package/dist/vocabulary/data.d.ts +0 -66
- package/dist/vocabulary/data.d.ts.map +0 -1
- package/dist/vocabulary/data.js +0 -503
- package/dist/vocabulary/data.js.map +0 -1
- package/dist/vocabulary/dispatch.d.ts +0 -9
- package/dist/vocabulary/dispatch.d.ts.map +0 -1
- package/dist/vocabulary/dispatch.js +0 -50
- package/dist/vocabulary/dispatch.js.map +0 -1
- package/dist/vocabulary/fact.d.ts +0 -19
- package/dist/vocabulary/fact.d.ts.map +0 -1
- package/dist/vocabulary/fact.js +0 -51
- package/dist/vocabulary/fact.js.map +0 -1
- package/dist/vocabulary/form.d.ts +0 -11
- package/dist/vocabulary/form.d.ts.map +0 -1
- package/dist/vocabulary/form.js +0 -23
- package/dist/vocabulary/form.js.map +0 -1
- package/dist/vocabulary/formatValue.d.ts +0 -7
- package/dist/vocabulary/formatValue.d.ts.map +0 -1
- package/dist/vocabulary/formatValue.js +0 -76
- package/dist/vocabulary/formatValue.js.map +0 -1
- package/dist/vocabulary/icon.d.ts +0 -41
- package/dist/vocabulary/icon.d.ts.map +0 -1
- package/dist/vocabulary/icon.js +0 -272
- package/dist/vocabulary/icon.js.map +0 -1
- package/dist/vocabulary/index.d.ts +0 -12
- package/dist/vocabulary/index.d.ts.map +0 -1
- package/dist/vocabulary/index.js +0 -36
- package/dist/vocabulary/index.js.map +0 -1
- package/dist/vocabulary/interactive.d.ts +0 -230
- package/dist/vocabulary/interactive.d.ts.map +0 -1
- package/dist/vocabulary/interactive.js +0 -530
- package/dist/vocabulary/interactive.js.map +0 -1
- package/dist/vocabulary/layout.d.ts +0 -79
- package/dist/vocabulary/layout.d.ts.map +0 -1
- package/dist/vocabulary/layout.js +0 -139
- package/dist/vocabulary/layout.js.map +0 -1
- package/dist/vocabulary/list.d.ts +0 -14
- package/dist/vocabulary/list.d.ts.map +0 -1
- package/dist/vocabulary/list.js +0 -50
- package/dist/vocabulary/list.js.map +0 -1
- package/dist/vocabulary/media.d.ts +0 -25
- package/dist/vocabulary/media.d.ts.map +0 -1
- package/dist/vocabulary/media.js +0 -42
- package/dist/vocabulary/media.js.map +0 -1
- package/dist/vocabulary/text.d.ts +0 -57
- package/dist/vocabulary/text.d.ts.map +0 -1
- package/dist/vocabulary/text.js +0 -49
- package/dist/vocabulary/text.js.map +0 -1
- package/dist/vocabulary/toTextContent.d.ts +0 -2
- package/dist/vocabulary/toTextContent.d.ts.map +0 -1
- package/dist/vocabulary/toTextContent.js +0 -6
- package/dist/vocabulary/toTextContent.js.map +0 -1
- package/src/JSONGenerativeUI.client.tsx +0 -168
- package/src/JSONGenerativeUI.server.tsx +0 -39
- package/src/JSONGenerativeUI.shared.ts +0 -90
- package/src/JSONGenerativeUI.test.tsx +0 -1298
- package/src/RadioGroupScope.server.test.tsx +0 -24
- package/src/RadioGroupScope.tsx +0 -34
- package/src/a2ui/BindingContext.ts +0 -26
- package/src/a2ui/PresentRenderer.tsx +0 -83
- package/src/a2ui/convert.test.ts +0 -2923
- package/src/a2ui/convert.ts +0 -1207
- package/src/a2ui/dataModel.ts +0 -69
- package/src/a2ui/reducer.test.ts +0 -422
- package/src/a2ui/reducer.ts +0 -363
- package/src/a2ui/snapshot.test.ts +0 -52
- package/src/a2ui/snapshot.ts +0 -52
- package/src/a2ui/types.ts +0 -114
- package/src/a2ui/valueFunctions.test.ts +0 -271
- package/src/a2ui/valueFunctions.ts +0 -523
- package/src/actionRegistry.test.ts +0 -90
- package/src/actionRegistry.ts +0 -88
- package/src/answeredValues.test.ts +0 -33
- package/src/answeredValues.tsx +0 -70
- package/src/buildPresentParameters.test.ts +0 -246
- package/src/buildPresentParameters.ts +0 -130
- package/src/constants.ts +0 -17
- package/src/convert/boundSpec.test.ts +0 -192
- package/src/convert/boundSpec.ts +0 -134
- package/src/convert/copyBounded.test.ts +0 -131
- package/src/convert/copyBounded.ts +0 -38
- package/src/convert/isElement.ts +0 -6
- package/src/convert/takeRun.test.ts +0 -64
- package/src/convert/takeRun.ts +0 -19
- package/src/defineGenerativeComponents.ts +0 -38
- package/src/fieldReferences.test.ts +0 -66
- package/src/fieldReferences.ts +0 -83
- package/src/generativeUIToJSX.test.ts +0 -268
- package/src/generativeUIToJSX.ts +0 -152
- package/src/index.server.test.ts +0 -106
- package/src/index.shared.ts +0 -61
- package/src/ir.test.ts +0 -203
- package/src/renderGenerativeUI.test.tsx +0 -373
- package/src/renderGenerativeUI.tsx +0 -165
- package/src/scopeSchema.test.ts +0 -72
- package/src/scopeSchema.ts +0 -71
- package/src/slack/a2uiSlack.test.ts +0 -198
- package/src/slack/constants.ts +0 -194
- package/src/slack/datePicker.test.ts +0 -612
- package/src/slack/decodeBlockAction.test.ts +0 -233
- package/src/slack/decodeBlockAction.ts +0 -232
- package/src/slack/fromSlackBlocks.test.ts +0 -1465
- package/src/slack/fromSlackBlocks.ts +0 -789
- package/src/slack/toSlackBlocks.test.ts +0 -3065
- package/src/slack/toSlackBlocks.ts +0 -1818
- package/src/slack/types.ts +0 -264
- package/src/teams/constants.ts +0 -93
- package/src/teams/decodeSubmitData.test.ts +0 -397
- package/src/teams/decodeSubmitData.ts +0 -110
- package/src/teams/temporal.test.ts +0 -766
- package/src/teams/temporalId.ts +0 -56
- package/src/teams/toAdaptiveCard.test.ts +0 -1897
- package/src/teams/toAdaptiveCard.ts +0 -1057
- package/src/teams/toTeamsAttachments.test.ts +0 -74
- package/src/teams/toTeamsAttachments.ts +0 -133
- package/src/teams/types.ts +0 -266
- package/src/temporal.test.ts +0 -319
- package/src/temporal.ts +0 -259
- package/src/types.ts +0 -119
- package/src/vocabulary/alert.test.tsx +0 -427
- package/src/vocabulary/alert.tsx +0 -217
- package/src/vocabulary/collectFormValues.test.ts +0 -389
- package/src/vocabulary/collectFormValues.ts +0 -116
- package/src/vocabulary/data.test.tsx +0 -858
- package/src/vocabulary/data.tsx +0 -819
- package/src/vocabulary/datepicker.dom.test.tsx +0 -1148
- package/src/vocabulary/dispatch.ts +0 -83
- package/src/vocabulary/fact.test.tsx +0 -94
- package/src/vocabulary/fact.tsx +0 -54
- package/src/vocabulary/form.test.tsx +0 -113
- package/src/vocabulary/form.tsx +0 -39
- package/src/vocabulary/formatValue.test.ts +0 -72
- package/src/vocabulary/formatValue.ts +0 -127
- package/src/vocabulary/icon.test.tsx +0 -64
- package/src/vocabulary/icon.tsx +0 -174
- package/src/vocabulary/index.test.ts +0 -65
- package/src/vocabulary/index.ts +0 -33
- package/src/vocabulary/interactive.dispatch.test.tsx +0 -454
- package/src/vocabulary/interactive.dom.test.tsx +0 -1747
- package/src/vocabulary/interactive.test.tsx +0 -377
- package/src/vocabulary/interactive.tsx +0 -1048
- package/src/vocabulary/layout.test.tsx +0 -323
- package/src/vocabulary/layout.tsx +0 -247
- package/src/vocabulary/list.test.tsx +0 -222
- package/src/vocabulary/list.tsx +0 -50
- package/src/vocabulary/media.test.tsx +0 -85
- package/src/vocabulary/media.tsx +0 -56
- package/src/vocabulary/text.test.tsx +0 -102
- package/src/vocabulary/text.tsx +0 -60
- package/src/vocabulary/toTextContent.ts +0 -2
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
import { z } from "zod";
|
|
3
|
-
export declare const dataVocabulary: {
|
|
4
|
-
Table: {
|
|
5
|
-
description: string;
|
|
6
|
-
properties: z.ZodObject<{
|
|
7
|
-
columns: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
8
|
-
label: z.ZodString;
|
|
9
|
-
align: z.ZodOptional<z.ZodEnum<{
|
|
10
|
-
start: "start";
|
|
11
|
-
end: "end";
|
|
12
|
-
}>>;
|
|
13
|
-
format: z.ZodOptional<z.ZodObject<{
|
|
14
|
-
kind: z.ZodEnum<{
|
|
15
|
-
number: "number";
|
|
16
|
-
date: "date";
|
|
17
|
-
currency: "currency";
|
|
18
|
-
percent: "percent";
|
|
19
|
-
}>;
|
|
20
|
-
currency: z.ZodOptional<z.ZodString>;
|
|
21
|
-
decimals: z.ZodOptional<z.ZodNumber>;
|
|
22
|
-
}, z.core.$strip>>;
|
|
23
|
-
}, z.core.$strip>>>;
|
|
24
|
-
rows: z.ZodOptional<z.ZodArray<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>>;
|
|
25
|
-
sortable: z.ZodOptional<z.ZodBoolean>;
|
|
26
|
-
}, z.core.$strip>;
|
|
27
|
-
render: ({ columns, rows, sortable, children }: any) => React.JSX.Element;
|
|
28
|
-
};
|
|
29
|
-
Markdown: {
|
|
30
|
-
description: string;
|
|
31
|
-
properties: z.ZodObject<{
|
|
32
|
-
value: z.ZodString;
|
|
33
|
-
}, z.core.$strip>;
|
|
34
|
-
streamProperties: true;
|
|
35
|
-
render: ({ value, children }: any) => React.JSX.Element;
|
|
36
|
-
};
|
|
37
|
-
Chart: {
|
|
38
|
-
description: string;
|
|
39
|
-
properties: z.ZodObject<{
|
|
40
|
-
variant: z.ZodEnum<{
|
|
41
|
-
area: "area";
|
|
42
|
-
line: "line";
|
|
43
|
-
bar: "bar";
|
|
44
|
-
sparkline: "sparkline";
|
|
45
|
-
}>;
|
|
46
|
-
data: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
47
|
-
label: z.ZodOptional<z.ZodString>;
|
|
48
|
-
value: z.ZodNumber;
|
|
49
|
-
}, z.core.$strip>>>;
|
|
50
|
-
series: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
51
|
-
label: z.ZodOptional<z.ZodString>;
|
|
52
|
-
color: z.ZodOptional<z.ZodString>;
|
|
53
|
-
data: z.ZodArray<z.ZodObject<{
|
|
54
|
-
label: z.ZodOptional<z.ZodString>;
|
|
55
|
-
value: z.ZodNumber;
|
|
56
|
-
}, z.core.$strip>>;
|
|
57
|
-
}, z.core.$strip>>>;
|
|
58
|
-
stacked: z.ZodOptional<z.ZodBoolean>;
|
|
59
|
-
showAxis: z.ZodOptional<z.ZodBoolean>;
|
|
60
|
-
showLegend: z.ZodOptional<z.ZodBoolean>;
|
|
61
|
-
color: z.ZodOptional<z.ZodString>;
|
|
62
|
-
}, z.core.$strip>;
|
|
63
|
-
render: ({ variant, data, series, stacked, showAxis, showLegend, color, }: any) => React.JSX.Element;
|
|
64
|
-
};
|
|
65
|
-
};
|
|
66
|
-
//# sourceMappingURL=data.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../src/vocabulary/data.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAojBxB,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6PI,CAAC"}
|
package/dist/vocabulary/data.js
DELETED
|
@@ -1,503 +0,0 @@
|
|
|
1
|
-
import { toTextContent } from "./toTextContent.js";
|
|
2
|
-
import { formatValue, isNumericTableFormat } from "./formatValue.js";
|
|
3
|
-
import * as React from "react";
|
|
4
|
-
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
-
import { z } from "zod";
|
|
6
|
-
//#region src/vocabulary/data.tsx
|
|
7
|
-
const columnSchema = z.object({
|
|
8
|
-
label: z.string().describe("Column header label."),
|
|
9
|
-
align: z.enum(["start", "end"]).optional().describe("Cell alignment."),
|
|
10
|
-
format: z.object({
|
|
11
|
-
kind: z.enum([
|
|
12
|
-
"number",
|
|
13
|
-
"currency",
|
|
14
|
-
"percent",
|
|
15
|
-
"date"
|
|
16
|
-
]).describe("Format kind. `percent` takes a fraction, so 0.25 renders as 25%."),
|
|
17
|
-
currency: z.string().optional().describe("Currency code."),
|
|
18
|
-
decimals: z.number().optional().describe("Decimal places.")
|
|
19
|
-
}).optional().describe("Cell value format.")
|
|
20
|
-
});
|
|
21
|
-
const cellSchema = z.union([
|
|
22
|
-
z.string(),
|
|
23
|
-
z.number(),
|
|
24
|
-
z.boolean()
|
|
25
|
-
]).describe("A cell value.");
|
|
26
|
-
const tableCollator = new Intl.Collator("en-US", { numeric: true });
|
|
27
|
-
const isTableColumn = (column) => column !== null && typeof column === "object" && "label" in column && typeof column.label === "string";
|
|
28
|
-
const isTableCell = (cell) => typeof cell === "string" || typeof cell === "number" || typeof cell === "boolean";
|
|
29
|
-
const tableAlignment = (column) => {
|
|
30
|
-
if (!isTableColumn(column)) return void 0;
|
|
31
|
-
if (column.align === "start" || column.align === "end") return column.align;
|
|
32
|
-
return isNumericTableFormat(column.format) ? "end" : void 0;
|
|
33
|
-
};
|
|
34
|
-
const compareTableCells = (left, right) => {
|
|
35
|
-
if (typeof left === "number" && Number.isFinite(left) && typeof right === "number" && Number.isFinite(right)) return left - right;
|
|
36
|
-
if (typeof left === "number" && Number.isFinite(left)) return -1;
|
|
37
|
-
if (typeof right === "number" && Number.isFinite(right)) return 1;
|
|
38
|
-
return tableCollator.compare(isTableCell(left) ? String(left) : "", isTableCell(right) ? String(right) : "");
|
|
39
|
-
};
|
|
40
|
-
function TableView({ columns, rows, children, sort, onSort }) {
|
|
41
|
-
const safeColumns = Array.isArray(columns) ? columns : [];
|
|
42
|
-
const hasColumns = safeColumns.some(isTableColumn);
|
|
43
|
-
const safeRows = Array.isArray(rows) ? rows.filter(Array.isArray) : [];
|
|
44
|
-
const sortedRows = sort === void 0 ? safeRows : safeRows.map((row, index) => ({
|
|
45
|
-
row,
|
|
46
|
-
index
|
|
47
|
-
})).sort((left, right) => {
|
|
48
|
-
const comparison = compareTableCells(left.row[sort.column], right.row[sort.column]);
|
|
49
|
-
return comparison === 0 ? left.index - right.index : sort.direction === "ascending" ? comparison : -comparison;
|
|
50
|
-
}).map(({ row }) => row);
|
|
51
|
-
return /* @__PURE__ */ jsxs("table", {
|
|
52
|
-
"data-aui": "table",
|
|
53
|
-
children: [
|
|
54
|
-
hasColumns ? /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { children: safeColumns.map((column, i) => {
|
|
55
|
-
const label = isTableColumn(column) ? column.label : "";
|
|
56
|
-
const direction = sort?.column === i ? sort.direction : void 0;
|
|
57
|
-
return /* @__PURE__ */ jsx("th", {
|
|
58
|
-
"data-aui": "table-col",
|
|
59
|
-
"data-aui-align": tableAlignment(column),
|
|
60
|
-
"aria-sort": direction,
|
|
61
|
-
children: onSort ? /* @__PURE__ */ jsxs("button", {
|
|
62
|
-
type: "button",
|
|
63
|
-
"data-aui": "table-sort",
|
|
64
|
-
onClick: () => onSort(i),
|
|
65
|
-
children: [label, direction ? /* @__PURE__ */ jsx("span", {
|
|
66
|
-
"aria-hidden": "true",
|
|
67
|
-
"data-aui": "table-sort-direction",
|
|
68
|
-
children: direction === "ascending" ? "↑" : "↓"
|
|
69
|
-
}) : null]
|
|
70
|
-
}) : label
|
|
71
|
-
}, i);
|
|
72
|
-
}) }) }) : null,
|
|
73
|
-
safeRows.length ? /* @__PURE__ */ jsx("tbody", { children: sortedRows.map((row, r) => /* @__PURE__ */ jsx("tr", { children: row.map((cell, c) => /* @__PURE__ */ jsx("td", {
|
|
74
|
-
"data-aui-align": tableAlignment(safeColumns[c]),
|
|
75
|
-
children: formatValue(cell, isTableColumn(safeColumns[c]) ? safeColumns[c].format : void 0)
|
|
76
|
-
}, c)) }, r)) }) : null,
|
|
77
|
-
children
|
|
78
|
-
]
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
function SortableTable(props) {
|
|
82
|
-
const [sort, setSort] = React.useState();
|
|
83
|
-
return /* @__PURE__ */ jsx(TableView, {
|
|
84
|
-
...props,
|
|
85
|
-
sort,
|
|
86
|
-
onSort: (column) => setSort((current) => current?.column !== column ? {
|
|
87
|
-
column,
|
|
88
|
-
direction: "ascending"
|
|
89
|
-
} : current.direction === "ascending" ? {
|
|
90
|
-
column,
|
|
91
|
-
direction: "descending"
|
|
92
|
-
} : void 0)
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
const CHART_HEIGHT = 40;
|
|
96
|
-
const CHART_WIDTH = 100;
|
|
97
|
-
const clampValue = (value) => typeof value === "number" && Number.isFinite(value) ? value : 0;
|
|
98
|
-
const yFor = (value, scale) => {
|
|
99
|
-
const span = scale.max - scale.min;
|
|
100
|
-
return span > 0 ? CHART_HEIGHT - (value - scale.min) / span * CHART_HEIGHT : CHART_HEIGHT;
|
|
101
|
-
};
|
|
102
|
-
const pointSchema = z.object({
|
|
103
|
-
label: z.string().optional().describe("Point label."),
|
|
104
|
-
value: z.number().describe("Point value.")
|
|
105
|
-
});
|
|
106
|
-
const seriesSchema = z.object({
|
|
107
|
-
label: z.string().optional().describe("Series label, shown in the legend."),
|
|
108
|
-
color: z.string().optional().describe("Series color. One of `emphasis`, `secondary`, `alpha-70`, `white`, `white-70`, or `white-50`, matching Text's `color` tokens; other values have no visual effect."),
|
|
109
|
-
data: z.array(pointSchema).describe("Data points for this series.")
|
|
110
|
-
});
|
|
111
|
-
/** Pads every series to the longest series' length, treating a shorter series' missing points as `{ value: 0 }` so mismatched series never misalign or throw. */
|
|
112
|
-
function normalizeSeries(seriesProp, dataProp) {
|
|
113
|
-
const rawSeries = Array.isArray(seriesProp) && seriesProp.length > 0 ? seriesProp : [{ data: Array.isArray(dataProp) ? dataProp : [] }];
|
|
114
|
-
const count = rawSeries.reduce((max, s) => {
|
|
115
|
-
const len = Array.isArray(s?.data) ? s.data.length : 0;
|
|
116
|
-
return Math.max(max, len);
|
|
117
|
-
}, 0);
|
|
118
|
-
return {
|
|
119
|
-
count,
|
|
120
|
-
series: rawSeries.map((s) => {
|
|
121
|
-
const points = Array.isArray(s?.data) ? s.data : [];
|
|
122
|
-
const values = [];
|
|
123
|
-
const labels = [];
|
|
124
|
-
for (let i = 0; i < count; i++) {
|
|
125
|
-
const point = points[i];
|
|
126
|
-
values.push(clampValue(point?.value));
|
|
127
|
-
labels.push(typeof point?.label === "string" ? point.label : void 0);
|
|
128
|
-
}
|
|
129
|
-
return {
|
|
130
|
-
label: typeof s?.label === "string" ? s.label : void 0,
|
|
131
|
-
color: typeof s?.color === "string" ? s.color : void 0,
|
|
132
|
-
values,
|
|
133
|
-
labels
|
|
134
|
-
};
|
|
135
|
-
})
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
function valueScale(values) {
|
|
139
|
-
let min = 0;
|
|
140
|
-
let max = 0;
|
|
141
|
-
for (const value of values) {
|
|
142
|
-
min = Math.min(min, value);
|
|
143
|
-
max = Math.max(max, value);
|
|
144
|
-
}
|
|
145
|
-
return {
|
|
146
|
-
min,
|
|
147
|
-
max
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
function computeScale(series, count, stacked) {
|
|
151
|
-
if (stacked) {
|
|
152
|
-
let min = 0;
|
|
153
|
-
let max = 0;
|
|
154
|
-
for (let i = 0; i < count; i++) {
|
|
155
|
-
let negative = 0;
|
|
156
|
-
let positive = 0;
|
|
157
|
-
for (const s of series) {
|
|
158
|
-
const value = s.values[i] ?? 0;
|
|
159
|
-
if (value < 0) negative += value;
|
|
160
|
-
else positive += value;
|
|
161
|
-
}
|
|
162
|
-
min = Math.min(min, negative);
|
|
163
|
-
max = Math.max(max, positive);
|
|
164
|
-
}
|
|
165
|
-
return {
|
|
166
|
-
min,
|
|
167
|
-
max
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
return valueScale(series.flatMap((s) => s.values));
|
|
171
|
-
}
|
|
172
|
-
const NICE_MULTIPLES = [
|
|
173
|
-
1,
|
|
174
|
-
2,
|
|
175
|
-
5
|
|
176
|
-
];
|
|
177
|
-
/** The smallest of `{1, 2, 5} × 10^n` that is `>= max`, so axis ticks land on round numbers. */
|
|
178
|
-
function niceMax(max) {
|
|
179
|
-
if (max <= 0) return 0;
|
|
180
|
-
const exponent = Math.floor(Math.log10(max));
|
|
181
|
-
for (const multiple of NICE_MULTIPLES) {
|
|
182
|
-
const candidate = multiple * 10 ** exponent;
|
|
183
|
-
if (candidate >= max) return candidate;
|
|
184
|
-
}
|
|
185
|
-
return 10 ** (exponent + 1);
|
|
186
|
-
}
|
|
187
|
-
const TICK_COUNT = 5;
|
|
188
|
-
function axisScale(scale) {
|
|
189
|
-
if (scale.min === 0) return {
|
|
190
|
-
min: 0,
|
|
191
|
-
max: niceMax(scale.max)
|
|
192
|
-
};
|
|
193
|
-
if (scale.max === 0) return {
|
|
194
|
-
min: -niceMax(-scale.min),
|
|
195
|
-
max: 0
|
|
196
|
-
};
|
|
197
|
-
const step = niceMax(Math.max(-scale.min, scale.max) / 2);
|
|
198
|
-
return {
|
|
199
|
-
min: -2 * step,
|
|
200
|
-
max: 2 * step
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
/** `TICK_COUNT` evenly spaced ticks from the top of the scale down to its bottom, for a top-to-bottom y-axis column. */
|
|
204
|
-
function tickValues(scale) {
|
|
205
|
-
const ticks = [];
|
|
206
|
-
if (scale.min === 0) {
|
|
207
|
-
for (let i = 0; i < TICK_COUNT; i++) ticks.push(scale.max * (4 - i) / 4);
|
|
208
|
-
return ticks;
|
|
209
|
-
}
|
|
210
|
-
for (let i = 0; i < TICK_COUNT; i++) ticks.push(scale.min + (scale.max - scale.min) * (4 - i) / 4);
|
|
211
|
-
return ticks;
|
|
212
|
-
}
|
|
213
|
-
function formatTick(value) {
|
|
214
|
-
return (Math.round(value * 100) / 100).toLocaleString("en-US");
|
|
215
|
-
}
|
|
216
|
-
const SERIES_PALETTE_SIZE = 5;
|
|
217
|
-
const tooltipText = (seriesLabel, pointLabel, index, value) => `${seriesLabel ? `${seriesLabel}, ` : ""}${pointLabel || index + 1}: ${formatTick(value)}`;
|
|
218
|
-
const seriesColor = (series, seriesCount, color) => series.color ?? (seriesCount === 1 && typeof color === "string" ? color : void 0);
|
|
219
|
-
const xFor = (index, count) => count === 1 ? CHART_WIDTH / 2 : index / (count - 1) * CHART_WIDTH;
|
|
220
|
-
function pointTargets(series, positions, count, scale) {
|
|
221
|
-
return series.values.map((value, i) => /* @__PURE__ */ jsx("circle", {
|
|
222
|
-
"data-aui": "chart-point",
|
|
223
|
-
cx: xFor(i, count),
|
|
224
|
-
cy: yFor(positions[i] ?? 0, scale),
|
|
225
|
-
r: 4,
|
|
226
|
-
fill: "transparent",
|
|
227
|
-
children: /* @__PURE__ */ jsx("title", { children: tooltipText(series.label, series.labels[i], i, value) })
|
|
228
|
-
}, i));
|
|
229
|
-
}
|
|
230
|
-
function barGeometry(value, start, scale) {
|
|
231
|
-
const end = start + value;
|
|
232
|
-
if (scale.min === 0 && start >= 0 && end >= 0) {
|
|
233
|
-
const height = scale.max > 0 ? value / scale.max * CHART_HEIGHT : 0;
|
|
234
|
-
const belowHeight = scale.max > 0 ? start / scale.max * CHART_HEIGHT : 0;
|
|
235
|
-
return {
|
|
236
|
-
y: CHART_HEIGHT - belowHeight - height,
|
|
237
|
-
height
|
|
238
|
-
};
|
|
239
|
-
}
|
|
240
|
-
const startY = yFor(start, scale);
|
|
241
|
-
const endY = yFor(end, scale);
|
|
242
|
-
return {
|
|
243
|
-
y: Math.min(startY, endY),
|
|
244
|
-
height: Math.abs(endY - startY)
|
|
245
|
-
};
|
|
246
|
-
}
|
|
247
|
-
function renderSeriesMarks(variant, series, count, scale, stacked, color) {
|
|
248
|
-
const seriesCount = series.length;
|
|
249
|
-
if (variant === "bar") {
|
|
250
|
-
const slot = count > 0 ? CHART_WIDTH / count : 0;
|
|
251
|
-
const gap = slot * .2;
|
|
252
|
-
const groupWidth = slot - gap;
|
|
253
|
-
const perSeriesWidth = stacked || seriesCount <= 1 ? groupWidth : groupWidth / seriesCount;
|
|
254
|
-
const negatives = new Array(count).fill(0);
|
|
255
|
-
const positives = new Array(count).fill(0);
|
|
256
|
-
return series.map((s, seriesIndex) => {
|
|
257
|
-
const marks = s.values.map((value, i) => {
|
|
258
|
-
const { y, height } = barGeometry(value, stacked ? value < 0 ? negatives[i] ?? 0 : positives[i] ?? 0 : 0, scale);
|
|
259
|
-
const x = stacked || seriesCount <= 1 ? i * slot + gap / 2 : i * slot + gap / 2 + seriesIndex * perSeriesWidth;
|
|
260
|
-
return /* @__PURE__ */ jsx("rect", {
|
|
261
|
-
x,
|
|
262
|
-
y,
|
|
263
|
-
width: perSeriesWidth,
|
|
264
|
-
height,
|
|
265
|
-
fill: "currentColor",
|
|
266
|
-
children: /* @__PURE__ */ jsx("title", { children: tooltipText(s.label, s.labels[i], i, value) })
|
|
267
|
-
}, i);
|
|
268
|
-
});
|
|
269
|
-
if (stacked) for (let i = 0; i < count; i++) {
|
|
270
|
-
const value = s.values[i] ?? 0;
|
|
271
|
-
if (value < 0) negatives[i] = (negatives[i] ?? 0) + value;
|
|
272
|
-
else positives[i] = (positives[i] ?? 0) + value;
|
|
273
|
-
}
|
|
274
|
-
return /* @__PURE__ */ jsx("g", {
|
|
275
|
-
"data-aui": "chart-series",
|
|
276
|
-
"data-aui-series": seriesIndex % SERIES_PALETTE_SIZE,
|
|
277
|
-
"data-aui-color": seriesColor(s, seriesCount, color),
|
|
278
|
-
children: marks
|
|
279
|
-
}, seriesIndex);
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
|
-
if (variant === "area") {
|
|
283
|
-
const negatives = new Array(count).fill(0);
|
|
284
|
-
const positives = new Array(count).fill(0);
|
|
285
|
-
return series.map((s, seriesIndex) => {
|
|
286
|
-
const bottoms = s.values.map((value, i) => stacked ? value < 0 ? negatives[i] ?? 0 : positives[i] ?? 0 : 0);
|
|
287
|
-
const tops = s.values.map((value, i) => stacked ? (bottoms[i] ?? 0) + value : value);
|
|
288
|
-
if (stacked) for (let i = 0; i < count; i++) {
|
|
289
|
-
const value = s.values[i] ?? 0;
|
|
290
|
-
if (value < 0) negatives[i] = (negatives[i] ?? 0) + value;
|
|
291
|
-
else positives[i] = (positives[i] ?? 0) + value;
|
|
292
|
-
}
|
|
293
|
-
if (count === 1) {
|
|
294
|
-
const y = yFor(tops[0] ?? 0, scale);
|
|
295
|
-
return /* @__PURE__ */ jsxs("g", {
|
|
296
|
-
"data-aui": "chart-series",
|
|
297
|
-
"data-aui-series": seriesIndex % SERIES_PALETTE_SIZE,
|
|
298
|
-
"data-aui-color": seriesColor(s, seriesCount, color),
|
|
299
|
-
children: [/* @__PURE__ */ jsx("circle", {
|
|
300
|
-
cx: CHART_WIDTH / 2,
|
|
301
|
-
cy: y,
|
|
302
|
-
r: 2,
|
|
303
|
-
fill: "currentColor"
|
|
304
|
-
}), pointTargets(s, tops, count, scale)]
|
|
305
|
-
}, seriesIndex);
|
|
306
|
-
}
|
|
307
|
-
if (count === 0) return /* @__PURE__ */ jsx("g", {
|
|
308
|
-
"data-aui": "chart-series",
|
|
309
|
-
"data-aui-series": seriesIndex % SERIES_PALETTE_SIZE,
|
|
310
|
-
"data-aui-color": seriesColor(s, seriesCount, color)
|
|
311
|
-
}, seriesIndex);
|
|
312
|
-
const topPoints = tops.map((v, i) => `${xFor(i, count)},${yFor(v, scale)}`);
|
|
313
|
-
const bottomPoints = bottoms.map((v, i) => `${xFor(i, count)},${yFor(v, scale)}`).reverse();
|
|
314
|
-
return /* @__PURE__ */ jsxs("g", {
|
|
315
|
-
"data-aui": "chart-series",
|
|
316
|
-
"data-aui-series": seriesIndex % SERIES_PALETTE_SIZE,
|
|
317
|
-
"data-aui-color": seriesColor(s, seriesCount, color),
|
|
318
|
-
children: [
|
|
319
|
-
/* @__PURE__ */ jsx("polygon", {
|
|
320
|
-
points: [...topPoints, ...bottomPoints].join(" "),
|
|
321
|
-
fill: "currentColor",
|
|
322
|
-
fillOpacity: "0.25"
|
|
323
|
-
}),
|
|
324
|
-
/* @__PURE__ */ jsx("polyline", {
|
|
325
|
-
points: topPoints.join(" "),
|
|
326
|
-
fill: "none",
|
|
327
|
-
stroke: "currentColor",
|
|
328
|
-
vectorEffect: "non-scaling-stroke"
|
|
329
|
-
}),
|
|
330
|
-
pointTargets(s, tops, count, scale)
|
|
331
|
-
]
|
|
332
|
-
}, seriesIndex);
|
|
333
|
-
});
|
|
334
|
-
}
|
|
335
|
-
return series.map((s, seriesIndex) => /* @__PURE__ */ jsxs("g", {
|
|
336
|
-
"data-aui": "chart-series",
|
|
337
|
-
"data-aui-series": seriesIndex % SERIES_PALETTE_SIZE,
|
|
338
|
-
"data-aui-color": seriesColor(s, series.length, color),
|
|
339
|
-
children: [count === 1 ? /* @__PURE__ */ jsx("circle", {
|
|
340
|
-
cx: CHART_WIDTH / 2,
|
|
341
|
-
cy: yFor(s.values[0] ?? 0, scale),
|
|
342
|
-
r: 2,
|
|
343
|
-
fill: "currentColor"
|
|
344
|
-
}) : count > 1 ? /* @__PURE__ */ jsx("polyline", {
|
|
345
|
-
points: s.values.map((v, i) => `${xFor(i, count)},${yFor(v, scale)}`).join(" "),
|
|
346
|
-
fill: "none",
|
|
347
|
-
stroke: "currentColor",
|
|
348
|
-
vectorEffect: "non-scaling-stroke"
|
|
349
|
-
}) : null, variant === "line" ? pointTargets(s, s.values, count, scale) : null]
|
|
350
|
-
}, seriesIndex));
|
|
351
|
-
}
|
|
352
|
-
const dataVocabulary = {
|
|
353
|
-
Table: {
|
|
354
|
-
description: "Tabular data. Provide `columns` and `rows`; each row is an array of cells matching the columns.",
|
|
355
|
-
properties: z.object({
|
|
356
|
-
columns: z.array(columnSchema).optional().describe("Column definitions."),
|
|
357
|
-
rows: z.array(z.array(cellSchema)).optional().describe("Rows of cells."),
|
|
358
|
-
sortable: z.boolean().optional().describe("Allow header sorting.")
|
|
359
|
-
}),
|
|
360
|
-
render: ({ columns, rows, sortable, children }) => sortable === true ? /* @__PURE__ */ jsx(SortableTable, {
|
|
361
|
-
columns,
|
|
362
|
-
rows,
|
|
363
|
-
children
|
|
364
|
-
}) : /* @__PURE__ */ jsx(TableView, {
|
|
365
|
-
columns,
|
|
366
|
-
rows,
|
|
367
|
-
children
|
|
368
|
-
})
|
|
369
|
-
},
|
|
370
|
-
Markdown: {
|
|
371
|
-
description: "A markdown string. Rendered as-is by default; override this component for a full markdown renderer.",
|
|
372
|
-
properties: z.object({ value: z.string().describe("Markdown source.") }),
|
|
373
|
-
streamProperties: true,
|
|
374
|
-
render: ({ value, children }) => /* @__PURE__ */ jsxs("div", {
|
|
375
|
-
"data-aui": "markdown",
|
|
376
|
-
children: [toTextContent(value), children]
|
|
377
|
-
})
|
|
378
|
-
},
|
|
379
|
-
Chart: {
|
|
380
|
-
description: "A chart. `variant` selects bar, line, sparkline, or area rendering. Provide `data` for a single series, or `series` for multiple named series (`series` takes precedence over `data` when both are present). Set `stacked` to accumulate series values instead of overlaying them, and `showAxis`/`showLegend` to add y-axis ticks, x-axis point labels, and a legend.",
|
|
381
|
-
properties: z.object({
|
|
382
|
-
variant: z.enum([
|
|
383
|
-
"bar",
|
|
384
|
-
"line",
|
|
385
|
-
"sparkline",
|
|
386
|
-
"area"
|
|
387
|
-
]).describe("Chart variant."),
|
|
388
|
-
data: z.array(pointSchema).optional().describe("Data points for a single series."),
|
|
389
|
-
series: z.array(seriesSchema).optional().describe("Multiple named series; takes precedence over `data` when present."),
|
|
390
|
-
stacked: z.boolean().optional().describe("Accumulate series values instead of overlaying them (bar and area variants; ignored for line and sparkline)."),
|
|
391
|
-
showAxis: z.boolean().optional().describe("Show y-axis ticks and x-axis point labels."),
|
|
392
|
-
showLegend: z.boolean().optional().describe("Show a legend mapping each series to its color."),
|
|
393
|
-
color: z.string().optional().describe("Series color (single-series mode only). One of `emphasis`, `secondary`, `alpha-70`, `white`, `white-70`, or `white-50`, matching Text's `color` tokens; other values have no visual effect.")
|
|
394
|
-
}),
|
|
395
|
-
render: ({ variant, data, series, stacked, showAxis, showLegend, color }) => {
|
|
396
|
-
if (!(variant === "area" || !!stacked || !!showAxis || !!showLegend || Array.isArray(series) && series.length > 0)) {
|
|
397
|
-
const points = Array.isArray(data) ? data : [];
|
|
398
|
-
const n = points.length;
|
|
399
|
-
const values = points.map((d) => clampValue(d?.value));
|
|
400
|
-
const scale = valueScale(values);
|
|
401
|
-
const chartSeries = {
|
|
402
|
-
label: void 0,
|
|
403
|
-
color: void 0,
|
|
404
|
-
values,
|
|
405
|
-
labels: points.map((point) => typeof point?.label === "string" ? point.label : void 0)
|
|
406
|
-
};
|
|
407
|
-
const slot = n > 0 ? CHART_WIDTH / n : 0;
|
|
408
|
-
const gap = slot * .2;
|
|
409
|
-
const barWidth = slot - gap;
|
|
410
|
-
const crossesZero = scale.min < 0 && scale.max > 0;
|
|
411
|
-
return /* @__PURE__ */ jsxs("svg", {
|
|
412
|
-
"data-aui": "chart",
|
|
413
|
-
"data-aui-variant": variant,
|
|
414
|
-
"data-aui-color": color,
|
|
415
|
-
role: "img",
|
|
416
|
-
"aria-label": `${variant} chart with ${n} data points`,
|
|
417
|
-
viewBox: `0 0 ${CHART_WIDTH} ${CHART_HEIGHT}`,
|
|
418
|
-
preserveAspectRatio: "none",
|
|
419
|
-
children: [crossesZero ? /* @__PURE__ */ jsx("line", {
|
|
420
|
-
"data-aui": "chart-zero",
|
|
421
|
-
x1: 0,
|
|
422
|
-
x2: CHART_WIDTH,
|
|
423
|
-
y1: yFor(0, scale),
|
|
424
|
-
y2: yFor(0, scale),
|
|
425
|
-
stroke: "currentColor",
|
|
426
|
-
vectorEffect: "non-scaling-stroke"
|
|
427
|
-
}) : null, variant === "bar" ? values.map((v, i) => {
|
|
428
|
-
const { y, height } = barGeometry(v, 0, scale);
|
|
429
|
-
return /* @__PURE__ */ jsx("rect", {
|
|
430
|
-
x: i * slot + gap / 2,
|
|
431
|
-
y,
|
|
432
|
-
width: barWidth,
|
|
433
|
-
height,
|
|
434
|
-
fill: "currentColor",
|
|
435
|
-
children: /* @__PURE__ */ jsx("title", { children: tooltipText(void 0, chartSeries.labels[i], i, v) })
|
|
436
|
-
}, i);
|
|
437
|
-
}) : n === 1 ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("circle", {
|
|
438
|
-
cx: CHART_WIDTH / 2,
|
|
439
|
-
cy: yFor(values[0] ?? 0, scale),
|
|
440
|
-
r: 2,
|
|
441
|
-
fill: "currentColor"
|
|
442
|
-
}), variant === "line" ? pointTargets(chartSeries, values, n, scale) : null] }) : n > 1 ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("polyline", {
|
|
443
|
-
points: values.map((v, i) => `${xFor(i, n)},${yFor(v, scale)}`).join(" "),
|
|
444
|
-
fill: "none",
|
|
445
|
-
stroke: "currentColor"
|
|
446
|
-
}), variant === "line" ? pointTargets(chartSeries, values, n, scale) : null] }) : null]
|
|
447
|
-
});
|
|
448
|
-
}
|
|
449
|
-
const { count, series: normalized } = normalizeSeries(series, data);
|
|
450
|
-
const stackedScale = !!stacked && (variant === "bar" || variant === "area");
|
|
451
|
-
const rawScale = computeScale(normalized, count, stackedScale);
|
|
452
|
-
const scale = showAxis ? axisScale(rawScale) : rawScale;
|
|
453
|
-
const marks = renderSeriesMarks(variant, normalized, count, scale, stackedScale, color);
|
|
454
|
-
const crossesZero = rawScale.min < 0 && rawScale.max > 0;
|
|
455
|
-
const svg = /* @__PURE__ */ jsxs("svg", {
|
|
456
|
-
"data-aui": "chart",
|
|
457
|
-
"data-aui-variant": variant,
|
|
458
|
-
"data-aui-color": color,
|
|
459
|
-
role: "img",
|
|
460
|
-
"aria-label": `${variant} chart with ${count} data points`,
|
|
461
|
-
viewBox: `0 0 ${CHART_WIDTH} ${CHART_HEIGHT}`,
|
|
462
|
-
preserveAspectRatio: "none",
|
|
463
|
-
children: [crossesZero ? /* @__PURE__ */ jsx("line", {
|
|
464
|
-
"data-aui": "chart-zero",
|
|
465
|
-
x1: 0,
|
|
466
|
-
x2: CHART_WIDTH,
|
|
467
|
-
y1: yFor(0, scale),
|
|
468
|
-
y2: yFor(0, scale),
|
|
469
|
-
stroke: "currentColor",
|
|
470
|
-
vectorEffect: "non-scaling-stroke"
|
|
471
|
-
}) : null, marks]
|
|
472
|
-
});
|
|
473
|
-
if (!showAxis && !showLegend) return svg;
|
|
474
|
-
return /* @__PURE__ */ jsxs("div", {
|
|
475
|
-
"data-aui": "chart-frame",
|
|
476
|
-
children: [
|
|
477
|
-
showAxis ? /* @__PURE__ */ jsx("div", {
|
|
478
|
-
"data-aui": "chart-ticks",
|
|
479
|
-
children: tickValues(scale).map((tick, i) => /* @__PURE__ */ jsx("div", { children: formatTick(tick) }, i))
|
|
480
|
-
}) : null,
|
|
481
|
-
svg,
|
|
482
|
-
showAxis ? /* @__PURE__ */ jsx("div", {
|
|
483
|
-
"data-aui": "chart-xlabels",
|
|
484
|
-
children: (normalized[0]?.labels ?? []).map((label, i) => /* @__PURE__ */ jsx("div", { children: label ?? "" }, i))
|
|
485
|
-
}) : null,
|
|
486
|
-
showLegend ? /* @__PURE__ */ jsx("div", {
|
|
487
|
-
"data-aui": "chart-legend",
|
|
488
|
-
children: normalized.map((s, i) => /* @__PURE__ */ jsxs("span", {
|
|
489
|
-
"data-aui": "chart-legend-item",
|
|
490
|
-
"data-aui-series": i % SERIES_PALETTE_SIZE,
|
|
491
|
-
"data-aui-color": seriesColor(s, normalized.length, color),
|
|
492
|
-
children: [/* @__PURE__ */ jsx("span", { "data-aui": "chart-legend-swatch" }), s.label ?? `Series ${i + 1}`]
|
|
493
|
-
}, i))
|
|
494
|
-
}) : null
|
|
495
|
-
]
|
|
496
|
-
});
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
};
|
|
500
|
-
//#endregion
|
|
501
|
-
export { dataVocabulary };
|
|
502
|
-
|
|
503
|
-
//# sourceMappingURL=data.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data.js","names":[],"sources":["../../src/vocabulary/data.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { z } from \"zod\";\nimport type { GenerativeUILibrary } from \"../types\";\nimport { formatValue, isNumericTableFormat } from \"./formatValue\";\nimport { toTextContent } from \"./toTextContent\";\n\nconst columnSchema = z.object({\n label: z.string().describe(\"Column header label.\"),\n align: z.enum([\"start\", \"end\"]).optional().describe(\"Cell alignment.\"),\n format: z\n .object({\n kind: z\n .enum([\"number\", \"currency\", \"percent\", \"date\"])\n .describe(\n \"Format kind. `percent` takes a fraction, so 0.25 renders as 25%.\",\n ),\n currency: z.string().optional().describe(\"Currency code.\"),\n decimals: z.number().optional().describe(\"Decimal places.\"),\n })\n .optional()\n .describe(\"Cell value format.\"),\n});\n\nconst cellSchema = z\n .union([z.string(), z.number(), z.boolean()])\n .describe(\"A cell value.\");\n\ntype TableColumn = {\n label: string;\n align?: \"start\" | \"end\";\n format?: unknown;\n};\ntype TableCell = string | number | boolean;\n\ntype TableSort = { column: number; direction: \"ascending\" | \"descending\" };\n\nconst tableCollator = new Intl.Collator(\"en-US\", { numeric: true });\n\nconst isTableColumn = (column: unknown): column is TableColumn =>\n column !== null &&\n typeof column === \"object\" &&\n \"label\" in column &&\n typeof column.label === \"string\";\n\nconst isTableCell = (cell: unknown): cell is TableCell =>\n typeof cell === \"string\" ||\n typeof cell === \"number\" ||\n typeof cell === \"boolean\";\n\nconst tableAlignment = (column: unknown): \"start\" | \"end\" | undefined => {\n if (!isTableColumn(column)) return undefined;\n if (column.align === \"start\" || column.align === \"end\") return column.align;\n return isNumericTableFormat(column.format) ? \"end\" : undefined;\n};\n\nconst compareTableCells = (left: unknown, right: unknown): number => {\n if (\n typeof left === \"number\" &&\n Number.isFinite(left) &&\n typeof right === \"number\" &&\n Number.isFinite(right)\n ) {\n return left - right;\n }\n if (typeof left === \"number\" && Number.isFinite(left)) return -1;\n if (typeof right === \"number\" && Number.isFinite(right)) return 1;\n return tableCollator.compare(\n isTableCell(left) ? String(left) : \"\",\n isTableCell(right) ? String(right) : \"\",\n );\n};\n\ntype TableViewProps = {\n columns: unknown;\n rows: unknown;\n children: React.ReactNode;\n sort?: TableSort | undefined;\n onSort?: ((column: number) => void) | undefined;\n};\n\nfunction TableView({ columns, rows, children, sort, onSort }: TableViewProps) {\n const safeColumns = Array.isArray(columns) ? columns : [];\n const hasColumns = safeColumns.some(isTableColumn);\n const safeRows = Array.isArray(rows) ? rows.filter(Array.isArray) : [];\n const sortedRows =\n sort === undefined\n ? safeRows\n : safeRows\n .map((row, index) => ({ row, index }))\n .sort((left, right) => {\n const comparison = compareTableCells(\n left.row[sort.column],\n right.row[sort.column],\n );\n return comparison === 0\n ? left.index - right.index\n : sort.direction === \"ascending\"\n ? comparison\n : -comparison;\n })\n .map(({ row }) => row);\n\n return (\n <table data-aui=\"table\">\n {hasColumns ? (\n <thead>\n <tr>\n {safeColumns.map((column, i) => {\n const label = isTableColumn(column) ? column.label : \"\";\n const direction = sort?.column === i ? sort.direction : undefined;\n return (\n <th\n key={i}\n data-aui=\"table-col\"\n data-aui-align={tableAlignment(column)}\n aria-sort={direction}\n >\n {onSort ? (\n <button\n type=\"button\"\n data-aui=\"table-sort\"\n onClick={() => onSort(i)}\n >\n {label}\n {direction ? (\n <span\n aria-hidden=\"true\"\n data-aui=\"table-sort-direction\"\n >\n {direction === \"ascending\" ? \"↑\" : \"↓\"}\n </span>\n ) : null}\n </button>\n ) : (\n label\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n ) : null}\n {safeRows.length ? (\n <tbody>\n {sortedRows.map((row, r) => (\n <tr key={r}>\n {row.map((cell, c) => (\n <td key={c} data-aui-align={tableAlignment(safeColumns[c])}>\n {formatValue(\n cell,\n isTableColumn(safeColumns[c])\n ? safeColumns[c].format\n : undefined,\n )}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n ) : null}\n {children}\n </table>\n );\n}\n\nfunction SortableTable(props: Omit<TableViewProps, \"sort\" | \"onSort\">) {\n const [sort, setSort] = React.useState<TableSort | undefined>();\n return (\n <TableView\n {...props}\n sort={sort}\n onSort={(column) =>\n setSort((current) =>\n current?.column !== column\n ? { column, direction: \"ascending\" }\n : current.direction === \"ascending\"\n ? { column, direction: \"descending\" }\n : undefined,\n )\n }\n />\n );\n}\n\nconst CHART_HEIGHT = 40;\nconst CHART_WIDTH = 100;\n\nconst clampValue = (value: unknown): number =>\n typeof value === \"number\" && Number.isFinite(value) ? value : 0;\n\ntype ChartScale = { min: number; max: number };\n\nconst yFor = (value: number, scale: ChartScale): number => {\n const span = scale.max - scale.min;\n return span > 0\n ? CHART_HEIGHT - ((value - scale.min) / span) * CHART_HEIGHT\n : CHART_HEIGHT;\n};\n\nconst pointSchema = z.object({\n label: z.string().optional().describe(\"Point label.\"),\n value: z.number().describe(\"Point value.\"),\n});\n\nconst seriesSchema = z.object({\n label: z.string().optional().describe(\"Series label, shown in the legend.\"),\n color: z\n .string()\n .optional()\n .describe(\n \"Series color. One of `emphasis`, `secondary`, `alpha-70`, `white`, `white-70`, or `white-50`, matching Text's `color` tokens; other values have no visual effect.\",\n ),\n data: z.array(pointSchema).describe(\"Data points for this series.\"),\n});\n\ntype ChartPoint = { label?: string | undefined; value: number };\ntype ChartSeriesInput = {\n label?: string | undefined;\n color?: string | undefined;\n data?: ChartPoint[] | undefined;\n};\ntype NormalizedChartSeries = {\n label: string | undefined;\n color: string | undefined;\n values: number[];\n labels: (string | undefined)[];\n};\n\n/** Pads every series to the longest series' length, treating a shorter series' missing points as `{ value: 0 }` so mismatched series never misalign or throw. */\nfunction normalizeSeries(\n seriesProp: unknown,\n dataProp: unknown,\n): { count: number; series: NormalizedChartSeries[] } {\n const rawSeries: ChartSeriesInput[] =\n Array.isArray(seriesProp) && seriesProp.length > 0\n ? (seriesProp as ChartSeriesInput[])\n : [{ data: Array.isArray(dataProp) ? (dataProp as ChartPoint[]) : [] }];\n\n const count = rawSeries.reduce((max, s) => {\n const len = Array.isArray(s?.data) ? s.data.length : 0;\n return Math.max(max, len);\n }, 0);\n\n const series = rawSeries.map((s) => {\n const points = Array.isArray(s?.data) ? s.data : [];\n const values: number[] = [];\n const labels: (string | undefined)[] = [];\n for (let i = 0; i < count; i++) {\n const point = points[i];\n values.push(clampValue(point?.value));\n labels.push(typeof point?.label === \"string\" ? point.label : undefined);\n }\n return {\n label: typeof s?.label === \"string\" ? s.label : undefined,\n color: typeof s?.color === \"string\" ? s.color : undefined,\n values,\n labels,\n };\n });\n\n return { count, series };\n}\n\nfunction valueScale(values: number[]): ChartScale {\n let min = 0;\n let max = 0;\n for (const value of values) {\n min = Math.min(min, value);\n max = Math.max(max, value);\n }\n return { min, max };\n}\n\nfunction computeScale(\n series: NormalizedChartSeries[],\n count: number,\n stacked: boolean,\n): ChartScale {\n if (stacked) {\n let min = 0;\n let max = 0;\n for (let i = 0; i < count; i++) {\n let negative = 0;\n let positive = 0;\n for (const s of series) {\n const value = s.values[i] ?? 0;\n if (value < 0) negative += value;\n else positive += value;\n }\n min = Math.min(min, negative);\n max = Math.max(max, positive);\n }\n return { min, max };\n }\n return valueScale(series.flatMap((s) => s.values));\n}\n\nconst NICE_MULTIPLES = [1, 2, 5];\n\n/** The smallest of `{1, 2, 5} × 10^n` that is `>= max`, so axis ticks land on round numbers. */\nfunction niceMax(max: number): number {\n if (max <= 0) return 0;\n const exponent = Math.floor(Math.log10(max));\n for (const multiple of NICE_MULTIPLES) {\n const candidate = multiple * 10 ** exponent;\n if (candidate >= max) return candidate;\n }\n return 10 ** (exponent + 1);\n}\n\nconst TICK_COUNT = 5;\n\nfunction axisScale(scale: ChartScale): ChartScale {\n if (scale.min === 0) return { min: 0, max: niceMax(scale.max) };\n if (scale.max === 0) return { min: -niceMax(-scale.min), max: 0 };\n const step = niceMax(Math.max(-scale.min, scale.max) / 2);\n return { min: -2 * step, max: 2 * step };\n}\n\n/** `TICK_COUNT` evenly spaced ticks from the top of the scale down to its bottom, for a top-to-bottom y-axis column. */\nfunction tickValues(scale: ChartScale): number[] {\n const ticks: number[] = [];\n if (scale.min === 0) {\n for (let i = 0; i < TICK_COUNT; i++) {\n ticks.push((scale.max * (TICK_COUNT - 1 - i)) / (TICK_COUNT - 1));\n }\n return ticks;\n }\n for (let i = 0; i < TICK_COUNT; i++) {\n ticks.push(\n scale.min +\n ((scale.max - scale.min) * (TICK_COUNT - 1 - i)) / (TICK_COUNT - 1),\n );\n }\n return ticks;\n}\n\nfunction formatTick(value: number): string {\n return (Math.round(value * 100) / 100).toLocaleString(\"en-US\");\n}\n\ntype ChartVariant = \"bar\" | \"line\" | \"sparkline\" | \"area\";\n\nconst SERIES_PALETTE_SIZE = 5;\n\nconst tooltipText = (\n seriesLabel: string | undefined,\n pointLabel: string | undefined,\n index: number,\n value: number,\n) =>\n `${seriesLabel ? `${seriesLabel}, ` : \"\"}${pointLabel || index + 1}: ${formatTick(value)}`;\n\nconst seriesColor = (\n series: NormalizedChartSeries,\n seriesCount: number,\n color: unknown,\n) =>\n series.color ??\n (seriesCount === 1 && typeof color === \"string\" ? color : undefined);\n\nconst xFor = (index: number, count: number): number =>\n count === 1 ? CHART_WIDTH / 2 : (index / (count - 1)) * CHART_WIDTH;\n\nfunction pointTargets(\n series: NormalizedChartSeries,\n positions: number[],\n count: number,\n scale: ChartScale,\n) {\n return series.values.map((value, i) => (\n <circle\n key={i}\n data-aui=\"chart-point\"\n cx={xFor(i, count)}\n cy={yFor(positions[i] ?? 0, scale)}\n r={4}\n fill=\"transparent\"\n >\n <title>{tooltipText(series.label, series.labels[i], i, value)}</title>\n </circle>\n ));\n}\n\nfunction barGeometry(value: number, start: number, scale: ChartScale) {\n const end = start + value;\n if (scale.min === 0 && start >= 0 && end >= 0) {\n const height = scale.max > 0 ? (value / scale.max) * CHART_HEIGHT : 0;\n const belowHeight = scale.max > 0 ? (start / scale.max) * CHART_HEIGHT : 0;\n return { y: CHART_HEIGHT - belowHeight - height, height };\n }\n const startY = yFor(start, scale);\n const endY = yFor(end, scale);\n return { y: Math.min(startY, endY), height: Math.abs(endY - startY) };\n}\n\nfunction renderSeriesMarks(\n variant: ChartVariant,\n series: NormalizedChartSeries[],\n count: number,\n scale: ChartScale,\n stacked: boolean,\n color: unknown,\n) {\n const seriesCount = series.length;\n\n if (variant === \"bar\") {\n const slot = count > 0 ? CHART_WIDTH / count : 0;\n const gap = slot * 0.2;\n const groupWidth = slot - gap;\n const perSeriesWidth =\n stacked || seriesCount <= 1 ? groupWidth : groupWidth / seriesCount;\n const negatives = new Array(count).fill(0) as number[];\n const positives = new Array(count).fill(0) as number[];\n\n return series.map((s, seriesIndex) => {\n const marks = s.values.map((value, i) => {\n const start = stacked\n ? value < 0\n ? (negatives[i] ?? 0)\n : (positives[i] ?? 0)\n : 0;\n const { y, height } = barGeometry(value, start, scale);\n const x =\n stacked || seriesCount <= 1\n ? i * slot + gap / 2\n : i * slot + gap / 2 + seriesIndex * perSeriesWidth;\n return (\n <rect\n key={i}\n x={x}\n y={y}\n width={perSeriesWidth}\n height={height}\n fill=\"currentColor\"\n >\n <title>{tooltipText(s.label, s.labels[i], i, value)}</title>\n </rect>\n );\n });\n if (stacked) {\n for (let i = 0; i < count; i++) {\n const value = s.values[i] ?? 0;\n if (value < 0) negatives[i] = (negatives[i] ?? 0) + value;\n else positives[i] = (positives[i] ?? 0) + value;\n }\n }\n return (\n <g\n key={seriesIndex}\n data-aui=\"chart-series\"\n data-aui-series={seriesIndex % SERIES_PALETTE_SIZE}\n data-aui-color={seriesColor(s, seriesCount, color)}\n >\n {marks}\n </g>\n );\n });\n }\n\n if (variant === \"area\") {\n const negatives = new Array(count).fill(0) as number[];\n const positives = new Array(count).fill(0) as number[];\n\n return series.map((s, seriesIndex) => {\n const bottoms = s.values.map((value, i) =>\n stacked ? (value < 0 ? (negatives[i] ?? 0) : (positives[i] ?? 0)) : 0,\n );\n const tops = s.values.map((value, i) =>\n stacked ? (bottoms[i] ?? 0) + value : value,\n );\n if (stacked) {\n for (let i = 0; i < count; i++) {\n const value = s.values[i] ?? 0;\n if (value < 0) negatives[i] = (negatives[i] ?? 0) + value;\n else positives[i] = (positives[i] ?? 0) + value;\n }\n }\n\n if (count === 1) {\n const y = yFor(tops[0] ?? 0, scale);\n return (\n <g\n key={seriesIndex}\n data-aui=\"chart-series\"\n data-aui-series={seriesIndex % SERIES_PALETTE_SIZE}\n data-aui-color={seriesColor(s, seriesCount, color)}\n >\n <circle cx={CHART_WIDTH / 2} cy={y} r={2} fill=\"currentColor\" />\n {pointTargets(s, tops, count, scale)}\n </g>\n );\n }\n if (count === 0) {\n return (\n <g\n key={seriesIndex}\n data-aui=\"chart-series\"\n data-aui-series={seriesIndex % SERIES_PALETTE_SIZE}\n data-aui-color={seriesColor(s, seriesCount, color)}\n />\n );\n }\n\n const topPoints = tops.map(\n (v, i) => `${xFor(i, count)},${yFor(v, scale)}`,\n );\n const bottomPoints = bottoms\n .map((v, i) => `${xFor(i, count)},${yFor(v, scale)}`)\n .reverse();\n\n return (\n <g\n key={seriesIndex}\n data-aui=\"chart-series\"\n data-aui-series={seriesIndex % SERIES_PALETTE_SIZE}\n data-aui-color={seriesColor(s, seriesCount, color)}\n >\n <polygon\n points={[...topPoints, ...bottomPoints].join(\" \")}\n fill=\"currentColor\"\n fillOpacity=\"0.25\"\n />\n <polyline\n points={topPoints.join(\" \")}\n fill=\"none\"\n stroke=\"currentColor\"\n vectorEffect=\"non-scaling-stroke\"\n />\n {pointTargets(s, tops, count, scale)}\n </g>\n );\n });\n }\n\n // line / sparkline: each series is always drawn independently. Stacking a line has no single standard meaning, so `stacked` is ignored (the caller never passes it for these variants).\n return series.map((s, seriesIndex) => (\n <g\n key={seriesIndex}\n data-aui=\"chart-series\"\n data-aui-series={seriesIndex % SERIES_PALETTE_SIZE}\n data-aui-color={seriesColor(s, series.length, color)}\n >\n {count === 1 ? (\n <circle\n cx={CHART_WIDTH / 2}\n cy={yFor(s.values[0] ?? 0, scale)}\n r={2}\n fill=\"currentColor\"\n />\n ) : count > 1 ? (\n <polyline\n points={s.values\n .map((v, i) => `${xFor(i, count)},${yFor(v, scale)}`)\n .join(\" \")}\n fill=\"none\"\n stroke=\"currentColor\"\n vectorEffect=\"non-scaling-stroke\"\n />\n ) : null}\n {variant === \"line\" ? pointTargets(s, s.values, count, scale) : null}\n </g>\n ));\n}\n\nexport const dataVocabulary = {\n Table: {\n description:\n \"Tabular data. Provide `columns` and `rows`; each row is an array of cells matching the columns.\",\n properties: z.object({\n columns: z.array(columnSchema).optional().describe(\"Column definitions.\"),\n rows: z.array(z.array(cellSchema)).optional().describe(\"Rows of cells.\"),\n sortable: z.boolean().optional().describe(\"Allow header sorting.\"),\n }),\n render: ({ columns, rows, sortable, children }) =>\n sortable === true ? (\n <SortableTable columns={columns} rows={rows}>\n {children}\n </SortableTable>\n ) : (\n <TableView columns={columns} rows={rows}>\n {children}\n </TableView>\n ),\n },\n Markdown: {\n description:\n \"A markdown string. Rendered as-is by default; override this component for a full markdown renderer.\",\n properties: z.object({\n value: z.string().describe(\"Markdown source.\"),\n }),\n streamProperties: true,\n render: ({ value, children }) => (\n <div data-aui=\"markdown\">\n {toTextContent(value)}\n {children}\n </div>\n ),\n },\n Chart: {\n description:\n \"A chart. `variant` selects bar, line, sparkline, or area rendering. Provide `data` for a single series, or `series` for multiple named series (`series` takes precedence over `data` when both are present). Set `stacked` to accumulate series values instead of overlaying them, and `showAxis`/`showLegend` to add y-axis ticks, x-axis point labels, and a legend.\",\n properties: z.object({\n variant: z\n .enum([\"bar\", \"line\", \"sparkline\", \"area\"])\n .describe(\"Chart variant.\"),\n data: z\n .array(pointSchema)\n .optional()\n .describe(\"Data points for a single series.\"),\n series: z\n .array(seriesSchema)\n .optional()\n .describe(\n \"Multiple named series; takes precedence over `data` when present.\",\n ),\n stacked: z\n .boolean()\n .optional()\n .describe(\n \"Accumulate series values instead of overlaying them (bar and area variants; ignored for line and sparkline).\",\n ),\n showAxis: z\n .boolean()\n .optional()\n .describe(\"Show y-axis ticks and x-axis point labels.\"),\n showLegend: z\n .boolean()\n .optional()\n .describe(\"Show a legend mapping each series to its color.\"),\n color: z\n .string()\n .optional()\n .describe(\n \"Series color (single-series mode only). One of `emphasis`, `secondary`, `alpha-70`, `white`, `white-70`, or `white-50`, matching Text's `color` tokens; other values have no visual effect.\",\n ),\n }),\n render: ({\n variant,\n data,\n series,\n stacked,\n showAxis,\n showLegend,\n color,\n }) => {\n const usesExtendedFeatures =\n variant === \"area\" ||\n !!stacked ||\n !!showAxis ||\n !!showLegend ||\n (Array.isArray(series) && series.length > 0);\n\n if (!usesExtendedFeatures) {\n const points = Array.isArray(data) ? data : [];\n const n = points.length;\n const values = points.map((d) => clampValue(d?.value));\n const scale = valueScale(values);\n const chartSeries: NormalizedChartSeries = {\n label: undefined,\n color: undefined,\n values,\n labels: points.map((point) =>\n typeof point?.label === \"string\" ? point.label : undefined,\n ),\n };\n const slot = n > 0 ? CHART_WIDTH / n : 0;\n const gap = slot * 0.2;\n const barWidth = slot - gap;\n const crossesZero = scale.min < 0 && scale.max > 0;\n\n return (\n <svg\n data-aui=\"chart\"\n data-aui-variant={variant}\n data-aui-color={color}\n role=\"img\"\n aria-label={`${variant} chart with ${n} data points`}\n viewBox={`0 0 ${CHART_WIDTH} ${CHART_HEIGHT}`}\n preserveAspectRatio=\"none\"\n >\n {crossesZero ? (\n <line\n data-aui=\"chart-zero\"\n x1={0}\n x2={CHART_WIDTH}\n y1={yFor(0, scale)}\n y2={yFor(0, scale)}\n stroke=\"currentColor\"\n vectorEffect=\"non-scaling-stroke\"\n />\n ) : null}\n {variant === \"bar\" ? (\n values.map((v, i) => {\n const { y, height } = barGeometry(v, 0, scale);\n return (\n <rect\n key={i}\n x={i * slot + gap / 2}\n y={y}\n width={barWidth}\n height={height}\n fill=\"currentColor\"\n >\n <title>\n {tooltipText(undefined, chartSeries.labels[i], i, v)}\n </title>\n </rect>\n );\n })\n ) : n === 1 ? (\n <>\n <circle\n cx={CHART_WIDTH / 2}\n cy={yFor(values[0] ?? 0, scale)}\n r={2}\n fill=\"currentColor\"\n />\n {variant === \"line\"\n ? pointTargets(chartSeries, values, n, scale)\n : null}\n </>\n ) : n > 1 ? (\n <>\n <polyline\n points={values\n .map((v, i) => `${xFor(i, n)},${yFor(v, scale)}`)\n .join(\" \")}\n fill=\"none\"\n stroke=\"currentColor\"\n />\n {variant === \"line\"\n ? pointTargets(chartSeries, values, n, scale)\n : null}\n </>\n ) : null}\n </svg>\n );\n }\n\n const { count, series: normalized } = normalizeSeries(series, data);\n const stackedScale =\n !!stacked && (variant === \"bar\" || variant === \"area\");\n const rawScale = computeScale(normalized, count, stackedScale);\n const scale = showAxis ? axisScale(rawScale) : rawScale;\n const marks = renderSeriesMarks(\n variant,\n normalized,\n count,\n scale,\n stackedScale,\n color,\n );\n const crossesZero = rawScale.min < 0 && rawScale.max > 0;\n\n const svg = (\n <svg\n data-aui=\"chart\"\n data-aui-variant={variant}\n data-aui-color={color}\n role=\"img\"\n aria-label={`${variant} chart with ${count} data points`}\n viewBox={`0 0 ${CHART_WIDTH} ${CHART_HEIGHT}`}\n preserveAspectRatio=\"none\"\n >\n {crossesZero ? (\n <line\n data-aui=\"chart-zero\"\n x1={0}\n x2={CHART_WIDTH}\n y1={yFor(0, scale)}\n y2={yFor(0, scale)}\n stroke=\"currentColor\"\n vectorEffect=\"non-scaling-stroke\"\n />\n ) : null}\n {marks}\n </svg>\n );\n\n if (!showAxis && !showLegend) return svg;\n\n return (\n <div data-aui=\"chart-frame\">\n {showAxis ? (\n <div data-aui=\"chart-ticks\">\n {tickValues(scale).map((tick, i) => (\n <div key={i}>{formatTick(tick)}</div>\n ))}\n </div>\n ) : null}\n {svg}\n {showAxis ? (\n <div data-aui=\"chart-xlabels\">\n {(normalized[0]?.labels ?? []).map((label, i) => (\n <div key={i}>{label ?? \"\"}</div>\n ))}\n </div>\n ) : null}\n {showLegend ? (\n <div data-aui=\"chart-legend\">\n {normalized.map((s, i) => (\n <span\n key={i}\n data-aui=\"chart-legend-item\"\n data-aui-series={i % SERIES_PALETTE_SIZE}\n data-aui-color={seriesColor(s, normalized.length, color)}\n >\n <span data-aui=\"chart-legend-swatch\" />\n {s.label ?? `Series ${i + 1}`}\n </span>\n ))}\n </div>\n ) : null}\n </div>\n );\n },\n },\n} satisfies GenerativeUILibrary;\n"],"mappings":"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"}
|