@assistant-ui/react-generative-ui 0.0.7 → 0.0.9
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/dist/JSONGenerativeUI.client.d.ts +0 -1
- package/dist/JSONGenerativeUI.client.d.ts.map +1 -1
- package/dist/JSONGenerativeUI.server.d.ts +0 -1
- package/dist/JSONGenerativeUI.server.d.ts.map +1 -1
- package/dist/JSONGenerativeUI.shared.d.ts +0 -1
- package/dist/JSONGenerativeUI.shared.d.ts.map +1 -1
- package/dist/actionRegistry.d.ts +2 -11
- package/dist/actionRegistry.d.ts.map +1 -1
- package/dist/actionRegistry.js.map +1 -1
- package/dist/buildPresentParameters.d.ts +5 -5
- package/dist/buildPresentParameters.d.ts.map +1 -1
- package/dist/buildPresentParameters.js +10 -5
- package/dist/buildPresentParameters.js.map +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/defineGenerativeComponents.d.ts +0 -1
- package/dist/defineGenerativeComponents.d.ts.map +1 -1
- package/dist/generativeUIToJSX.d.ts +15 -10
- package/dist/generativeUIToJSX.d.ts.map +1 -1
- package/dist/generativeUIToJSX.js +47 -17
- package/dist/generativeUIToJSX.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.js +2 -2
- package/dist/index.server.d.ts +4 -3
- package/dist/index.server.js +2 -2
- package/dist/index.shared.d.ts +3 -3
- package/dist/index.shared.js +2 -2
- package/dist/ir.d.ts +6 -6
- package/dist/ir.d.ts.map +1 -1
- package/dist/ir.js +27 -1
- package/dist/ir.js.map +1 -1
- package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts +3 -3
- package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts.map +1 -1
- package/dist/renderGenerativeUI.d.ts +0 -1
- package/dist/renderGenerativeUI.d.ts.map +1 -1
- package/dist/slack/constants.d.ts +111 -0
- package/dist/slack/constants.d.ts.map +1 -0
- package/dist/slack/constants.js +162 -0
- package/dist/slack/constants.js.map +1 -0
- package/dist/slack/decodeBlockAction.d.ts +11 -0
- package/dist/slack/decodeBlockAction.d.ts.map +1 -0
- package/dist/slack/decodeBlockAction.js +40 -0
- package/dist/slack/decodeBlockAction.js.map +1 -0
- package/dist/slack/fromSlackBlocks.d.ts +30 -0
- package/dist/slack/fromSlackBlocks.d.ts.map +1 -0
- package/dist/slack/fromSlackBlocks.js +447 -0
- package/dist/slack/fromSlackBlocks.js.map +1 -0
- package/dist/slack/toSlackBlocks.d.ts +7 -0
- package/dist/slack/toSlackBlocks.d.ts.map +1 -0
- package/dist/slack/toSlackBlocks.js +649 -0
- package/dist/slack/toSlackBlocks.js.map +1 -0
- package/dist/slack/types.d.ts +178 -0
- package/dist/slack/types.d.ts.map +1 -0
- package/dist/slack/types.js +0 -0
- package/dist/slack.d.ts +5 -0
- package/dist/slack.js +4 -0
- package/dist/teams/boundSpec.d.ts +20 -0
- package/dist/teams/boundSpec.d.ts.map +1 -0
- package/dist/teams/boundSpec.js +67 -0
- package/dist/teams/boundSpec.js.map +1 -0
- package/dist/teams/constants.d.ts +57 -0
- package/dist/teams/constants.d.ts.map +1 -0
- package/dist/teams/constants.js +92 -0
- package/dist/teams/constants.js.map +1 -0
- package/dist/teams/decodeSubmitData.d.ts +25 -0
- package/dist/teams/decodeSubmitData.d.ts.map +1 -0
- package/dist/teams/decodeSubmitData.js +44 -0
- package/dist/teams/decodeSubmitData.js.map +1 -0
- package/dist/teams/toAdaptiveCard.d.ts +39 -0
- package/dist/teams/toAdaptiveCard.d.ts.map +1 -0
- package/dist/teams/toAdaptiveCard.js +496 -0
- package/dist/teams/toAdaptiveCard.js.map +1 -0
- package/dist/teams/toTeamsAttachments.d.ts +13 -0
- package/dist/teams/toTeamsAttachments.d.ts.map +1 -0
- package/dist/teams/toTeamsAttachments.js +95 -0
- package/dist/teams/toTeamsAttachments.js.map +1 -0
- package/dist/teams/types.d.ts +196 -0
- package/dist/teams/types.d.ts.map +1 -0
- package/dist/teams/types.js +0 -0
- package/dist/teams.d.ts +5 -0
- package/dist/teams.js +4 -0
- package/dist/types.d.ts +7 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/vocabulary/alert.d.ts +6 -12
- package/dist/vocabulary/alert.d.ts.map +1 -1
- package/dist/vocabulary/alert.js +13 -4
- package/dist/vocabulary/alert.js.map +1 -1
- package/dist/vocabulary/collectFormValues.d.ts +23 -0
- package/dist/vocabulary/collectFormValues.d.ts.map +1 -0
- package/dist/vocabulary/collectFormValues.js +32 -0
- package/dist/vocabulary/collectFormValues.js.map +1 -0
- package/dist/vocabulary/data.d.ts +16 -17
- package/dist/vocabulary/data.d.ts.map +1 -1
- package/dist/vocabulary/data.js +244 -13
- package/dist/vocabulary/data.js.map +1 -1
- package/dist/vocabulary/dispatch.d.ts +11 -0
- package/dist/vocabulary/dispatch.d.ts.map +1 -0
- package/dist/vocabulary/dispatch.js +21 -0
- package/dist/vocabulary/dispatch.js.map +1 -0
- package/dist/vocabulary/fact.d.ts +1 -6
- package/dist/vocabulary/fact.d.ts.map +1 -1
- package/dist/vocabulary/fact.js.map +1 -1
- package/dist/vocabulary/form.d.ts +14 -0
- package/dist/vocabulary/form.d.ts.map +1 -0
- package/dist/vocabulary/form.js +23 -0
- package/dist/vocabulary/form.js.map +1 -0
- package/dist/vocabulary/icon.d.ts +44 -0
- package/dist/vocabulary/icon.d.ts.map +1 -0
- package/dist/vocabulary/icon.js +272 -0
- package/dist/vocabulary/icon.js.map +1 -0
- package/dist/vocabulary/index.d.ts +0 -1
- package/dist/vocabulary/index.d.ts.map +1 -1
- package/dist/vocabulary/index.js +7 -1
- package/dist/vocabulary/index.js.map +1 -1
- package/dist/vocabulary/interactive.d.ts +45 -33
- package/dist/vocabulary/interactive.d.ts.map +1 -1
- package/dist/vocabulary/interactive.js +78 -29
- package/dist/vocabulary/interactive.js.map +1 -1
- package/dist/vocabulary/layout.d.ts +27 -23
- package/dist/vocabulary/layout.d.ts.map +1 -1
- package/dist/vocabulary/layout.js +78 -14
- package/dist/vocabulary/layout.js.map +1 -1
- package/dist/vocabulary/list.d.ts +17 -0
- package/dist/vocabulary/list.d.ts.map +1 -0
- package/dist/vocabulary/list.js +48 -0
- package/dist/vocabulary/list.js.map +1 -0
- package/dist/vocabulary/media.d.ts +3 -9
- package/dist/vocabulary/media.d.ts.map +1 -1
- package/dist/vocabulary/media.js +17 -7
- package/dist/vocabulary/media.js.map +1 -1
- package/dist/vocabulary/text.d.ts +3 -17
- package/dist/vocabulary/text.d.ts.map +1 -1
- package/dist/vocabulary/text.js.map +1 -1
- package/package.json +15 -7
- package/src/actionRegistry.ts +2 -10
- package/src/buildPresentParameters.ts +15 -9
- package/src/generativeUIToJSX.test.ts +186 -0
- package/src/generativeUIToJSX.ts +112 -21
- package/src/index.shared.ts +3 -0
- package/src/ir.ts +31 -5
- package/src/renderGenerativeUI.test.tsx +16 -2
- package/src/slack/constants.ts +212 -0
- package/src/slack/decodeBlockAction.test.ts +135 -0
- package/src/slack/decodeBlockAction.ts +66 -0
- package/src/slack/fromSlackBlocks.test.ts +1145 -0
- package/src/slack/fromSlackBlocks.ts +709 -0
- package/src/slack/toSlackBlocks.test.ts +1936 -0
- package/src/slack/toSlackBlocks.ts +1319 -0
- package/src/slack/types.ts +230 -0
- package/src/slack.ts +37 -0
- package/src/teams/boundSpec.ts +102 -0
- package/src/teams/constants.ts +127 -0
- package/src/teams/decodeSubmitData.test.ts +148 -0
- package/src/teams/decodeSubmitData.ts +57 -0
- package/src/teams/toAdaptiveCard.test.ts +1410 -0
- package/src/teams/toAdaptiveCard.ts +762 -0
- package/src/teams/toTeamsAttachments.test.ts +29 -0
- package/src/teams/toTeamsAttachments.ts +137 -0
- package/src/teams/types.ts +237 -0
- package/src/teams.ts +34 -0
- package/src/vocabulary/alert.test.tsx +72 -2
- package/src/vocabulary/alert.tsx +24 -5
- package/src/vocabulary/collectFormValues.test.ts +127 -0
- package/src/vocabulary/collectFormValues.ts +58 -0
- package/src/vocabulary/data.test.tsx +503 -3
- package/src/vocabulary/data.tsx +426 -18
- package/src/vocabulary/dispatch.ts +22 -0
- package/src/vocabulary/form.test.tsx +112 -0
- package/src/vocabulary/form.tsx +34 -0
- package/src/vocabulary/icon.test.tsx +64 -0
- package/src/vocabulary/icon.tsx +174 -0
- package/src/vocabulary/index.test.ts +7 -0
- package/src/vocabulary/index.ts +6 -0
- package/src/vocabulary/interactive.dispatch.test.tsx +243 -1
- package/src/vocabulary/interactive.test.tsx +143 -3
- package/src/vocabulary/interactive.tsx +134 -30
- package/src/vocabulary/layout.test.tsx +231 -3
- package/src/vocabulary/layout.tsx +168 -15
- package/src/vocabulary/list.test.tsx +195 -0
- package/src/vocabulary/list.tsx +48 -0
- package/src/vocabulary/media.test.tsx +36 -4
- package/src/vocabulary/media.tsx +27 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive.js","names":[],"sources":["../../src/vocabulary/interactive.tsx"],"sourcesContent":["import { z } from \"zod\";\nimport type { Action } from \"../ir\";\nimport { BUTTON_STYLES } from \"../ir\";\nimport type { GenerativeUIDispatch, GenerativeUILibrary } from \"../types\";\n\nconst optionSchema = z.object({\n label: z.string(),\n value: z.string(),\n});\n\nconst actionAttr = (a: Action | undefined): string | undefined =>\n a ? JSON.stringify(a) : undefined;\n\n/** Fires `$action` through `$dispatch` when both are present, merging a runtime\n * value into the payload under the reserved `$input` key (not `value`) so the\n * user's input never clobbers a model-supplied `value` field. No-op when no\n * registry is wired. The returned promise from an async handler is caught and\n * re-thrown on a microtask so rejections surface rather than going unhandled. */\nconst fire = (\n $action: Action | undefined,\n $dispatch: GenerativeUIDispatch | undefined,\n input?: unknown,\n) => {\n if (!$action || !$dispatch) return;\n const payload = input === undefined ? $action : { ...$action, $input: input };\n void Promise.resolve($dispatch(payload)).catch((error) => {\n queueMicrotask(() => {\n throw error;\n });\n });\n};\n\nexport const interactiveVocabulary = {\n Button: {\n description:\n \"A clickable button. Carries `$action` describing the side effect or resume value.\",\n properties: z.object({\n label: z.string().describe(\"Button label.\"),\n buttonStyle: z.enum(BUTTON_STYLES).optional().describe(\"Visual style.\"),\n block: z\n .boolean()\n .optional()\n .describe(\"Whether the button spans the full width.\"),\n }),\n render: ({ label, buttonStyle, block, $action, $dispatch, children }) => (\n <button\n data-aui=\"button\"\n data-aui-style={buttonStyle}\n data-aui-block={block || undefined}\n data-aui-action={actionAttr($action)}\n onClick={() => fire($action, $dispatch)}\n >\n {label}\n {children}\n </button>\n ),\n },\n Select: {\n description:\n \"A dropdown selector. Carries `$action` describing the on-select behavior.\",\n properties: z.object({\n options: z.array(optionSchema).describe(\"Selectable options.\"),\n placeholder: z\n .string()\n .optional()\n .describe(\"Placeholder shown when nothing is selected.\"),\n label: z\n .string()\n .optional()\n .describe(\"Accessible label for the control.\"),\n }),\n render: ({ options, placeholder, label, $action, $dispatch, children }) => (\n <select\n data-aui=\"select\"\n data-aui-action={actionAttr($action)}\n aria-label={label}\n defaultValue=\"\"\n onChange={(e) => fire($action, $dispatch, e.currentTarget.value)}\n >\n {placeholder ? (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n ) : null}\n {options.map((o: { label: string; value: string }, i: number) => (\n <option key={i} value={o.value}>\n {o.label}\n </option>\n ))}\n {children}\n </select>\n ),\n },\n Input: {\n description:\n \"A text input. Carries `$action` describing the on-submit behavior.\",\n properties: z.object({\n placeholder: z.string().optional().describe(\"Placeholder text.\"),\n multiline: z\n .boolean()\n .optional()\n .describe(\"Render a textarea instead of a single-line input.\"),\n label: z\n .string()\n .optional()\n .describe(\"Accessible label for the control.\"),\n }),\n render: ({ placeholder, multiline, label, $action, $dispatch }) => {\n const submit = (v: string) => fire($action, $dispatch, v);\n return multiline ? (\n <textarea\n data-aui=\"input\"\n data-aui-multiline\n data-aui-action={actionAttr($action)}\n aria-label={label}\n placeholder={placeholder}\n onKeyDown={(e) => {\n if (\n e.key === \"Enter\" &&\n (e.ctrlKey || e.metaKey) &&\n !e.nativeEvent.isComposing\n )\n submit(e.currentTarget.value);\n }}\n />\n ) : (\n <input\n data-aui=\"input\"\n data-aui-action={actionAttr($action)}\n aria-label={label}\n placeholder={placeholder}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !e.nativeEvent.isComposing)\n submit(e.currentTarget.value);\n }}\n />\n );\n },\n },\n DatePicker: {\n description:\n \"A date input. Carries `$action` describing the on-select behavior.\",\n properties: z.object({\n value: z.string().optional().describe(\"Initial date (YYYY-MM-DD).\"),\n min: z.string().optional().describe(\"Minimum date (YYYY-MM-DD).\"),\n max: z.string().optional().describe(\"Maximum date (YYYY-MM-DD).\"),\n label: z\n .string()\n .optional()\n .describe(\"Accessible label for the control.\"),\n }),\n render: ({ value, min, max, label, $action, $dispatch }) => (\n <input\n type=\"date\"\n data-aui=\"datepicker\"\n data-aui-action={actionAttr($action)}\n aria-label={label}\n defaultValue={value}\n min={min}\n max={max}\n onChange={(e) => fire($action, $dispatch, e.currentTarget.value)}\n />\n ),\n },\n} satisfies GenerativeUILibrary;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"interactive.js","names":[],"sources":["../../src/vocabulary/interactive.tsx"],"sourcesContent":["import { useId } from \"react\";\nimport { z } from \"zod\";\nimport type { Action } from \"../ir\";\nimport { BUTTON_STYLES } from \"../ir\";\nimport type { GenerativeUIDispatch, GenerativeUILibrary } from \"../types\";\nimport { actionAttr, fire } from \"./dispatch\";\n\nconst optionSchema = z.object({\n label: z.string(),\n value: z.string(),\n});\n\ntype RadioGroupRenderProps = {\n options: { label: string; value: string }[];\n name?: string;\n label?: string;\n defaultValue?: string;\n $action?: Action;\n $dispatch?: GenerativeUIDispatch;\n};\n\nfunction RadioGroupRender({\n options,\n name,\n label,\n defaultValue,\n $action,\n $dispatch,\n}: RadioGroupRenderProps) {\n const generatedName = useId();\n const fieldName = name ?? generatedName;\n const safeOptions = Array.isArray(options) ? options : [];\n return (\n <fieldset\n data-aui=\"radiogroup\"\n data-aui-action={actionAttr($action)}\n aria-label={label}\n >\n {safeOptions.map((option, i) =>\n option &&\n typeof option.label === \"string\" &&\n typeof option.value === \"string\" ? (\n <label key={i} data-aui=\"radiogroup-option\">\n <input\n type=\"radio\"\n name={fieldName}\n value={option.value}\n defaultChecked={defaultValue === option.value}\n onChange={() => fire($action, $dispatch, option.value)}\n />\n {option.label}\n </label>\n ) : null,\n )}\n </fieldset>\n );\n}\n\nexport const interactiveVocabulary = {\n Button: {\n description:\n \"A clickable button. Carries `$action` describing the side effect or resume value. Set `submit` to submit an ancestor Form/Card instead of firing `$action` on click.\",\n properties: z.object({\n label: z.string().describe(\"Button label.\"),\n buttonStyle: z.enum(BUTTON_STYLES).optional().describe(\"Visual style.\"),\n block: z\n .boolean()\n .optional()\n .describe(\"Whether the button spans the full width.\"),\n submit: z\n .boolean()\n .optional()\n .describe(\n \"Render as a submit button for an ancestor Form/Card instead of a click button.\",\n ),\n }),\n render: ({\n label,\n buttonStyle,\n block,\n submit,\n $action,\n $dispatch,\n children,\n }) => (\n <button\n type={submit ? \"submit\" : \"button\"}\n data-aui=\"button\"\n data-aui-style={buttonStyle}\n data-aui-block={block || undefined}\n data-aui-submit={submit || undefined}\n data-aui-action={actionAttr($action)}\n onClick={submit ? undefined : () => fire($action, $dispatch)}\n >\n {label}\n {children}\n </button>\n ),\n },\n Select: {\n description:\n \"A dropdown selector. Carries `$action` describing the on-select behavior.\",\n properties: z.object({\n options: z.array(optionSchema).describe(\"Selectable options.\"),\n placeholder: z\n .string()\n .optional()\n .describe(\"Placeholder shown when nothing is selected.\"),\n label: z\n .string()\n .optional()\n .describe(\"Accessible label for the control.\"),\n name: z.string().optional().describe(\"Field name used inside a Form.\"),\n }),\n render: ({\n options,\n placeholder,\n label,\n name,\n $action,\n $dispatch,\n children,\n }) => (\n <select\n data-aui=\"select\"\n data-aui-action={actionAttr($action)}\n name={name}\n aria-label={label}\n defaultValue=\"\"\n onChange={(e) => fire($action, $dispatch, e.currentTarget.value)}\n >\n {placeholder ? (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n ) : null}\n {options.map((o: { label: string; value: string }, i: number) => (\n <option key={i} value={o.value}>\n {o.label}\n </option>\n ))}\n {children}\n </select>\n ),\n },\n Input: {\n description:\n \"A text input. Carries `$action` describing the on-submit behavior.\",\n properties: z.object({\n placeholder: z.string().optional().describe(\"Placeholder text.\"),\n multiline: z\n .boolean()\n .optional()\n .describe(\"Render a textarea instead of a single-line input.\"),\n label: z\n .string()\n .optional()\n .describe(\"Accessible label for the control.\"),\n name: z.string().optional().describe(\"Field name used inside a Form.\"),\n }),\n render: ({ placeholder, multiline, label, name, $action, $dispatch }) => {\n const submit = (v: string) => fire($action, $dispatch, v);\n return multiline ? (\n <textarea\n data-aui=\"input\"\n data-aui-multiline\n data-aui-action={actionAttr($action)}\n name={name}\n aria-label={label}\n placeholder={placeholder}\n onKeyDown={(e) => {\n if (\n e.key !== \"Enter\" ||\n !(e.ctrlKey || e.metaKey) ||\n e.nativeEvent.isComposing\n )\n return;\n if (e.currentTarget.form) {\n e.preventDefault();\n HTMLFormElement.prototype.requestSubmit.call(\n e.currentTarget.form,\n );\n } else {\n submit(e.currentTarget.value);\n }\n }}\n />\n ) : (\n <input\n data-aui=\"input\"\n data-aui-action={actionAttr($action)}\n name={name}\n aria-label={label}\n placeholder={placeholder}\n onKeyDown={(e) => {\n if (\n e.key === \"Enter\" &&\n !e.nativeEvent.isComposing &&\n !e.currentTarget.form\n )\n submit(e.currentTarget.value);\n }}\n />\n );\n },\n },\n DatePicker: {\n description:\n \"A date input. Carries `$action` describing the on-select behavior.\",\n properties: z.object({\n value: z.string().optional().describe(\"Initial date (YYYY-MM-DD).\"),\n min: z.string().optional().describe(\"Minimum date (YYYY-MM-DD).\"),\n max: z.string().optional().describe(\"Maximum date (YYYY-MM-DD).\"),\n label: z\n .string()\n .optional()\n .describe(\"Accessible label for the control.\"),\n name: z.string().optional().describe(\"Field name used inside a Form.\"),\n }),\n render: ({ value, min, max, label, name, $action, $dispatch }) => (\n <input\n type=\"date\"\n data-aui=\"datepicker\"\n data-aui-action={actionAttr($action)}\n name={name}\n aria-label={label}\n defaultValue={value}\n min={min}\n max={max}\n onChange={(e) => fire($action, $dispatch, e.currentTarget.value)}\n />\n ),\n },\n Checkbox: {\n description:\n \"A checkbox with a label. Carries `$action` describing the on-change behavior.\",\n properties: z.object({\n label: z.string().describe(\"Label text next to the checkbox.\"),\n name: z.string().optional().describe(\"Field name used inside a Form.\"),\n defaultChecked: z\n .boolean()\n .optional()\n .describe(\"Whether the checkbox starts checked.\"),\n }),\n render: ({ label, name, defaultChecked, $action, $dispatch }) => (\n <label data-aui=\"checkbox\">\n <input\n type=\"checkbox\"\n data-aui-action={actionAttr($action)}\n name={name}\n defaultChecked={defaultChecked}\n onChange={(e) => fire($action, $dispatch, e.currentTarget.checked)}\n />\n <span data-aui=\"checkbox-label\">{label}</span>\n </label>\n ),\n },\n RadioGroup: {\n description:\n \"A group of mutually exclusive radio options. Carries `$action` describing the on-change behavior.\",\n properties: z.object({\n options: z.array(optionSchema).describe(\"Selectable options.\"),\n name: z.string().optional().describe(\"Field name used inside a Form.\"),\n label: z.string().optional().describe(\"Accessible name for the group.\"),\n defaultValue: z.string().optional().describe(\"Initially selected value.\"),\n }),\n render: RadioGroupRender,\n },\n} satisfies GenerativeUILibrary;\n"],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
|
|
3
2
|
//#region src/vocabulary/layout.d.ts
|
|
4
3
|
declare const layoutVocabulary: {
|
|
5
4
|
Card: {
|
|
@@ -8,13 +7,21 @@ declare const layoutVocabulary: {
|
|
|
8
7
|
title: z.ZodOptional<z.ZodString>;
|
|
9
8
|
padding: z.ZodOptional<z.ZodNumber>;
|
|
10
9
|
background: z.ZodOptional<z.ZodString>;
|
|
10
|
+
asForm: z.ZodOptional<z.ZodBoolean>;
|
|
11
|
+
confirm: z.ZodOptional<z.ZodObject<{
|
|
12
|
+
label: z.ZodString;
|
|
13
|
+
$action: z.ZodOptional<z.ZodObject<{
|
|
14
|
+
type: z.ZodString;
|
|
15
|
+
}, z.core.$loose>>;
|
|
16
|
+
}, z.core.$strip>>;
|
|
17
|
+
cancel: z.ZodOptional<z.ZodObject<{
|
|
18
|
+
label: z.ZodString;
|
|
19
|
+
$action: z.ZodOptional<z.ZodObject<{
|
|
20
|
+
type: z.ZodString;
|
|
21
|
+
}, z.core.$loose>>;
|
|
22
|
+
}, z.core.$strip>>;
|
|
11
23
|
}, z.core.$strip>;
|
|
12
|
-
render: ({
|
|
13
|
-
title,
|
|
14
|
-
padding,
|
|
15
|
-
background,
|
|
16
|
-
children
|
|
17
|
-
}: any) => import("react").JSX.Element;
|
|
24
|
+
render: ({ title, padding, background, asForm, confirm, cancel, $dispatch, children }: any) => import("react").JSX.Element;
|
|
18
25
|
};
|
|
19
26
|
Col: {
|
|
20
27
|
description: string;
|
|
@@ -26,11 +33,7 @@ declare const layoutVocabulary: {
|
|
|
26
33
|
end: "end";
|
|
27
34
|
}>>;
|
|
28
35
|
}, z.core.$strip>;
|
|
29
|
-
render: ({
|
|
30
|
-
gap,
|
|
31
|
-
align,
|
|
32
|
-
children
|
|
33
|
-
}: any) => import("react").JSX.Element;
|
|
36
|
+
render: ({ gap, align, children }: any) => import("react").JSX.Element;
|
|
34
37
|
};
|
|
35
38
|
Row: {
|
|
36
39
|
description: string;
|
|
@@ -48,12 +51,7 @@ declare const layoutVocabulary: {
|
|
|
48
51
|
between: "between";
|
|
49
52
|
}>>;
|
|
50
53
|
}, z.core.$strip>;
|
|
51
|
-
render: ({
|
|
52
|
-
gap,
|
|
53
|
-
align,
|
|
54
|
-
justify,
|
|
55
|
-
children
|
|
56
|
-
}: any) => import("react").JSX.Element;
|
|
54
|
+
render: ({ gap, align, justify, children }: any) => import("react").JSX.Element;
|
|
57
55
|
};
|
|
58
56
|
Spacer: {
|
|
59
57
|
description: string;
|
|
@@ -66,11 +64,17 @@ declare const layoutVocabulary: {
|
|
|
66
64
|
value: z.ZodString;
|
|
67
65
|
variant: z.ZodOptional<z.ZodString>;
|
|
68
66
|
}, z.core.$strip>;
|
|
69
|
-
render: ({
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
67
|
+
render: ({ value, variant, children }: any) => import("react").JSX.Element;
|
|
68
|
+
};
|
|
69
|
+
Box: {
|
|
70
|
+
description: string;
|
|
71
|
+
properties: z.ZodObject<{
|
|
72
|
+
width: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
|
|
73
|
+
height: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
|
|
74
|
+
radius: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"full">, z.ZodNumber]>>;
|
|
75
|
+
background: z.ZodOptional<z.ZodString>;
|
|
76
|
+
}, z.core.$strip>;
|
|
77
|
+
render: ({ width, height, radius, background, children }: any) => import("react").JSX.Element;
|
|
74
78
|
};
|
|
75
79
|
};
|
|
76
80
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.d.ts","names":[],"sources":["../../src/vocabulary/layout.tsx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"layout.d.ts","names":[],"sources":["../../src/vocabulary/layout.tsx"],"mappings":";;cAuBa"}
|
|
@@ -1,29 +1,70 @@
|
|
|
1
1
|
import { ALIGNS, JUSTIFIES } from "../ir.js";
|
|
2
|
+
import { fire } from "./dispatch.js";
|
|
3
|
+
import { collectFormValuesFromEvent } from "./collectFormValues.js";
|
|
2
4
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
5
|
import { z } from "zod";
|
|
4
6
|
//#region src/vocabulary/layout.tsx
|
|
7
|
+
const toCssLength = (value) => typeof value === "number" ? `${value}px` : value;
|
|
8
|
+
const cardActionSchema = z.looseObject({ type: z.string().describe("The action type, resolved by the host's action registry.") });
|
|
9
|
+
const cardFooterButtonSchema = z.object({
|
|
10
|
+
label: z.string().describe("Footer button label."),
|
|
11
|
+
$action: cardActionSchema.optional().describe("Action fired when the button is activated.")
|
|
12
|
+
});
|
|
5
13
|
const layoutVocabulary = {
|
|
6
14
|
Card: {
|
|
7
|
-
description: "A bordered container grouping related content. Optionally titled.",
|
|
15
|
+
description: "A bordered container grouping related content. Optionally titled. Set `asForm` to collect named child control values on submit, and `confirm`/`cancel` to add a footer with action buttons.",
|
|
8
16
|
properties: z.object({
|
|
9
17
|
title: z.string().optional().describe("Optional card title."),
|
|
10
|
-
padding: z.number().optional().describe("Padding in 4px units (e.g. 2 = 8px)."),
|
|
11
|
-
background: z.string().optional().describe("Background
|
|
18
|
+
padding: z.number().min(0).max(8).optional().describe("Padding in 4px units (e.g. 2 = 8px). 0 to 8 is the supported range."),
|
|
19
|
+
background: z.string().optional().describe("Background color or gradient (any CSS background value). Setting this also switches the card's own text to white, since a custom background makes the card a tinted surface; children can still opt into a different color explicitly."),
|
|
20
|
+
asForm: z.boolean().optional().describe("Render as a form; submitting it fires `confirm.$action` with every named child control's value, keyed by `name`."),
|
|
21
|
+
confirm: cardFooterButtonSchema.optional().describe("Confirm button shown in the footer."),
|
|
22
|
+
cancel: cardFooterButtonSchema.optional().describe("Cancel button shown in the footer.")
|
|
12
23
|
}),
|
|
13
|
-
render: ({ title, padding, background, children }) =>
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
24
|
+
render: ({ title, padding, background, asForm, confirm, cancel, $dispatch, children }) => {
|
|
25
|
+
const Root = asForm ? "form" : "section";
|
|
26
|
+
const footer = confirm || cancel ? /* @__PURE__ */ jsxs("footer", {
|
|
27
|
+
"data-aui": "card-footer",
|
|
28
|
+
children: [confirm ? /* @__PURE__ */ jsx("button", {
|
|
29
|
+
type: asForm ? "submit" : "button",
|
|
30
|
+
"data-aui": "card-confirm",
|
|
31
|
+
onClick: asForm ? void 0 : () => fire(confirm.$action, $dispatch),
|
|
32
|
+
children: confirm.label
|
|
33
|
+
}) : null, cancel ? /* @__PURE__ */ jsx("button", {
|
|
34
|
+
type: "button",
|
|
35
|
+
"data-aui": "card-cancel",
|
|
36
|
+
onClick: () => fire(cancel.$action, $dispatch),
|
|
37
|
+
children: cancel.label
|
|
38
|
+
}) : null]
|
|
39
|
+
}) : null;
|
|
40
|
+
return /* @__PURE__ */ jsxs(Root, {
|
|
41
|
+
"data-aui": "card",
|
|
42
|
+
"data-aui-padding": padding,
|
|
43
|
+
"data-aui-background": background,
|
|
44
|
+
style: background !== void 0 ? {
|
|
45
|
+
background,
|
|
46
|
+
color: "white"
|
|
47
|
+
} : void 0,
|
|
48
|
+
"data-aui-asform": asForm || void 0,
|
|
49
|
+
onSubmit: asForm ? (event) => {
|
|
50
|
+
event.preventDefault();
|
|
51
|
+
fire(confirm?.$action, $dispatch, collectFormValuesFromEvent(event));
|
|
52
|
+
} : void 0,
|
|
53
|
+
children: [
|
|
54
|
+
title ? /* @__PURE__ */ jsx("header", {
|
|
55
|
+
"data-aui": "card-title",
|
|
56
|
+
children: title
|
|
57
|
+
}) : null,
|
|
58
|
+
children,
|
|
59
|
+
footer
|
|
60
|
+
]
|
|
61
|
+
});
|
|
62
|
+
}
|
|
22
63
|
},
|
|
23
64
|
Col: {
|
|
24
65
|
description: "A vertical stack; children laid out top to bottom.",
|
|
25
66
|
properties: z.object({
|
|
26
|
-
gap: z.number().optional().describe("Gap between children in 4px units."),
|
|
67
|
+
gap: z.number().min(0).max(8).optional().describe("Gap between children in 4px units. 0 to 8 is the supported range."),
|
|
27
68
|
align: z.enum(ALIGNS).optional().describe("Cross-axis alignment.")
|
|
28
69
|
}),
|
|
29
70
|
render: ({ gap, align, children }) => /* @__PURE__ */ jsx("div", {
|
|
@@ -36,7 +77,7 @@ const layoutVocabulary = {
|
|
|
36
77
|
Row: {
|
|
37
78
|
description: "A horizontal row; children laid out left to right.",
|
|
38
79
|
properties: z.object({
|
|
39
|
-
gap: z.number().optional().describe("Gap between children in 4px units."),
|
|
80
|
+
gap: z.number().min(0).max(8).optional().describe("Gap between children in 4px units. 0 to 8 is the supported range."),
|
|
40
81
|
align: z.enum(ALIGNS).optional().describe("Cross-axis alignment."),
|
|
41
82
|
justify: z.enum(JUSTIFIES).optional().describe("Main-axis distribution.")
|
|
42
83
|
}),
|
|
@@ -64,6 +105,29 @@ const layoutVocabulary = {
|
|
|
64
105
|
"data-aui-variant": variant,
|
|
65
106
|
children: [value, children]
|
|
66
107
|
})
|
|
108
|
+
},
|
|
109
|
+
Box: {
|
|
110
|
+
description: "A generic container for composition, e.g. a progress bar built from an outer track Box containing a partial-width fill Box. Size, radius, and background accept arbitrary values, so they render as inline styles rather than data-attribute hooks.",
|
|
111
|
+
properties: z.object({
|
|
112
|
+
width: z.union([z.string(), z.number()]).optional().describe("Width; a number is pixels."),
|
|
113
|
+
height: z.union([z.string(), z.number()]).optional().describe("Height; a number is pixels."),
|
|
114
|
+
radius: z.union([z.literal("full"), z.number()]).optional().describe("Corner radius; \"full\" is a pill/circle, a number is pixels."),
|
|
115
|
+
background: z.string().optional().describe("Background color or gradient (any CSS background value).")
|
|
116
|
+
}),
|
|
117
|
+
render: ({ width, height, radius, background, children }) => {
|
|
118
|
+
const style = {};
|
|
119
|
+
if (width !== void 0) style.width = toCssLength(width);
|
|
120
|
+
if (height !== void 0) style.height = toCssLength(height);
|
|
121
|
+
if (background !== void 0) style.background = background;
|
|
122
|
+
if (radius === "full") style.borderRadius = "9999px";
|
|
123
|
+
else if (typeof radius === "number") style.borderRadius = `${radius}px`;
|
|
124
|
+
return /* @__PURE__ */ jsx("div", {
|
|
125
|
+
"data-aui": "box",
|
|
126
|
+
"data-aui-radius": radius === "full" ? "full" : void 0,
|
|
127
|
+
style,
|
|
128
|
+
children
|
|
129
|
+
});
|
|
130
|
+
}
|
|
67
131
|
}
|
|
68
132
|
};
|
|
69
133
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.js","names":[],"sources":["../../src/vocabulary/layout.tsx"],"sourcesContent":["import { z } from \"zod\";\nimport type { GenerativeUILibrary } from \"../types\";\nimport { ALIGNS, JUSTIFIES } from \"../ir\";\n\nexport const layoutVocabulary = {\n Card: {\n description:\n \"A bordered container grouping related content. Optionally titled.\",\n properties: z.object({\n title: z.string().optional().describe(\"Optional card title.\"),\n padding: z\n .number()\n .optional()\n .describe(\"Padding in 4px units (e.g. 2 = 8px).\"),\n background: z.string().optional().describe(\"Background token or color.\"),\n }),\n render: ({ title, padding, background, children }) => (\n <section\n data-aui=\"card\"\n data-aui-padding={padding}\n data-aui-background={background}\n >\n {title ? <header data-aui=\"card-title\">{title}</header> : null}\n {children}\n </section>\n ),\n },\n Col: {\n description: \"A vertical stack; children laid out top to bottom.\",\n properties: z.object({\n gap: z.number().optional().describe(\"Gap between children in 4px units.\"),\n align: z.enum(ALIGNS).optional().describe(\"Cross-axis alignment.\"),\n }),\n render: ({ gap, align, children }) => (\n <div data-aui=\"col\" data-aui-gap={gap} data-aui-align={align}>\n {children}\n </div>\n ),\n },\n Row: {\n description: \"A horizontal row; children laid out left to right.\",\n properties: z.object({\n gap: z.number().optional().describe(\"Gap between children in 4px units.\"),\n align: z.enum(ALIGNS).optional().describe(\"Cross-axis alignment.\"),\n justify: z.enum(JUSTIFIES).optional().describe(\"Main-axis distribution.\"),\n }),\n render: ({ gap, align, justify, children }) => (\n <div\n data-aui=\"row\"\n data-aui-gap={gap}\n data-aui-align={align}\n data-aui-justify={justify}\n >\n {children}\n </div>\n ),\n },\n Spacer: {\n description: \"Empty space that pushes neighbors apart.\",\n properties: z.object({}),\n render: () => <div data-aui=\"spacer\" />,\n },\n Badge: {\n description: \"A small labeled tag, e.g. for status or category.\",\n properties: z.object({\n value: z.string().describe(\"Badge text.\"),\n variant: z.string().optional().describe(\"Visual variant token.\"),\n }),\n render: ({ value, variant, children }) => (\n <span data-aui=\"badge\" data-aui-variant={variant}>\n {value}\n {children}\n </span>\n ),\n },\n} satisfies GenerativeUILibrary;\n"],"mappings":";;;;AAIA,MAAa,mBAAmB;CAC9B,MAAM;EACJ,aACE;EACF,YAAY,EAAE,OAAO;GACnB,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,sBAAsB;GAC5D,SAAS,EACN,OAAO,CAAC,CACR,SAAS,CAAC,CACV,SAAS,sCAAsC;GAClD,YAAY,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,4BAA4B;EACzE,CAAC;EACD,SAAS,EAAE,OAAO,SAAS,YAAY,eACrC,qBAAC,WAAD;GACE,YAAS;GACT,oBAAkB;GAClB,uBAAqB;aAHvB,CAKG,QAAQ,oBAAC,UAAD;IAAQ,YAAS;cAAc;GAAc,CAAA,IAAI,MACzD,QACM;;CAEb;CACA,KAAK;EACH,aAAa;EACb,YAAY,EAAE,OAAO;GACnB,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,oCAAoC;GACxE,OAAO,EAAE,KAAK,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,uBAAuB;EACnE,CAAC;EACD,SAAS,EAAE,KAAK,OAAO,eACrB,oBAAC,OAAD;GAAK,YAAS;GAAM,gBAAc;GAAK,kBAAgB;GACpD;EACE,CAAA;CAET;CACA,KAAK;EACH,aAAa;EACb,YAAY,EAAE,OAAO;GACnB,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,oCAAoC;GACxE,OAAO,EAAE,KAAK,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,uBAAuB;GACjE,SAAS,EAAE,KAAK,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,yBAAyB;EAC1E,CAAC;EACD,SAAS,EAAE,KAAK,OAAO,SAAS,eAC9B,oBAAC,OAAD;GACE,YAAS;GACT,gBAAc;GACd,kBAAgB;GAChB,oBAAkB;GAEjB;EACE,CAAA;CAET;CACA,QAAQ;EACN,aAAa;EACb,YAAY,EAAE,OAAO,CAAC,CAAC;EACvB,cAAc,oBAAC,OAAD,EAAK,YAAS,SAAU,CAAA;CACxC;CACA,OAAO;EACL,aAAa;EACb,YAAY,EAAE,OAAO;GACnB,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,aAAa;GACxC,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,uBAAuB;EACjE,CAAC;EACD,SAAS,EAAE,OAAO,SAAS,eACzB,qBAAC,QAAD;GAAM,YAAS;GAAQ,oBAAkB;aAAzC,CACG,OACA,QACG;;CAEV;AACF"}
|
|
1
|
+
{"version":3,"file":"layout.js","names":[],"sources":["../../src/vocabulary/layout.tsx"],"sourcesContent":["import type { CSSProperties, FormEvent } from \"react\";\nimport { z } from \"zod\";\nimport type { GenerativeUILibrary } from \"../types\";\nimport { ALIGNS, JUSTIFIES } from \"../ir\";\nimport { fire } from \"./dispatch\";\nimport { collectFormValuesFromEvent } from \"./collectFormValues\";\n\nconst toCssLength = (value: string | number): string =>\n typeof value === \"number\" ? `${value}px` : value;\n\nconst cardActionSchema = z.looseObject({\n type: z\n .string()\n .describe(\"The action type, resolved by the host's action registry.\"),\n});\n\nconst cardFooterButtonSchema = z.object({\n label: z.string().describe(\"Footer button label.\"),\n $action: cardActionSchema\n .optional()\n .describe(\"Action fired when the button is activated.\"),\n});\n\nexport const layoutVocabulary = {\n Card: {\n description:\n \"A bordered container grouping related content. Optionally titled. Set `asForm` to collect named child control values on submit, and `confirm`/`cancel` to add a footer with action buttons.\",\n properties: z.object({\n title: z.string().optional().describe(\"Optional card title.\"),\n padding: z\n .number()\n .min(0)\n .max(8)\n .optional()\n .describe(\n \"Padding in 4px units (e.g. 2 = 8px). 0 to 8 is the supported range.\",\n ),\n background: z\n .string()\n .optional()\n .describe(\n \"Background color or gradient (any CSS background value). Setting this also switches the card's own text to white, since a custom background makes the card a tinted surface; children can still opt into a different color explicitly.\",\n ),\n asForm: z\n .boolean()\n .optional()\n .describe(\n \"Render as a form; submitting it fires `confirm.$action` with every named child control's value, keyed by `name`.\",\n ),\n confirm: cardFooterButtonSchema\n .optional()\n .describe(\"Confirm button shown in the footer.\"),\n cancel: cardFooterButtonSchema\n .optional()\n .describe(\"Cancel button shown in the footer.\"),\n }),\n render: ({\n title,\n padding,\n background,\n asForm,\n confirm,\n cancel,\n $dispatch,\n children,\n }) => {\n const Root = asForm ? \"form\" : \"section\";\n const footer =\n confirm || cancel ? (\n <footer data-aui=\"card-footer\">\n {confirm ? (\n <button\n type={asForm ? \"submit\" : \"button\"}\n data-aui=\"card-confirm\"\n onClick={\n asForm ? undefined : () => fire(confirm.$action, $dispatch)\n }\n >\n {confirm.label}\n </button>\n ) : null}\n {cancel ? (\n <button\n type=\"button\"\n data-aui=\"card-cancel\"\n onClick={() => fire(cancel.$action, $dispatch)}\n >\n {cancel.label}\n </button>\n ) : null}\n </footer>\n ) : null;\n\n return (\n <Root\n data-aui=\"card\"\n data-aui-padding={padding}\n data-aui-background={background}\n style={\n background !== undefined\n ? { background, color: \"white\" }\n : undefined\n }\n data-aui-asform={asForm || undefined}\n onSubmit={\n asForm\n ? (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n fire(\n confirm?.$action,\n $dispatch,\n collectFormValuesFromEvent(event),\n );\n }\n : undefined\n }\n >\n {title ? <header data-aui=\"card-title\">{title}</header> : null}\n {children}\n {footer}\n </Root>\n );\n },\n },\n Col: {\n description: \"A vertical stack; children laid out top to bottom.\",\n properties: z.object({\n gap: z\n .number()\n .min(0)\n .max(8)\n .optional()\n .describe(\n \"Gap between children in 4px units. 0 to 8 is the supported range.\",\n ),\n align: z.enum(ALIGNS).optional().describe(\"Cross-axis alignment.\"),\n }),\n render: ({ gap, align, children }) => (\n <div data-aui=\"col\" data-aui-gap={gap} data-aui-align={align}>\n {children}\n </div>\n ),\n },\n Row: {\n description: \"A horizontal row; children laid out left to right.\",\n properties: z.object({\n gap: z\n .number()\n .min(0)\n .max(8)\n .optional()\n .describe(\n \"Gap between children in 4px units. 0 to 8 is the supported range.\",\n ),\n align: z.enum(ALIGNS).optional().describe(\"Cross-axis alignment.\"),\n justify: z.enum(JUSTIFIES).optional().describe(\"Main-axis distribution.\"),\n }),\n render: ({ gap, align, justify, children }) => (\n <div\n data-aui=\"row\"\n data-aui-gap={gap}\n data-aui-align={align}\n data-aui-justify={justify}\n >\n {children}\n </div>\n ),\n },\n Spacer: {\n description: \"Empty space that pushes neighbors apart.\",\n properties: z.object({}),\n render: () => <div data-aui=\"spacer\" />,\n },\n Badge: {\n description: \"A small labeled tag, e.g. for status or category.\",\n properties: z.object({\n value: z.string().describe(\"Badge text.\"),\n variant: z.string().optional().describe(\"Visual variant token.\"),\n }),\n render: ({ value, variant, children }) => (\n <span data-aui=\"badge\" data-aui-variant={variant}>\n {value}\n {children}\n </span>\n ),\n },\n Box: {\n description:\n \"A generic container for composition, e.g. a progress bar built from an outer track Box containing a partial-width fill Box. Size, radius, and background accept arbitrary values, so they render as inline styles rather than data-attribute hooks.\",\n properties: z.object({\n width: z\n .union([z.string(), z.number()])\n .optional()\n .describe(\"Width; a number is pixels.\"),\n height: z\n .union([z.string(), z.number()])\n .optional()\n .describe(\"Height; a number is pixels.\"),\n radius: z\n .union([z.literal(\"full\"), z.number()])\n .optional()\n .describe(\n 'Corner radius; \"full\" is a pill/circle, a number is pixels.',\n ),\n background: z\n .string()\n .optional()\n .describe(\"Background color or gradient (any CSS background value).\"),\n }),\n render: ({ width, height, radius, background, children }) => {\n const style: CSSProperties = {};\n if (width !== undefined) style.width = toCssLength(width);\n if (height !== undefined) style.height = toCssLength(height);\n if (background !== undefined) style.background = background;\n if (radius === \"full\") style.borderRadius = \"9999px\";\n else if (typeof radius === \"number\") style.borderRadius = `${radius}px`;\n\n return (\n <div\n data-aui=\"box\"\n data-aui-radius={radius === \"full\" ? \"full\" : undefined}\n style={style}\n >\n {children}\n </div>\n );\n },\n },\n} satisfies GenerativeUILibrary;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
//#region src/vocabulary/list.d.ts
|
|
3
|
+
declare const listVocabulary: {
|
|
4
|
+
ListView: {
|
|
5
|
+
description: string;
|
|
6
|
+
properties: z.ZodObject<{}, z.core.$strip>;
|
|
7
|
+
render: ({ children }: any) => import("react").JSX.Element;
|
|
8
|
+
};
|
|
9
|
+
ListViewItem: {
|
|
10
|
+
description: string;
|
|
11
|
+
properties: z.ZodObject<{}, z.core.$strip>;
|
|
12
|
+
render: ({ $action, $dispatch, children }: any) => import("react").JSX.Element;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
//#endregion
|
|
16
|
+
export { listVocabulary };
|
|
17
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","names":[],"sources":["../../src/vocabulary/list.tsx"],"mappings":";;cAOa"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { fire } from "./dispatch.js";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
//#region src/vocabulary/list.tsx
|
|
5
|
+
const INTERACTIVE_DESCENDANT_SELECTOR = "button, a, input, select, textarea, label, [role=\"button\"], [role=\"link\"], [role=\"checkbox\"], [role=\"radio\"], [role=\"switch\"], [role=\"textbox\"], [role=\"combobox\"], [role=\"menuitem\"]";
|
|
6
|
+
const listVocabulary = {
|
|
7
|
+
ListView: {
|
|
8
|
+
description: "A vertical list container. Wrap `ListViewItem` children as rows.",
|
|
9
|
+
properties: z.object({}),
|
|
10
|
+
render: ({ children }) => /* @__PURE__ */ jsx("ul", {
|
|
11
|
+
"data-aui": "listview",
|
|
12
|
+
children
|
|
13
|
+
})
|
|
14
|
+
},
|
|
15
|
+
ListViewItem: {
|
|
16
|
+
description: "A row inside a ListView. Carries `$action` to make the whole row clickable and keyboard-activatable.",
|
|
17
|
+
properties: z.object({}),
|
|
18
|
+
render: ({ $action, $dispatch, children }) => {
|
|
19
|
+
if (!$action || !$dispatch) return /* @__PURE__ */ jsx("li", {
|
|
20
|
+
"data-aui": "listview-item",
|
|
21
|
+
children
|
|
22
|
+
});
|
|
23
|
+
return /* @__PURE__ */ jsx("li", {
|
|
24
|
+
"data-aui": "listview-item",
|
|
25
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
26
|
+
role: "button",
|
|
27
|
+
tabIndex: 0,
|
|
28
|
+
"data-aui": "listview-item-trigger",
|
|
29
|
+
onClick: (event) => {
|
|
30
|
+
if (event.target.closest(INTERACTIVE_DESCENDANT_SELECTOR)) return;
|
|
31
|
+
fire($action, $dispatch);
|
|
32
|
+
},
|
|
33
|
+
onKeyDown: (event) => {
|
|
34
|
+
if (event.key !== "Enter" && event.key !== " ") return;
|
|
35
|
+
if (event.target.closest(INTERACTIVE_DESCENDANT_SELECTOR)) return;
|
|
36
|
+
if (event.key === " ") event.preventDefault();
|
|
37
|
+
fire($action, $dispatch);
|
|
38
|
+
},
|
|
39
|
+
children
|
|
40
|
+
})
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
//#endregion
|
|
46
|
+
export { listVocabulary };
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","names":[],"sources":["../../src/vocabulary/list.tsx"],"sourcesContent":["import { z } from \"zod\";\nimport type { GenerativeUILibrary } from \"../types\";\nimport { fire } from \"./dispatch\";\n\nconst INTERACTIVE_DESCENDANT_SELECTOR =\n 'button, a, input, select, textarea, label, [role=\"button\"], [role=\"link\"], [role=\"checkbox\"], [role=\"radio\"], [role=\"switch\"], [role=\"textbox\"], [role=\"combobox\"], [role=\"menuitem\"]';\n\nexport const listVocabulary = {\n ListView: {\n description:\n \"A vertical list container. Wrap `ListViewItem` children as rows.\",\n properties: z.object({}),\n render: ({ children }) => <ul data-aui=\"listview\">{children}</ul>,\n },\n ListViewItem: {\n description:\n \"A row inside a ListView. Carries `$action` to make the whole row clickable and keyboard-activatable.\",\n properties: z.object({}),\n render: ({ $action, $dispatch, children }) => {\n if (!$action || !$dispatch) {\n return <li data-aui=\"listview-item\">{children}</li>;\n }\n return (\n <li data-aui=\"listview-item\">\n <div\n role=\"button\"\n tabIndex={0}\n data-aui=\"listview-item-trigger\"\n onClick={(event) => {\n const target = event.target as Element;\n if (target.closest(INTERACTIVE_DESCENDANT_SELECTOR)) return;\n fire($action, $dispatch);\n }}\n onKeyDown={(event) => {\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n const target = event.target as Element;\n if (target.closest(INTERACTIVE_DESCENDANT_SELECTOR)) return;\n if (event.key === \" \") event.preventDefault();\n fire($action, $dispatch);\n }}\n >\n {children}\n </div>\n </li>\n );\n },\n },\n} satisfies GenerativeUILibrary;\n"],"mappings":";;;;AAIA,MAAM,kCACJ;AAEF,MAAa,iBAAiB;CAC5B,UAAU;EACR,aACE;EACF,YAAY,EAAE,OAAO,CAAC,CAAC;EACvB,SAAS,EAAE,eAAe,oBAAC,MAAD;GAAI,YAAS;GAAY;EAAa,CAAA;CAClE;CACA,cAAc;EACZ,aACE;EACF,YAAY,EAAE,OAAO,CAAC,CAAC;EACvB,SAAS,EAAE,SAAS,WAAW,eAAe;GAC5C,IAAI,CAAC,WAAW,CAAC,WACf,OAAO,oBAAC,MAAD;IAAI,YAAS;IAAiB;GAAa,CAAA;GAEpD,OACE,oBAAC,MAAD;IAAI,YAAS;IACX,UAAA,oBAAC,OAAD;KACE,MAAK;KACL,UAAU;KACV,YAAS;KACT,UAAU,UAAU;MAElB,IADe,MAAM,OACV,QAAQ,+BAA+B,GAAG;MACrD,KAAK,SAAS,SAAS;KACzB;KACA,YAAY,UAAU;MACpB,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;MAEhD,IADe,MAAM,OACV,QAAQ,+BAA+B,GAAG;MACrD,IAAI,MAAM,QAAQ,KAAK,MAAM,eAAe;MAC5C,KAAK,SAAS,SAAS;KACzB;KAEC;IACE,CAAA;GACH,CAAA;EAER;CACF;AACF"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
|
|
3
2
|
//#region src/vocabulary/media.d.ts
|
|
4
3
|
declare const mediaVocabulary: {
|
|
5
4
|
Image: {
|
|
@@ -12,21 +11,16 @@ declare const mediaVocabulary: {
|
|
|
12
11
|
md: "md";
|
|
13
12
|
lg: "lg";
|
|
14
13
|
}>, z.ZodNumber]>>;
|
|
14
|
+
round: z.ZodOptional<z.ZodBoolean>;
|
|
15
15
|
}, z.core.$strip>;
|
|
16
|
-
render: ({
|
|
17
|
-
src,
|
|
18
|
-
alt,
|
|
19
|
-
size
|
|
20
|
-
}: any) => import("react").JSX.Element;
|
|
16
|
+
render: ({ src, alt, size, round }: any) => import("react").JSX.Element;
|
|
21
17
|
};
|
|
22
18
|
Divider: {
|
|
23
19
|
description: string;
|
|
24
20
|
properties: z.ZodObject<{
|
|
25
21
|
flush: z.ZodOptional<z.ZodBoolean>;
|
|
26
22
|
}, z.core.$strip>;
|
|
27
|
-
render: ({
|
|
28
|
-
flush
|
|
29
|
-
}: any) => import("react").JSX.Element;
|
|
23
|
+
render: ({ flush }: any) => import("react").JSX.Element;
|
|
30
24
|
};
|
|
31
25
|
};
|
|
32
26
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.d.ts","names":[],"sources":["../../src/vocabulary/media.tsx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"media.d.ts","names":[],"sources":["../../src/vocabulary/media.tsx"],"mappings":";;cAKa"}
|
package/dist/vocabulary/media.js
CHANGED
|
@@ -8,14 +8,24 @@ const mediaVocabulary = {
|
|
|
8
8
|
properties: z.object({
|
|
9
9
|
src: z.string().describe("Image URL."),
|
|
10
10
|
alt: z.string().describe("Alt text for accessibility."),
|
|
11
|
-
size: z.union([z.enum(IMAGE_SIZE_TOKENS), z.number()]).optional().describe("Size token or pixel value.")
|
|
11
|
+
size: z.union([z.enum(IMAGE_SIZE_TOKENS), z.number()]).optional().describe("Size token or pixel value."),
|
|
12
|
+
round: z.boolean().optional().describe("Render as a circular avatar (fully rounded, cropped to a square).")
|
|
12
13
|
}),
|
|
13
|
-
render: ({ src, alt, size }) =>
|
|
14
|
-
"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
render: ({ src, alt, size, round }) => {
|
|
15
|
+
const numericSize = typeof size === "number" ? size : void 0;
|
|
16
|
+
const style = numericSize === void 0 ? void 0 : round ? {
|
|
17
|
+
width: `${numericSize}px`,
|
|
18
|
+
height: `${numericSize}px`
|
|
19
|
+
} : { maxWidth: `${numericSize}px` };
|
|
20
|
+
return /* @__PURE__ */ jsx("img", {
|
|
21
|
+
"data-aui": "image",
|
|
22
|
+
"data-aui-size": numericSize === void 0 ? size : void 0,
|
|
23
|
+
"data-aui-round": round || void 0,
|
|
24
|
+
src,
|
|
25
|
+
alt,
|
|
26
|
+
style
|
|
27
|
+
});
|
|
28
|
+
}
|
|
19
29
|
},
|
|
20
30
|
Divider: {
|
|
21
31
|
description: "A horizontal rule between sections.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.js","names":[],"sources":["../../src/vocabulary/media.tsx"],"sourcesContent":["import { z } from \"zod\";\nimport type { GenerativeUILibrary } from \"../types\";\nimport { IMAGE_SIZE_TOKENS } from \"../ir\";\n\nexport const mediaVocabulary = {\n Image: {\n description: \"An image. Provide `src` and `alt` for accessibility.\",\n properties: z.object({\n src: z.string().describe(\"Image URL.\"),\n alt: z.string().describe(\"Alt text for accessibility.\"),\n size: z\n .union([z.enum(IMAGE_SIZE_TOKENS), z.number()])\n .optional()\n .describe(\"Size token or pixel value.\"),\n }),\n render: ({ src, alt, size }) => (\n
|
|
1
|
+
{"version":3,"file":"media.js","names":[],"sources":["../../src/vocabulary/media.tsx"],"sourcesContent":["import type { CSSProperties } from \"react\";\nimport { z } from \"zod\";\nimport type { GenerativeUILibrary } from \"../types\";\nimport { IMAGE_SIZE_TOKENS } from \"../ir\";\n\nexport const mediaVocabulary = {\n Image: {\n description: \"An image. Provide `src` and `alt` for accessibility.\",\n properties: z.object({\n src: z.string().describe(\"Image URL.\"),\n alt: z.string().describe(\"Alt text for accessibility.\"),\n size: z\n .union([z.enum(IMAGE_SIZE_TOKENS), z.number()])\n .optional()\n .describe(\"Size token or pixel value.\"),\n round: z\n .boolean()\n .optional()\n .describe(\n \"Render as a circular avatar (fully rounded, cropped to a square).\",\n ),\n }),\n render: ({ src, alt, size, round }) => {\n const numericSize = typeof size === \"number\" ? size : undefined;\n const style: CSSProperties | undefined =\n numericSize === undefined\n ? undefined\n : round\n ? { width: `${numericSize}px`, height: `${numericSize}px` }\n : { maxWidth: `${numericSize}px` };\n\n return (\n <img\n data-aui=\"image\"\n data-aui-size={numericSize === undefined ? size : undefined}\n data-aui-round={round || undefined}\n src={src}\n alt={alt}\n style={style}\n />\n );\n },\n },\n Divider: {\n description: \"A horizontal rule between sections.\",\n properties: z.object({\n flush: z\n .boolean()\n .optional()\n .describe(\"Whether the divider spans the full width with no inset.\"),\n }),\n render: ({ flush }) => (\n <hr data-aui=\"divider\" data-aui-flush={flush || undefined} />\n ),\n },\n} satisfies GenerativeUILibrary;\n"],"mappings":";;;;AAKA,MAAa,kBAAkB;CAC7B,OAAO;EACL,aAAa;EACb,YAAY,EAAE,OAAO;GACnB,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS,YAAY;GACrC,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS,6BAA6B;GACtD,MAAM,EACH,MAAM,CAAC,EAAE,KAAK,iBAAiB,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAC9C,SAAS,CAAC,CACV,SAAS,4BAA4B;GACxC,OAAO,EACJ,QAAQ,CAAC,CACT,SAAS,CAAC,CACV,SACC,mEACF;EACJ,CAAC;EACD,SAAS,EAAE,KAAK,KAAK,MAAM,YAAY;GACrC,MAAM,cAAc,OAAO,SAAS,WAAW,OAAO,KAAA;GACtD,MAAM,QACJ,gBAAgB,KAAA,IACZ,KAAA,IACA,QACE;IAAE,OAAO,GAAG,YAAY;IAAK,QAAQ,GAAG,YAAY;GAAI,IACxD,EAAE,UAAU,GAAG,YAAY,IAAI;GAEvC,OACE,oBAAC,OAAD;IACE,YAAS;IACT,iBAAe,gBAAgB,KAAA,IAAY,OAAO,KAAA;IAClD,kBAAgB,SAAS,KAAA;IACpB;IACA;IACE;GACR,CAAA;EAEL;CACF;CACA,SAAS;EACP,aAAa;EACb,YAAY,EAAE,OAAO,EACnB,OAAO,EACJ,QAAQ,CAAC,CACT,SAAS,CAAC,CACV,SAAS,yDAAyD,EACvE,CAAC;EACD,SAAS,EAAE,YACT,oBAAC,MAAD;GAAI,YAAS;GAAU,kBAAgB,SAAS,KAAA;EAAY,CAAA;CAEhE;AACF"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
|
|
3
2
|
//#region src/vocabulary/text.d.ts
|
|
4
3
|
declare const textVocabulary: {
|
|
5
4
|
Header: {
|
|
@@ -15,11 +14,7 @@ declare const textVocabulary: {
|
|
|
15
14
|
"3xl": "3xl";
|
|
16
15
|
}>>;
|
|
17
16
|
}, z.core.$strip>;
|
|
18
|
-
render: ({
|
|
19
|
-
text,
|
|
20
|
-
size,
|
|
21
|
-
children
|
|
22
|
-
}: any) => import("react").JSX.Element;
|
|
17
|
+
render: ({ text, size, children }: any) => import("react").JSX.Element;
|
|
23
18
|
};
|
|
24
19
|
Text: {
|
|
25
20
|
description: string;
|
|
@@ -49,13 +44,7 @@ declare const textVocabulary: {
|
|
|
49
44
|
}>>;
|
|
50
45
|
}, z.core.$strip>;
|
|
51
46
|
streamProperties: true;
|
|
52
|
-
render: ({
|
|
53
|
-
value,
|
|
54
|
-
size,
|
|
55
|
-
weight,
|
|
56
|
-
color,
|
|
57
|
-
children
|
|
58
|
-
}: any) => import("react").JSX.Element;
|
|
47
|
+
render: ({ value, size, weight, color, children }: any) => import("react").JSX.Element;
|
|
59
48
|
};
|
|
60
49
|
Caption: {
|
|
61
50
|
description: string;
|
|
@@ -63,10 +52,7 @@ declare const textVocabulary: {
|
|
|
63
52
|
value: z.ZodString;
|
|
64
53
|
}, z.core.$strip>;
|
|
65
54
|
streamProperties: true;
|
|
66
|
-
render: ({
|
|
67
|
-
value,
|
|
68
|
-
children
|
|
69
|
-
}: any) => import("react").JSX.Element;
|
|
55
|
+
render: ({ value, children }: any) => import("react").JSX.Element;
|
|
70
56
|
};
|
|
71
57
|
};
|
|
72
58
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","names":[],"sources":["../../src/vocabulary/text.tsx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"text.d.ts","names":[],"sources":["../../src/vocabulary/text.tsx"],"mappings":";;cAIa"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","names":[],"sources":["../../src/vocabulary/text.tsx"],"sourcesContent":["import { z } from \"zod\";\nimport type { GenerativeUILibrary } from \"../types\";\nimport { COLORS, TEXT_SIZES, WEIGHTS } from \"../ir\";\n\nexport const textVocabulary = {\n Header: {\n description: \"A section heading. Renders as a bold title.\",\n properties: z.object({\n text: z.string().describe(\"The heading text.\"),\n size: z\n .enum(TEXT_SIZES)\n .optional()\n .describe(\"Heading size; defaults to `lg`.\"),\n }),\n render: ({ text, size, children }) => (\n <h2 data-aui=\"header\" data-aui-size={size ?? \"lg\"}>\n {text}\n {children}\n </h2>\n ),\n },\n Text: {\n description: \"A run of text. Use for paragraphs, labels, or inline copy.\",\n properties: z.object({\n value: z.string().describe(\"The text content.\"),\n size: z\n .enum(TEXT_SIZES)\n .optional()\n .describe(\"Text size; defaults to `md`.\"),\n weight: z.enum(WEIGHTS).optional().describe(\"Font weight.\"),\n color: z.enum(COLORS).optional().describe(\"Foreground color token.\"),\n }),\n streamProperties: true,\n render: ({ value, size, weight, color, children }) => (\n <span\n data-aui=\"text\"\n data-aui-size={size ?? \"md\"}\n data-aui-weight={weight}\n data-aui-color={color}\n >\n {value}\n {children}\n </span>\n ),\n },\n Caption: {\n description: \"Secondary, de-emphasized text under a primary element.\",\n properties: z.object({\n value: z.string().describe(\"The caption text.\"),\n }),\n streamProperties: true,\n render: ({ value, children }) => (\n <p data-aui=\"caption\">\n {value}\n {children}\n </p>\n ),\n },\n} satisfies GenerativeUILibrary;\n"],"mappings":";;;;AAIA,MAAa,iBAAiB;CAC5B,QAAQ;EACN,aAAa;EACb,YAAY,EAAE,OAAO;GACnB,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,mBAAmB;GAC7C,MAAM,EACH,KAAK,UAAU,CAAC,CAChB,SAAS,CAAC,CACV,SAAS,iCAAiC;EAC/C,CAAC;EACD,SAAS,EAAE,MAAM,MAAM,eACrB,qBAAC,MAAD;GAAI,YAAS;GAAS,iBAAe,QAAQ;
|
|
1
|
+
{"version":3,"file":"text.js","names":[],"sources":["../../src/vocabulary/text.tsx"],"sourcesContent":["import { z } from \"zod\";\nimport type { GenerativeUILibrary } from \"../types\";\nimport { COLORS, TEXT_SIZES, WEIGHTS } from \"../ir\";\n\nexport const textVocabulary = {\n Header: {\n description: \"A section heading. Renders as a bold title.\",\n properties: z.object({\n text: z.string().describe(\"The heading text.\"),\n size: z\n .enum(TEXT_SIZES)\n .optional()\n .describe(\"Heading size; defaults to `lg`.\"),\n }),\n render: ({ text, size, children }) => (\n <h2 data-aui=\"header\" data-aui-size={size ?? \"lg\"}>\n {text}\n {children}\n </h2>\n ),\n },\n Text: {\n description: \"A run of text. Use for paragraphs, labels, or inline copy.\",\n properties: z.object({\n value: z.string().describe(\"The text content.\"),\n size: z\n .enum(TEXT_SIZES)\n .optional()\n .describe(\"Text size; defaults to `md`.\"),\n weight: z.enum(WEIGHTS).optional().describe(\"Font weight.\"),\n color: z.enum(COLORS).optional().describe(\"Foreground color token.\"),\n }),\n streamProperties: true,\n render: ({ value, size, weight, color, children }) => (\n <span\n data-aui=\"text\"\n data-aui-size={size ?? \"md\"}\n data-aui-weight={weight}\n data-aui-color={color}\n >\n {value}\n {children}\n </span>\n ),\n },\n Caption: {\n description: \"Secondary, de-emphasized text under a primary element.\",\n properties: z.object({\n value: z.string().describe(\"The caption text.\"),\n }),\n streamProperties: true,\n render: ({ value, children }) => (\n <p data-aui=\"caption\">\n {value}\n {children}\n </p>\n ),\n },\n} satisfies GenerativeUILibrary;\n"],"mappings":";;;;AAIA,MAAa,iBAAiB;CAC5B,QAAQ;EACN,aAAa;EACb,YAAY,EAAE,OAAO;GACnB,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,mBAAmB;GAC7C,MAAM,EACH,KAAK,UAAU,CAAC,CAChB,SAAS,CAAC,CACV,SAAS,iCAAiC;EAC/C,CAAC;EACD,SAAS,EAAE,MAAM,MAAM,eACrB,qBAAC,MAAD;GAAI,YAAS;GAAS,iBAAe,QAAQ;GAA7C,UAAA,CACG,MACA,QACC;;CAER;CACA,MAAM;EACJ,aAAa;EACb,YAAY,EAAE,OAAO;GACnB,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,mBAAmB;GAC9C,MAAM,EACH,KAAK,UAAU,CAAC,CAChB,SAAS,CAAC,CACV,SAAS,8BAA8B;GAC1C,QAAQ,EAAE,KAAK,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,cAAc;GAC1D,OAAO,EAAE,KAAK,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,yBAAyB;EACrE,CAAC;EACD,kBAAkB;EAClB,SAAS,EAAE,OAAO,MAAM,QAAQ,OAAO,eACrC,qBAAC,QAAD;GACE,YAAS;GACT,iBAAe,QAAQ;GACvB,mBAAiB;GACjB,kBAAgB;GAJlB,UAAA,CAMG,OACA,QACG;;CAEV;CACA,SAAS;EACP,aAAa;EACb,YAAY,EAAE,OAAO,EACnB,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,mBAAmB,EAChD,CAAC;EACD,kBAAkB;EAClB,SAAS,EAAE,OAAO,eAChB,qBAAC,KAAD;GAAG,YAAS;GAAZ,UAAA,CACG,OACA,QACA;;CAEP;AACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@assistant-ui/react-generative-ui",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.9",
|
|
4
4
|
"description": "Generative UI components for assistant-ui",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"generative-ui",
|
|
@@ -27,6 +27,14 @@
|
|
|
27
27
|
"./ir": {
|
|
28
28
|
"types": "./dist/ir.d.ts",
|
|
29
29
|
"default": "./dist/ir.js"
|
|
30
|
+
},
|
|
31
|
+
"./slack": {
|
|
32
|
+
"types": "./dist/slack.d.ts",
|
|
33
|
+
"default": "./dist/slack.js"
|
|
34
|
+
},
|
|
35
|
+
"./teams": {
|
|
36
|
+
"types": "./dist/teams.d.ts",
|
|
37
|
+
"default": "./dist/teams.js"
|
|
30
38
|
}
|
|
31
39
|
},
|
|
32
40
|
"main": "./dist/index.js",
|
|
@@ -38,7 +46,7 @@
|
|
|
38
46
|
],
|
|
39
47
|
"sideEffects": false,
|
|
40
48
|
"dependencies": {
|
|
41
|
-
"assistant-stream": "^0.3.
|
|
49
|
+
"assistant-stream": "^0.3.27"
|
|
42
50
|
},
|
|
43
51
|
"peerDependencies": {
|
|
44
52
|
"@assistant-ui/react": "^0.14.14",
|
|
@@ -54,12 +62,12 @@
|
|
|
54
62
|
"devDependencies": {
|
|
55
63
|
"@types/json-schema": "^7.0.15",
|
|
56
64
|
"@types/react": "^19.2.17",
|
|
57
|
-
"react": "^19.2.
|
|
58
|
-
"react-dom": "^19.2.
|
|
59
|
-
"vitest": "^4.1.
|
|
65
|
+
"react": "^19.2.8",
|
|
66
|
+
"react-dom": "^19.2.8",
|
|
67
|
+
"vitest": "^4.1.10",
|
|
60
68
|
"zod": "^4.4.3",
|
|
61
|
-
"@assistant-ui/react": "0.14.
|
|
62
|
-
"@assistant-ui/x-buildutils": "0.0.
|
|
69
|
+
"@assistant-ui/react": "0.14.28",
|
|
70
|
+
"@assistant-ui/x-buildutils": "0.0.19"
|
|
63
71
|
},
|
|
64
72
|
"publishConfig": {
|
|
65
73
|
"access": "public",
|
package/src/actionRegistry.ts
CHANGED
|
@@ -3,11 +3,7 @@ import type { Action } from "./ir";
|
|
|
3
3
|
/** Context handed to an {@link ActionHandler} when an `$action` fires. */
|
|
4
4
|
export type ActionDispatchContext = {
|
|
5
5
|
/**
|
|
6
|
-
* The action payload. For fire-and-forget actions this is the `$action` as
|
|
7
|
-
* the model emitted it. For interactive components (`Select`/`Input`/
|
|
8
|
-
* `DatePicker`) the user's runtime input is merged in under the reserved
|
|
9
|
-
* `$input` key, so the handler sees both the model payload and what the user
|
|
10
|
-
* did; a model-supplied `value` field is never clobbered.
|
|
6
|
+
* The action payload. For fire-and-forget actions this is the `$action` as the model emitted it. For an interactive component the user's runtime input is merged in under the reserved `$input` key: a single value for a standalone control's dispatch, or an object keyed by each field's `name` for a `Form` or a `Card` with `asForm` set. A model-supplied `value` field is never clobbered.
|
|
11
7
|
*/
|
|
12
8
|
readonly payload: Action;
|
|
13
9
|
};
|
|
@@ -24,11 +20,7 @@ export type ActionHandler = (
|
|
|
24
20
|
) => unknown | Promise<unknown>;
|
|
25
21
|
|
|
26
22
|
/**
|
|
27
|
-
* The host-provided map from `$action.type` to {@link ActionHandler}. This is
|
|
28
|
-
* the single dispatch target for `$action` on web, shared by the model
|
|
29
|
-
* `present` renderer, the synthetic `present` produced from A2A/A2UI, and the
|
|
30
|
-
* decoded `block_actions` from Slack. Construct it with
|
|
31
|
-
* {@link createActionRegistry} and pass it to `JSONGenerativeUI`.
|
|
23
|
+
* The host-provided map from `$action.type` to {@link ActionHandler}. This is the single dispatch target for rendered generative UI: every interactive component fires its `$action` here through the injected `$dispatch` (a submit Button defers to its ancestor form's dispatch instead). The payload's `$input` takes one of two shapes: a single value for a standalone control's dispatch (`Select`, `Input`, `DatePicker`, `Checkbox`, `RadioGroup`), or an object keyed by field `name` for a `Form` or a `Card` with `asForm` set. Construct it with {@link createActionRegistry} and pass it to `JSONGenerativeUI`.
|
|
32
24
|
*/
|
|
33
25
|
export type ActionRegistry = {
|
|
34
26
|
dispatch(action: Action): unknown;
|