@copilotkit/a2ui-renderer 1.51.4 → 1.51.5-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/A2UIMessageRenderer.cjs +135 -0
- package/dist/A2UIMessageRenderer.cjs.map +1 -0
- package/dist/A2UIMessageRenderer.d.cts +11 -0
- package/dist/A2UIMessageRenderer.d.cts.map +1 -0
- package/dist/A2UIMessageRenderer.d.mts +11 -0
- package/dist/A2UIMessageRenderer.d.mts.map +1 -0
- package/dist/A2UIMessageRenderer.mjs +134 -0
- package/dist/A2UIMessageRenderer.mjs.map +1 -0
- package/dist/A2UIViewer.cjs +154 -0
- package/dist/A2UIViewer.cjs.map +1 -0
- package/dist/A2UIViewer.d.cts +39 -0
- package/dist/A2UIViewer.d.cts.map +1 -0
- package/dist/A2UIViewer.d.mts +39 -0
- package/dist/A2UIViewer.d.mts.map +1 -0
- package/dist/A2UIViewer.mjs +152 -0
- package/dist/A2UIViewer.mjs.map +1 -0
- package/dist/_virtual/_rolldown/runtime.cjs +29 -0
- package/dist/index.cjs +8 -0
- package/dist/index.d.cts +15 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +15 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +5 -0
- package/dist/index.umd.js +3070 -2
- package/dist/index.umd.js.map +1 -1
- package/dist/react-renderer/components/content/AudioPlayer.cjs +34 -0
- package/dist/react-renderer/components/content/AudioPlayer.cjs.map +1 -0
- package/dist/react-renderer/components/content/AudioPlayer.mjs +33 -0
- package/dist/react-renderer/components/content/AudioPlayer.mjs.map +1 -0
- package/dist/react-renderer/components/content/Divider.cjs +31 -0
- package/dist/react-renderer/components/content/Divider.cjs.map +1 -0
- package/dist/react-renderer/components/content/Divider.mjs +30 -0
- package/dist/react-renderer/components/content/Divider.mjs.map +1 -0
- package/dist/react-renderer/components/content/Icon.cjs +50 -0
- package/dist/react-renderer/components/content/Icon.cjs.map +1 -0
- package/dist/react-renderer/components/content/Icon.mjs +49 -0
- package/dist/react-renderer/components/content/Icon.mjs.map +1 -0
- package/dist/react-renderer/components/content/Image.cjs +43 -0
- package/dist/react-renderer/components/content/Image.cjs.map +1 -0
- package/dist/react-renderer/components/content/Image.mjs +42 -0
- package/dist/react-renderer/components/content/Image.mjs.map +1 -0
- package/dist/react-renderer/components/content/Text.cjs +131 -0
- package/dist/react-renderer/components/content/Text.cjs.map +1 -0
- package/dist/react-renderer/components/content/Text.mjs +129 -0
- package/dist/react-renderer/components/content/Text.mjs.map +1 -0
- package/dist/react-renderer/components/content/Video.cjs +56 -0
- package/dist/react-renderer/components/content/Video.cjs.map +1 -0
- package/dist/react-renderer/components/content/Video.mjs +55 -0
- package/dist/react-renderer/components/content/Video.mjs.map +1 -0
- package/dist/react-renderer/components/interactive/Button.cjs +39 -0
- package/dist/react-renderer/components/interactive/Button.cjs.map +1 -0
- package/dist/react-renderer/components/interactive/Button.mjs +38 -0
- package/dist/react-renderer/components/interactive/Button.mjs.map +1 -0
- package/dist/react-renderer/components/interactive/CheckBox.cjs +58 -0
- package/dist/react-renderer/components/interactive/CheckBox.cjs.map +1 -0
- package/dist/react-renderer/components/interactive/CheckBox.mjs +57 -0
- package/dist/react-renderer/components/interactive/CheckBox.mjs.map +1 -0
- package/dist/react-renderer/components/interactive/DateTimeInput.cjs +65 -0
- package/dist/react-renderer/components/interactive/DateTimeInput.cjs.map +1 -0
- package/dist/react-renderer/components/interactive/DateTimeInput.mjs +64 -0
- package/dist/react-renderer/components/interactive/DateTimeInput.mjs.map +1 -0
- package/dist/react-renderer/components/interactive/MultipleChoice.cjs +54 -0
- package/dist/react-renderer/components/interactive/MultipleChoice.cjs.map +1 -0
- package/dist/react-renderer/components/interactive/MultipleChoice.mjs +53 -0
- package/dist/react-renderer/components/interactive/MultipleChoice.mjs.map +1 -0
- package/dist/react-renderer/components/interactive/Slider.cjs +72 -0
- package/dist/react-renderer/components/interactive/Slider.cjs.map +1 -0
- package/dist/react-renderer/components/interactive/Slider.mjs +71 -0
- package/dist/react-renderer/components/interactive/Slider.mjs.map +1 -0
- package/dist/react-renderer/components/interactive/TextField.cjs +74 -0
- package/dist/react-renderer/components/interactive/TextField.cjs.map +1 -0
- package/dist/react-renderer/components/interactive/TextField.mjs +73 -0
- package/dist/react-renderer/components/interactive/TextField.mjs.map +1 -0
- package/dist/react-renderer/components/layout/Card.cjs +46 -0
- package/dist/react-renderer/components/layout/Card.cjs.map +1 -0
- package/dist/react-renderer/components/layout/Card.mjs +45 -0
- package/dist/react-renderer/components/layout/Card.mjs.map +1 -0
- package/dist/react-renderer/components/layout/Column.cjs +43 -0
- package/dist/react-renderer/components/layout/Column.cjs.map +1 -0
- package/dist/react-renderer/components/layout/Column.mjs +42 -0
- package/dist/react-renderer/components/layout/Column.mjs.map +1 -0
- package/dist/react-renderer/components/layout/List.cjs +41 -0
- package/dist/react-renderer/components/layout/List.cjs.map +1 -0
- package/dist/react-renderer/components/layout/List.mjs +40 -0
- package/dist/react-renderer/components/layout/List.mjs.map +1 -0
- package/dist/react-renderer/components/layout/Modal.cjs +92 -0
- package/dist/react-renderer/components/layout/Modal.cjs.map +1 -0
- package/dist/react-renderer/components/layout/Modal.mjs +91 -0
- package/dist/react-renderer/components/layout/Modal.mjs.map +1 -0
- package/dist/react-renderer/components/layout/Row.cjs +43 -0
- package/dist/react-renderer/components/layout/Row.cjs.map +1 -0
- package/dist/react-renderer/components/layout/Row.mjs +42 -0
- package/dist/react-renderer/components/layout/Row.mjs.map +1 -0
- package/dist/react-renderer/components/layout/Tabs.cjs +47 -0
- package/dist/react-renderer/components/layout/Tabs.cjs.map +1 -0
- package/dist/react-renderer/components/layout/Tabs.mjs +46 -0
- package/dist/react-renderer/components/layout/Tabs.mjs.map +1 -0
- package/dist/react-renderer/core/A2UIProvider.cjs +123 -0
- package/dist/react-renderer/core/A2UIProvider.cjs.map +1 -0
- package/dist/react-renderer/core/A2UIProvider.mjs +120 -0
- package/dist/react-renderer/core/A2UIProvider.mjs.map +1 -0
- package/dist/react-renderer/core/A2UIRenderer.cjs +93 -0
- package/dist/react-renderer/core/A2UIRenderer.cjs.map +1 -0
- package/dist/react-renderer/core/A2UIRenderer.mjs +92 -0
- package/dist/react-renderer/core/A2UIRenderer.mjs.map +1 -0
- package/dist/react-renderer/core/ComponentNode.cjs +53 -0
- package/dist/react-renderer/core/ComponentNode.cjs.map +1 -0
- package/dist/react-renderer/core/ComponentNode.mjs +52 -0
- package/dist/react-renderer/core/ComponentNode.mjs.map +1 -0
- package/dist/react-renderer/hooks/useA2UI.cjs +46 -0
- package/dist/react-renderer/hooks/useA2UI.cjs.map +1 -0
- package/dist/react-renderer/hooks/useA2UI.mjs +46 -0
- package/dist/react-renderer/hooks/useA2UI.mjs.map +1 -0
- package/dist/react-renderer/hooks/useA2UIComponent.cjs +173 -0
- package/dist/react-renderer/hooks/useA2UIComponent.cjs.map +1 -0
- package/dist/react-renderer/hooks/useA2UIComponent.mjs +172 -0
- package/dist/react-renderer/hooks/useA2UIComponent.mjs.map +1 -0
- package/dist/react-renderer/lib/utils.cjs +39 -0
- package/dist/react-renderer/lib/utils.cjs.map +1 -0
- package/dist/react-renderer/lib/utils.mjs +37 -0
- package/dist/react-renderer/lib/utils.mjs.map +1 -0
- package/dist/react-renderer/registry/ComponentRegistry.cjs +114 -0
- package/dist/react-renderer/registry/ComponentRegistry.cjs.map +1 -0
- package/dist/react-renderer/registry/ComponentRegistry.mjs +113 -0
- package/dist/react-renderer/registry/ComponentRegistry.mjs.map +1 -0
- package/dist/react-renderer/registry/defaultCatalog.cjs +57 -0
- package/dist/react-renderer/registry/defaultCatalog.cjs.map +1 -0
- package/dist/react-renderer/registry/defaultCatalog.mjs +57 -0
- package/dist/react-renderer/registry/defaultCatalog.mjs.map +1 -0
- package/dist/react-renderer/styles/index.cjs +458 -0
- package/dist/react-renderer/styles/index.cjs.map +1 -0
- package/dist/react-renderer/styles/{index.js → index.mjs} +47 -64
- package/dist/react-renderer/styles/index.mjs.map +1 -0
- package/dist/react-renderer/styles/reset.cjs +29 -0
- package/dist/react-renderer/styles/reset.cjs.map +1 -0
- package/dist/react-renderer/styles/reset.mjs +28 -0
- package/dist/react-renderer/styles/reset.mjs.map +1 -0
- package/dist/react-renderer/theme/ThemeContext.cjs +35 -0
- package/dist/react-renderer/theme/ThemeContext.cjs.map +1 -0
- package/dist/react-renderer/theme/ThemeContext.mjs +33 -0
- package/dist/react-renderer/theme/ThemeContext.mjs.map +1 -0
- package/dist/react-renderer/theme/litTheme.cjs +368 -0
- package/dist/react-renderer/theme/litTheme.cjs.map +1 -0
- package/dist/react-renderer/theme/litTheme.mjs +367 -0
- package/dist/react-renderer/theme/litTheme.mjs.map +1 -0
- package/dist/react-renderer/theme/utils.cjs +41 -0
- package/dist/react-renderer/theme/utils.cjs.map +1 -0
- package/dist/react-renderer/theme/utils.mjs +39 -0
- package/dist/react-renderer/theme/utils.mjs.map +1 -0
- package/dist/theme/viewer-theme.cjs +366 -0
- package/dist/theme/viewer-theme.cjs.map +1 -0
- package/dist/theme/viewer-theme.d.cts +7 -0
- package/dist/theme/viewer-theme.d.cts.map +1 -0
- package/dist/theme/viewer-theme.d.mts +7 -0
- package/dist/theme/viewer-theme.d.mts.map +1 -0
- package/dist/theme/viewer-theme.mjs +365 -0
- package/dist/theme/viewer-theme.mjs.map +1 -0
- package/package.json +14 -9
- package/dist/.tsbuildinfo +0 -1
- package/dist/A2UIMessageRenderer.d.ts +0 -7
- package/dist/A2UIMessageRenderer.d.ts.map +0 -1
- package/dist/A2UIMessageRenderer.js +0 -126
- package/dist/A2UIMessageRenderer.js.map +0 -1
- package/dist/A2UIViewer.d.ts +0 -32
- package/dist/A2UIViewer.d.ts.map +0 -1
- package/dist/A2UIViewer.js +0 -121
- package/dist/A2UIViewer.js.map +0 -1
- package/dist/__tests__/A2UIMessageRenderer.test.d.ts +0 -2
- package/dist/__tests__/A2UIMessageRenderer.test.d.ts.map +0 -1
- package/dist/__tests__/A2UIMessageRenderer.test.js +0 -229
- package/dist/__tests__/A2UIMessageRenderer.test.js.map +0 -1
- package/dist/__tests__/clsx-shim.d.ts +0 -8
- package/dist/__tests__/clsx-shim.d.ts.map +0 -1
- package/dist/__tests__/clsx-shim.js +0 -24
- package/dist/__tests__/clsx-shim.js.map +0 -1
- package/dist/__tests__/setup.d.ts +0 -2
- package/dist/__tests__/setup.d.ts.map +0 -1
- package/dist/__tests__/setup.js +0 -29
- package/dist/__tests__/setup.js.map +0 -1
- package/dist/index.d.ts +0 -13
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -19
- package/dist/index.js.map +0 -1
- package/dist/react-renderer/components/content/AudioPlayer.d.ts +0 -8
- package/dist/react-renderer/components/content/AudioPlayer.d.ts.map +0 -1
- package/dist/react-renderer/components/content/AudioPlayer.js +0 -23
- package/dist/react-renderer/components/content/AudioPlayer.js.map +0 -1
- package/dist/react-renderer/components/content/Divider.d.ts +0 -13
- package/dist/react-renderer/components/content/Divider.d.ts.map +0 -1
- package/dist/react-renderer/components/content/Divider.js +0 -22
- package/dist/react-renderer/components/content/Divider.js.map +0 -1
- package/dist/react-renderer/components/content/Icon.d.ts +0 -16
- package/dist/react-renderer/components/content/Icon.d.ts.map +0 -1
- package/dist/react-renderer/components/content/Icon.js +0 -40
- package/dist/react-renderer/components/content/Icon.js.map +0 -1
- package/dist/react-renderer/components/content/Image.d.ts +0 -11
- package/dist/react-renderer/components/content/Image.d.ts.map +0 -1
- package/dist/react-renderer/components/content/Image.js +0 -34
- package/dist/react-renderer/components/content/Image.js.map +0 -1
- package/dist/react-renderer/components/content/Text.d.ts +0 -28
- package/dist/react-renderer/components/content/Text.d.ts.map +0 -1
- package/dist/react-renderer/components/content/Text.js +0 -134
- package/dist/react-renderer/components/content/Text.js.map +0 -1
- package/dist/react-renderer/components/content/Video.d.ts +0 -10
- package/dist/react-renderer/components/content/Video.d.ts.map +0 -1
- package/dist/react-renderer/components/content/Video.js +0 -41
- package/dist/react-renderer/components/content/Video.js.map +0 -1
- package/dist/react-renderer/components/content/index.d.ts +0 -7
- package/dist/react-renderer/components/content/index.d.ts.map +0 -1
- package/dist/react-renderer/components/content/index.js +0 -7
- package/dist/react-renderer/components/content/index.js.map +0 -1
- package/dist/react-renderer/components/interactive/Button.d.ts +0 -11
- package/dist/react-renderer/components/interactive/Button.d.ts.map +0 -1
- package/dist/react-renderer/components/interactive/Button.js +0 -27
- package/dist/react-renderer/components/interactive/Button.js.map +0 -1
- package/dist/react-renderer/components/interactive/CheckBox.d.ts +0 -10
- package/dist/react-renderer/components/interactive/CheckBox.d.ts.map +0 -1
- package/dist/react-renderer/components/interactive/CheckBox.js +0 -55
- package/dist/react-renderer/components/interactive/CheckBox.js.map +0 -1
- package/dist/react-renderer/components/interactive/DateTimeInput.d.ts +0 -10
- package/dist/react-renderer/components/interactive/DateTimeInput.d.ts.map +0 -1
- package/dist/react-renderer/components/interactive/DateTimeInput.js +0 -68
- package/dist/react-renderer/components/interactive/DateTimeInput.js.map +0 -1
- package/dist/react-renderer/components/interactive/MultipleChoice.d.ts +0 -11
- package/dist/react-renderer/components/interactive/MultipleChoice.d.ts.map +0 -1
- package/dist/react-renderer/components/interactive/MultipleChoice.js +0 -43
- package/dist/react-renderer/components/interactive/MultipleChoice.js.map +0 -1
- package/dist/react-renderer/components/interactive/Slider.d.ts +0 -10
- package/dist/react-renderer/components/interactive/Slider.d.ts.map +0 -1
- package/dist/react-renderer/components/interactive/Slider.js +0 -62
- package/dist/react-renderer/components/interactive/Slider.js.map +0 -1
- package/dist/react-renderer/components/interactive/TextField.d.ts +0 -10
- package/dist/react-renderer/components/interactive/TextField.d.ts.map +0 -1
- package/dist/react-renderer/components/interactive/TextField.js +0 -59
- package/dist/react-renderer/components/interactive/TextField.js.map +0 -1
- package/dist/react-renderer/components/interactive/index.d.ts +0 -7
- package/dist/react-renderer/components/interactive/index.d.ts.map +0 -1
- package/dist/react-renderer/components/interactive/index.js +0 -7
- package/dist/react-renderer/components/interactive/index.js.map +0 -1
- package/dist/react-renderer/components/layout/Card.d.ts +0 -17
- package/dist/react-renderer/components/layout/Card.d.ts.map +0 -1
- package/dist/react-renderer/components/layout/Card.js +0 -39
- package/dist/react-renderer/components/layout/Card.js.map +0 -1
- package/dist/react-renderer/components/layout/Column.d.ts +0 -10
- package/dist/react-renderer/components/layout/Column.d.ts.map +0 -1
- package/dist/react-renderer/components/layout/Column.js +0 -33
- package/dist/react-renderer/components/layout/Column.js.map +0 -1
- package/dist/react-renderer/components/layout/List.d.ts +0 -10
- package/dist/react-renderer/components/layout/List.d.ts.map +0 -1
- package/dist/react-renderer/components/layout/List.js +0 -32
- package/dist/react-renderer/components/layout/List.js.map +0 -1
- package/dist/react-renderer/components/layout/Modal.d.ts +0 -15
- package/dist/react-renderer/components/layout/Modal.d.ts.map +0 -1
- package/dist/react-renderer/components/layout/Modal.js +0 -65
- package/dist/react-renderer/components/layout/Modal.js.map +0 -1
- package/dist/react-renderer/components/layout/Row.d.ts +0 -10
- package/dist/react-renderer/components/layout/Row.d.ts.map +0 -1
- package/dist/react-renderer/components/layout/Row.js +0 -33
- package/dist/react-renderer/components/layout/Row.js.map +0 -1
- package/dist/react-renderer/components/layout/Tabs.d.ts +0 -8
- package/dist/react-renderer/components/layout/Tabs.d.ts.map +0 -1
- package/dist/react-renderer/components/layout/Tabs.js +0 -29
- package/dist/react-renderer/components/layout/Tabs.js.map +0 -1
- package/dist/react-renderer/components/layout/index.d.ts +0 -7
- package/dist/react-renderer/components/layout/index.d.ts.map +0 -1
- package/dist/react-renderer/components/layout/index.js +0 -7
- package/dist/react-renderer/components/layout/index.js.map +0 -1
- package/dist/react-renderer/core/A2UIProvider.d.ts +0 -82
- package/dist/react-renderer/core/A2UIProvider.d.ts.map +0 -1
- package/dist/react-renderer/core/A2UIProvider.js +0 -156
- package/dist/react-renderer/core/A2UIProvider.js.map +0 -1
- package/dist/react-renderer/core/A2UIRenderer.d.ts +0 -36
- package/dist/react-renderer/core/A2UIRenderer.d.ts.map +0 -1
- package/dist/react-renderer/core/A2UIRenderer.js +0 -83
- package/dist/react-renderer/core/A2UIRenderer.js.map +0 -1
- package/dist/react-renderer/core/A2UIViewer.d.ts +0 -56
- package/dist/react-renderer/core/A2UIViewer.d.ts.map +0 -1
- package/dist/react-renderer/core/A2UIViewer.js +0 -135
- package/dist/react-renderer/core/A2UIViewer.js.map +0 -1
- package/dist/react-renderer/core/ComponentNode.d.ts +0 -25
- package/dist/react-renderer/core/ComponentNode.d.ts.map +0 -1
- package/dist/react-renderer/core/ComponentNode.js +0 -43
- package/dist/react-renderer/core/ComponentNode.js.map +0 -1
- package/dist/react-renderer/core/store.d.ts +0 -37
- package/dist/react-renderer/core/store.d.ts.map +0 -1
- package/dist/react-renderer/core/store.js +0 -2
- package/dist/react-renderer/core/store.js.map +0 -1
- package/dist/react-renderer/hooks/useA2UI.d.ts +0 -46
- package/dist/react-renderer/hooks/useA2UI.d.ts.map +0 -1
- package/dist/react-renderer/hooks/useA2UI.js +0 -41
- package/dist/react-renderer/hooks/useA2UI.js.map +0 -1
- package/dist/react-renderer/hooks/useA2UIComponent.d.ts +0 -52
- package/dist/react-renderer/hooks/useA2UIComponent.d.ts.map +0 -1
- package/dist/react-renderer/hooks/useA2UIComponent.js +0 -175
- package/dist/react-renderer/hooks/useA2UIComponent.js.map +0 -1
- package/dist/react-renderer/index.d.ts +0 -37
- package/dist/react-renderer/index.d.ts.map +0 -1
- package/dist/react-renderer/index.js +0 -40
- package/dist/react-renderer/index.js.map +0 -1
- package/dist/react-renderer/lib/utils.d.ts +0 -32
- package/dist/react-renderer/lib/utils.d.ts.map +0 -1
- package/dist/react-renderer/lib/utils.js +0 -41
- package/dist/react-renderer/lib/utils.js.map +0 -1
- package/dist/react-renderer/registry/ComponentRegistry.d.ts +0 -78
- package/dist/react-renderer/registry/ComponentRegistry.d.ts.map +0 -1
- package/dist/react-renderer/registry/ComponentRegistry.js +0 -113
- package/dist/react-renderer/registry/ComponentRegistry.js.map +0 -1
- package/dist/react-renderer/registry/defaultCatalog.d.ts +0 -13
- package/dist/react-renderer/registry/defaultCatalog.d.ts.map +0 -1
- package/dist/react-renderer/registry/defaultCatalog.js +0 -59
- package/dist/react-renderer/registry/defaultCatalog.js.map +0 -1
- package/dist/react-renderer/styles/index.d.ts +0 -41
- package/dist/react-renderer/styles/index.d.ts.map +0 -1
- package/dist/react-renderer/styles/index.js.map +0 -1
- package/dist/react-renderer/styles/reset.d.ts +0 -18
- package/dist/react-renderer/styles/reset.d.ts.map +0 -1
- package/dist/react-renderer/styles/reset.js +0 -24
- package/dist/react-renderer/styles/reset.js.map +0 -1
- package/dist/react-renderer/theme/ThemeContext.d.ts +0 -29
- package/dist/react-renderer/theme/ThemeContext.d.ts.map +0 -1
- package/dist/react-renderer/theme/ThemeContext.js +0 -35
- package/dist/react-renderer/theme/ThemeContext.js.map +0 -1
- package/dist/react-renderer/theme/litTheme.d.ts +0 -8
- package/dist/react-renderer/theme/litTheme.d.ts.map +0 -1
- package/dist/react-renderer/theme/litTheme.js +0 -401
- package/dist/react-renderer/theme/litTheme.js.map +0 -1
- package/dist/react-renderer/theme/utils.d.ts +0 -23
- package/dist/react-renderer/theme/utils.d.ts.map +0 -1
- package/dist/react-renderer/theme/utils.js +0 -46
- package/dist/react-renderer/theme/utils.js.map +0 -1
- package/dist/react-renderer/types.d.ts +0 -53
- package/dist/react-renderer/types.d.ts.map +0 -1
- package/dist/react-renderer/types.js +0 -2
- package/dist/react-renderer/types.js.map +0 -1
- package/dist/theme/viewer-theme.d.ts +0 -3
- package/dist/theme/viewer-theme.d.ts.map +0 -1
- package/dist/theme/viewer-theme.js +0 -391
- package/dist/theme/viewer-theme.js.map +0 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { classMapToString, stylesToObject } from "../../theme/utils.mjs";
|
|
2
|
+
import "../../lib/utils.mjs";
|
|
3
|
+
import { useA2UIComponent } from "../../hooks/useA2UIComponent.mjs";
|
|
4
|
+
import { memo, useCallback, useEffect, useId, useState } from "react";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
|
|
7
|
+
//#region src/react-renderer/components/interactive/DateTimeInput.tsx
|
|
8
|
+
/**
|
|
9
|
+
* DateTimeInput component - a date and/or time picker.
|
|
10
|
+
*
|
|
11
|
+
* Supports enabling date, time, or both. Uses native HTML5 date/time inputs.
|
|
12
|
+
*/
|
|
13
|
+
const DateTimeInput = memo(function DateTimeInput({ node, surfaceId }) {
|
|
14
|
+
const { theme, resolveString, setValue, getValue } = useA2UIComponent(node, surfaceId);
|
|
15
|
+
const props = node.properties;
|
|
16
|
+
const id = useId();
|
|
17
|
+
const valuePath = props.value?.path;
|
|
18
|
+
const initialValue = resolveString(props.value) ?? "";
|
|
19
|
+
const enableDate = props.enableDate ?? true;
|
|
20
|
+
const enableTime = props.enableTime ?? false;
|
|
21
|
+
const [value, setLocalValue] = useState(initialValue);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
if (valuePath) {
|
|
24
|
+
const externalValue = getValue(valuePath);
|
|
25
|
+
if (externalValue !== null && String(externalValue) !== value) setLocalValue(String(externalValue));
|
|
26
|
+
}
|
|
27
|
+
}, [valuePath, getValue]);
|
|
28
|
+
const handleChange = useCallback((e) => {
|
|
29
|
+
const newValue = e.target.value;
|
|
30
|
+
setLocalValue(newValue);
|
|
31
|
+
if (valuePath) setValue(valuePath, newValue);
|
|
32
|
+
}, [valuePath, setValue]);
|
|
33
|
+
let inputType = "date";
|
|
34
|
+
if (enableDate && enableTime) inputType = "datetime-local";
|
|
35
|
+
else if (enableTime && !enableDate) inputType = "time";
|
|
36
|
+
const getPlaceholderText = () => {
|
|
37
|
+
if (enableDate && enableTime) return "Date & Time";
|
|
38
|
+
else if (enableTime) return "Time";
|
|
39
|
+
return "Date";
|
|
40
|
+
};
|
|
41
|
+
return /* @__PURE__ */ jsx("div", {
|
|
42
|
+
className: "a2ui-datetime-input",
|
|
43
|
+
style: node.weight !== void 0 ? { "--weight": node.weight } : {},
|
|
44
|
+
children: /* @__PURE__ */ jsxs("section", {
|
|
45
|
+
className: classMapToString(theme.components.DateTimeInput.container),
|
|
46
|
+
children: [/* @__PURE__ */ jsx("label", {
|
|
47
|
+
htmlFor: id,
|
|
48
|
+
className: classMapToString(theme.components.DateTimeInput.label),
|
|
49
|
+
children: getPlaceholderText()
|
|
50
|
+
}), /* @__PURE__ */ jsx("input", {
|
|
51
|
+
type: inputType,
|
|
52
|
+
id,
|
|
53
|
+
value,
|
|
54
|
+
onChange: handleChange,
|
|
55
|
+
className: classMapToString(theme.components.DateTimeInput.element),
|
|
56
|
+
style: stylesToObject(theme.additionalStyles?.DateTimeInput)
|
|
57
|
+
})]
|
|
58
|
+
})
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
//#endregion
|
|
63
|
+
export { DateTimeInput as default };
|
|
64
|
+
//# sourceMappingURL=DateTimeInput.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DateTimeInput.mjs","names":[],"sources":["../../../../src/react-renderer/components/interactive/DateTimeInput.tsx"],"sourcesContent":["import { useState, useCallback, useEffect, useId, memo } from \"react\";\nimport type { Types } from \"@a2ui/lit/0.8\";\nimport type { A2UIComponentProps } from \"../../types\";\nimport { useA2UIComponent } from \"../../hooks/useA2UIComponent\";\nimport { classMapToString, stylesToObject } from \"../../lib/utils\";\n\n/**\n * DateTimeInput component - a date and/or time picker.\n *\n * Supports enabling date, time, or both. Uses native HTML5 date/time inputs.\n */\nexport const DateTimeInput = memo(function DateTimeInput({\n node,\n surfaceId,\n}: A2UIComponentProps<Types.DateTimeInputNode>) {\n const { theme, resolveString, setValue, getValue } = useA2UIComponent(\n node,\n surfaceId,\n );\n const props = node.properties;\n const id = useId();\n\n const valuePath = props.value?.path;\n const initialValue = resolveString(props.value) ?? \"\";\n const enableDate = props.enableDate ?? true;\n const enableTime = props.enableTime ?? false;\n\n const [value, setLocalValue] = useState(initialValue);\n\n // Sync with external data model changes\n useEffect(() => {\n if (valuePath) {\n const externalValue = getValue(valuePath);\n if (externalValue !== null && String(externalValue) !== value) {\n setLocalValue(String(externalValue));\n }\n }\n }, [valuePath, getValue]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setLocalValue(newValue);\n\n // Two-way binding: update data model\n if (valuePath) {\n setValue(valuePath, newValue);\n }\n },\n [valuePath, setValue],\n );\n\n // Determine input type based on enableDate and enableTime\n let inputType: \"date\" | \"time\" | \"datetime-local\" = \"date\";\n if (enableDate && enableTime) {\n inputType = \"datetime-local\";\n } else if (enableTime && !enableDate) {\n inputType = \"time\";\n }\n\n // Get placeholder text to match Lit renderer\n const getPlaceholderText = () => {\n if (enableDate && enableTime) {\n return \"Date & Time\";\n } else if (enableTime) {\n return \"Time\";\n }\n return \"Date\";\n };\n\n // Structure mirrors Lit's DateTimeInput component:\n // <div class=\"a2ui-datetime-input\"> ← :host equivalent\n // <section class=\"...\"> ← container theme classes\n // <label> ← label\n // <input> ← input element\n // </section>\n // </div>\n\n // Apply --weight CSS variable on root div (:host equivalent) for flex layouts\n const hostStyle: React.CSSProperties =\n node.weight !== undefined\n ? ({ \"--weight\": node.weight } as React.CSSProperties)\n : {};\n\n return (\n <div className=\"a2ui-datetime-input\" style={hostStyle}>\n <section\n className={classMapToString(theme.components.DateTimeInput.container)}\n >\n <label\n htmlFor={id}\n className={classMapToString(theme.components.DateTimeInput.label)}\n >\n {getPlaceholderText()}\n </label>\n <input\n type={inputType}\n id={id}\n value={value}\n onChange={handleChange}\n className={classMapToString(theme.components.DateTimeInput.element)}\n style={stylesToObject(theme.additionalStyles?.DateTimeInput)}\n />\n </section>\n </div>\n );\n});\n\nexport default DateTimeInput;\n"],"mappings":";;;;;;;;;;;;AAWA,MAAa,gBAAgB,KAAK,SAAS,cAAc,EACvD,MACA,aAC8C;CAC9C,MAAM,EAAE,OAAO,eAAe,UAAU,aAAa,iBACnD,MACA,UACD;CACD,MAAM,QAAQ,KAAK;CACnB,MAAM,KAAK,OAAO;CAElB,MAAM,YAAY,MAAM,OAAO;CAC/B,MAAM,eAAe,cAAc,MAAM,MAAM,IAAI;CACnD,MAAM,aAAa,MAAM,cAAc;CACvC,MAAM,aAAa,MAAM,cAAc;CAEvC,MAAM,CAAC,OAAO,iBAAiB,SAAS,aAAa;AAGrD,iBAAgB;AACd,MAAI,WAAW;GACb,MAAM,gBAAgB,SAAS,UAAU;AACzC,OAAI,kBAAkB,QAAQ,OAAO,cAAc,KAAK,MACtD,eAAc,OAAO,cAAc,CAAC;;IAGvC,CAAC,WAAW,SAAS,CAAC;CAEzB,MAAM,eAAe,aAClB,MAA2C;EAC1C,MAAM,WAAW,EAAE,OAAO;AAC1B,gBAAc,SAAS;AAGvB,MAAI,UACF,UAAS,WAAW,SAAS;IAGjC,CAAC,WAAW,SAAS,CACtB;CAGD,IAAI,YAAgD;AACpD,KAAI,cAAc,WAChB,aAAY;UACH,cAAc,CAAC,WACxB,aAAY;CAId,MAAM,2BAA2B;AAC/B,MAAI,cAAc,WAChB,QAAO;WACE,WACT,QAAO;AAET,SAAO;;AAiBT,QACE,oBAAC;EAAI,WAAU;EAAsB,OALrC,KAAK,WAAW,SACX,EAAE,YAAY,KAAK,QAAQ,GAC5B,EAAE;YAIJ,qBAAC;GACC,WAAW,iBAAiB,MAAM,WAAW,cAAc,UAAU;cAErE,oBAAC;IACC,SAAS;IACT,WAAW,iBAAiB,MAAM,WAAW,cAAc,MAAM;cAEhE,oBAAoB;KACf,EACR,oBAAC;IACC,MAAM;IACF;IACG;IACP,UAAU;IACV,WAAW,iBAAiB,MAAM,WAAW,cAAc,QAAQ;IACnE,OAAO,eAAe,MAAM,kBAAkB,cAAc;KAC5D;IACM;GACN;EAER"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
const require_runtime = require('../../../_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
const require_utils = require('../../theme/utils.cjs');
|
|
3
|
+
require('../../lib/utils.cjs');
|
|
4
|
+
const require_useA2UIComponent = require('../../hooks/useA2UIComponent.cjs');
|
|
5
|
+
let react = require("react");
|
|
6
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
|
+
|
|
8
|
+
//#region src/react-renderer/components/interactive/MultipleChoice.tsx
|
|
9
|
+
/**
|
|
10
|
+
* MultipleChoice component - a selection component using a dropdown.
|
|
11
|
+
*
|
|
12
|
+
* Renders a <select> element with options, matching the Lit renderer's behavior.
|
|
13
|
+
* Supports two-way data binding for the selected value.
|
|
14
|
+
*/
|
|
15
|
+
const MultipleChoice = (0, react.memo)(function MultipleChoice({ node, surfaceId }) {
|
|
16
|
+
const { theme, resolveString, setValue } = require_useA2UIComponent.useA2UIComponent(node, surfaceId);
|
|
17
|
+
const props = node.properties;
|
|
18
|
+
const id = (0, react.useId)();
|
|
19
|
+
const options = props.options ?? [];
|
|
20
|
+
const selectionsPath = props.selections?.path;
|
|
21
|
+
const description = resolveString(props.description) ?? "Select an item";
|
|
22
|
+
const handleChange = (0, react.useCallback)((e) => {
|
|
23
|
+
if (selectionsPath) setValue(selectionsPath, [e.target.value]);
|
|
24
|
+
}, [selectionsPath, setValue]);
|
|
25
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
26
|
+
className: "a2ui-multiplechoice",
|
|
27
|
+
style: node.weight !== void 0 ? { "--weight": node.weight } : {},
|
|
28
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
|
|
29
|
+
className: require_utils.classMapToString(theme.components.MultipleChoice.container),
|
|
30
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
31
|
+
htmlFor: id,
|
|
32
|
+
className: require_utils.classMapToString(theme.components.MultipleChoice.label),
|
|
33
|
+
children: description
|
|
34
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
|
|
35
|
+
name: "data",
|
|
36
|
+
id,
|
|
37
|
+
className: require_utils.classMapToString(theme.components.MultipleChoice.element),
|
|
38
|
+
style: require_utils.stylesToObject(theme.additionalStyles?.MultipleChoice),
|
|
39
|
+
onChange: handleChange,
|
|
40
|
+
children: options.map((option) => {
|
|
41
|
+
const label = resolveString(option.label);
|
|
42
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
43
|
+
value: option.value,
|
|
44
|
+
children: label
|
|
45
|
+
}, option.value);
|
|
46
|
+
})
|
|
47
|
+
})]
|
|
48
|
+
})
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
//#endregion
|
|
53
|
+
exports.default = MultipleChoice;
|
|
54
|
+
//# sourceMappingURL=MultipleChoice.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultipleChoice.cjs","names":["useA2UIComponent","classMapToString","stylesToObject"],"sources":["../../../../src/react-renderer/components/interactive/MultipleChoice.tsx"],"sourcesContent":["import { useCallback, useId, memo } from \"react\";\nimport type { Types } from \"@a2ui/lit/0.8\";\nimport type { A2UIComponentProps } from \"../../types\";\nimport { useA2UIComponent } from \"../../hooks/useA2UIComponent\";\nimport { classMapToString, stylesToObject } from \"../../lib/utils\";\n\n/**\n * MultipleChoice component - a selection component using a dropdown.\n *\n * Renders a <select> element with options, matching the Lit renderer's behavior.\n * Supports two-way data binding for the selected value.\n */\nexport const MultipleChoice = memo(function MultipleChoice({\n node,\n surfaceId,\n}: A2UIComponentProps<Types.MultipleChoiceNode>) {\n const { theme, resolveString, setValue } = useA2UIComponent(node, surfaceId);\n const props = node.properties;\n const id = useId();\n\n const options =\n (props.options as {\n label: { literalString?: string; path?: string };\n value: string;\n }[]) ?? [];\n const selectionsPath = props.selections?.path;\n\n // Access description from props (Lit component supports it)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const description =\n resolveString((props as any).description) ?? \"Select an item\";\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => {\n // Two-way binding: update data model with array (matches Lit behavior)\n if (selectionsPath) {\n setValue(selectionsPath, [e.target.value]);\n }\n },\n [selectionsPath, setValue],\n );\n\n // Apply --weight CSS variable on root div (:host equivalent) for flex layouts\n const hostStyle: React.CSSProperties =\n node.weight !== undefined\n ? ({ \"--weight\": node.weight } as React.CSSProperties)\n : {};\n\n // Structure mirrors Lit's MultipleChoice component:\n // <div class=\"a2ui-multiplechoice\"> ← :host equivalent\n // <section class=\"...\"> ← container theme classes\n // <label>...</label> ← description label\n // <select>...</select> ← dropdown element\n // </section>\n // </div>\n return (\n <div className=\"a2ui-multiplechoice\" style={hostStyle}>\n <section\n className={classMapToString(theme.components.MultipleChoice.container)}\n >\n <label\n htmlFor={id}\n className={classMapToString(theme.components.MultipleChoice.label)}\n >\n {description}\n </label>\n <select\n name=\"data\"\n id={id}\n className={classMapToString(theme.components.MultipleChoice.element)}\n style={stylesToObject(theme.additionalStyles?.MultipleChoice)}\n onChange={handleChange}\n >\n {options.map((option) => {\n const label = resolveString(option.label);\n return (\n <option key={option.value} value={option.value}>\n {label}\n </option>\n );\n })}\n </select>\n </section>\n </div>\n );\n});\n\nexport default MultipleChoice;\n"],"mappings":";;;;;;;;;;;;;;AAYA,MAAa,iCAAsB,SAAS,eAAe,EACzD,MACA,aAC+C;CAC/C,MAAM,EAAE,OAAO,eAAe,aAAaA,0CAAiB,MAAM,UAAU;CAC5E,MAAM,QAAQ,KAAK;CACnB,MAAM,uBAAY;CAElB,MAAM,UACH,MAAM,WAGC,EAAE;CACZ,MAAM,iBAAiB,MAAM,YAAY;CAIzC,MAAM,cACJ,cAAe,MAAc,YAAY,IAAI;CAE/C,MAAM,uCACH,MAA4C;AAE3C,MAAI,eACF,UAAS,gBAAgB,CAAC,EAAE,OAAO,MAAM,CAAC;IAG9C,CAAC,gBAAgB,SAAS,CAC3B;AAeD,QACE,2CAAC;EAAI,WAAU;EAAsB,OAZrC,KAAK,WAAW,SACX,EAAE,YAAY,KAAK,QAAQ,GAC5B,EAAE;YAWJ,4CAAC;GACC,WAAWC,+BAAiB,MAAM,WAAW,eAAe,UAAU;cAEtE,2CAAC;IACC,SAAS;IACT,WAAWA,+BAAiB,MAAM,WAAW,eAAe,MAAM;cAEjE;KACK,EACR,2CAAC;IACC,MAAK;IACD;IACJ,WAAWA,+BAAiB,MAAM,WAAW,eAAe,QAAQ;IACpE,OAAOC,6BAAe,MAAM,kBAAkB,eAAe;IAC7D,UAAU;cAET,QAAQ,KAAK,WAAW;KACvB,MAAM,QAAQ,cAAc,OAAO,MAAM;AACzC,YACE,2CAAC;MAA0B,OAAO,OAAO;gBACtC;QADU,OAAO,MAEX;MAEX;KACK;IACD;GACN;EAER"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { classMapToString, stylesToObject } from "../../theme/utils.mjs";
|
|
2
|
+
import "../../lib/utils.mjs";
|
|
3
|
+
import { useA2UIComponent } from "../../hooks/useA2UIComponent.mjs";
|
|
4
|
+
import { memo, useCallback, useId } from "react";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
|
|
7
|
+
//#region src/react-renderer/components/interactive/MultipleChoice.tsx
|
|
8
|
+
/**
|
|
9
|
+
* MultipleChoice component - a selection component using a dropdown.
|
|
10
|
+
*
|
|
11
|
+
* Renders a <select> element with options, matching the Lit renderer's behavior.
|
|
12
|
+
* Supports two-way data binding for the selected value.
|
|
13
|
+
*/
|
|
14
|
+
const MultipleChoice = memo(function MultipleChoice({ node, surfaceId }) {
|
|
15
|
+
const { theme, resolveString, setValue } = useA2UIComponent(node, surfaceId);
|
|
16
|
+
const props = node.properties;
|
|
17
|
+
const id = useId();
|
|
18
|
+
const options = props.options ?? [];
|
|
19
|
+
const selectionsPath = props.selections?.path;
|
|
20
|
+
const description = resolveString(props.description) ?? "Select an item";
|
|
21
|
+
const handleChange = useCallback((e) => {
|
|
22
|
+
if (selectionsPath) setValue(selectionsPath, [e.target.value]);
|
|
23
|
+
}, [selectionsPath, setValue]);
|
|
24
|
+
return /* @__PURE__ */ jsx("div", {
|
|
25
|
+
className: "a2ui-multiplechoice",
|
|
26
|
+
style: node.weight !== void 0 ? { "--weight": node.weight } : {},
|
|
27
|
+
children: /* @__PURE__ */ jsxs("section", {
|
|
28
|
+
className: classMapToString(theme.components.MultipleChoice.container),
|
|
29
|
+
children: [/* @__PURE__ */ jsx("label", {
|
|
30
|
+
htmlFor: id,
|
|
31
|
+
className: classMapToString(theme.components.MultipleChoice.label),
|
|
32
|
+
children: description
|
|
33
|
+
}), /* @__PURE__ */ jsx("select", {
|
|
34
|
+
name: "data",
|
|
35
|
+
id,
|
|
36
|
+
className: classMapToString(theme.components.MultipleChoice.element),
|
|
37
|
+
style: stylesToObject(theme.additionalStyles?.MultipleChoice),
|
|
38
|
+
onChange: handleChange,
|
|
39
|
+
children: options.map((option) => {
|
|
40
|
+
const label = resolveString(option.label);
|
|
41
|
+
return /* @__PURE__ */ jsx("option", {
|
|
42
|
+
value: option.value,
|
|
43
|
+
children: label
|
|
44
|
+
}, option.value);
|
|
45
|
+
})
|
|
46
|
+
})]
|
|
47
|
+
})
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
//#endregion
|
|
52
|
+
export { MultipleChoice as default };
|
|
53
|
+
//# sourceMappingURL=MultipleChoice.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultipleChoice.mjs","names":[],"sources":["../../../../src/react-renderer/components/interactive/MultipleChoice.tsx"],"sourcesContent":["import { useCallback, useId, memo } from \"react\";\nimport type { Types } from \"@a2ui/lit/0.8\";\nimport type { A2UIComponentProps } from \"../../types\";\nimport { useA2UIComponent } from \"../../hooks/useA2UIComponent\";\nimport { classMapToString, stylesToObject } from \"../../lib/utils\";\n\n/**\n * MultipleChoice component - a selection component using a dropdown.\n *\n * Renders a <select> element with options, matching the Lit renderer's behavior.\n * Supports two-way data binding for the selected value.\n */\nexport const MultipleChoice = memo(function MultipleChoice({\n node,\n surfaceId,\n}: A2UIComponentProps<Types.MultipleChoiceNode>) {\n const { theme, resolveString, setValue } = useA2UIComponent(node, surfaceId);\n const props = node.properties;\n const id = useId();\n\n const options =\n (props.options as {\n label: { literalString?: string; path?: string };\n value: string;\n }[]) ?? [];\n const selectionsPath = props.selections?.path;\n\n // Access description from props (Lit component supports it)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const description =\n resolveString((props as any).description) ?? \"Select an item\";\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => {\n // Two-way binding: update data model with array (matches Lit behavior)\n if (selectionsPath) {\n setValue(selectionsPath, [e.target.value]);\n }\n },\n [selectionsPath, setValue],\n );\n\n // Apply --weight CSS variable on root div (:host equivalent) for flex layouts\n const hostStyle: React.CSSProperties =\n node.weight !== undefined\n ? ({ \"--weight\": node.weight } as React.CSSProperties)\n : {};\n\n // Structure mirrors Lit's MultipleChoice component:\n // <div class=\"a2ui-multiplechoice\"> ← :host equivalent\n // <section class=\"...\"> ← container theme classes\n // <label>...</label> ← description label\n // <select>...</select> ← dropdown element\n // </section>\n // </div>\n return (\n <div className=\"a2ui-multiplechoice\" style={hostStyle}>\n <section\n className={classMapToString(theme.components.MultipleChoice.container)}\n >\n <label\n htmlFor={id}\n className={classMapToString(theme.components.MultipleChoice.label)}\n >\n {description}\n </label>\n <select\n name=\"data\"\n id={id}\n className={classMapToString(theme.components.MultipleChoice.element)}\n style={stylesToObject(theme.additionalStyles?.MultipleChoice)}\n onChange={handleChange}\n >\n {options.map((option) => {\n const label = resolveString(option.label);\n return (\n <option key={option.value} value={option.value}>\n {label}\n </option>\n );\n })}\n </select>\n </section>\n </div>\n );\n});\n\nexport default MultipleChoice;\n"],"mappings":";;;;;;;;;;;;;AAYA,MAAa,iBAAiB,KAAK,SAAS,eAAe,EACzD,MACA,aAC+C;CAC/C,MAAM,EAAE,OAAO,eAAe,aAAa,iBAAiB,MAAM,UAAU;CAC5E,MAAM,QAAQ,KAAK;CACnB,MAAM,KAAK,OAAO;CAElB,MAAM,UACH,MAAM,WAGC,EAAE;CACZ,MAAM,iBAAiB,MAAM,YAAY;CAIzC,MAAM,cACJ,cAAe,MAAc,YAAY,IAAI;CAE/C,MAAM,eAAe,aAClB,MAA4C;AAE3C,MAAI,eACF,UAAS,gBAAgB,CAAC,EAAE,OAAO,MAAM,CAAC;IAG9C,CAAC,gBAAgB,SAAS,CAC3B;AAeD,QACE,oBAAC;EAAI,WAAU;EAAsB,OAZrC,KAAK,WAAW,SACX,EAAE,YAAY,KAAK,QAAQ,GAC5B,EAAE;YAWJ,qBAAC;GACC,WAAW,iBAAiB,MAAM,WAAW,eAAe,UAAU;cAEtE,oBAAC;IACC,SAAS;IACT,WAAW,iBAAiB,MAAM,WAAW,eAAe,MAAM;cAEjE;KACK,EACR,oBAAC;IACC,MAAK;IACD;IACJ,WAAW,iBAAiB,MAAM,WAAW,eAAe,QAAQ;IACpE,OAAO,eAAe,MAAM,kBAAkB,eAAe;IAC7D,UAAU;cAET,QAAQ,KAAK,WAAW;KACvB,MAAM,QAAQ,cAAc,OAAO,MAAM;AACzC,YACE,oBAAC;MAA0B,OAAO,OAAO;gBACtC;QADU,OAAO,MAEX;MAEX;KACK;IACD;GACN;EAER"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
const require_runtime = require('../../../_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
const require_utils = require('../../theme/utils.cjs');
|
|
3
|
+
require('../../lib/utils.cjs');
|
|
4
|
+
const require_useA2UIComponent = require('../../hooks/useA2UIComponent.cjs');
|
|
5
|
+
let react = require("react");
|
|
6
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
|
+
|
|
8
|
+
//#region src/react-renderer/components/interactive/Slider.tsx
|
|
9
|
+
/**
|
|
10
|
+
* Slider component - a numeric value selector with a range.
|
|
11
|
+
*
|
|
12
|
+
* Supports two-way data binding for the value.
|
|
13
|
+
*/
|
|
14
|
+
const Slider = (0, react.memo)(function Slider({ node, surfaceId }) {
|
|
15
|
+
const { theme, resolveNumber, resolveString, setValue, getValue } = require_useA2UIComponent.useA2UIComponent(node, surfaceId);
|
|
16
|
+
const props = node.properties;
|
|
17
|
+
const id = (0, react.useId)();
|
|
18
|
+
const valuePath = props.value?.path;
|
|
19
|
+
const initialValue = resolveNumber(props.value) ?? 0;
|
|
20
|
+
const minValue = props.minValue ?? 0;
|
|
21
|
+
const maxValue = props.maxValue ?? 0;
|
|
22
|
+
const [value, setLocalValue] = (0, react.useState)(initialValue);
|
|
23
|
+
(0, react.useEffect)(() => {
|
|
24
|
+
if (valuePath) {
|
|
25
|
+
const externalValue = getValue(valuePath);
|
|
26
|
+
if (externalValue !== null && Number(externalValue) !== value) setLocalValue(Number(externalValue));
|
|
27
|
+
}
|
|
28
|
+
}, [valuePath, getValue]);
|
|
29
|
+
(0, react.useEffect)(() => {
|
|
30
|
+
if (props.value?.literalNumber !== void 0) setLocalValue(props.value.literalNumber);
|
|
31
|
+
}, [props.value?.literalNumber]);
|
|
32
|
+
const handleChange = (0, react.useCallback)((e) => {
|
|
33
|
+
const newValue = Number(e.target.value);
|
|
34
|
+
setLocalValue(newValue);
|
|
35
|
+
if (valuePath) setValue(valuePath, newValue);
|
|
36
|
+
}, [valuePath, setValue]);
|
|
37
|
+
const labelValue = props.label;
|
|
38
|
+
const label = labelValue ? resolveString(labelValue) : "";
|
|
39
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
40
|
+
className: "a2ui-slider",
|
|
41
|
+
style: node.weight !== void 0 ? { "--weight": node.weight } : {},
|
|
42
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
|
|
43
|
+
className: require_utils.classMapToString(theme.components.Slider.container),
|
|
44
|
+
children: [
|
|
45
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
46
|
+
htmlFor: id,
|
|
47
|
+
className: require_utils.classMapToString(theme.components.Slider.label),
|
|
48
|
+
children: label
|
|
49
|
+
}),
|
|
50
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
51
|
+
type: "range",
|
|
52
|
+
id,
|
|
53
|
+
name: "data",
|
|
54
|
+
value,
|
|
55
|
+
min: minValue,
|
|
56
|
+
max: maxValue,
|
|
57
|
+
onChange: handleChange,
|
|
58
|
+
className: require_utils.classMapToString(theme.components.Slider.element),
|
|
59
|
+
style: require_utils.stylesToObject(theme.additionalStyles?.Slider)
|
|
60
|
+
}),
|
|
61
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
62
|
+
className: require_utils.classMapToString(theme.components.Slider.label),
|
|
63
|
+
children: value
|
|
64
|
+
})
|
|
65
|
+
]
|
|
66
|
+
})
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
//#endregion
|
|
71
|
+
exports.default = Slider;
|
|
72
|
+
//# sourceMappingURL=Slider.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Slider.cjs","names":["useA2UIComponent","classMapToString","stylesToObject"],"sources":["../../../../src/react-renderer/components/interactive/Slider.tsx"],"sourcesContent":["import { useState, useCallback, useEffect, useId, memo } from \"react\";\nimport type { Types } from \"@a2ui/lit/0.8\";\nimport type { A2UIComponentProps } from \"../../types\";\nimport { useA2UIComponent } from \"../../hooks/useA2UIComponent\";\nimport { classMapToString, stylesToObject } from \"../../lib/utils\";\n\n/**\n * Slider component - a numeric value selector with a range.\n *\n * Supports two-way data binding for the value.\n */\nexport const Slider = memo(function Slider({\n node,\n surfaceId,\n}: A2UIComponentProps<Types.SliderNode>) {\n const { theme, resolveNumber, resolveString, setValue, getValue } =\n useA2UIComponent(node, surfaceId);\n const props = node.properties;\n const id = useId();\n\n const valuePath = props.value?.path;\n const initialValue = resolveNumber(props.value) ?? 0;\n // Match Lit's default values (minValue=0, maxValue=0)\n const minValue = props.minValue ?? 0;\n const maxValue = props.maxValue ?? 0;\n\n const [value, setLocalValue] = useState(initialValue);\n\n // Sync with external data model changes (path binding)\n useEffect(() => {\n if (valuePath) {\n const externalValue = getValue(valuePath);\n if (externalValue !== null && Number(externalValue) !== value) {\n setLocalValue(Number(externalValue));\n }\n }\n }, [valuePath, getValue]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Sync when literal value changes from props (server-driven updates via surfaceUpdate)\n useEffect(() => {\n if (props.value?.literalNumber !== undefined) {\n setLocalValue(props.value.literalNumber);\n }\n }, [props.value?.literalNumber]);\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = Number(e.target.value);\n setLocalValue(newValue);\n\n // Two-way binding: update data model\n if (valuePath) {\n setValue(valuePath, newValue);\n }\n },\n [valuePath, setValue],\n );\n\n // Access label from props if it exists (Lit component supports it but type doesn't define it)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const labelValue = (props as any).label;\n const label = labelValue ? resolveString(labelValue) : \"\";\n\n // Structure mirrors Lit's Slider component:\n // <div class=\"a2ui-slider\"> ← :host equivalent\n // <section class=\"...\"> ← internal element\n // <label>...</label>\n // <input>...</input>\n // <span>value</span>\n // </section>\n // </div>\n\n // Apply --weight CSS variable on root div (:host equivalent) for flex layouts\n const hostStyle: React.CSSProperties =\n node.weight !== undefined\n ? ({ \"--weight\": node.weight } as React.CSSProperties)\n : {};\n\n return (\n <div className=\"a2ui-slider\" style={hostStyle}>\n <section className={classMapToString(theme.components.Slider.container)}>\n <label\n htmlFor={id}\n className={classMapToString(theme.components.Slider.label)}\n >\n {label}\n </label>\n <input\n type=\"range\"\n id={id}\n name=\"data\"\n value={value}\n min={minValue}\n max={maxValue}\n onChange={handleChange}\n className={classMapToString(theme.components.Slider.element)}\n style={stylesToObject(theme.additionalStyles?.Slider)}\n />\n <span className={classMapToString(theme.components.Slider.label)}>\n {value}\n </span>\n </section>\n </div>\n );\n});\n\nexport default Slider;\n"],"mappings":";;;;;;;;;;;;;AAWA,MAAa,yBAAc,SAAS,OAAO,EACzC,MACA,aACuC;CACvC,MAAM,EAAE,OAAO,eAAe,eAAe,UAAU,aACrDA,0CAAiB,MAAM,UAAU;CACnC,MAAM,QAAQ,KAAK;CACnB,MAAM,uBAAY;CAElB,MAAM,YAAY,MAAM,OAAO;CAC/B,MAAM,eAAe,cAAc,MAAM,MAAM,IAAI;CAEnD,MAAM,WAAW,MAAM,YAAY;CACnC,MAAM,WAAW,MAAM,YAAY;CAEnC,MAAM,CAAC,OAAO,qCAA0B,aAAa;AAGrD,4BAAgB;AACd,MAAI,WAAW;GACb,MAAM,gBAAgB,SAAS,UAAU;AACzC,OAAI,kBAAkB,QAAQ,OAAO,cAAc,KAAK,MACtD,eAAc,OAAO,cAAc,CAAC;;IAGvC,CAAC,WAAW,SAAS,CAAC;AAGzB,4BAAgB;AACd,MAAI,MAAM,OAAO,kBAAkB,OACjC,eAAc,MAAM,MAAM,cAAc;IAEzC,CAAC,MAAM,OAAO,cAAc,CAAC;CAEhC,MAAM,uCACH,MAA2C;EAC1C,MAAM,WAAW,OAAO,EAAE,OAAO,MAAM;AACvC,gBAAc,SAAS;AAGvB,MAAI,UACF,UAAS,WAAW,SAAS;IAGjC,CAAC,WAAW,SAAS,CACtB;CAID,MAAM,aAAc,MAAc;CAClC,MAAM,QAAQ,aAAa,cAAc,WAAW,GAAG;AAiBvD,QACE,2CAAC;EAAI,WAAU;EAAc,OAL7B,KAAK,WAAW,SACX,EAAE,YAAY,KAAK,QAAQ,GAC5B,EAAE;YAIJ,4CAAC;GAAQ,WAAWC,+BAAiB,MAAM,WAAW,OAAO,UAAU;;IACrE,2CAAC;KACC,SAAS;KACT,WAAWA,+BAAiB,MAAM,WAAW,OAAO,MAAM;eAEzD;MACK;IACR,2CAAC;KACC,MAAK;KACD;KACJ,MAAK;KACE;KACP,KAAK;KACL,KAAK;KACL,UAAU;KACV,WAAWA,+BAAiB,MAAM,WAAW,OAAO,QAAQ;KAC5D,OAAOC,6BAAe,MAAM,kBAAkB,OAAO;MACrD;IACF,2CAAC;KAAK,WAAWD,+BAAiB,MAAM,WAAW,OAAO,MAAM;eAC7D;MACI;;IACC;GACN;EAER"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { classMapToString, stylesToObject } from "../../theme/utils.mjs";
|
|
2
|
+
import "../../lib/utils.mjs";
|
|
3
|
+
import { useA2UIComponent } from "../../hooks/useA2UIComponent.mjs";
|
|
4
|
+
import { memo, useCallback, useEffect, useId, useState } from "react";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
|
|
7
|
+
//#region src/react-renderer/components/interactive/Slider.tsx
|
|
8
|
+
/**
|
|
9
|
+
* Slider component - a numeric value selector with a range.
|
|
10
|
+
*
|
|
11
|
+
* Supports two-way data binding for the value.
|
|
12
|
+
*/
|
|
13
|
+
const Slider = memo(function Slider({ node, surfaceId }) {
|
|
14
|
+
const { theme, resolveNumber, resolveString, setValue, getValue } = useA2UIComponent(node, surfaceId);
|
|
15
|
+
const props = node.properties;
|
|
16
|
+
const id = useId();
|
|
17
|
+
const valuePath = props.value?.path;
|
|
18
|
+
const initialValue = resolveNumber(props.value) ?? 0;
|
|
19
|
+
const minValue = props.minValue ?? 0;
|
|
20
|
+
const maxValue = props.maxValue ?? 0;
|
|
21
|
+
const [value, setLocalValue] = useState(initialValue);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
if (valuePath) {
|
|
24
|
+
const externalValue = getValue(valuePath);
|
|
25
|
+
if (externalValue !== null && Number(externalValue) !== value) setLocalValue(Number(externalValue));
|
|
26
|
+
}
|
|
27
|
+
}, [valuePath, getValue]);
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
if (props.value?.literalNumber !== void 0) setLocalValue(props.value.literalNumber);
|
|
30
|
+
}, [props.value?.literalNumber]);
|
|
31
|
+
const handleChange = useCallback((e) => {
|
|
32
|
+
const newValue = Number(e.target.value);
|
|
33
|
+
setLocalValue(newValue);
|
|
34
|
+
if (valuePath) setValue(valuePath, newValue);
|
|
35
|
+
}, [valuePath, setValue]);
|
|
36
|
+
const labelValue = props.label;
|
|
37
|
+
const label = labelValue ? resolveString(labelValue) : "";
|
|
38
|
+
return /* @__PURE__ */ jsx("div", {
|
|
39
|
+
className: "a2ui-slider",
|
|
40
|
+
style: node.weight !== void 0 ? { "--weight": node.weight } : {},
|
|
41
|
+
children: /* @__PURE__ */ jsxs("section", {
|
|
42
|
+
className: classMapToString(theme.components.Slider.container),
|
|
43
|
+
children: [
|
|
44
|
+
/* @__PURE__ */ jsx("label", {
|
|
45
|
+
htmlFor: id,
|
|
46
|
+
className: classMapToString(theme.components.Slider.label),
|
|
47
|
+
children: label
|
|
48
|
+
}),
|
|
49
|
+
/* @__PURE__ */ jsx("input", {
|
|
50
|
+
type: "range",
|
|
51
|
+
id,
|
|
52
|
+
name: "data",
|
|
53
|
+
value,
|
|
54
|
+
min: minValue,
|
|
55
|
+
max: maxValue,
|
|
56
|
+
onChange: handleChange,
|
|
57
|
+
className: classMapToString(theme.components.Slider.element),
|
|
58
|
+
style: stylesToObject(theme.additionalStyles?.Slider)
|
|
59
|
+
}),
|
|
60
|
+
/* @__PURE__ */ jsx("span", {
|
|
61
|
+
className: classMapToString(theme.components.Slider.label),
|
|
62
|
+
children: value
|
|
63
|
+
})
|
|
64
|
+
]
|
|
65
|
+
})
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
//#endregion
|
|
70
|
+
export { Slider as default };
|
|
71
|
+
//# sourceMappingURL=Slider.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Slider.mjs","names":[],"sources":["../../../../src/react-renderer/components/interactive/Slider.tsx"],"sourcesContent":["import { useState, useCallback, useEffect, useId, memo } from \"react\";\nimport type { Types } from \"@a2ui/lit/0.8\";\nimport type { A2UIComponentProps } from \"../../types\";\nimport { useA2UIComponent } from \"../../hooks/useA2UIComponent\";\nimport { classMapToString, stylesToObject } from \"../../lib/utils\";\n\n/**\n * Slider component - a numeric value selector with a range.\n *\n * Supports two-way data binding for the value.\n */\nexport const Slider = memo(function Slider({\n node,\n surfaceId,\n}: A2UIComponentProps<Types.SliderNode>) {\n const { theme, resolveNumber, resolveString, setValue, getValue } =\n useA2UIComponent(node, surfaceId);\n const props = node.properties;\n const id = useId();\n\n const valuePath = props.value?.path;\n const initialValue = resolveNumber(props.value) ?? 0;\n // Match Lit's default values (minValue=0, maxValue=0)\n const minValue = props.minValue ?? 0;\n const maxValue = props.maxValue ?? 0;\n\n const [value, setLocalValue] = useState(initialValue);\n\n // Sync with external data model changes (path binding)\n useEffect(() => {\n if (valuePath) {\n const externalValue = getValue(valuePath);\n if (externalValue !== null && Number(externalValue) !== value) {\n setLocalValue(Number(externalValue));\n }\n }\n }, [valuePath, getValue]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Sync when literal value changes from props (server-driven updates via surfaceUpdate)\n useEffect(() => {\n if (props.value?.literalNumber !== undefined) {\n setLocalValue(props.value.literalNumber);\n }\n }, [props.value?.literalNumber]);\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = Number(e.target.value);\n setLocalValue(newValue);\n\n // Two-way binding: update data model\n if (valuePath) {\n setValue(valuePath, newValue);\n }\n },\n [valuePath, setValue],\n );\n\n // Access label from props if it exists (Lit component supports it but type doesn't define it)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const labelValue = (props as any).label;\n const label = labelValue ? resolveString(labelValue) : \"\";\n\n // Structure mirrors Lit's Slider component:\n // <div class=\"a2ui-slider\"> ← :host equivalent\n // <section class=\"...\"> ← internal element\n // <label>...</label>\n // <input>...</input>\n // <span>value</span>\n // </section>\n // </div>\n\n // Apply --weight CSS variable on root div (:host equivalent) for flex layouts\n const hostStyle: React.CSSProperties =\n node.weight !== undefined\n ? ({ \"--weight\": node.weight } as React.CSSProperties)\n : {};\n\n return (\n <div className=\"a2ui-slider\" style={hostStyle}>\n <section className={classMapToString(theme.components.Slider.container)}>\n <label\n htmlFor={id}\n className={classMapToString(theme.components.Slider.label)}\n >\n {label}\n </label>\n <input\n type=\"range\"\n id={id}\n name=\"data\"\n value={value}\n min={minValue}\n max={maxValue}\n onChange={handleChange}\n className={classMapToString(theme.components.Slider.element)}\n style={stylesToObject(theme.additionalStyles?.Slider)}\n />\n <span className={classMapToString(theme.components.Slider.label)}>\n {value}\n </span>\n </section>\n </div>\n );\n});\n\nexport default Slider;\n"],"mappings":";;;;;;;;;;;;AAWA,MAAa,SAAS,KAAK,SAAS,OAAO,EACzC,MACA,aACuC;CACvC,MAAM,EAAE,OAAO,eAAe,eAAe,UAAU,aACrD,iBAAiB,MAAM,UAAU;CACnC,MAAM,QAAQ,KAAK;CACnB,MAAM,KAAK,OAAO;CAElB,MAAM,YAAY,MAAM,OAAO;CAC/B,MAAM,eAAe,cAAc,MAAM,MAAM,IAAI;CAEnD,MAAM,WAAW,MAAM,YAAY;CACnC,MAAM,WAAW,MAAM,YAAY;CAEnC,MAAM,CAAC,OAAO,iBAAiB,SAAS,aAAa;AAGrD,iBAAgB;AACd,MAAI,WAAW;GACb,MAAM,gBAAgB,SAAS,UAAU;AACzC,OAAI,kBAAkB,QAAQ,OAAO,cAAc,KAAK,MACtD,eAAc,OAAO,cAAc,CAAC;;IAGvC,CAAC,WAAW,SAAS,CAAC;AAGzB,iBAAgB;AACd,MAAI,MAAM,OAAO,kBAAkB,OACjC,eAAc,MAAM,MAAM,cAAc;IAEzC,CAAC,MAAM,OAAO,cAAc,CAAC;CAEhC,MAAM,eAAe,aAClB,MAA2C;EAC1C,MAAM,WAAW,OAAO,EAAE,OAAO,MAAM;AACvC,gBAAc,SAAS;AAGvB,MAAI,UACF,UAAS,WAAW,SAAS;IAGjC,CAAC,WAAW,SAAS,CACtB;CAID,MAAM,aAAc,MAAc;CAClC,MAAM,QAAQ,aAAa,cAAc,WAAW,GAAG;AAiBvD,QACE,oBAAC;EAAI,WAAU;EAAc,OAL7B,KAAK,WAAW,SACX,EAAE,YAAY,KAAK,QAAQ,GAC5B,EAAE;YAIJ,qBAAC;GAAQ,WAAW,iBAAiB,MAAM,WAAW,OAAO,UAAU;;IACrE,oBAAC;KACC,SAAS;KACT,WAAW,iBAAiB,MAAM,WAAW,OAAO,MAAM;eAEzD;MACK;IACR,oBAAC;KACC,MAAK;KACD;KACJ,MAAK;KACE;KACP,KAAK;KACL,KAAK;KACL,UAAU;KACV,WAAW,iBAAiB,MAAM,WAAW,OAAO,QAAQ;KAC5D,OAAO,eAAe,MAAM,kBAAkB,OAAO;MACrD;IACF,oBAAC;KAAK,WAAW,iBAAiB,MAAM,WAAW,OAAO,MAAM;eAC7D;MACI;;IACC;GACN;EAER"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
const require_runtime = require('../../../_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
const require_utils = require('../../theme/utils.cjs');
|
|
3
|
+
require('../../lib/utils.cjs');
|
|
4
|
+
const require_useA2UIComponent = require('../../hooks/useA2UIComponent.cjs');
|
|
5
|
+
let react = require("react");
|
|
6
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
|
+
|
|
8
|
+
//#region src/react-renderer/components/interactive/TextField.tsx
|
|
9
|
+
/**
|
|
10
|
+
* TextField component - an input field for text entry.
|
|
11
|
+
*
|
|
12
|
+
* Supports various input types and two-way data binding.
|
|
13
|
+
*/
|
|
14
|
+
const TextField = (0, react.memo)(function TextField({ node, surfaceId }) {
|
|
15
|
+
const { theme, resolveString, setValue, getValue } = require_useA2UIComponent.useA2UIComponent(node, surfaceId);
|
|
16
|
+
const props = node.properties;
|
|
17
|
+
const id = (0, react.useId)();
|
|
18
|
+
const label = resolveString(props.label);
|
|
19
|
+
const textPath = props.text?.path;
|
|
20
|
+
const initialValue = resolveString(props.text) ?? "";
|
|
21
|
+
const fieldType = props.type;
|
|
22
|
+
const validationRegexp = props.validationRegexp;
|
|
23
|
+
const [value, setLocalValue] = (0, react.useState)(initialValue);
|
|
24
|
+
const [_isValid, setIsValid] = (0, react.useState)(true);
|
|
25
|
+
(0, react.useEffect)(() => {
|
|
26
|
+
if (textPath) {
|
|
27
|
+
const externalValue = getValue(textPath);
|
|
28
|
+
if (externalValue !== null && String(externalValue) !== value) setLocalValue(String(externalValue));
|
|
29
|
+
}
|
|
30
|
+
}, [textPath, getValue]);
|
|
31
|
+
const handleChange = (0, react.useCallback)((e) => {
|
|
32
|
+
const newValue = e.target.value;
|
|
33
|
+
setLocalValue(newValue);
|
|
34
|
+
if (validationRegexp) setIsValid(new RegExp(validationRegexp).test(newValue));
|
|
35
|
+
if (textPath) setValue(textPath, newValue);
|
|
36
|
+
}, [
|
|
37
|
+
validationRegexp,
|
|
38
|
+
textPath,
|
|
39
|
+
setValue
|
|
40
|
+
]);
|
|
41
|
+
const inputType = fieldType === "number" ? "number" : fieldType === "date" ? "date" : "text";
|
|
42
|
+
const isTextArea = fieldType === "longText";
|
|
43
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
44
|
+
className: "a2ui-textfield",
|
|
45
|
+
style: node.weight !== void 0 ? { "--weight": node.weight } : {},
|
|
46
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
|
|
47
|
+
className: require_utils.classMapToString(theme.components.TextField.container),
|
|
48
|
+
children: [label && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
49
|
+
htmlFor: id,
|
|
50
|
+
className: require_utils.classMapToString(theme.components.TextField.label),
|
|
51
|
+
children: label
|
|
52
|
+
}), isTextArea ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
|
|
53
|
+
id,
|
|
54
|
+
value,
|
|
55
|
+
onChange: handleChange,
|
|
56
|
+
placeholder: "Please enter a value",
|
|
57
|
+
className: require_utils.classMapToString(theme.components.TextField.element),
|
|
58
|
+
style: require_utils.stylesToObject(theme.additionalStyles?.TextField)
|
|
59
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
60
|
+
type: inputType,
|
|
61
|
+
id,
|
|
62
|
+
value,
|
|
63
|
+
onChange: handleChange,
|
|
64
|
+
placeholder: "Please enter a value",
|
|
65
|
+
className: require_utils.classMapToString(theme.components.TextField.element),
|
|
66
|
+
style: require_utils.stylesToObject(theme.additionalStyles?.TextField)
|
|
67
|
+
})]
|
|
68
|
+
})
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
//#endregion
|
|
73
|
+
exports.default = TextField;
|
|
74
|
+
//# sourceMappingURL=TextField.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextField.cjs","names":["useA2UIComponent","classMapToString","stylesToObject"],"sources":["../../../../src/react-renderer/components/interactive/TextField.tsx"],"sourcesContent":["import { useState, useCallback, useEffect, useId, memo } from \"react\";\nimport type { Types } from \"@a2ui/lit/0.8\";\nimport type { A2UIComponentProps } from \"../../types\";\nimport { useA2UIComponent } from \"../../hooks/useA2UIComponent\";\nimport { classMapToString, stylesToObject } from \"../../lib/utils\";\n\ntype TextFieldType = \"shortText\" | \"longText\" | \"number\" | \"date\";\n\n/**\n * TextField component - an input field for text entry.\n *\n * Supports various input types and two-way data binding.\n */\nexport const TextField = memo(function TextField({\n node,\n surfaceId,\n}: A2UIComponentProps<Types.TextFieldNode>) {\n const { theme, resolveString, setValue, getValue } = useA2UIComponent(\n node,\n surfaceId,\n );\n const props = node.properties;\n const id = useId();\n\n const label = resolveString(props.label);\n const textPath = props.text?.path;\n const initialValue = resolveString(props.text) ?? \"\";\n const fieldType = props.type as TextFieldType | undefined;\n const validationRegexp = props.validationRegexp;\n\n const [value, setLocalValue] = useState(initialValue);\n // Validation state tracked for potential future use (e.g., error styling)\n const [_isValid, setIsValid] = useState(true);\n\n // Sync with external data model changes\n useEffect(() => {\n if (textPath) {\n const externalValue = getValue(textPath);\n if (externalValue !== null && String(externalValue) !== value) {\n setLocalValue(String(externalValue));\n }\n }\n }, [textPath, getValue]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const newValue = e.target.value;\n setLocalValue(newValue);\n\n // Validate if pattern provided\n if (validationRegexp) {\n setIsValid(new RegExp(validationRegexp).test(newValue));\n }\n\n // Two-way binding: update data model\n if (textPath) {\n setValue(textPath, newValue);\n }\n },\n [validationRegexp, textPath, setValue],\n );\n\n const inputType =\n fieldType === \"number\" ? \"number\" : fieldType === \"date\" ? \"date\" : \"text\";\n const isTextArea = fieldType === \"longText\";\n\n // Structure mirrors Lit's TextField component:\n // <div class=\"a2ui-textfield\"> ← :host equivalent\n // <section class=\"...\"> ← container with theme classes\n // <label>...</label>\n // <input>...</input>\n // </section>\n // </div>\n\n // Apply --weight CSS variable on root div (:host equivalent) for flex layouts\n const hostStyle: React.CSSProperties =\n node.weight !== undefined\n ? ({ \"--weight\": node.weight } as React.CSSProperties)\n : {};\n\n return (\n <div className=\"a2ui-textfield\" style={hostStyle}>\n <section\n className={classMapToString(theme.components.TextField.container)}\n >\n {label && (\n <label\n htmlFor={id}\n className={classMapToString(theme.components.TextField.label)}\n >\n {label}\n </label>\n )}\n {isTextArea ? (\n <textarea\n id={id}\n value={value}\n onChange={handleChange}\n placeholder=\"Please enter a value\"\n className={classMapToString(theme.components.TextField.element)}\n style={stylesToObject(theme.additionalStyles?.TextField)}\n />\n ) : (\n <input\n type={inputType}\n id={id}\n value={value}\n onChange={handleChange}\n placeholder=\"Please enter a value\"\n className={classMapToString(theme.components.TextField.element)}\n style={stylesToObject(theme.additionalStyles?.TextField)}\n />\n )}\n </section>\n </div>\n );\n});\n\nexport default TextField;\n"],"mappings":";;;;;;;;;;;;;AAaA,MAAa,4BAAiB,SAAS,UAAU,EAC/C,MACA,aAC0C;CAC1C,MAAM,EAAE,OAAO,eAAe,UAAU,aAAaA,0CACnD,MACA,UACD;CACD,MAAM,QAAQ,KAAK;CACnB,MAAM,uBAAY;CAElB,MAAM,QAAQ,cAAc,MAAM,MAAM;CACxC,MAAM,WAAW,MAAM,MAAM;CAC7B,MAAM,eAAe,cAAc,MAAM,KAAK,IAAI;CAClD,MAAM,YAAY,MAAM;CACxB,MAAM,mBAAmB,MAAM;CAE/B,MAAM,CAAC,OAAO,qCAA0B,aAAa;CAErD,MAAM,CAAC,UAAU,kCAAuB,KAAK;AAG7C,4BAAgB;AACd,MAAI,UAAU;GACZ,MAAM,gBAAgB,SAAS,SAAS;AACxC,OAAI,kBAAkB,QAAQ,OAAO,cAAc,KAAK,MACtD,eAAc,OAAO,cAAc,CAAC;;IAGvC,CAAC,UAAU,SAAS,CAAC;CAExB,MAAM,uCACH,MAAiE;EAChE,MAAM,WAAW,EAAE,OAAO;AAC1B,gBAAc,SAAS;AAGvB,MAAI,iBACF,YAAW,IAAI,OAAO,iBAAiB,CAAC,KAAK,SAAS,CAAC;AAIzD,MAAI,SACF,UAAS,UAAU,SAAS;IAGhC;EAAC;EAAkB;EAAU;EAAS,CACvC;CAED,MAAM,YACJ,cAAc,WAAW,WAAW,cAAc,SAAS,SAAS;CACtE,MAAM,aAAa,cAAc;AAgBjC,QACE,2CAAC;EAAI,WAAU;EAAiB,OALhC,KAAK,WAAW,SACX,EAAE,YAAY,KAAK,QAAQ,GAC5B,EAAE;YAIJ,4CAAC;GACC,WAAWC,+BAAiB,MAAM,WAAW,UAAU,UAAU;cAEhE,SACC,2CAAC;IACC,SAAS;IACT,WAAWA,+BAAiB,MAAM,WAAW,UAAU,MAAM;cAE5D;KACK,EAET,aACC,2CAAC;IACK;IACG;IACP,UAAU;IACV,aAAY;IACZ,WAAWA,+BAAiB,MAAM,WAAW,UAAU,QAAQ;IAC/D,OAAOC,6BAAe,MAAM,kBAAkB,UAAU;KACxD,GAEF,2CAAC;IACC,MAAM;IACF;IACG;IACP,UAAU;IACV,aAAY;IACZ,WAAWD,+BAAiB,MAAM,WAAW,UAAU,QAAQ;IAC/D,OAAOC,6BAAe,MAAM,kBAAkB,UAAU;KACxD;IAEI;GACN;EAER"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { classMapToString, stylesToObject } from "../../theme/utils.mjs";
|
|
2
|
+
import "../../lib/utils.mjs";
|
|
3
|
+
import { useA2UIComponent } from "../../hooks/useA2UIComponent.mjs";
|
|
4
|
+
import { memo, useCallback, useEffect, useId, useState } from "react";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
|
|
7
|
+
//#region src/react-renderer/components/interactive/TextField.tsx
|
|
8
|
+
/**
|
|
9
|
+
* TextField component - an input field for text entry.
|
|
10
|
+
*
|
|
11
|
+
* Supports various input types and two-way data binding.
|
|
12
|
+
*/
|
|
13
|
+
const TextField = memo(function TextField({ node, surfaceId }) {
|
|
14
|
+
const { theme, resolveString, setValue, getValue } = useA2UIComponent(node, surfaceId);
|
|
15
|
+
const props = node.properties;
|
|
16
|
+
const id = useId();
|
|
17
|
+
const label = resolveString(props.label);
|
|
18
|
+
const textPath = props.text?.path;
|
|
19
|
+
const initialValue = resolveString(props.text) ?? "";
|
|
20
|
+
const fieldType = props.type;
|
|
21
|
+
const validationRegexp = props.validationRegexp;
|
|
22
|
+
const [value, setLocalValue] = useState(initialValue);
|
|
23
|
+
const [_isValid, setIsValid] = useState(true);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (textPath) {
|
|
26
|
+
const externalValue = getValue(textPath);
|
|
27
|
+
if (externalValue !== null && String(externalValue) !== value) setLocalValue(String(externalValue));
|
|
28
|
+
}
|
|
29
|
+
}, [textPath, getValue]);
|
|
30
|
+
const handleChange = useCallback((e) => {
|
|
31
|
+
const newValue = e.target.value;
|
|
32
|
+
setLocalValue(newValue);
|
|
33
|
+
if (validationRegexp) setIsValid(new RegExp(validationRegexp).test(newValue));
|
|
34
|
+
if (textPath) setValue(textPath, newValue);
|
|
35
|
+
}, [
|
|
36
|
+
validationRegexp,
|
|
37
|
+
textPath,
|
|
38
|
+
setValue
|
|
39
|
+
]);
|
|
40
|
+
const inputType = fieldType === "number" ? "number" : fieldType === "date" ? "date" : "text";
|
|
41
|
+
const isTextArea = fieldType === "longText";
|
|
42
|
+
return /* @__PURE__ */ jsx("div", {
|
|
43
|
+
className: "a2ui-textfield",
|
|
44
|
+
style: node.weight !== void 0 ? { "--weight": node.weight } : {},
|
|
45
|
+
children: /* @__PURE__ */ jsxs("section", {
|
|
46
|
+
className: classMapToString(theme.components.TextField.container),
|
|
47
|
+
children: [label && /* @__PURE__ */ jsx("label", {
|
|
48
|
+
htmlFor: id,
|
|
49
|
+
className: classMapToString(theme.components.TextField.label),
|
|
50
|
+
children: label
|
|
51
|
+
}), isTextArea ? /* @__PURE__ */ jsx("textarea", {
|
|
52
|
+
id,
|
|
53
|
+
value,
|
|
54
|
+
onChange: handleChange,
|
|
55
|
+
placeholder: "Please enter a value",
|
|
56
|
+
className: classMapToString(theme.components.TextField.element),
|
|
57
|
+
style: stylesToObject(theme.additionalStyles?.TextField)
|
|
58
|
+
}) : /* @__PURE__ */ jsx("input", {
|
|
59
|
+
type: inputType,
|
|
60
|
+
id,
|
|
61
|
+
value,
|
|
62
|
+
onChange: handleChange,
|
|
63
|
+
placeholder: "Please enter a value",
|
|
64
|
+
className: classMapToString(theme.components.TextField.element),
|
|
65
|
+
style: stylesToObject(theme.additionalStyles?.TextField)
|
|
66
|
+
})]
|
|
67
|
+
})
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
//#endregion
|
|
72
|
+
export { TextField as default };
|
|
73
|
+
//# sourceMappingURL=TextField.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextField.mjs","names":[],"sources":["../../../../src/react-renderer/components/interactive/TextField.tsx"],"sourcesContent":["import { useState, useCallback, useEffect, useId, memo } from \"react\";\nimport type { Types } from \"@a2ui/lit/0.8\";\nimport type { A2UIComponentProps } from \"../../types\";\nimport { useA2UIComponent } from \"../../hooks/useA2UIComponent\";\nimport { classMapToString, stylesToObject } from \"../../lib/utils\";\n\ntype TextFieldType = \"shortText\" | \"longText\" | \"number\" | \"date\";\n\n/**\n * TextField component - an input field for text entry.\n *\n * Supports various input types and two-way data binding.\n */\nexport const TextField = memo(function TextField({\n node,\n surfaceId,\n}: A2UIComponentProps<Types.TextFieldNode>) {\n const { theme, resolveString, setValue, getValue } = useA2UIComponent(\n node,\n surfaceId,\n );\n const props = node.properties;\n const id = useId();\n\n const label = resolveString(props.label);\n const textPath = props.text?.path;\n const initialValue = resolveString(props.text) ?? \"\";\n const fieldType = props.type as TextFieldType | undefined;\n const validationRegexp = props.validationRegexp;\n\n const [value, setLocalValue] = useState(initialValue);\n // Validation state tracked for potential future use (e.g., error styling)\n const [_isValid, setIsValid] = useState(true);\n\n // Sync with external data model changes\n useEffect(() => {\n if (textPath) {\n const externalValue = getValue(textPath);\n if (externalValue !== null && String(externalValue) !== value) {\n setLocalValue(String(externalValue));\n }\n }\n }, [textPath, getValue]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const newValue = e.target.value;\n setLocalValue(newValue);\n\n // Validate if pattern provided\n if (validationRegexp) {\n setIsValid(new RegExp(validationRegexp).test(newValue));\n }\n\n // Two-way binding: update data model\n if (textPath) {\n setValue(textPath, newValue);\n }\n },\n [validationRegexp, textPath, setValue],\n );\n\n const inputType =\n fieldType === \"number\" ? \"number\" : fieldType === \"date\" ? \"date\" : \"text\";\n const isTextArea = fieldType === \"longText\";\n\n // Structure mirrors Lit's TextField component:\n // <div class=\"a2ui-textfield\"> ← :host equivalent\n // <section class=\"...\"> ← container with theme classes\n // <label>...</label>\n // <input>...</input>\n // </section>\n // </div>\n\n // Apply --weight CSS variable on root div (:host equivalent) for flex layouts\n const hostStyle: React.CSSProperties =\n node.weight !== undefined\n ? ({ \"--weight\": node.weight } as React.CSSProperties)\n : {};\n\n return (\n <div className=\"a2ui-textfield\" style={hostStyle}>\n <section\n className={classMapToString(theme.components.TextField.container)}\n >\n {label && (\n <label\n htmlFor={id}\n className={classMapToString(theme.components.TextField.label)}\n >\n {label}\n </label>\n )}\n {isTextArea ? (\n <textarea\n id={id}\n value={value}\n onChange={handleChange}\n placeholder=\"Please enter a value\"\n className={classMapToString(theme.components.TextField.element)}\n style={stylesToObject(theme.additionalStyles?.TextField)}\n />\n ) : (\n <input\n type={inputType}\n id={id}\n value={value}\n onChange={handleChange}\n placeholder=\"Please enter a value\"\n className={classMapToString(theme.components.TextField.element)}\n style={stylesToObject(theme.additionalStyles?.TextField)}\n />\n )}\n </section>\n </div>\n );\n});\n\nexport default TextField;\n"],"mappings":";;;;;;;;;;;;AAaA,MAAa,YAAY,KAAK,SAAS,UAAU,EAC/C,MACA,aAC0C;CAC1C,MAAM,EAAE,OAAO,eAAe,UAAU,aAAa,iBACnD,MACA,UACD;CACD,MAAM,QAAQ,KAAK;CACnB,MAAM,KAAK,OAAO;CAElB,MAAM,QAAQ,cAAc,MAAM,MAAM;CACxC,MAAM,WAAW,MAAM,MAAM;CAC7B,MAAM,eAAe,cAAc,MAAM,KAAK,IAAI;CAClD,MAAM,YAAY,MAAM;CACxB,MAAM,mBAAmB,MAAM;CAE/B,MAAM,CAAC,OAAO,iBAAiB,SAAS,aAAa;CAErD,MAAM,CAAC,UAAU,cAAc,SAAS,KAAK;AAG7C,iBAAgB;AACd,MAAI,UAAU;GACZ,MAAM,gBAAgB,SAAS,SAAS;AACxC,OAAI,kBAAkB,QAAQ,OAAO,cAAc,KAAK,MACtD,eAAc,OAAO,cAAc,CAAC;;IAGvC,CAAC,UAAU,SAAS,CAAC;CAExB,MAAM,eAAe,aAClB,MAAiE;EAChE,MAAM,WAAW,EAAE,OAAO;AAC1B,gBAAc,SAAS;AAGvB,MAAI,iBACF,YAAW,IAAI,OAAO,iBAAiB,CAAC,KAAK,SAAS,CAAC;AAIzD,MAAI,SACF,UAAS,UAAU,SAAS;IAGhC;EAAC;EAAkB;EAAU;EAAS,CACvC;CAED,MAAM,YACJ,cAAc,WAAW,WAAW,cAAc,SAAS,SAAS;CACtE,MAAM,aAAa,cAAc;AAgBjC,QACE,oBAAC;EAAI,WAAU;EAAiB,OALhC,KAAK,WAAW,SACX,EAAE,YAAY,KAAK,QAAQ,GAC5B,EAAE;YAIJ,qBAAC;GACC,WAAW,iBAAiB,MAAM,WAAW,UAAU,UAAU;cAEhE,SACC,oBAAC;IACC,SAAS;IACT,WAAW,iBAAiB,MAAM,WAAW,UAAU,MAAM;cAE5D;KACK,EAET,aACC,oBAAC;IACK;IACG;IACP,UAAU;IACV,aAAY;IACZ,WAAW,iBAAiB,MAAM,WAAW,UAAU,QAAQ;IAC/D,OAAO,eAAe,MAAM,kBAAkB,UAAU;KACxD,GAEF,oBAAC;IACC,MAAM;IACF;IACG;IACP,UAAU;IACV,aAAY;IACZ,WAAW,iBAAiB,MAAM,WAAW,UAAU,QAAQ;IAC/D,OAAO,eAAe,MAAM,kBAAkB,UAAU;KACxD;IAEI;GACN;EAER"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
const require_runtime = require('../../../_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
const require_ComponentNode = require('../../core/ComponentNode.cjs');
|
|
3
|
+
const require_utils = require('../../theme/utils.cjs');
|
|
4
|
+
require('../../lib/utils.cjs');
|
|
5
|
+
const require_useA2UIComponent = require('../../hooks/useA2UIComponent.cjs');
|
|
6
|
+
let react = require("react");
|
|
7
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
8
|
+
|
|
9
|
+
//#region src/react-renderer/components/layout/Card.tsx
|
|
10
|
+
/**
|
|
11
|
+
* Card component - a container that visually groups content.
|
|
12
|
+
*
|
|
13
|
+
* Structure mirrors Lit's Card component:
|
|
14
|
+
* <div class="a2ui-card"> ← :host equivalent
|
|
15
|
+
* <section class="..."> ← theme classes (border, padding, background)
|
|
16
|
+
* {children} ← ::slotted(*) equivalent
|
|
17
|
+
* </section>
|
|
18
|
+
* </div>
|
|
19
|
+
*
|
|
20
|
+
* All styles come from componentSpecificStyles CSS, no inline styles needed.
|
|
21
|
+
*/
|
|
22
|
+
const Card = (0, react.memo)(function Card({ node, surfaceId }) {
|
|
23
|
+
const { theme } = require_useA2UIComponent.useA2UIComponent(node, surfaceId);
|
|
24
|
+
const props = node.properties;
|
|
25
|
+
const rawChildren = props.children ?? (props.child ? [props.child] : []);
|
|
26
|
+
const children = Array.isArray(rawChildren) ? rawChildren : [];
|
|
27
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
28
|
+
className: "a2ui-card",
|
|
29
|
+
style: node.weight !== void 0 ? { "--weight": node.weight } : {},
|
|
30
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("section", {
|
|
31
|
+
className: require_utils.classMapToString(theme.components.Card),
|
|
32
|
+
style: require_utils.stylesToObject(theme.additionalStyles?.Card),
|
|
33
|
+
children: children.map((child, index) => {
|
|
34
|
+
const childId = typeof child === "object" && child !== null && "id" in child ? child.id : `child-${index}`;
|
|
35
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ComponentNode.default, {
|
|
36
|
+
node: typeof child === "object" && child !== null && "type" in child ? child : null,
|
|
37
|
+
surfaceId
|
|
38
|
+
}, childId);
|
|
39
|
+
})
|
|
40
|
+
})
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
//#endregion
|
|
45
|
+
exports.default = Card;
|
|
46
|
+
//# sourceMappingURL=Card.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Card.cjs","names":["useA2UIComponent","classMapToString","stylesToObject","ComponentNode"],"sources":["../../../../src/react-renderer/components/layout/Card.tsx"],"sourcesContent":["import { memo } from \"react\";\nimport type { Types } from \"@a2ui/lit/0.8\";\nimport type { A2UIComponentProps } from \"../../types\";\nimport { useA2UIComponent } from \"../../hooks/useA2UIComponent\";\nimport { classMapToString, stylesToObject } from \"../../lib/utils\";\nimport { ComponentNode } from \"../../core/ComponentNode\";\n\n/**\n * Card component - a container that visually groups content.\n *\n * Structure mirrors Lit's Card component:\n * <div class=\"a2ui-card\"> ← :host equivalent\n * <section class=\"...\"> ← theme classes (border, padding, background)\n * {children} ← ::slotted(*) equivalent\n * </section>\n * </div>\n *\n * All styles come from componentSpecificStyles CSS, no inline styles needed.\n */\nexport const Card = memo(function Card({\n node,\n surfaceId,\n}: A2UIComponentProps<Types.CardNode>) {\n const { theme } = useA2UIComponent(node, surfaceId);\n const props = node.properties;\n\n // Card can have either a single child or multiple children\n const rawChildren = props.children ?? (props.child ? [props.child] : []);\n const children = Array.isArray(rawChildren) ? rawChildren : [];\n\n // Apply --weight CSS variable on root div (:host equivalent) for flex layouts\n const hostStyle: React.CSSProperties =\n node.weight !== undefined\n ? ({ \"--weight\": node.weight } as React.CSSProperties)\n : {};\n\n return (\n <div className=\"a2ui-card\" style={hostStyle}>\n <section\n className={classMapToString(theme.components.Card)}\n style={stylesToObject(theme.additionalStyles?.Card)}\n >\n {children.map((child, index) => {\n const childId =\n typeof child === \"object\" && child !== null && \"id\" in child\n ? (child as Types.AnyComponentNode).id\n : `child-${index}`;\n const childNode =\n typeof child === \"object\" && child !== null && \"type\" in child\n ? (child as Types.AnyComponentNode)\n : null;\n return (\n <ComponentNode\n key={childId}\n node={childNode}\n surfaceId={surfaceId}\n />\n );\n })}\n </section>\n </div>\n );\n});\n\nexport default Card;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAmBA,MAAa,uBAAY,SAAS,KAAK,EACrC,MACA,aACqC;CACrC,MAAM,EAAE,UAAUA,0CAAiB,MAAM,UAAU;CACnD,MAAM,QAAQ,KAAK;CAGnB,MAAM,cAAc,MAAM,aAAa,MAAM,QAAQ,CAAC,MAAM,MAAM,GAAG,EAAE;CACvE,MAAM,WAAW,MAAM,QAAQ,YAAY,GAAG,cAAc,EAAE;AAQ9D,QACE,2CAAC;EAAI,WAAU;EAAY,OAL3B,KAAK,WAAW,SACX,EAAE,YAAY,KAAK,QAAQ,GAC5B,EAAE;YAIJ,2CAAC;GACC,WAAWC,+BAAiB,MAAM,WAAW,KAAK;GAClD,OAAOC,6BAAe,MAAM,kBAAkB,KAAK;aAElD,SAAS,KAAK,OAAO,UAAU;IAC9B,MAAM,UACJ,OAAO,UAAU,YAAY,UAAU,QAAQ,QAAQ,QAClD,MAAiC,KAClC,SAAS;AAKf,WACE,2CAACC;KAEC,MANF,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,QACpD,QACD;KAKS;OAFN,QAGL;KAEJ;IACM;GACN;EAER"}
|