@elabs-ai/components-ai 5.3.0 → 5.4.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.
@@ -2,14 +2,14 @@
2
2
  "use client";
3
3
  import {
4
4
  A2uiSurface
5
- } from "../chunk-GA7M34KU.js";
5
+ } from "../chunk-VQNTO2H4.js";
6
6
  import {
7
7
  completeJson
8
8
  } from "../chunk-SKVG672B.js";
9
9
  import "../chunk-7FD5CZEU.js";
10
10
  import "../chunk-4XRNIZMG.js";
11
- import "../chunk-L4SU3QJV.js";
12
- import "../chunk-QOBSEGCG.js";
11
+ import "../chunk-IH4Y3O24.js";
12
+ import "../chunk-PCEEZGTQ.js";
13
13
  export {
14
14
  A2uiSurface,
15
15
  completeJson
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  A2UI_CATALOG_SCHEMA,
4
4
  A2UI_CATALOG_VERSION
5
- } from "../../chunk-QOBSEGCG.js";
5
+ } from "../../chunk-PCEEZGTQ.js";
6
6
  export {
7
7
  A2UI_CATALOG_SCHEMA,
8
8
  A2UI_CATALOG_VERSION
@@ -20,7 +20,7 @@ import {
20
20
  import {
21
21
  A2UI_CATALOG_SCHEMA,
22
22
  A2UI_CATALOG_VERSION
23
- } from "../../chunk-QOBSEGCG.js";
23
+ } from "../../chunk-PCEEZGTQ.js";
24
24
  export {
25
25
  A2UI_CATALOG_SCHEMA,
26
26
  A2UI_CATALOG_VERSION,
@@ -7,7 +7,7 @@ import {
7
7
  } from "../chunk-BM2LWERA.js";
8
8
  import {
9
9
  A2uiSurface
10
- } from "../chunk-GA7M34KU.js";
10
+ } from "../chunk-VQNTO2H4.js";
11
11
  import {
12
12
  completeJson,
13
13
  parseSurfaceJson
@@ -27,11 +27,11 @@ import {
27
27
  createA2uiCatalog,
28
28
  defineA2uiType,
29
29
  uiCatalog
30
- } from "../chunk-L4SU3QJV.js";
30
+ } from "../chunk-IH4Y3O24.js";
31
31
  import {
32
32
  A2UI_CATALOG_SCHEMA,
33
33
  A2UI_CATALOG_VERSION
34
- } from "../chunk-QOBSEGCG.js";
34
+ } from "../chunk-PCEEZGTQ.js";
35
35
  export {
36
36
  A2UI_CATALOG_SCHEMA,
37
37
  A2UI_CATALOG_VERSION,
@@ -6,8 +6,8 @@ import {
6
6
  createA2uiCatalog,
7
7
  defineA2uiType,
8
8
  uiCatalog
9
- } from "../chunk-L4SU3QJV.js";
10
- import "../chunk-QOBSEGCG.js";
9
+ } from "../chunk-IH4Y3O24.js";
10
+ import "../chunk-PCEEZGTQ.js";
11
11
  export {
12
12
  UI_CATALOG_BINDINGS,
13
13
  catalogSchema,
@@ -61,8 +61,8 @@ var ToolHeader = ({
61
61
  children: [
62
62
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
63
63
  /* @__PURE__ */ jsx(WrenchIcon, { className: "size-4 shrink-0 text-muted-foreground" }),
64
- /* @__PURE__ */ jsx("span", { className: "shrink-0 text-body font-medium", children: title ?? derivedName }),
65
- getStatusBadge(state),
64
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate text-body font-medium", children: title ?? derivedName }),
65
+ /* @__PURE__ */ jsx(StatusBadge, { status: statusFromToolState(state), className: "shrink-0" }),
66
66
  summary ? /* @__PURE__ */ jsx("span", { className: "truncate text-meta text-muted-foreground", children: summary }) : null
67
67
  ] }),
68
68
  /* @__PURE__ */ jsx(ChevronDownIcon, { className: "size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-180" })
@@ -170,4 +170,4 @@ export {
170
170
  ToolInput,
171
171
  ToolOutput
172
172
  };
173
- //# sourceMappingURL=chunk-PTWCTSZL.js.map
173
+ //# sourceMappingURL=chunk-AOOIAFDT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tool.tsx"],"sourcesContent":["\"use client\";\n\nimport { Skeleton, StatusBadge, useLocale, type Status } from \"@elabs-ai/components-ui\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { DynamicToolUIPart, ToolUIPart } from \"ai\";\nimport { ChevronDownIcon, WrenchIcon } from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { isValidElement } from \"react\";\nimport type { BundledLanguage } from \"shiki\";\n\nimport { CodeBlock } from \"./code-block\";\n\nexport type ToolProps = ComponentProps<typeof Collapsible>;\n\nexport const Tool = ({ className, ...props }: ToolProps) => (\n <Collapsible\n className={cn(\"group not-prose mb-4 w-full rounded-md border\", className)}\n {...props}\n />\n);\n\nexport type ToolPart = ToolUIPart | DynamicToolUIPart;\n\n/**\n * `JSON.stringify` throws on a circular reference or a `BigInt` — both\n * realistic shapes for tool input/output payloads a model produced. Falls\n * back to a readable placeholder instead of crashing the message render.\n */\nfunction safeJsonStringify(value: unknown): string {\n try {\n return JSON.stringify(value, (_key, v) => (typeof v === \"bigint\" ? `${v.toString()}n` : v), 2);\n } catch {\n return String(value);\n }\n}\n\nexport type ToolHeaderProps = {\n title?: string;\n /**\n * The business summary line (\"3 documents found\", \"8 rows reconciled\"),\n * shown beside the name + StatusBadge (#192, research 10 §B.5). Falls back\n * to nothing — the derived tool name still labels the row.\n */\n summary?: ReactNode;\n className?: string;\n} & (\n | { type: ToolUIPart[\"type\"]; state: ToolUIPart[\"state\"]; toolName?: never }\n | {\n type: DynamicToolUIPart[\"type\"];\n state: DynamicToolUIPart[\"state\"];\n toolName: string;\n }\n);\n\n/**\n * Map the AI-SDK `ToolUIPart` 7-state machine onto the canonical `Status`\n * enum (#189, research 10 §B.1 mapping a). Lives here — not in `@elabs-ai/components-ui` —\n * because it is typed against the SDK union; the `ai` import stays TYPES-ONLY\n * (D6, gate-enforced by `pnpm ai:types-only`).\n */\nexport const statusFromToolState = (state: ToolPart[\"state\"]): Status => {\n switch (state) {\n case \"input-streaming\":\n return \"pending\";\n case \"input-available\":\n return \"running\";\n case \"approval-requested\":\n return \"awaiting-approval\";\n case \"approval-responded\":\n return \"running\";\n case \"output-available\":\n return \"complete\";\n case \"output-denied\":\n return \"denied\";\n case \"output-error\":\n return \"failed\";\n }\n};\n\n/** Same signature as before #189; renders the canonical StatusBadge. */\nexport const getStatusBadge = (status: ToolPart[\"state\"]) => (\n <StatusBadge status={statusFromToolState(status)} />\n);\n\nexport const ToolHeader = ({\n className,\n title,\n summary,\n type,\n state,\n toolName,\n ...props\n}: ToolHeaderProps) => {\n const derivedName = type === \"dynamic-tool\" ? toolName : type.split(\"-\").slice(1).join(\"-\");\n\n return (\n <CollapsibleTrigger\n className={cn(\"flex w-full items-center justify-between gap-4 p-3\", className)}\n {...props}\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <WrenchIcon className=\"size-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 truncate text-body font-medium\">{title ?? derivedName}</span>\n <StatusBadge status={statusFromToolState(state)} className=\"shrink-0\" />\n {summary ? (\n <span className=\"truncate text-meta text-muted-foreground\">{summary}</span>\n ) : null}\n </div>\n <ChevronDownIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-180\" />\n </CollapsibleTrigger>\n );\n};\n\nexport type ToolContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const ToolContent = ({ className, ...props }: ToolContentProps) => (\n <CollapsibleContent\n className={cn(\n \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 space-y-4 p-4 text-popover-foreground outline-none data-[state=closed]:animate-out data-[state=open]:animate-in data-[state=open]:[--tw-ease:var(--ease-entrance)] data-[state=closed]:[--tw-ease:var(--ease-exit)]\",\n className,\n )}\n {...props}\n />\n);\n\nexport type ToolDetailsProps = ComponentProps<typeof Collapsible> & {\n /** The disclosure label. */\n label?: ReactNode;\n};\n\n/**\n * The technical view, behind disclosure — the PACKAGE DEFAULT for tool JSON\n * (#192, research 10 §B.5): a nested collapsible, COLLAPSED by default,\n * holding `ToolInput`/`ToolOutput`. The header carries the business `summary`;\n * the raw payload is one expand away, never the headline.\n */\nexport const ToolDetails = ({\n className,\n label,\n defaultOpen = false,\n children,\n ...props\n}: ToolDetailsProps) => {\n const { t } = useLocale();\n return (\n <Collapsible\n className={cn(\"group/tool-details not-prose\", className)}\n defaultOpen={defaultOpen}\n {...props}\n >\n <CollapsibleTrigger className=\"flex items-center gap-1 rounded-sm text-meta text-muted-foreground transition-colors hover:text-foreground focus-ring\">\n <ChevronDownIcon className=\"size-3.5 transition-transform group-data-[state=open]/tool-details:rotate-180\" />\n {label ?? t(\"ai.tool.showTechnicalDetails\")}\n </CollapsibleTrigger>\n <CollapsibleContent className=\"mt-3 space-y-4\">{children}</CollapsibleContent>\n </Collapsible>\n );\n};\n\nexport type ToolInputProps = ComponentProps<\"div\"> & {\n input: ToolPart[\"input\"];\n};\n\nexport const ToolInput = ({ className, input, ...props }: ToolInputProps) => {\n const { t } = useLocale();\n return (\n <div className={cn(\"space-y-2 overflow-hidden\", className)} {...props}>\n <h4 className=\"text-eyebrow uppercase text-muted-foreground\">\n {t(\"ai.schemaDisplay.parameters\")}\n </h4>\n <div className=\"rounded-md bg-muted/50\">\n <CodeBlock code={safeJsonStringify(input)} language=\"json\" />\n </div>\n </div>\n );\n};\n\nexport type ToolOutputProps = ComponentProps<\"div\"> & {\n /**\n * The tool result. Objects/strings render as JSON inside the technical view.\n *\n * @deprecated Passing a pre-rendered **React element** here (the \"rich\n * output under a muted Result heading\" path) is deprecated since #192\n * (research 10 §B.5): a produced artifact is the HEADLINE, not a technical\n * detail — host it in a `<ToolResultCard>` and keep `ToolOutput` for the\n * JSON payload behind `<ToolDetails>`. The element path still renders for\n * existing consumers (e.g. the copy-owned `ai-chart` registry block) but\n * will be removed in a future release.\n */\n output: ToolPart[\"output\"];\n errorText: ToolPart[\"errorText\"];\n /**\n * The call has not produced output yet (loading-states.md `isStreaming`) —\n * derive it from the existing `statusFromToolState(state)` mapping\n * (`\"input-streaming\"`/`\"input-available\"` → not yet `\"complete\"`/`\"failed\"`)\n * rather than a second source of truth. While true and no `output`/\n * `errorText` has arrived, renders a layout-shaped skeleton in the Result\n * slot instead of `null`, so the technical view reserves its space. A\n * still-running call is never a terminal failure — the error branch is\n * suppressed while `isStreaming` per the loading-states.md error rule, even\n * if a stale `errorText` is still set from a previous render.\n * @default false\n */\n isStreaming?: boolean;\n};\n\nexport const ToolOutput = ({\n className,\n output,\n errorText,\n isStreaming = false,\n ...props\n}: ToolOutputProps) => {\n const { t } = useLocale();\n\n // `output` is a defined-but-falsy result (`0`, `false`, `\"\"`) for plenty of\n // real tools (a count, a boolean check, an empty-string field) — only\n // `undefined` means \"no output (yet)\".\n const hasOutput = output !== undefined;\n\n if (!(hasOutput || errorText || isStreaming)) {\n return null;\n }\n\n const showError = !isStreaming && Boolean(errorText);\n const pending = isStreaming && !hasOutput && !errorText;\n\n let Output: ReactNode = null;\n\n if (hasOutput) {\n if (isValidElement(output)) {\n Output = output;\n } else if (typeof output === \"string\") {\n // A tool result is arbitrary text, not guaranteed JSON — forcing the\n // JSON highlighter on it mis-colours ordinary strings. Shiki's own\n // `BundledLanguage` union (grammar-backed languages) omits its\n // hard-coded plain-text pseudo-languages (`isPlainLang`:\n // \"plaintext\" | \"txt\" | \"text\" | \"plain\") — `createHighlighter`/\n // `codeToTokens` accept and special-case them with no grammar load\n // (verified: `getLoadedLanguages()` stays empty, no throw), so this\n // is a type-only gap, not a runtime one.\n Output = <CodeBlock code={output} language={\"text\" as BundledLanguage} />;\n } else {\n // Objects, arrays, numbers, booleans, null, bigint — all safe to\n // stringify for display.\n Output = <CodeBlock code={safeJsonStringify(output)} language=\"json\" />;\n }\n }\n\n return (\n <div className={cn(\"space-y-2\", className)} {...props}>\n <h4 className=\"text-eyebrow uppercase text-muted-foreground\">\n {showError ? t(\"ai.tool.error\") : t(\"ai.tool.result\")}\n </h4>\n {pending ? (\n <div className=\"space-y-2 rounded-md bg-muted/50 p-3\" role=\"status\" aria-live=\"polite\">\n <span className=\"sr-only\">{t(\"loading\")}</span>\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n ) : (\n <div\n className={cn(\n \"overflow-x-auto rounded-md text-caption [&_table]:w-full\",\n // #124: this colours the ambient text of the error/result body —\n // running text, so the error branch takes the ink rung.\n showError ? \"bg-destructive/10 text-destructive-text\" : \"bg-muted/50 text-foreground\",\n )}\n >\n {showError && <div>{errorText}</div>}\n {Output}\n </div>\n )}\n </div>\n );\n};\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  A2UI_CATALOG_SCHEMA
4
- } from "./chunk-QOBSEGCG.js";
4
+ } from "./chunk-PCEEZGTQ.js";
5
5
 
6
6
  // src/a2ui/ui-catalog.tsx
7
7
  import {
@@ -171,4 +171,4 @@ export {
171
171
  catalogSchema,
172
172
  uiCatalog
173
173
  };
174
- //# sourceMappingURL=chunk-L4SU3QJV.js.map
174
+ //# sourceMappingURL=chunk-IH4Y3O24.js.map
@@ -21,7 +21,8 @@ var A2UI_CATALOG_SCHEMA = {
21
21
  events: {
22
22
  change: "onValueChange"
23
23
  },
24
- source: "@elabs-ai/components-ui"
24
+ source: "@elabs-ai/components-ui",
25
+ summary: "Vertically stacked sections that expand one at a time (or several) to reveal their content."
25
26
  },
26
27
  AccordionContent: {
27
28
  children: true,
@@ -178,7 +179,8 @@ var A2UI_CATALOG_SCHEMA = {
178
179
  }
179
180
  },
180
181
  events: {},
181
- source: "@elabs-ai/components-ui"
182
+ source: "@elabs-ai/components-ui",
183
+ summary: "Buttons joined into one connected control \u2014 a segmented choice or a set of related actions."
182
184
  },
183
185
  Card: {
184
186
  children: true,
@@ -284,7 +286,8 @@ var A2UI_CATALOG_SCHEMA = {
284
286
  events: {
285
287
  change: "onOpenChange"
286
288
  },
287
- source: "@elabs-ai/components-ui"
289
+ source: "@elabs-ai/components-ui",
290
+ summary: "A single section that toggles between hidden and shown, with a trigger that reports its state."
288
291
  },
289
292
  CollapsibleContent: {
290
293
  children: true,
@@ -443,7 +446,8 @@ var A2UI_CATALOG_SCHEMA = {
443
446
  }
444
447
  },
445
448
  events: {},
446
- source: "@elabs-ai/components-ui"
449
+ source: "@elabs-ai/components-ui",
450
+ summary: "The caption for a form control, wired to it for clicks and assistive technology."
447
451
  },
448
452
  MetricCard: {
449
453
  children: false,
@@ -666,7 +670,8 @@ var A2UI_CATALOG_SCHEMA = {
666
670
  }
667
671
  },
668
672
  events: {},
669
- source: "@elabs-ai/components-ui"
673
+ source: "@elabs-ai/components-ui",
674
+ summary: "A horizontal or vertical divider between regions of the same surface."
670
675
  },
671
676
  Slider: {
672
677
  children: false,
@@ -972,7 +977,8 @@ var A2UI_CATALOG_SCHEMA = {
972
977
  events: {
973
978
  change: "onChange"
974
979
  },
975
- source: "@elabs-ai/components-ui"
980
+ source: "@elabs-ai/components-ui",
981
+ summary: "Multi-line text input, sized by rows and auto-growing when asked."
976
982
  },
977
983
  Timeline: {
978
984
  children: false,
@@ -993,4 +999,4 @@ export {
993
999
  A2UI_CATALOG_VERSION,
994
1000
  A2UI_CATALOG_SCHEMA
995
1001
  };
996
- //# sourceMappingURL=chunk-QOBSEGCG.js.map
1002
+ //# sourceMappingURL=chunk-PCEEZGTQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/a2ui/core/catalog.generated.ts"],"sourcesContent":["// GENERATED by packages/cli/scripts/gen-a2ui-catalog.mjs from\n// packages/ai/src/a2ui/catalog.source.json + brand-ui.manifest.json — do not edit;\n// edit the source file (or the component) and run `pnpm gen`.\nimport type { A2uiCatalogSchema } from \"./spec\";\n\nexport const A2UI_CATALOG_VERSION = \"1\";\n\nexport const A2UI_CATALOG_SCHEMA: A2uiCatalogSchema = {\n Accordion: {\n children: true,\n props: {\n collapsible: {\n type: \"boolean\",\n },\n defaultValue: {\n type: \"string\",\n },\n type: {\n enum: [\"single\", \"multiple\"],\n required: true,\n type: \"string\",\n },\n },\n events: {\n change: \"onValueChange\",\n },\n source: \"@elabs-ai/components-ui\",\n summary:\n \"Vertically stacked sections that expand one at a time (or several) to reveal their content.\",\n },\n AccordionContent: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n AccordionItem: {\n children: true,\n props: {\n value: {\n type: \"string\",\n required: true,\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n AccordionTrigger: {\n children: true,\n props: {\n headingLevel: {\n type: \"number\",\n enum: [2, 3, 4, 5, 6],\n description:\n \"The heading level Radix's `Accordion.Header` renders. Radix hardcodes `h3`, which skips a level whenever the accordion sits directly under the page `h1` — so…\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Alert: {\n children: true,\n props: {\n variant: {\n type: \"string\",\n enum: [\"default\", \"destructive\", \"success\", \"warning\", \"info\"],\n default: \"default\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Compose AlertTitle + AlertDescription inside.\",\n },\n AlertDescription: {\n children: true,\n props: {\n measure: {\n type: \"boolean\",\n description:\n \"Cap the line length to a readable prose measure (`max-w-prose`, ~65ch) for genuine paragraph content (#339). Off by default — short, label-style descriptions…\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n AlertTitle: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Avatar: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Compose AvatarFallback (initials) inside.\",\n },\n AvatarFallback: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Badge: {\n children: true,\n props: {\n variant: {\n type: \"string\",\n enum: [\"default\", \"secondary\", \"outline\", \"success\", \"warning\", \"destructive\", \"info\"],\n default: \"default\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Compact status/label chip (status, count, category).\",\n },\n BentoGrid: {\n children: true,\n props: {\n spotlight: {\n type: \"boolean\",\n description:\n \"Enable the cursor-following spotlight on every tile in this grid. Individual tiles can still opt out (or in) with their own `spotlight` prop. Disabled entire…\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Feature/bento grid; children are BentoGridItem.\",\n },\n BentoGridItem: {\n children: true,\n props: {\n size: {\n type: \"string\",\n description:\n 'Size preset. Resolves to a col + row span. Overridden by explicit `span`. @default \"sm\"',\n enum: [\"sm\", \"md\", \"lg\", \"hero\"],\n },\n span: {\n type: \"object\",\n description:\n \"Explicit grid span. Wins over `size`. Spans clamp gracefully on narrow layouts — a `col: 4` on a 2-col grid becomes `span min(4, 2)`.\",\n },\n spotlight: {\n type: \"boolean\",\n description:\n \"Enable the cursor-following spotlight gradient on this tile. Omit to inherit the parent `BentoGrid`'s `spotlight` (itself `false` by default) — so the effect…\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Button: {\n children: true,\n props: {\n disabled: {\n type: \"boolean\",\n },\n size: {\n type: \"string\",\n enum: [\"sm\", \"default\", \"lg\", \"icon\", \"icon-sm\", \"icon-lg\"],\n default: \"default\",\n },\n type: {\n enum: [\"button\", \"submit\"],\n default: \"button\",\n type: \"string\",\n },\n variant: {\n type: \"string\",\n enum: [\"default\", \"secondary\", \"destructive\", \"outline\", \"outline-subtle\", \"ghost\", \"link\"],\n default: \"default\",\n },\n },\n events: {\n click: \"onClick\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: 'An action. Bind `on.click`; one `variant: \"default\"` per group.',\n },\n ButtonGroup: {\n children: true,\n props: {\n orientation: {\n type: \"string\",\n enum: [\"horizontal\", \"vertical\"],\n default: \"horizontal\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary:\n \"Buttons joined into one connected control — a segmented choice or a set of related actions.\",\n },\n Card: {\n children: true,\n props: {\n detail: {\n type: \"node\",\n description:\n \"Optional detail-panel content. **Undefined → a plain card** (today's single `<div>` — no grid, no panel, zero behaviour change).\",\n },\n detailLabel: {\n type: \"string\",\n description: 'Accessible label for the detail region. @default \"Details\"',\n },\n detailPlacement: {\n type: \"string\",\n enum: [\"side\", \"bottom\"],\n description: 'Which edge the detail panel sits on. @default \"side\"',\n },\n interactive: {\n type: \"string\",\n enum: [\"true\", \"false\"],\n default: \"false\",\n },\n stacked: {\n type: \"boolean\",\n description:\n \"Opt-in hairline gesture: the edges of two sheets stacked behind the card's top edge (the `hairline-stack` utility). It draws OUTSIDE the card, so it needs ~1…\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"The one generic surface — compose CardHeader / CardContent / CardFooter inside.\",\n },\n CardAction: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"The header's trailing action slot (a Button, a Badge).\",\n },\n CardContent: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n CardDescription: {\n children: true,\n props: {\n measure: {\n type: \"boolean\",\n description:\n \"Cap the line length to a readable prose measure (`max-w-prose`, ~65ch) for genuine paragraph content (#339). Off by default — short, subtitle-style descripti…\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n CardFooter: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n CardHeader: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n CardTitle: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Checkbox: {\n children: false,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n defaultChecked: {\n type: \"boolean\",\n },\n disabled: {\n type: \"boolean\",\n },\n id: {\n type: \"string\",\n },\n },\n events: {\n change: \"onCheckedChange\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: \"Binary on/off toggle within a form (multi-select within a group).\",\n },\n Collapsible: {\n children: true,\n props: {\n defaultOpen: {\n type: \"boolean\",\n },\n },\n events: {\n change: \"onOpenChange\",\n },\n source: \"@elabs-ai/components-ui\",\n summary:\n \"A single section that toggles between hidden and shown, with a trigger that reports its state.\",\n },\n CollapsibleContent: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n CollapsibleTrigger: {\n children: true,\n props: {\n asChild: {\n type: \"boolean\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Descriptions: {\n children: true,\n props: {\n columns: {\n type: \"number\",\n enum: [1, 2, 3],\n description:\n \"Number of columns at the widest breakpoint. Collapses to a single column on small screens. Default 1.\",\n },\n layout: {\n type: \"string\",\n description:\n \"`horizontal` places the label beside the value; `vertical` stacks the label above the value. Default `horizontal`.\",\n enum: [\"horizontal\", \"vertical\"],\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Key–value list; children are DescriptionsItem.\",\n },\n DescriptionsItem: {\n children: true,\n props: {\n label: {\n type: \"node\",\n required: true,\n description: \"The term / label for this entry.\",\n },\n numeric: {\n type: \"boolean\",\n description:\n \"When the value is numeric, set this so the value uses `tabular-nums` for aligned digits.\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n EmptyState: {\n children: false,\n props: {\n actions: {\n type: \"node\",\n description: \"Primary/secondary actions.\",\n },\n description: {\n type: \"node\",\n },\n icon: {\n type: \"node\",\n description:\n \"Optional icon shown above the title, clamped to a fixed 40×40 (this wrapper only ever forwards `icon` to `StatePanel`, never `illustration` — for a larger, u…\",\n },\n title: {\n type: \"node\",\n required: true,\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Nothing here yet — title, description, optional actions.\",\n },\n Grid: {\n builtin: true,\n children: true,\n props: {\n columns: {\n enum: [1, 2, 3, 4],\n default: 2,\n type: \"number\",\n },\n gap: {\n enum: [\"none\", \"xs\", \"sm\", \"md\", \"lg\"],\n default: \"md\",\n type: \"string\",\n },\n },\n events: {},\n source: \"builtin\",\n summary: \"Responsive CSS grid, 1–4 equal columns (collapses to one column on narrow screens).\",\n },\n Heading: {\n children: true,\n props: {\n level: {\n type: \"number\",\n description: \"Semantic heading level — drives the rendered tag AND the default size.\",\n enum: [1, 2, 3, 4, 5, 6],\n default: 2,\n },\n size: {\n type: \"string\",\n enum: [\"display-lg\", \"display\", \"title\", \"subtitle\"],\n default: \"title\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Section heading; `level` sets the HTML rank (1–6), `size` the type role.\",\n },\n Input: {\n children: false,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n defaultValue: {\n type: \"string\",\n },\n disabled: {\n type: \"boolean\",\n },\n id: {\n type: \"string\",\n },\n placeholder: {\n type: \"string\",\n },\n required: {\n type: \"boolean\",\n },\n type: {\n enum: [\"text\", \"email\", \"number\", \"password\", \"search\", \"tel\", \"url\", \"date\"],\n type: \"string\",\n },\n },\n events: {\n change: \"onChange\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: \"Single-line text field — the base form input.\",\n },\n Kbd: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Label: {\n children: true,\n props: {\n htmlFor: {\n type: \"string\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"The caption for a form control, wired to it for clicks and assistive technology.\",\n },\n MetricCard: {\n children: false,\n props: {\n currency: {\n type: \"string\",\n description: 'ISO 4217 code for `valueFormat: \"currency\"`. Default: `\"USD\"`.',\n },\n delta: {\n type: \"string\",\n description: 'Signed change, e.g. \"+12.4%\". Direction colors it.',\n },\n deltaDirection: {\n type: \"string\",\n enum: [\"up\", \"down\", \"neutral\"],\n },\n description: {\n type: \"node\",\n description: \"Secondary line under the value — sublabel / context.\",\n },\n evidence: {\n type: \"node\",\n description:\n \"Optional grounding footer (research 11 §B.5 KPI-3) — connects a cited figure to its source (e.g. an `EvidenceChip` from `@elabs-ai/components-ai`). Rendered …\",\n },\n label: {\n type: \"node\",\n required: true,\n },\n loading: {\n type: \"boolean\",\n description:\n \"Loading vs ready — renders a layout-shaped skeleton (matching the real box height) instead of the value/label/delta text. Default: `false`.\",\n },\n positiveIsGood: {\n type: \"boolean\",\n description: 'Whether \"up\" is good (green) — flip for metrics where down is good.',\n },\n sparkline: {\n type: \"node\",\n description:\n 'Trend slot rendered directly under the value (RM-072) — pass a `<Sparkline …/>` from `@elabs-ai/components-charts`. Hidden at `size=\"sm\"`.',\n },\n value: {\n type: \"node\",\n required: true,\n },\n valueFormat: {\n type: \"string\",\n description:\n 'How to render a NUMERIC `value`. Default: `\"compact\"`. Ignored for every other `ReactNode` — a string you already formatted is rendered verbatim.',\n enum: [\"number\", \"compact\", \"currency\", \"percent\"],\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"One KPI: label, value, optional delta. Put several in a Grid.\",\n },\n Progress: {\n children: false,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n marker: {\n type: \"number\",\n description:\n 'Reference point (0–100, same scale as `value`) — e.g. an \"expected by today\" pace or a target — rendered as a thin vertical tick on the track. Unset (default…',\n },\n markerLabel: {\n type: \"string\",\n description:\n 'What `marker` represents (already localized by the caller — e.g. `\"expected 70% by today\"`). When set, it is appended to the progress bar\\'s accessible value …',\n },\n max: {\n type: \"number\",\n },\n value: {\n type: \"number\",\n required: true,\n },\n variant: {\n type: \"string\",\n enum: [\"default\", \"success\", \"warning\", \"destructive\"],\n default: \"default\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n RadioGroup: {\n children: true,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n defaultValue: {\n type: \"string\",\n },\n },\n events: {\n change: \"onValueChange\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: \"Mutually-exclusive single choice from a small visible set.\",\n },\n RadioGroupItem: {\n children: false,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n disabled: {\n type: \"boolean\",\n },\n id: {\n type: \"string\",\n },\n value: {\n type: \"string\",\n required: true,\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n SectionHeader: {\n children: false,\n props: {\n actions: {\n type: \"node\",\n description: \"Right-aligned actions (buttons, menus).\",\n },\n description: {\n type: \"node\",\n },\n eyebrow: {\n type: \"node\",\n description: \"Optional element rendered above the title (eyebrow / breadcrumbs).\",\n },\n size: {\n type: \"string\",\n enum: [\"default\", \"lg\"],\n description:\n 'Title size: `\"default\"` (`text-title`) for a section inside a screen; `\"lg\"` (`text-display`, description at a readable measure) for the sections of a LONG p…',\n },\n title: {\n type: \"node\",\n required: true,\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Title + description + optional actions above a region.\",\n },\n Select: {\n children: true,\n props: {\n defaultValue: {\n type: \"string\",\n },\n disabled: {\n type: \"boolean\",\n },\n },\n events: {\n change: \"onValueChange\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: \"Compose SelectTrigger (SelectValue) + SelectContent (SelectItem…).\",\n },\n SelectContent: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n SelectItem: {\n children: true,\n props: {\n disabled: {\n type: \"boolean\",\n },\n value: {\n type: \"string\",\n required: true,\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n SelectTrigger: {\n children: true,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n autoTitle: {\n type: \"boolean\",\n description:\n \"Auto-set a native `title` from the trigger's rendered text — but ONLY while that text is actually clipped (default `true`). Set `false` when the trigger is a…\",\n },\n size: {\n type: \"string\",\n enum: [\"sm\", \"default\"],\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n SelectValue: {\n children: false,\n props: {\n placeholder: {\n type: \"string\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Separator: {\n children: false,\n props: {\n orientation: {\n enum: [\"horizontal\", \"vertical\"],\n default: \"horizontal\",\n type: \"string\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"A horizontal or vertical divider between regions of the same surface.\",\n },\n Slider: {\n children: false,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n defaultValue: {\n type: \"array\",\n },\n max: {\n type: \"number\",\n },\n min: {\n type: \"number\",\n },\n step: {\n type: \"number\",\n },\n thumbProps: {\n type: \"array\",\n description:\n \"Escape hatch spread onto the thumb LAST — for `data-*`/`style`/etc, or to deliberately override `aria-label`/`aria-labelledby`/`aria-valuetext` (an explicit …\",\n },\n },\n events: {\n change: \"onValueChange\",\n },\n source: \"@elabs-ai/components-ui\",\n },\n Stack: {\n builtin: true,\n children: true,\n props: {\n align: {\n enum: [\"start\", \"center\", \"end\", \"stretch\"],\n default: \"stretch\",\n type: \"string\",\n },\n direction: {\n enum: [\"column\", \"row\"],\n default: \"column\",\n type: \"string\",\n },\n gap: {\n enum: [\"none\", \"xs\", \"sm\", \"md\", \"lg\"],\n default: \"md\",\n type: \"string\",\n },\n justify: {\n enum: [\"start\", \"center\", \"end\", \"between\"],\n default: \"start\",\n type: \"string\",\n },\n wrap: {\n type: \"boolean\",\n default: false,\n },\n },\n events: {},\n source: \"builtin\",\n summary:\n \"Vertical or horizontal flex group. The default container — put siblings in a Stack, never bare.\",\n },\n StatePanel: {\n children: false,\n props: {\n actions: {\n type: \"node\",\n description: \"Primary / secondary action buttons.\",\n },\n description: {\n type: \"node\",\n description: \"Supporting description below the title.\",\n },\n icon: {\n type: \"node\",\n description:\n 'Icon shown above the title, clamped to a uniform 40×40 so mismatched glyphs stay tidy. For `\"error\"` defaults to a built-in warning triangle. For `\"loading\"`…',\n },\n illustration: {\n type: \"node\",\n description:\n \"A larger illustration (one of `@elabs-ai/components-ui`'s shipped `*Illustration` components, or a consumer's own `ReactNode`) shown above the title instead …\",\n },\n kind: {\n type: \"string\",\n enum: [\"empty\", \"error\", \"loading\"],\n default: \"empty\",\n },\n loadingLabel: {\n type: \"string\",\n description: 'Accessible label for the spinner in loading state. @default \"Loading…\"',\n },\n size: {\n type: \"string\",\n enum: [\"sm\", \"md\", \"lg\"],\n description: 'Spinner size (loading kind only). @default \"md\"',\n },\n title: {\n type: \"node\",\n description: \"Heading text.\",\n },\n titleAs: {\n type: \"string\",\n enum: [\"div\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\"],\n description:\n \"Heading level for the panel's title (#328 convention). Set this to the level that correctly follows whatever heading precedes this panel in the document outl…\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"An empty / error / loading message panel.\",\n },\n StatusBadge: {\n children: false,\n props: {\n hideIcon: {\n type: \"boolean\",\n description: \"Render label-only (no status icon).\",\n },\n size: {\n type: \"string\",\n enum: [\"sm\", \"md\"],\n default: \"md\",\n },\n status: {\n type: \"string\",\n required: true,\n description: \"The canonical execution status, or a mapped out-of-vocabulary one (#363).\",\n enum: [\n \"pending\",\n \"running\",\n \"complete\",\n \"awaiting-approval\",\n \"denied\",\n \"failed\",\n \"skipped\",\n ],\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"A closed status vocabulary with icon + text (never colour alone).\",\n },\n Switch: {\n children: false,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n defaultChecked: {\n type: \"boolean\",\n },\n disabled: {\n type: \"boolean\",\n },\n id: {\n type: \"string\",\n },\n },\n events: {\n change: \"onCheckedChange\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: \"Immediate on/off setting toggle (applies on change, not on submit).\",\n },\n Table: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Compose TableHeader/TableBody → TableRow → TableHead/TableCell.\",\n },\n TableBody: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TableCaption: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TableCell: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TableFooter: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TableHead: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TableHeader: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TableRow: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Tabs: {\n children: true,\n props: {\n defaultValue: {\n type: \"string\",\n required: true,\n },\n },\n events: {\n change: \"onValueChange\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: \"Compose TabsList (TabsTrigger…) + TabsContent per value.\",\n },\n TabsContent: {\n children: true,\n props: {\n value: {\n type: \"string\",\n required: true,\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TabsList: {\n children: true,\n props: {\n variant: {\n type: \"string\",\n enum: [\"segmented\", \"underline\"],\n default: \"segmented\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TabsTrigger: {\n children: true,\n props: {\n disabled: {\n type: \"boolean\",\n },\n value: {\n type: \"string\",\n required: true,\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Text: {\n children: true,\n props: {\n tone: {\n type: \"string\",\n enum: [\"default\", \"muted\", \"primary\"],\n default: \"default\",\n },\n variant: {\n type: \"string\",\n enum: [\"lead\", \"body\", \"caption\", \"meta\", \"kpi\", \"kpi-sm\", \"eyebrow\", \"code\"],\n default: \"body\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"A paragraph or inline run of text with a type role and tone.\",\n },\n Textarea: {\n children: false,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n defaultValue: {\n type: \"string\",\n },\n disabled: {\n type: \"boolean\",\n },\n id: {\n type: \"string\",\n },\n placeholder: {\n type: \"string\",\n },\n rows: {\n type: \"number\",\n },\n },\n events: {\n change: \"onChange\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: \"Multi-line text input, sized by rows and auto-growing when asked.\",\n },\n Timeline: {\n children: false,\n props: {\n items: {\n type: \"array\",\n required: true,\n description: '[{ title, description?, status?: \"done\"|\"active\"|\"pending\", timestamp? }]',\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Ordered status timeline from `items` (title, status, timestamp, description).\",\n },\n};\n"],"mappings":";;;AAKO,IAAM,uBAAuB;AAE7B,IAAM,sBAAyC;AAAA,EACpD,WAAW;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,MACL,aAAa;AAAA,QACX,MAAM;AAAA,MACR;AAAA,MACA,cAAc;AAAA,QACZ,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,MAAM,CAAC,UAAU,UAAU;AAAA,QAC3B,UAAU;AAAA,QACV,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,IACR,SACE;AAAA,EACJ;AAAA,EACA,kBAAkB;AAAA,IAChB,UAAU;AAAA,IACV,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,eAAe;AAAA,IACb,UAAU;AAAA,IACV,OAAO;AAAA,MACL,OAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,kBAAkB;AAAA,IAChB,UAAU;AAAA,IACV,OAAO;AAAA,MACL,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,QACpB,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACL,UAAU;AAAA,IACV,OAAO;AAAA,MACL,SAAS;AAAA,QACP,MAAM;AAAA,QACN,MAAM,CAAC,WAAW,eAAe,WAAW,WAAW,MAAM;AAAA,QAC7D,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,kBAAkB;AAAA,IAChB,UAAU;AAAA,IACV,OAAO;AAAA,MACL,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,YAAY;AAAA,IACV,UAAU;AAAA,IACV,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,gBAAgB;AAAA,IACd,UAAU;AAAA,IACV,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACL,UAAU;AAAA,IACV,OAAO;AAAA,MACL,SAAS;AAAA,QACP,MAAM;AAAA,QACN,MAAM,CAAC,WAAW,aAAa,WAAW,WAAW,WAAW,eAAe,MAAM;AAAA,QACrF,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,WAAW;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,MACL,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,eAAe;AAAA,IACb,UAAU;AAAA,IACV,OAAO;AAAA,MACL,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aACE;AAAA,QACF,MAAM,CAAC,MAAM,MAAM,MAAM,MAAM;AAAA,MACjC;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,MACL,UAAU;AAAA,QACR,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM,CAAC,MAAM,WAAW,MAAM,QAAQ,WAAW,SAAS;AAAA,QAC1D,SAAS;AAAA,MACX;AAAA,MACA,MAAM;AAAA,QACJ,MAAM,CAAC,UAAU,QAAQ;AAAA,QACzB,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,MAAM,CAAC,WAAW,aAAa,eAAe,WAAW,kBAAkB,SAAS,MAAM;AAAA,QAC1F,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,OAAO;AAAA,IACT;AAAA,IACA,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,aAAa;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,MACL,aAAa;AAAA,QACX,MAAM;AAAA,QACN,MAAM,CAAC,cAAc,UAAU;AAAA,QAC/B,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,SACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,OAAO;AAAA,MACL,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,aAAa;AAAA,QACX,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,iBAAiB;AAAA,QACf,MAAM;AAAA,QACN,MAAM,CAAC,QAAQ,QAAQ;AAAA,QACvB,aAAa;AAAA,MACf;AAAA,MACA,aAAa;AAAA,QACX,MAAM;AAAA,QACN,MAAM,CAAC,QAAQ,OAAO;AAAA,QACtB,SAAS;AAAA,MACX;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,YAAY;AAAA,IACV,UAAU;AAAA,IACV,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,aAAa;AAAA,IACX,UAAU;AAAA,IACV,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,iBAAiB;AAAA,IACf,UAAU;AAAA,IACV,OAAO;AAAA,MACL,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,YAAY;AAAA,IACV,UAAU;AAAA,IACV,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,YAAY;AAAA,IACV,UAAU;AAAA,IACV,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,WAAW;AAAA,IACT,UAAU;AAAA,IACV,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,UAAU;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,MACL,cAAc;AAAA,QACZ,MAAM;AAAA,MACR;AAAA,MACA,gBAAgB;AAAA,QACd,MAAM;AAAA,MACR;AAAA,MACA,UAAU;AAAA,QACR,MAAM;AAAA,MACR;AAAA,MACA,IAAI;AAAA,QACF,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,aAAa;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,MACL,aAAa;AAAA,QACX,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,IACR,SACE;AAAA,EACJ;AAAA,EACA,oBAAoB;AAAA,IAClB,UAAU;AAAA,IACV,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,oBAAoB;AAAA,IAClB,UAAU;AAAA,IACV,OAAO;AAAA,MACL,SAAS;AAAA,QACP,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,cAAc;AAAA,IACZ,UAAU;AAAA,IACV,OAAO;AAAA,MACL,SAAS;AAAA,QACP,MAAM;AAAA,QACN,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,QACd,aACE;AAAA,MACJ;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aACE;AAAA,QACF,MAAM,CAAC,cAAc,UAAU;AAAA,MACjC;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,kBAAkB;AAAA,IAChB,UAAU;AAAA,IACV,OAAO;AAAA,MACL,OAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,MACf;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,YAAY;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,MACL,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,aAAa;AAAA,QACX,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,MAAM;AAAA,IACJ,SAAS;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,MACL,SAAS;AAAA,QACP,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,QACjB,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,MACA,KAAK;AAAA,QACH,MAAM,CAAC,QAAQ,MAAM,MAAM,MAAM,IAAI;AAAA,QACrC,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,MACL,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,QACvB,SAAS;AAAA,MACX;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM,CAAC,cAAc,WAAW,SAAS,UAAU;AAAA,QACnD,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,UAAU;AAAA,IACV,OAAO;AAAA,MACL,cAAc;AAAA,QACZ,MAAM;AAAA,MACR;AAAA,MACA,cAAc;AAAA,QACZ,MAAM;AAAA,MACR;AAAA,MACA,UAAU;AAAA,QACR,MAAM;AAAA,MACR;AAAA,MACA,IAAI;AAAA,QACF,MAAM;AAAA,MACR;AAAA,MACA,aAAa;AAAA,QACX,MAAM;AAAA,MACR;AAAA,MACA,UAAU;AAAA,QACR,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,MAAM,CAAC,QAAQ,SAAS,UAAU,YAAY,UAAU,OAAO,OAAO,MAAM;AAAA,QAC5E,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,KAAK;AAAA,IACH,UAAU;AAAA,IACV,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACL,UAAU;AAAA,IACV,OAAO;AAAA,MACL,SAAS;AAAA,QACP,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,YAAY;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,MACL,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,gBAAgB;AAAA,QACd,MAAM;AAAA,QACN,MAAM,CAAC,MAAM,QAAQ,SAAS;AAAA,MAChC;AAAA,MACA,aAAa;AAAA,QACX,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,gBAAgB;AAAA,QACd,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,MACA,aAAa;AAAA,QACX,MAAM;AAAA,QACN,aACE;AAAA,QACF,MAAM,CAAC,UAAU,WAAW,YAAY,SAAS;AAAA,MACnD;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,UAAU;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,MACL,cAAc;AAAA,QACZ,MAAM;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,aAAa;AAAA,QACX,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,KAAK;AAAA,QACH,MAAM;AAAA,MACR;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,MAAM,CAAC,WAAW,WAAW,WAAW,aAAa;AAAA,QACrD,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,YAAY;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,MACL,cAAc;AAAA,QACZ,MAAM;AAAA,MACR;AAAA,MACA,cAAc;AAAA,QACZ,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,gBAAgB;AAAA,IACd,UAAU;AAAA,IACV,OAAO;AAAA,MACL,cAAc;AAAA,QACZ,MAAM;AAAA,MACR;AAAA,MACA,UAAU;AAAA,QACR,MAAM;AAAA,MACR;AAAA,MACA,IAAI;AAAA,QACF,MAAM;AAAA,MACR;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,eAAe;AAAA,IACb,UAAU;AAAA,IACV,OAAO;AAAA,MACL,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,aAAa;AAAA,QACX,MAAM;AAAA,MACR;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM,CAAC,WAAW,IAAI;AAAA,QACtB,aACE;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,MACL,cAAc;AAAA,QACZ,MAAM;AAAA,MACR;AAAA,MACA,UAAU;AAAA,QACR,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,eAAe;AAAA,IACb,UAAU;AAAA,IACV,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,YAAY;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,MACL,UAAU;AAAA,QACR,MAAM;AAAA,MACR;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,eAAe;AAAA,IACb,UAAU;AAAA,IACV,OAAO;AAAA,MACL,cAAc;AAAA,QACZ,MAAM;AAAA,MACR;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM,CAAC,MAAM,SAAS;AAAA,MACxB;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,aAAa;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,MACL,aAAa;AAAA,QACX,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,WAAW;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,MACL,aAAa;AAAA,QACX,MAAM,CAAC,cAAc,UAAU;AAAA,QAC/B,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,MACL,cAAc;AAAA,QACZ,MAAM;AAAA,MACR;AAAA,MACA,cAAc;AAAA,QACZ,MAAM;AAAA,MACR;AAAA,MACA,KAAK;AAAA,QACH,MAAM;AAAA,MACR;AAAA,MACA,KAAK;AAAA,QACH,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,MACR;AAAA,MACA,YAAY;AAAA,QACV,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,MACL,OAAO;AAAA,QACL,MAAM,CAAC,SAAS,UAAU,OAAO,SAAS;AAAA,QAC1C,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,MACA,WAAW;AAAA,QACT,MAAM,CAAC,UAAU,KAAK;AAAA,QACtB,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,MACA,KAAK;AAAA,QACH,MAAM,CAAC,QAAQ,MAAM,MAAM,MAAM,IAAI;AAAA,QACrC,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,MACA,SAAS;AAAA,QACP,MAAM,CAAC,SAAS,UAAU,OAAO,SAAS;AAAA,QAC1C,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,SACE;AAAA,EACJ;AAAA,EACA,YAAY;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,MACL,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,aAAa;AAAA,QACX,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM,CAAC,SAAS,SAAS,SAAS;AAAA,QAClC,SAAS;AAAA,MACX;AAAA,MACA,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM,CAAC,MAAM,MAAM,IAAI;AAAA,QACvB,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,MAAM,CAAC,OAAO,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,QAChD,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,aAAa;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,MACL,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM,CAAC,MAAM,IAAI;AAAA,QACjB,SAAS;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,QACb,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,MACL,cAAc;AAAA,QACZ,MAAM;AAAA,MACR;AAAA,MACA,gBAAgB;AAAA,QACd,MAAM;AAAA,MACR;AAAA,MACA,UAAU;AAAA,QACR,MAAM;AAAA,MACR;AAAA,MACA,IAAI;AAAA,QACF,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,UAAU;AAAA,IACV,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,WAAW;AAAA,IACT,UAAU;AAAA,IACV,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,cAAc;AAAA,IACZ,UAAU;AAAA,IACV,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,WAAW;AAAA,IACT,UAAU;AAAA,IACV,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,aAAa;AAAA,IACX,UAAU;AAAA,IACV,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,WAAW;AAAA,IACT,UAAU;AAAA,IACV,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,aAAa;AAAA,IACX,UAAU;AAAA,IACV,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,UAAU;AAAA,IACR,UAAU;AAAA,IACV,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,OAAO;AAAA,MACL,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,aAAa;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,MACL,OAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,UAAU;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,MACL,SAAS;AAAA,QACP,MAAM;AAAA,QACN,MAAM,CAAC,aAAa,WAAW;AAAA,QAC/B,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,aAAa;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,MACL,UAAU;AAAA,QACR,MAAM;AAAA,MACR;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,OAAO;AAAA,MACL,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM,CAAC,WAAW,SAAS,SAAS;AAAA,QACpC,SAAS;AAAA,MACX;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,MAAM,CAAC,QAAQ,QAAQ,WAAW,QAAQ,OAAO,UAAU,WAAW,MAAM;AAAA,QAC5E,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,UAAU;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,MACL,cAAc;AAAA,QACZ,MAAM;AAAA,MACR;AAAA,MACA,cAAc;AAAA,QACZ,MAAM;AAAA,MACR;AAAA,MACA,UAAU;AAAA,QACR,MAAM;AAAA,MACR;AAAA,MACA,IAAI;AAAA,QACF,MAAM;AAAA,MACR;AAAA,MACA,aAAa;AAAA,QACX,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,UAAU;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,MACL,OAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AACF;","names":[]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  getStatusBadge
4
- } from "./chunk-PTWCTSZL.js";
4
+ } from "./chunk-AOOIAFDT.js";
5
5
 
6
6
  // src/sandbox.tsx
7
7
  import {
@@ -105,4 +105,4 @@ export {
105
105
  SandboxTabsTrigger,
106
106
  SandboxTabContent
107
107
  };
108
- //# sourceMappingURL=chunk-FERYDFZA.js.map
108
+ //# sourceMappingURL=chunk-UHLVPAHG.js.map
@@ -11,7 +11,7 @@ import {
11
11
  ToolInput,
12
12
  ToolOutput,
13
13
  statusFromToolState
14
- } from "./chunk-PTWCTSZL.js";
14
+ } from "./chunk-AOOIAFDT.js";
15
15
  import {
16
16
  buildPartGroups,
17
17
  defaultPartStatus,
@@ -146,4 +146,4 @@ function GroupedParts({
146
146
  export {
147
147
  GroupedParts
148
148
  };
149
- //# sourceMappingURL=chunk-WU5BLGTF.js.map
149
+ //# sourceMappingURL=chunk-VJZJWNEC.js.map
@@ -10,7 +10,7 @@ import {
10
10
  import {
11
11
  catalogSchema,
12
12
  uiCatalog
13
- } from "./chunk-L4SU3QJV.js";
13
+ } from "./chunk-IH4Y3O24.js";
14
14
 
15
15
  // src/a2ui/a2ui-surface.tsx
16
16
  import { Skeleton, useLocale } from "@elabs-ai/components-ui";
@@ -233,4 +233,4 @@ A2uiSurface.displayName = "A2uiSurface";
233
233
  export {
234
234
  A2uiSurface
235
235
  };
236
- //# sourceMappingURL=chunk-GA7M34KU.js.map
236
+ //# sourceMappingURL=chunk-VQNTO2H4.js.map
@@ -2,9 +2,9 @@
2
2
  "use client";
3
3
  import {
4
4
  GroupedParts
5
- } from "./chunk-WU5BLGTF.js";
5
+ } from "./chunk-VJZJWNEC.js";
6
6
  import "./chunk-X47QMM6K.js";
7
- import "./chunk-PTWCTSZL.js";
7
+ import "./chunk-AOOIAFDT.js";
8
8
  import "./chunk-YSKD7UXX.js";
9
9
  import "./chunk-TWPHAJNM.js";
10
10
  import "./chunk-3YPT3V7L.js";
package/dist/index.js CHANGED
@@ -115,7 +115,7 @@ import {
115
115
  SandboxTabsBar,
116
116
  SandboxTabsList,
117
117
  SandboxTabsTrigger
118
- } from "./chunk-FERYDFZA.js";
118
+ } from "./chunk-UHLVPAHG.js";
119
119
  import {
120
120
  SchemaDisplay,
121
121
  SchemaDisplayBody,
@@ -337,7 +337,7 @@ import {
337
337
  } from "./chunk-3XNPMDZY.js";
338
338
  import {
339
339
  GroupedParts
340
- } from "./chunk-WU5BLGTF.js";
340
+ } from "./chunk-VJZJWNEC.js";
341
341
  import {
342
342
  Reasoning,
343
343
  ReasoningContent,
@@ -353,7 +353,7 @@ import {
353
353
  ToolOutput,
354
354
  getStatusBadge,
355
355
  statusFromToolState
356
- } from "./chunk-PTWCTSZL.js";
356
+ } from "./chunk-AOOIAFDT.js";
357
357
  import {
358
358
  buildPartGroups,
359
359
  defaultPartStatus,
@@ -673,7 +673,7 @@ import "./chunk-DZW6LM22.js";
673
673
  import "./chunk-3TDHPXZZ.js";
674
674
  import {
675
675
  A2uiSurface
676
- } from "./chunk-GA7M34KU.js";
676
+ } from "./chunk-VQNTO2H4.js";
677
677
  import {
678
678
  completeJson,
679
679
  parseSurfaceJson
@@ -693,11 +693,11 @@ import {
693
693
  createA2uiCatalog,
694
694
  defineA2uiType,
695
695
  uiCatalog
696
- } from "./chunk-L4SU3QJV.js";
696
+ } from "./chunk-IH4Y3O24.js";
697
697
  import {
698
698
  A2UI_CATALOG_SCHEMA,
699
699
  A2UI_CATALOG_VERSION
700
- } from "./chunk-QOBSEGCG.js";
700
+ } from "./chunk-PCEEZGTQ.js";
701
701
  import "./chunk-SSKZ2AED.js";
702
702
  import "./chunk-NMVNNO3L.js";
703
703
  import "./chunk-QUDZOTRV.js";
package/dist/sandbox.js CHANGED
@@ -9,8 +9,8 @@ import {
9
9
  SandboxTabsBar,
10
10
  SandboxTabsList,
11
11
  SandboxTabsTrigger
12
- } from "./chunk-FERYDFZA.js";
13
- import "./chunk-PTWCTSZL.js";
12
+ } from "./chunk-UHLVPAHG.js";
13
+ import "./chunk-AOOIAFDT.js";
14
14
  import "./chunk-TWPHAJNM.js";
15
15
  import "./chunk-3YPT3V7L.js";
16
16
  import "./chunk-3TDHPXZZ.js";
package/dist/tool.js CHANGED
@@ -9,7 +9,7 @@ import {
9
9
  ToolOutput,
10
10
  getStatusBadge,
11
11
  statusFromToolState
12
- } from "./chunk-PTWCTSZL.js";
12
+ } from "./chunk-AOOIAFDT.js";
13
13
  import "./chunk-TWPHAJNM.js";
14
14
  import "./chunk-3YPT3V7L.js";
15
15
  import "./chunk-3TDHPXZZ.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elabs-ai/components-ai",
3
- "version": "5.3.0",
3
+ "version": "5.4.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -50,9 +50,9 @@
50
50
  "mermaid": "^11.12.2",
51
51
  "react": "^18.2.0 || ^19.0.0",
52
52
  "react-dom": "^18.2.0 || ^19.0.0",
53
- "@elabs-ai/components-icons": "^5.3.0",
54
- "@elabs-ai/components-tokens": "^5.3.0",
55
- "@elabs-ai/components-ui": "^5.3.0"
53
+ "@elabs-ai/components-icons": "^5.4.0",
54
+ "@elabs-ai/components-tokens": "^5.4.0",
55
+ "@elabs-ai/components-ui": "^5.4.0"
56
56
  },
57
57
  "peerDependenciesMeta": {
58
58
  "@rive-app/react-webgl2": {
@@ -87,12 +87,12 @@
87
87
  "tsup": "^8.3.5",
88
88
  "typescript": "^5.7.3",
89
89
  "vitest": "^3.0.2",
90
- "@elabs-ai/components-charts": "5.3.0",
90
+ "@elabs-ai/components-charts": "5.4.0",
91
91
  "@elabs-ai/components-eslint-config": "0.1.0",
92
- "@elabs-ai/components-icons": "5.3.0",
93
- "@elabs-ai/components-tokens": "5.3.0",
92
+ "@elabs-ai/components-icons": "5.4.0",
93
+ "@elabs-ai/components-tokens": "5.4.0",
94
94
  "@elabs-ai/components-typescript-config": "0.1.0",
95
- "@elabs-ai/components-ui": "5.3.0"
95
+ "@elabs-ai/components-ui": "5.4.0"
96
96
  },
97
97
  "scripts": {
98
98
  "build": "tsup",
@@ -260,6 +260,7 @@
260
260
  },
261
261
  "Accordion": {
262
262
  "type": "object",
263
+ "description": "Vertically stacked sections that expand one at a time (or several) to reveal their content.",
263
264
  "properties": {
264
265
  "type": {
265
266
  "const": "Accordion"
@@ -761,7 +762,7 @@
761
762
  "type": "boolean"
762
763
  },
763
764
  "spec": {
764
- "description": "{ data: row[], x: string, series: string[] | { key, label?, axis?: left|right, mark?: line|area|column }[] (type: \"dual-axis\" only: default axis left, mark line; needs ≥1 line series, no right-axis columns), type?: line|area|bar|pie|scatter|radar|funnel|candlestick|heatmap|calendar|waterfall|dumbbell|unit|treemap|histogram|box|strip|bump|stream|diverging-bar|dual-axis, xType?: time|category|number, y2?, axes?: { y2?: { align?: independent|ticks, proportional?: boolean, zero?: both|auto } } (type: \"dual-axis\" only, right axis vs left; default align ticks, zero auto), group?, title?, description?, stacked?: boolean|percent|diverging, orientation?: vertical|horizontal, donut?, legend?: boolean (an object form exists; AutoChart reads it as boolean truthy today), valueFormat?: number|compact|currency|percent, currency?, palette?: mono|sequential|categorical, emphasis?: analytical|editorial, kind?: steps|records|ranking|change (change: a two-measure spec reads as a before/after move, for dumbbell), nulls?: gap|zero|connect (line/area/stream non-numeric sample, default gap), curve?: linear|monotone|natural|step|step-before|step-after (line/area/stream, default monotone), symbols?: { placement?: all|ends|first|last, shape?: circle|square|triangle|diamond|cross|star|plus|hexagon, style?: filled|hollow, size? } (line/area/stream point markers), size?: { key, range?: [lo,hi] } (scatter bubble size), shapeBy?: { key, shapes?: marker-shape[] } (scatter shape by category), trend?: linear|log (scatter trend line), shapes?: [{ kind: line|path, … }] (scatter reference lines/areas), variant?: dumbbell|slope|arrow|dots (dumbbell only, default dumbbell), delta?: { show, mode: absolute|percent } (dumbbell delta label), groupSmall?: { threshold?, max?, label? } (pie: fold small slices into an Other slice), half?: boolean (pie half-donut, default false), labels?: { series?: end|key|none, values?: { placement: first|last|all|peaks, count?, minGap?, outline?, matchColor?, format? }, points?: { key, mode?: auto|all, priorityKey? }, slices?: { placement?: inside|outside|none, show: (label|value|percent)[], matchColor?, minAngle? }, comparison?: value|difference|none } (label engine), annotations?: [{ kind: text|range|line|row, … }] (notes, bands, reference lines, row notes in data units), divergingCenter?: string (neutral series when stacked is diverging), sort?: asc|desc|none|{by,dir} (bar) | start|end|delta|deltaPercent|data|label|none (dumbbell) | desc|none (pie) | data|increasesFirst|decreasesFirst (waterfall, default data), groupBy?: string (bar/dumbbell row grouping; waterfall: a subtotal after each group), colorBy?: { key, scale?: categorical|sequential|diverging, steps? } (bar per-bar / scatter per-point colour), overlays?: [{ kind: value|range, … }] (bar value markers, range spans), comparison?: { key, label? } (bar muted prior-period column), notes?: string (italic notes under an enclosing ChartFrame), byline?: { kind?: chart|map|table, author } (ChartFrame footer: kind + author), source?: string | { name, href? } (ChartFrame footer attribution), altText?: string (image text alternative, default: description), tooltip?: { variant?: rows|table|inline, focus?: boolean, pin?: boolean } (forwarded to ChartTooltip, default rows), facet?: { by: string | { series: true }, columns?, scales?: { y?: shared|independent, rangeRounding? }, sort?: start|end|delta|deltaPercent|range|title|data, baseline?: { key } | { series }, panelHeight? } (line/area/bar/pie small multiples), dataFormat?: differences|runningTotals (waterfall only, default differences), zoomToDifferences?: boolean (waterfall only, default false) }",
765
+ "description": "{ data: row[], x: string, series: string[] | { key, label?, axis?: left|right, mark?: line|area|column }[] (type: \"dual-axis\" only: default axis left, mark line; needs ≥1 line series, no right-axis columns), type?: line|area|bar|pie|scatter|radar|funnel|candlestick|heatmap|calendar|waterfall|dumbbell|unit|treemap|histogram|box|strip|bump|stream|diverging-bar|dual-axis, xType?: time|category|number, y2?, axes?: { y2?: { align?: independent|ticks, proportional?: boolean, zero?: both|auto } } (type: \"dual-axis\" only, right axis vs left; default align ticks, zero auto), group?, title?, description?, stacked?: boolean|percent|diverging, orientation?: vertical|horizontal, donut?, legend?: boolean (an object form exists; AutoChart reads it as boolean truthy today), valueFormat?: number|compact|currency|percent, currency?, palette?: mono|sequential|categorical, emphasis?: analytical|editorial, kind?: steps|records|ranking|change (change: a two-measure spec reads as a before/after move, for dumbbell), nulls?: gap|zero|connect (line/area/stream non-numeric sample, default gap), curve?: linear|monotone|natural|step|step-before|step-after (line/area/stream, default monotone), symbols?: { placement?: all|ends|first|last, shape?: circle|square|triangle|diamond|cross|star|plus|hexagon, style?: filled|hollow, size? } (line/area/stream point markers), size?: { key, range?: [lo,hi] } (scatter bubble size), shapeBy?: { key, shapes?: marker-shape[] } (scatter shape by category), trend?: linear|log (scatter trend line), shapes?: [{ kind: line|path, … }] (scatter reference lines/areas), variant?: dumbbell|slope|arrow|dots (dumbbell only, default dumbbell), delta?: { show, mode: absolute|percent } (dumbbell delta label), groupSmall?: { threshold?, max?, label? } (pie: fold small slices into an Other slice), half?: boolean (pie half-donut, default false), labels?: { series?: end|key|none, values?: { placement: first|last|all|peaks, count?, minGap?, outline?, matchColor?, format? }, points?: { key, mode?: auto|all, priorityKey? }, slices?: { placement?: inside|outside|none, show: (label|value|percent)[], matchColor?, minAngle? }, comparison?: value|difference|none } (label engine), annotations?: [{ kind: text|range|line|row, … }] (notes, bands, reference lines, row notes in data units), analytics?: [{ kind: line|band|trend|window|forecast|errorBars, of?: series|all, … }] (computed overlays — line: { value: mean|median|min|max|sum|number|{ percentile }|{ stddev, around? }, axis?: x|y, label?: none|value|computation|text, ifOverflow?: clip|extend }; band: { from, to } | { spread: { percentiles: [lo,hi] }|{ stddev }|{ ci } }; trend: { model?: linear|log|exp|pow|{ poly: 2..6 }|{ loess }, ci?, extent?: data|domain }; window: { k, reduce?: mean|median|sum|min|max|ewm, replace? }; forecast: { horizon, season?, interval? }; errorBars: { low: field|{ percent }, high?, band? }), selection?: { gestures: (range|rect|lasso|radial)[], confirm?: immediate|explicit, field? } (bar/line/area/scatter/heatmap/histogram/box/strip selection gestures with a toolbar — a bar chart with range and lasso selection is { gestures: [range, lasso] }; explicit previews until the reader confirms; intents arrive as the selectionIntent event), divergingCenter?: string (neutral series when stacked is diverging), sort?: asc|desc|none|{by,dir} (bar) | start|end|delta|deltaPercent|data|label|none (dumbbell) | desc|none (pie) | data|increasesFirst|decreasesFirst (waterfall, default data), groupBy?: string (bar/dumbbell row grouping; waterfall: a subtotal after each group), colorBy?: { key, scale?: categorical|sequential|diverging, steps? } (bar per-bar / scatter per-point colour), overlays?: [{ kind: value|range, … }] (bar value markers, range spans), comparison?: { key, label? } (bar muted prior-period column), notes?: string (italic notes under an enclosing ChartFrame), byline?: { kind?: chart|map|table, author } (ChartFrame footer: kind + author), source?: string | { name, href? } (ChartFrame footer attribution), altText?: string (image text alternative, default: description), tooltip?: { variant?: rows|table|inline, focus?: boolean, pin?: boolean } (forwarded to ChartTooltip, default rows), facet?: { by: string | { series: true }, columns?, scales?: { y?: shared|independent, rangeRounding? }, sort?: start|end|delta|deltaPercent|range|title|data, baseline?: { key } | { series }, panelHeight? } (line/area/bar/pie small multiples), dataFormat?: differences|runningTotals (waterfall only, default differences), zoomToDifferences?: boolean (waterfall only, default false), scrollbar?: miniChart|bar|auto|none (bar/diverging-bar/heatmap/calendar and line/area on a category x: an overview strip that scrolls the categories; default none, or auto when maxVisibleItems is set), maxVisibleItems?: number (categories shown at once, the rest scroll behind the strip and the value axis keeps the full domain; for > 30 categories set maxVisibleItems) }",
765
766
  "type": "object"
766
767
  }
767
768
  },
@@ -773,6 +774,9 @@
773
774
  "properties": {
774
775
  "datapointClick": {
775
776
  "$ref": "#/$defs/action"
777
+ },
778
+ "selectionIntent": {
779
+ "$ref": "#/$defs/action"
776
780
  }
777
781
  },
778
782
  "additionalProperties": false
@@ -1305,6 +1309,7 @@
1305
1309
  },
1306
1310
  "ButtonGroup": {
1307
1311
  "type": "object",
1312
+ "description": "Buttons joined into one connected control — a segmented choice or a set of related actions.",
1308
1313
  "properties": {
1309
1314
  "type": {
1310
1315
  "const": "ButtonGroup"
@@ -2043,6 +2048,7 @@
2043
2048
  },
2044
2049
  "Collapsible": {
2045
2050
  "type": "object",
2051
+ "description": "A single section that toggles between hidden and shown, with a trigger that reports its state.",
2046
2052
  "properties": {
2047
2053
  "type": {
2048
2054
  "const": "Collapsible"
@@ -2909,6 +2915,7 @@
2909
2915
  },
2910
2916
  "Label": {
2911
2917
  "type": "object",
2918
+ "description": "The caption for a form control, wired to it for clicks and assistive technology.",
2912
2919
  "properties": {
2913
2920
  "type": {
2914
2921
  "const": "Label"
@@ -3191,7 +3198,7 @@
3191
3198
  "type": "boolean"
3192
3199
  },
3193
3200
  "columns": {
3194
- "description": "Target columns at the largest breakpoint. Defaults to 4.",
3201
+ "description": "Target columns once the grid's own container is wide enough (container queries, not the viewport — see `colsMap`). Defaults to 4.",
3195
3202
  "enum": [2, 3, 4]
3196
3203
  },
3197
3204
  "featured": {
@@ -3889,6 +3896,7 @@
3889
3896
  },
3890
3897
  "Separator": {
3891
3898
  "type": "object",
3899
+ "description": "A horizontal or vertical divider between regions of the same surface.",
3892
3900
  "properties": {
3893
3901
  "type": {
3894
3902
  "const": "Separator"
@@ -5302,6 +5310,7 @@
5302
5310
  },
5303
5311
  "Textarea": {
5304
5312
  "type": "object",
5313
+ "description": "Multi-line text input, sized by rows and auto-growing when asked.",
5305
5314
  "properties": {
5306
5315
  "type": {
5307
5316
  "const": "Textarea"
@@ -574,7 +574,7 @@
574
574
  "spec": {
575
575
  "type": "object",
576
576
  "required": true,
577
- "description": "{ data: row[], x: string, series: string[] | { key, label?, axis?: left|right, mark?: line|area|column }[] (type: \"dual-axis\" only: default axis left, mark line; needs ≥1 line series, no right-axis columns), type?: line|area|bar|pie|scatter|radar|funnel|candlestick|heatmap|calendar|waterfall|dumbbell|unit|treemap|histogram|box|strip|bump|stream|diverging-bar|dual-axis, xType?: time|category|number, y2?, axes?: { y2?: { align?: independent|ticks, proportional?: boolean, zero?: both|auto } } (type: \"dual-axis\" only, right axis vs left; default align ticks, zero auto), group?, title?, description?, stacked?: boolean|percent|diverging, orientation?: vertical|horizontal, donut?, legend?: boolean (an object form exists; AutoChart reads it as boolean truthy today), valueFormat?: number|compact|currency|percent, currency?, palette?: mono|sequential|categorical, emphasis?: analytical|editorial, kind?: steps|records|ranking|change (change: a two-measure spec reads as a before/after move, for dumbbell), nulls?: gap|zero|connect (line/area/stream non-numeric sample, default gap), curve?: linear|monotone|natural|step|step-before|step-after (line/area/stream, default monotone), symbols?: { placement?: all|ends|first|last, shape?: circle|square|triangle|diamond|cross|star|plus|hexagon, style?: filled|hollow, size? } (line/area/stream point markers), size?: { key, range?: [lo,hi] } (scatter bubble size), shapeBy?: { key, shapes?: marker-shape[] } (scatter shape by category), trend?: linear|log (scatter trend line), shapes?: [{ kind: line|path, … }] (scatter reference lines/areas), variant?: dumbbell|slope|arrow|dots (dumbbell only, default dumbbell), delta?: { show, mode: absolute|percent } (dumbbell delta label), groupSmall?: { threshold?, max?, label? } (pie: fold small slices into an Other slice), half?: boolean (pie half-donut, default false), labels?: { series?: end|key|none, values?: { placement: first|last|all|peaks, count?, minGap?, outline?, matchColor?, format? }, points?: { key, mode?: auto|all, priorityKey? }, slices?: { placement?: inside|outside|none, show: (label|value|percent)[], matchColor?, minAngle? }, comparison?: value|difference|none } (label engine), annotations?: [{ kind: text|range|line|row, … }] (notes, bands, reference lines, row notes in data units), divergingCenter?: string (neutral series when stacked is diverging), sort?: asc|desc|none|{by,dir} (bar) | start|end|delta|deltaPercent|data|label|none (dumbbell) | desc|none (pie) | data|increasesFirst|decreasesFirst (waterfall, default data), groupBy?: string (bar/dumbbell row grouping; waterfall: a subtotal after each group), colorBy?: { key, scale?: categorical|sequential|diverging, steps? } (bar per-bar / scatter per-point colour), overlays?: [{ kind: value|range, … }] (bar value markers, range spans), comparison?: { key, label? } (bar muted prior-period column), notes?: string (italic notes under an enclosing ChartFrame), byline?: { kind?: chart|map|table, author } (ChartFrame footer: kind + author), source?: string | { name, href? } (ChartFrame footer attribution), altText?: string (image text alternative, default: description), tooltip?: { variant?: rows|table|inline, focus?: boolean, pin?: boolean } (forwarded to ChartTooltip, default rows), facet?: { by: string | { series: true }, columns?, scales?: { y?: shared|independent, rangeRounding? }, sort?: start|end|delta|deltaPercent|range|title|data, baseline?: { key } | { series }, panelHeight? } (line/area/bar/pie small multiples), dataFormat?: differences|runningTotals (waterfall only, default differences), zoomToDifferences?: boolean (waterfall only, default false) }"
577
+ "description": "{ data: row[], x: string, series: string[] | { key, label?, axis?: left|right, mark?: line|area|column }[] (type: \"dual-axis\" only: default axis left, mark line; needs ≥1 line series, no right-axis columns), type?: line|area|bar|pie|scatter|radar|funnel|candlestick|heatmap|calendar|waterfall|dumbbell|unit|treemap|histogram|box|strip|bump|stream|diverging-bar|dual-axis, xType?: time|category|number, y2?, axes?: { y2?: { align?: independent|ticks, proportional?: boolean, zero?: both|auto } } (type: \"dual-axis\" only, right axis vs left; default align ticks, zero auto), group?, title?, description?, stacked?: boolean|percent|diverging, orientation?: vertical|horizontal, donut?, legend?: boolean (an object form exists; AutoChart reads it as boolean truthy today), valueFormat?: number|compact|currency|percent, currency?, palette?: mono|sequential|categorical, emphasis?: analytical|editorial, kind?: steps|records|ranking|change (change: a two-measure spec reads as a before/after move, for dumbbell), nulls?: gap|zero|connect (line/area/stream non-numeric sample, default gap), curve?: linear|monotone|natural|step|step-before|step-after (line/area/stream, default monotone), symbols?: { placement?: all|ends|first|last, shape?: circle|square|triangle|diamond|cross|star|plus|hexagon, style?: filled|hollow, size? } (line/area/stream point markers), size?: { key, range?: [lo,hi] } (scatter bubble size), shapeBy?: { key, shapes?: marker-shape[] } (scatter shape by category), trend?: linear|log (scatter trend line), shapes?: [{ kind: line|path, … }] (scatter reference lines/areas), variant?: dumbbell|slope|arrow|dots (dumbbell only, default dumbbell), delta?: { show, mode: absolute|percent } (dumbbell delta label), groupSmall?: { threshold?, max?, label? } (pie: fold small slices into an Other slice), half?: boolean (pie half-donut, default false), labels?: { series?: end|key|none, values?: { placement: first|last|all|peaks, count?, minGap?, outline?, matchColor?, format? }, points?: { key, mode?: auto|all, priorityKey? }, slices?: { placement?: inside|outside|none, show: (label|value|percent)[], matchColor?, minAngle? }, comparison?: value|difference|none } (label engine), annotations?: [{ kind: text|range|line|row, … }] (notes, bands, reference lines, row notes in data units), analytics?: [{ kind: line|band|trend|window|forecast|errorBars, of?: series|all, … }] (computed overlays — line: { value: mean|median|min|max|sum|number|{ percentile }|{ stddev, around? }, axis?: x|y, label?: none|value|computation|text, ifOverflow?: clip|extend }; band: { from, to } | { spread: { percentiles: [lo,hi] }|{ stddev }|{ ci } }; trend: { model?: linear|log|exp|pow|{ poly: 2..6 }|{ loess }, ci?, extent?: data|domain }; window: { k, reduce?: mean|median|sum|min|max|ewm, replace? }; forecast: { horizon, season?, interval? }; errorBars: { low: field|{ percent }, high?, band? }), selection?: { gestures: (range|rect|lasso|radial)[], confirm?: immediate|explicit, field? } (bar/line/area/scatter/heatmap/histogram/box/strip selection gestures with a toolbar — a bar chart with range and lasso selection is { gestures: [range, lasso] }; explicit previews until the reader confirms; intents arrive as the selectionIntent event), divergingCenter?: string (neutral series when stacked is diverging), sort?: asc|desc|none|{by,dir} (bar) | start|end|delta|deltaPercent|data|label|none (dumbbell) | desc|none (pie) | data|increasesFirst|decreasesFirst (waterfall, default data), groupBy?: string (bar/dumbbell row grouping; waterfall: a subtotal after each group), colorBy?: { key, scale?: categorical|sequential|diverging, steps? } (bar per-bar / scatter per-point colour), overlays?: [{ kind: value|range, … }] (bar value markers, range spans), comparison?: { key, label? } (bar muted prior-period column), notes?: string (italic notes under an enclosing ChartFrame), byline?: { kind?: chart|map|table, author } (ChartFrame footer: kind + author), source?: string | { name, href? } (ChartFrame footer attribution), altText?: string (image text alternative, default: description), tooltip?: { variant?: rows|table|inline, focus?: boolean, pin?: boolean } (forwarded to ChartTooltip, default rows), facet?: { by: string | { series: true }, columns?, scales?: { y?: shared|independent, rangeRounding? }, sort?: start|end|delta|deltaPercent|range|title|data, baseline?: { key } | { series }, panelHeight? } (line/area/bar/pie small multiples), dataFormat?: differences|runningTotals (waterfall only, default differences), zoomToDifferences?: boolean (waterfall only, default false), scrollbar?: miniChart|bar|auto|none (bar/diverging-bar/heatmap/calendar and line/area on a category x: an overview strip that scrolls the categories; default none, or auto when maxVisibleItems is set), maxVisibleItems?: number (categories shown at once, the rest scroll behind the strip and the value axis keeps the full domain; for > 30 categories set maxVisibleItems) }"
578
578
  },
579
579
  "height": {
580
580
  "type": "number",
@@ -585,7 +585,8 @@
585
585
  }
586
586
  },
587
587
  "events": {
588
- "datapointClick": "onDatapointClick"
588
+ "datapointClick": "onDatapointClick",
589
+ "selectionIntent": "onSelectionIntent"
589
590
  },
590
591
  "omit": ["copyValueOnActivate", "dimExcluded"]
591
592
  },
@@ -25,6 +25,8 @@ export const A2UI_CATALOG_SCHEMA: A2uiCatalogSchema = {
25
25
  change: "onValueChange",
26
26
  },
27
27
  source: "@elabs-ai/components-ui",
28
+ summary:
29
+ "Vertically stacked sections that expand one at a time (or several) to reveal their content.",
28
30
  },
29
31
  AccordionContent: {
30
32
  children: true,
@@ -188,6 +190,8 @@ export const A2UI_CATALOG_SCHEMA: A2uiCatalogSchema = {
188
190
  },
189
191
  events: {},
190
192
  source: "@elabs-ai/components-ui",
193
+ summary:
194
+ "Buttons joined into one connected control — a segmented choice or a set of related actions.",
191
195
  },
192
196
  Card: {
193
197
  children: true,
@@ -297,6 +301,8 @@ export const A2UI_CATALOG_SCHEMA: A2uiCatalogSchema = {
297
301
  change: "onOpenChange",
298
302
  },
299
303
  source: "@elabs-ai/components-ui",
304
+ summary:
305
+ "A single section that toggles between hidden and shown, with a trigger that reports its state.",
300
306
  },
301
307
  CollapsibleContent: {
302
308
  children: true,
@@ -460,6 +466,7 @@ export const A2UI_CATALOG_SCHEMA: A2uiCatalogSchema = {
460
466
  },
461
467
  events: {},
462
468
  source: "@elabs-ai/components-ui",
469
+ summary: "The caption for a form control, wired to it for clicks and assistive technology.",
463
470
  },
464
471
  MetricCard: {
465
472
  children: false,
@@ -691,6 +698,7 @@ export const A2UI_CATALOG_SCHEMA: A2uiCatalogSchema = {
691
698
  },
692
699
  events: {},
693
700
  source: "@elabs-ai/components-ui",
701
+ summary: "A horizontal or vertical divider between regions of the same surface.",
694
702
  },
695
703
  Slider: {
696
704
  children: false,
@@ -1002,6 +1010,7 @@ export const A2UI_CATALOG_SCHEMA: A2uiCatalogSchema = {
1002
1010
  change: "onChange",
1003
1011
  },
1004
1012
  source: "@elabs-ai/components-ui",
1013
+ summary: "Multi-line text input, sized by rows and auto-growing when asked.",
1005
1014
  },
1006
1015
  Timeline: {
1007
1016
  children: false,
@@ -1049,7 +1049,7 @@ const meta = {
1049
1049
  subtitle: "For copilots and agentic products",
1050
1050
  description: {
1051
1051
  component:
1052
- "A full-page demo scenario composed from the @elabs-ai/components-* grammar: a double-sided application shell (collapsible left nav + the real ContextPanel right rail with animated collapse and asset drill-in) wrapping a complete agentic AI interaction — reasoning, a plan, the AgentTimeline execution rail, tools with JSON behind disclosure, a ToolResultCard chart headline, an ApprovalCard decision, a task summary, a checkpoint, and a grounded AgentMessage answer with an EvidenceChip and a SourceList.",
1052
+ "A full-page agent workspace composed from the @elabs-ai/components-* grammar: a double-sided application shell (collapsible left nav + the real ContextPanel right rail with animated collapse and asset drill-in) wrapping a complete agentic AI interaction — reasoning, a plan, the AgentTimeline execution rail, tools with JSON behind disclosure, a ToolResultCard chart headline, an ApprovalCard decision, a task summary, a checkpoint, and a grounded AgentMessage answer with an EvidenceChip and a SourceList.",
1053
1053
  },
1054
1054
  },
1055
1055
  },
package/src/tool.test.tsx CHANGED
@@ -32,6 +32,32 @@ describe("Tool JSON-behind-disclosure (#192, research 10 §B.5)", () => {
32
32
  });
33
33
  });
34
34
 
35
+ describe("ToolHeader layout in narrow containers (#598)", () => {
36
+ it("StatusBadge element has shrink-0 class to prevent clipping in narrow flex containers", () => {
37
+ const { container } = render(
38
+ <Tool>
39
+ <ToolHeader type="tool-search_web" state="output-available" summary="3 results found" />
40
+ </Tool>,
41
+ );
42
+ // StatusBadge renders as a span with data-slot="status-badge"
43
+ const statusBadgeSpan = container.querySelector('span[data-slot="status-badge"]');
44
+ expect(statusBadgeSpan).not.toBeNull();
45
+ expect(statusBadgeSpan).toHaveClass("shrink-0");
46
+ });
47
+
48
+ it("title span has min-w-0 and truncate classes to yield space to fixed-width siblings", () => {
49
+ render(
50
+ <Tool>
51
+ <ToolHeader type="tool-search_web" state="output-available" title="Search Tool" />
52
+ </Tool>,
53
+ );
54
+ // Find the title span (it contains the title text and comes after the wrench icon)
55
+ const titleSpan = screen.getByText("Search Tool");
56
+ expect(titleSpan).toHaveClass("min-w-0");
57
+ expect(titleSpan).toHaveClass("truncate");
58
+ });
59
+ });
60
+
35
61
  describe("ToolOutput isStreaming (#269, loading-states.md)", () => {
36
62
  it("renders a skeleton (not null) while streaming with no output yet", () => {
37
63
  const { container } = render(
package/src/tool.tsx CHANGED
@@ -101,8 +101,8 @@ export const ToolHeader = ({
101
101
  >
102
102
  <div className="flex min-w-0 items-center gap-2">
103
103
  <WrenchIcon className="size-4 shrink-0 text-muted-foreground" />
104
- <span className="shrink-0 text-body font-medium">{title ?? derivedName}</span>
105
- {getStatusBadge(state)}
104
+ <span className="min-w-0 truncate text-body font-medium">{title ?? derivedName}</span>
105
+ <StatusBadge status={statusFromToolState(state)} className="shrink-0" />
106
106
  {summary ? (
107
107
  <span className="truncate text-meta text-muted-foreground">{summary}</span>
108
108
  ) : null}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tool.tsx"],"sourcesContent":["\"use client\";\n\nimport { Skeleton, StatusBadge, useLocale, type Status } from \"@elabs-ai/components-ui\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { DynamicToolUIPart, ToolUIPart } from \"ai\";\nimport { ChevronDownIcon, WrenchIcon } from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { isValidElement } from \"react\";\nimport type { BundledLanguage } from \"shiki\";\n\nimport { CodeBlock } from \"./code-block\";\n\nexport type ToolProps = ComponentProps<typeof Collapsible>;\n\nexport const Tool = ({ className, ...props }: ToolProps) => (\n <Collapsible\n className={cn(\"group not-prose mb-4 w-full rounded-md border\", className)}\n {...props}\n />\n);\n\nexport type ToolPart = ToolUIPart | DynamicToolUIPart;\n\n/**\n * `JSON.stringify` throws on a circular reference or a `BigInt` — both\n * realistic shapes for tool input/output payloads a model produced. Falls\n * back to a readable placeholder instead of crashing the message render.\n */\nfunction safeJsonStringify(value: unknown): string {\n try {\n return JSON.stringify(value, (_key, v) => (typeof v === \"bigint\" ? `${v.toString()}n` : v), 2);\n } catch {\n return String(value);\n }\n}\n\nexport type ToolHeaderProps = {\n title?: string;\n /**\n * The business summary line (\"3 documents found\", \"8 rows reconciled\"),\n * shown beside the name + StatusBadge (#192, research 10 §B.5). Falls back\n * to nothing — the derived tool name still labels the row.\n */\n summary?: ReactNode;\n className?: string;\n} & (\n | { type: ToolUIPart[\"type\"]; state: ToolUIPart[\"state\"]; toolName?: never }\n | {\n type: DynamicToolUIPart[\"type\"];\n state: DynamicToolUIPart[\"state\"];\n toolName: string;\n }\n);\n\n/**\n * Map the AI-SDK `ToolUIPart` 7-state machine onto the canonical `Status`\n * enum (#189, research 10 §B.1 mapping a). Lives here — not in `@elabs-ai/components-ui` —\n * because it is typed against the SDK union; the `ai` import stays TYPES-ONLY\n * (D6, gate-enforced by `pnpm ai:types-only`).\n */\nexport const statusFromToolState = (state: ToolPart[\"state\"]): Status => {\n switch (state) {\n case \"input-streaming\":\n return \"pending\";\n case \"input-available\":\n return \"running\";\n case \"approval-requested\":\n return \"awaiting-approval\";\n case \"approval-responded\":\n return \"running\";\n case \"output-available\":\n return \"complete\";\n case \"output-denied\":\n return \"denied\";\n case \"output-error\":\n return \"failed\";\n }\n};\n\n/** Same signature as before #189; renders the canonical StatusBadge. */\nexport const getStatusBadge = (status: ToolPart[\"state\"]) => (\n <StatusBadge status={statusFromToolState(status)} />\n);\n\nexport const ToolHeader = ({\n className,\n title,\n summary,\n type,\n state,\n toolName,\n ...props\n}: ToolHeaderProps) => {\n const derivedName = type === \"dynamic-tool\" ? toolName : type.split(\"-\").slice(1).join(\"-\");\n\n return (\n <CollapsibleTrigger\n className={cn(\"flex w-full items-center justify-between gap-4 p-3\", className)}\n {...props}\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <WrenchIcon className=\"size-4 shrink-0 text-muted-foreground\" />\n <span className=\"shrink-0 text-body font-medium\">{title ?? derivedName}</span>\n {getStatusBadge(state)}\n {summary ? (\n <span className=\"truncate text-meta text-muted-foreground\">{summary}</span>\n ) : null}\n </div>\n <ChevronDownIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-180\" />\n </CollapsibleTrigger>\n );\n};\n\nexport type ToolContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const ToolContent = ({ className, ...props }: ToolContentProps) => (\n <CollapsibleContent\n className={cn(\n \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 space-y-4 p-4 text-popover-foreground outline-none data-[state=closed]:animate-out data-[state=open]:animate-in data-[state=open]:[--tw-ease:var(--ease-entrance)] data-[state=closed]:[--tw-ease:var(--ease-exit)]\",\n className,\n )}\n {...props}\n />\n);\n\nexport type ToolDetailsProps = ComponentProps<typeof Collapsible> & {\n /** The disclosure label. */\n label?: ReactNode;\n};\n\n/**\n * The technical view, behind disclosure — the PACKAGE DEFAULT for tool JSON\n * (#192, research 10 §B.5): a nested collapsible, COLLAPSED by default,\n * holding `ToolInput`/`ToolOutput`. The header carries the business `summary`;\n * the raw payload is one expand away, never the headline.\n */\nexport const ToolDetails = ({\n className,\n label,\n defaultOpen = false,\n children,\n ...props\n}: ToolDetailsProps) => {\n const { t } = useLocale();\n return (\n <Collapsible\n className={cn(\"group/tool-details not-prose\", className)}\n defaultOpen={defaultOpen}\n {...props}\n >\n <CollapsibleTrigger className=\"flex items-center gap-1 rounded-sm text-meta text-muted-foreground transition-colors hover:text-foreground focus-ring\">\n <ChevronDownIcon className=\"size-3.5 transition-transform group-data-[state=open]/tool-details:rotate-180\" />\n {label ?? t(\"ai.tool.showTechnicalDetails\")}\n </CollapsibleTrigger>\n <CollapsibleContent className=\"mt-3 space-y-4\">{children}</CollapsibleContent>\n </Collapsible>\n );\n};\n\nexport type ToolInputProps = ComponentProps<\"div\"> & {\n input: ToolPart[\"input\"];\n};\n\nexport const ToolInput = ({ className, input, ...props }: ToolInputProps) => {\n const { t } = useLocale();\n return (\n <div className={cn(\"space-y-2 overflow-hidden\", className)} {...props}>\n <h4 className=\"text-eyebrow uppercase text-muted-foreground\">\n {t(\"ai.schemaDisplay.parameters\")}\n </h4>\n <div className=\"rounded-md bg-muted/50\">\n <CodeBlock code={safeJsonStringify(input)} language=\"json\" />\n </div>\n </div>\n );\n};\n\nexport type ToolOutputProps = ComponentProps<\"div\"> & {\n /**\n * The tool result. Objects/strings render as JSON inside the technical view.\n *\n * @deprecated Passing a pre-rendered **React element** here (the \"rich\n * output under a muted Result heading\" path) is deprecated since #192\n * (research 10 §B.5): a produced artifact is the HEADLINE, not a technical\n * detail — host it in a `<ToolResultCard>` and keep `ToolOutput` for the\n * JSON payload behind `<ToolDetails>`. The element path still renders for\n * existing consumers (e.g. the copy-owned `ai-chart` registry block) but\n * will be removed in a future release.\n */\n output: ToolPart[\"output\"];\n errorText: ToolPart[\"errorText\"];\n /**\n * The call has not produced output yet (loading-states.md `isStreaming`) —\n * derive it from the existing `statusFromToolState(state)` mapping\n * (`\"input-streaming\"`/`\"input-available\"` → not yet `\"complete\"`/`\"failed\"`)\n * rather than a second source of truth. While true and no `output`/\n * `errorText` has arrived, renders a layout-shaped skeleton in the Result\n * slot instead of `null`, so the technical view reserves its space. A\n * still-running call is never a terminal failure — the error branch is\n * suppressed while `isStreaming` per the loading-states.md error rule, even\n * if a stale `errorText` is still set from a previous render.\n * @default false\n */\n isStreaming?: boolean;\n};\n\nexport const ToolOutput = ({\n className,\n output,\n errorText,\n isStreaming = false,\n ...props\n}: ToolOutputProps) => {\n const { t } = useLocale();\n\n // `output` is a defined-but-falsy result (`0`, `false`, `\"\"`) for plenty of\n // real tools (a count, a boolean check, an empty-string field) — only\n // `undefined` means \"no output (yet)\".\n const hasOutput = output !== undefined;\n\n if (!(hasOutput || errorText || isStreaming)) {\n return null;\n }\n\n const showError = !isStreaming && Boolean(errorText);\n const pending = isStreaming && !hasOutput && !errorText;\n\n let Output: ReactNode = null;\n\n if (hasOutput) {\n if (isValidElement(output)) {\n Output = output;\n } else if (typeof output === \"string\") {\n // A tool result is arbitrary text, not guaranteed JSON — forcing the\n // JSON highlighter on it mis-colours ordinary strings. Shiki's own\n // `BundledLanguage` union (grammar-backed languages) omits its\n // hard-coded plain-text pseudo-languages (`isPlainLang`:\n // \"plaintext\" | \"txt\" | \"text\" | \"plain\") — `createHighlighter`/\n // `codeToTokens` accept and special-case them with no grammar load\n // (verified: `getLoadedLanguages()` stays empty, no throw), so this\n // is a type-only gap, not a runtime one.\n Output = <CodeBlock code={output} language={\"text\" as BundledLanguage} />;\n } else {\n // Objects, arrays, numbers, booleans, null, bigint — all safe to\n // stringify for display.\n Output = <CodeBlock code={safeJsonStringify(output)} language=\"json\" />;\n }\n }\n\n return (\n <div className={cn(\"space-y-2\", className)} {...props}>\n <h4 className=\"text-eyebrow uppercase text-muted-foreground\">\n {showError ? t(\"ai.tool.error\") : t(\"ai.tool.result\")}\n </h4>\n {pending ? (\n <div className=\"space-y-2 rounded-md bg-muted/50 p-3\" role=\"status\" aria-live=\"polite\">\n <span className=\"sr-only\">{t(\"loading\")}</span>\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n ) : (\n <div\n className={cn(\n \"overflow-x-auto rounded-md text-caption [&_table]:w-full\",\n // #124: this colours the ambient text of the error/result body —\n // running text, so the error branch takes the ink rung.\n showError ? \"bg-destructive/10 text-destructive-text\" : \"bg-muted/50 text-foreground\",\n )}\n >\n {showError && <div>{errorText}</div>}\n {Output}\n </div>\n )}\n </div>\n );\n};\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/a2ui/core/catalog.generated.ts"],"sourcesContent":["// GENERATED by packages/cli/scripts/gen-a2ui-catalog.mjs from\n// packages/ai/src/a2ui/catalog.source.json + brand-ui.manifest.json — do not edit;\n// edit the source file (or the component) and run `pnpm gen`.\nimport type { A2uiCatalogSchema } from \"./spec\";\n\nexport const A2UI_CATALOG_VERSION = \"1\";\n\nexport const A2UI_CATALOG_SCHEMA: A2uiCatalogSchema = {\n Accordion: {\n children: true,\n props: {\n collapsible: {\n type: \"boolean\",\n },\n defaultValue: {\n type: \"string\",\n },\n type: {\n enum: [\"single\", \"multiple\"],\n required: true,\n type: \"string\",\n },\n },\n events: {\n change: \"onValueChange\",\n },\n source: \"@elabs-ai/components-ui\",\n },\n AccordionContent: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n AccordionItem: {\n children: true,\n props: {\n value: {\n type: \"string\",\n required: true,\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n AccordionTrigger: {\n children: true,\n props: {\n headingLevel: {\n type: \"number\",\n enum: [2, 3, 4, 5, 6],\n description:\n \"The heading level Radix's `Accordion.Header` renders. Radix hardcodes `h3`, which skips a level whenever the accordion sits directly under the page `h1` — so…\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Alert: {\n children: true,\n props: {\n variant: {\n type: \"string\",\n enum: [\"default\", \"destructive\", \"success\", \"warning\", \"info\"],\n default: \"default\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Compose AlertTitle + AlertDescription inside.\",\n },\n AlertDescription: {\n children: true,\n props: {\n measure: {\n type: \"boolean\",\n description:\n \"Cap the line length to a readable prose measure (`max-w-prose`, ~65ch) for genuine paragraph content (#339). Off by default — short, label-style descriptions…\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n AlertTitle: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Avatar: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Compose AvatarFallback (initials) inside.\",\n },\n AvatarFallback: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Badge: {\n children: true,\n props: {\n variant: {\n type: \"string\",\n enum: [\"default\", \"secondary\", \"outline\", \"success\", \"warning\", \"destructive\", \"info\"],\n default: \"default\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Compact status/label chip (status, count, category).\",\n },\n BentoGrid: {\n children: true,\n props: {\n spotlight: {\n type: \"boolean\",\n description:\n \"Enable the cursor-following spotlight on every tile in this grid. Individual tiles can still opt out (or in) with their own `spotlight` prop. Disabled entire…\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Feature/bento grid; children are BentoGridItem.\",\n },\n BentoGridItem: {\n children: true,\n props: {\n size: {\n type: \"string\",\n description:\n 'Size preset. Resolves to a col + row span. Overridden by explicit `span`. @default \"sm\"',\n enum: [\"sm\", \"md\", \"lg\", \"hero\"],\n },\n span: {\n type: \"object\",\n description:\n \"Explicit grid span. Wins over `size`. Spans clamp gracefully on narrow layouts — a `col: 4` on a 2-col grid becomes `span min(4, 2)`.\",\n },\n spotlight: {\n type: \"boolean\",\n description:\n \"Enable the cursor-following spotlight gradient on this tile. Omit to inherit the parent `BentoGrid`'s `spotlight` (itself `false` by default) — so the effect…\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Button: {\n children: true,\n props: {\n disabled: {\n type: \"boolean\",\n },\n size: {\n type: \"string\",\n enum: [\"sm\", \"default\", \"lg\", \"icon\", \"icon-sm\", \"icon-lg\"],\n default: \"default\",\n },\n type: {\n enum: [\"button\", \"submit\"],\n default: \"button\",\n type: \"string\",\n },\n variant: {\n type: \"string\",\n enum: [\"default\", \"secondary\", \"destructive\", \"outline\", \"outline-subtle\", \"ghost\", \"link\"],\n default: \"default\",\n },\n },\n events: {\n click: \"onClick\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: 'An action. Bind `on.click`; one `variant: \"default\"` per group.',\n },\n ButtonGroup: {\n children: true,\n props: {\n orientation: {\n type: \"string\",\n enum: [\"horizontal\", \"vertical\"],\n default: \"horizontal\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Card: {\n children: true,\n props: {\n detail: {\n type: \"node\",\n description:\n \"Optional detail-panel content. **Undefined → a plain card** (today's single `<div>` — no grid, no panel, zero behaviour change).\",\n },\n detailLabel: {\n type: \"string\",\n description: 'Accessible label for the detail region. @default \"Details\"',\n },\n detailPlacement: {\n type: \"string\",\n enum: [\"side\", \"bottom\"],\n description: 'Which edge the detail panel sits on. @default \"side\"',\n },\n interactive: {\n type: \"string\",\n enum: [\"true\", \"false\"],\n default: \"false\",\n },\n stacked: {\n type: \"boolean\",\n description:\n \"Opt-in hairline gesture: the edges of two sheets stacked behind the card's top edge (the `hairline-stack` utility). It draws OUTSIDE the card, so it needs ~1…\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"The one generic surface — compose CardHeader / CardContent / CardFooter inside.\",\n },\n CardAction: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"The header's trailing action slot (a Button, a Badge).\",\n },\n CardContent: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n CardDescription: {\n children: true,\n props: {\n measure: {\n type: \"boolean\",\n description:\n \"Cap the line length to a readable prose measure (`max-w-prose`, ~65ch) for genuine paragraph content (#339). Off by default — short, subtitle-style descripti…\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n CardFooter: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n CardHeader: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n CardTitle: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Checkbox: {\n children: false,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n defaultChecked: {\n type: \"boolean\",\n },\n disabled: {\n type: \"boolean\",\n },\n id: {\n type: \"string\",\n },\n },\n events: {\n change: \"onCheckedChange\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: \"Binary on/off toggle within a form (multi-select within a group).\",\n },\n Collapsible: {\n children: true,\n props: {\n defaultOpen: {\n type: \"boolean\",\n },\n },\n events: {\n change: \"onOpenChange\",\n },\n source: \"@elabs-ai/components-ui\",\n },\n CollapsibleContent: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n CollapsibleTrigger: {\n children: true,\n props: {\n asChild: {\n type: \"boolean\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Descriptions: {\n children: true,\n props: {\n columns: {\n type: \"number\",\n enum: [1, 2, 3],\n description:\n \"Number of columns at the widest breakpoint. Collapses to a single column on small screens. Default 1.\",\n },\n layout: {\n type: \"string\",\n description:\n \"`horizontal` places the label beside the value; `vertical` stacks the label above the value. Default `horizontal`.\",\n enum: [\"horizontal\", \"vertical\"],\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Key–value list; children are DescriptionsItem.\",\n },\n DescriptionsItem: {\n children: true,\n props: {\n label: {\n type: \"node\",\n required: true,\n description: \"The term / label for this entry.\",\n },\n numeric: {\n type: \"boolean\",\n description:\n \"When the value is numeric, set this so the value uses `tabular-nums` for aligned digits.\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n EmptyState: {\n children: false,\n props: {\n actions: {\n type: \"node\",\n description: \"Primary/secondary actions.\",\n },\n description: {\n type: \"node\",\n },\n icon: {\n type: \"node\",\n description:\n \"Optional icon shown above the title, clamped to a fixed 40×40 (this wrapper only ever forwards `icon` to `StatePanel`, never `illustration` — for a larger, u…\",\n },\n title: {\n type: \"node\",\n required: true,\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Nothing here yet — title, description, optional actions.\",\n },\n Grid: {\n builtin: true,\n children: true,\n props: {\n columns: {\n enum: [1, 2, 3, 4],\n default: 2,\n type: \"number\",\n },\n gap: {\n enum: [\"none\", \"xs\", \"sm\", \"md\", \"lg\"],\n default: \"md\",\n type: \"string\",\n },\n },\n events: {},\n source: \"builtin\",\n summary: \"Responsive CSS grid, 1–4 equal columns (collapses to one column on narrow screens).\",\n },\n Heading: {\n children: true,\n props: {\n level: {\n type: \"number\",\n description: \"Semantic heading level — drives the rendered tag AND the default size.\",\n enum: [1, 2, 3, 4, 5, 6],\n default: 2,\n },\n size: {\n type: \"string\",\n enum: [\"display-lg\", \"display\", \"title\", \"subtitle\"],\n default: \"title\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Section heading; `level` sets the HTML rank (1–6), `size` the type role.\",\n },\n Input: {\n children: false,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n defaultValue: {\n type: \"string\",\n },\n disabled: {\n type: \"boolean\",\n },\n id: {\n type: \"string\",\n },\n placeholder: {\n type: \"string\",\n },\n required: {\n type: \"boolean\",\n },\n type: {\n enum: [\"text\", \"email\", \"number\", \"password\", \"search\", \"tel\", \"url\", \"date\"],\n type: \"string\",\n },\n },\n events: {\n change: \"onChange\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: \"Single-line text field — the base form input.\",\n },\n Kbd: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Label: {\n children: true,\n props: {\n htmlFor: {\n type: \"string\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n MetricCard: {\n children: false,\n props: {\n currency: {\n type: \"string\",\n description: 'ISO 4217 code for `valueFormat: \"currency\"`. Default: `\"USD\"`.',\n },\n delta: {\n type: \"string\",\n description: 'Signed change, e.g. \"+12.4%\". Direction colors it.',\n },\n deltaDirection: {\n type: \"string\",\n enum: [\"up\", \"down\", \"neutral\"],\n },\n description: {\n type: \"node\",\n description: \"Secondary line under the value — sublabel / context.\",\n },\n evidence: {\n type: \"node\",\n description:\n \"Optional grounding footer (research 11 §B.5 KPI-3) — connects a cited figure to its source (e.g. an `EvidenceChip` from `@elabs-ai/components-ai`). Rendered …\",\n },\n label: {\n type: \"node\",\n required: true,\n },\n loading: {\n type: \"boolean\",\n description:\n \"Loading vs ready — renders a layout-shaped skeleton (matching the real box height) instead of the value/label/delta text. Default: `false`.\",\n },\n positiveIsGood: {\n type: \"boolean\",\n description: 'Whether \"up\" is good (green) — flip for metrics where down is good.',\n },\n sparkline: {\n type: \"node\",\n description:\n 'Trend slot rendered directly under the value (RM-072) — pass a `<Sparkline …/>` from `@elabs-ai/components-charts`. Hidden at `size=\"sm\"`.',\n },\n value: {\n type: \"node\",\n required: true,\n },\n valueFormat: {\n type: \"string\",\n description:\n 'How to render a NUMERIC `value`. Default: `\"compact\"`. Ignored for every other `ReactNode` — a string you already formatted is rendered verbatim.',\n enum: [\"number\", \"compact\", \"currency\", \"percent\"],\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"One KPI: label, value, optional delta. Put several in a Grid.\",\n },\n Progress: {\n children: false,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n marker: {\n type: \"number\",\n description:\n 'Reference point (0–100, same scale as `value`) — e.g. an \"expected by today\" pace or a target — rendered as a thin vertical tick on the track. Unset (default…',\n },\n markerLabel: {\n type: \"string\",\n description:\n 'What `marker` represents (already localized by the caller — e.g. `\"expected 70% by today\"`). When set, it is appended to the progress bar\\'s accessible value …',\n },\n max: {\n type: \"number\",\n },\n value: {\n type: \"number\",\n required: true,\n },\n variant: {\n type: \"string\",\n enum: [\"default\", \"success\", \"warning\", \"destructive\"],\n default: \"default\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n RadioGroup: {\n children: true,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n defaultValue: {\n type: \"string\",\n },\n },\n events: {\n change: \"onValueChange\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: \"Mutually-exclusive single choice from a small visible set.\",\n },\n RadioGroupItem: {\n children: false,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n disabled: {\n type: \"boolean\",\n },\n id: {\n type: \"string\",\n },\n value: {\n type: \"string\",\n required: true,\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n SectionHeader: {\n children: false,\n props: {\n actions: {\n type: \"node\",\n description: \"Right-aligned actions (buttons, menus).\",\n },\n description: {\n type: \"node\",\n },\n eyebrow: {\n type: \"node\",\n description: \"Optional element rendered above the title (eyebrow / breadcrumbs).\",\n },\n size: {\n type: \"string\",\n enum: [\"default\", \"lg\"],\n description:\n 'Title size: `\"default\"` (`text-title`) for a section inside a screen; `\"lg\"` (`text-display`, description at a readable measure) for the sections of a LONG p…',\n },\n title: {\n type: \"node\",\n required: true,\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Title + description + optional actions above a region.\",\n },\n Select: {\n children: true,\n props: {\n defaultValue: {\n type: \"string\",\n },\n disabled: {\n type: \"boolean\",\n },\n },\n events: {\n change: \"onValueChange\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: \"Compose SelectTrigger (SelectValue) + SelectContent (SelectItem…).\",\n },\n SelectContent: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n SelectItem: {\n children: true,\n props: {\n disabled: {\n type: \"boolean\",\n },\n value: {\n type: \"string\",\n required: true,\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n SelectTrigger: {\n children: true,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n autoTitle: {\n type: \"boolean\",\n description:\n \"Auto-set a native `title` from the trigger's rendered text — but ONLY while that text is actually clipped (default `true`). Set `false` when the trigger is a…\",\n },\n size: {\n type: \"string\",\n enum: [\"sm\", \"default\"],\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n SelectValue: {\n children: false,\n props: {\n placeholder: {\n type: \"string\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Separator: {\n children: false,\n props: {\n orientation: {\n enum: [\"horizontal\", \"vertical\"],\n default: \"horizontal\",\n type: \"string\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Slider: {\n children: false,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n defaultValue: {\n type: \"array\",\n },\n max: {\n type: \"number\",\n },\n min: {\n type: \"number\",\n },\n step: {\n type: \"number\",\n },\n thumbProps: {\n type: \"array\",\n description:\n \"Escape hatch spread onto the thumb LAST — for `data-*`/`style`/etc, or to deliberately override `aria-label`/`aria-labelledby`/`aria-valuetext` (an explicit …\",\n },\n },\n events: {\n change: \"onValueChange\",\n },\n source: \"@elabs-ai/components-ui\",\n },\n Stack: {\n builtin: true,\n children: true,\n props: {\n align: {\n enum: [\"start\", \"center\", \"end\", \"stretch\"],\n default: \"stretch\",\n type: \"string\",\n },\n direction: {\n enum: [\"column\", \"row\"],\n default: \"column\",\n type: \"string\",\n },\n gap: {\n enum: [\"none\", \"xs\", \"sm\", \"md\", \"lg\"],\n default: \"md\",\n type: \"string\",\n },\n justify: {\n enum: [\"start\", \"center\", \"end\", \"between\"],\n default: \"start\",\n type: \"string\",\n },\n wrap: {\n type: \"boolean\",\n default: false,\n },\n },\n events: {},\n source: \"builtin\",\n summary:\n \"Vertical or horizontal flex group. The default container — put siblings in a Stack, never bare.\",\n },\n StatePanel: {\n children: false,\n props: {\n actions: {\n type: \"node\",\n description: \"Primary / secondary action buttons.\",\n },\n description: {\n type: \"node\",\n description: \"Supporting description below the title.\",\n },\n icon: {\n type: \"node\",\n description:\n 'Icon shown above the title, clamped to a uniform 40×40 so mismatched glyphs stay tidy. For `\"error\"` defaults to a built-in warning triangle. For `\"loading\"`…',\n },\n illustration: {\n type: \"node\",\n description:\n \"A larger illustration (one of `@elabs-ai/components-ui`'s shipped `*Illustration` components, or a consumer's own `ReactNode`) shown above the title instead …\",\n },\n kind: {\n type: \"string\",\n enum: [\"empty\", \"error\", \"loading\"],\n default: \"empty\",\n },\n loadingLabel: {\n type: \"string\",\n description: 'Accessible label for the spinner in loading state. @default \"Loading…\"',\n },\n size: {\n type: \"string\",\n enum: [\"sm\", \"md\", \"lg\"],\n description: 'Spinner size (loading kind only). @default \"md\"',\n },\n title: {\n type: \"node\",\n description: \"Heading text.\",\n },\n titleAs: {\n type: \"string\",\n enum: [\"div\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\"],\n description:\n \"Heading level for the panel's title (#328 convention). Set this to the level that correctly follows whatever heading precedes this panel in the document outl…\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"An empty / error / loading message panel.\",\n },\n StatusBadge: {\n children: false,\n props: {\n hideIcon: {\n type: \"boolean\",\n description: \"Render label-only (no status icon).\",\n },\n size: {\n type: \"string\",\n enum: [\"sm\", \"md\"],\n default: \"md\",\n },\n status: {\n type: \"string\",\n required: true,\n description: \"The canonical execution status, or a mapped out-of-vocabulary one (#363).\",\n enum: [\n \"pending\",\n \"running\",\n \"complete\",\n \"awaiting-approval\",\n \"denied\",\n \"failed\",\n \"skipped\",\n ],\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"A closed status vocabulary with icon + text (never colour alone).\",\n },\n Switch: {\n children: false,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n defaultChecked: {\n type: \"boolean\",\n },\n disabled: {\n type: \"boolean\",\n },\n id: {\n type: \"string\",\n },\n },\n events: {\n change: \"onCheckedChange\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: \"Immediate on/off setting toggle (applies on change, not on submit).\",\n },\n Table: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Compose TableHeader/TableBody → TableRow → TableHead/TableCell.\",\n },\n TableBody: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TableCaption: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TableCell: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TableFooter: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TableHead: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TableHeader: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TableRow: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Tabs: {\n children: true,\n props: {\n defaultValue: {\n type: \"string\",\n required: true,\n },\n },\n events: {\n change: \"onValueChange\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: \"Compose TabsList (TabsTrigger…) + TabsContent per value.\",\n },\n TabsContent: {\n children: true,\n props: {\n value: {\n type: \"string\",\n required: true,\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TabsList: {\n children: true,\n props: {\n variant: {\n type: \"string\",\n enum: [\"segmented\", \"underline\"],\n default: \"segmented\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TabsTrigger: {\n children: true,\n props: {\n disabled: {\n type: \"boolean\",\n },\n value: {\n type: \"string\",\n required: true,\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Text: {\n children: true,\n props: {\n tone: {\n type: \"string\",\n enum: [\"default\", \"muted\", \"primary\"],\n default: \"default\",\n },\n variant: {\n type: \"string\",\n enum: [\"lead\", \"body\", \"caption\", \"meta\", \"kpi\", \"kpi-sm\", \"eyebrow\", \"code\"],\n default: \"body\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"A paragraph or inline run of text with a type role and tone.\",\n },\n Textarea: {\n children: false,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n defaultValue: {\n type: \"string\",\n },\n disabled: {\n type: \"boolean\",\n },\n id: {\n type: \"string\",\n },\n placeholder: {\n type: \"string\",\n },\n rows: {\n type: \"number\",\n },\n },\n events: {\n change: \"onChange\",\n },\n source: \"@elabs-ai/components-ui\",\n },\n Timeline: {\n children: false,\n props: {\n items: {\n type: \"array\",\n required: true,\n description: '[{ title, description?, status?: \"done\"|\"active\"|\"pending\", timestamp? }]',\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Ordered status timeline from `items` (title, status, timestamp, description).\",\n },\n};\n"],"mappings":"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","names":[]}