@lynx-js/genui 0.0.1-rc.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.
Files changed (254) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +170 -0
  3. package/a2ui/README.md +140 -0
  4. package/a2ui/dist/catalog/Button/catalog.json +156 -0
  5. package/a2ui/dist/catalog/Button/index.d.ts +35 -0
  6. package/a2ui/dist/catalog/Button/index.js +35 -0
  7. package/a2ui/dist/catalog/Button/index.js.map +1 -0
  8. package/a2ui/dist/catalog/Card/catalog.json +24 -0
  9. package/a2ui/dist/catalog/Card/index.d.ts +11 -0
  10. package/a2ui/dist/catalog/Card/index.js +19 -0
  11. package/a2ui/dist/catalog/Card/index.js.map +1 -0
  12. package/a2ui/dist/catalog/CheckBox/catalog.json +170 -0
  13. package/a2ui/dist/catalog/CheckBox/index.d.ts +32 -0
  14. package/a2ui/dist/catalog/CheckBox/index.js +24 -0
  15. package/a2ui/dist/catalog/CheckBox/index.js.map +1 -0
  16. package/a2ui/dist/catalog/Column/catalog.json +57 -0
  17. package/a2ui/dist/catalog/Column/index.d.ts +15 -0
  18. package/a2ui/dist/catalog/Column/index.js +55 -0
  19. package/a2ui/dist/catalog/Column/index.js.map +1 -0
  20. package/a2ui/dist/catalog/Divider/catalog.json +14 -0
  21. package/a2ui/dist/catalog/Divider/index.d.ts +9 -0
  22. package/a2ui/dist/catalog/Divider/index.js +8 -0
  23. package/a2ui/dist/catalog/Divider/index.js.map +1 -0
  24. package/a2ui/dist/catalog/Icon/catalog.json +45 -0
  25. package/a2ui/dist/catalog/Icon/index.d.ts +14 -0
  26. package/a2ui/dist/catalog/Icon/index.js +11 -0
  27. package/a2ui/dist/catalog/Icon/index.js.map +1 -0
  28. package/a2ui/dist/catalog/Image/catalog.json +62 -0
  29. package/a2ui/dist/catalog/Image/index.d.ts +16 -0
  30. package/a2ui/dist/catalog/Image/index.js +30 -0
  31. package/a2ui/dist/catalog/Image/index.js.map +1 -0
  32. package/a2ui/dist/catalog/LineChart/catalog.json +98 -0
  33. package/a2ui/dist/catalog/LineChart/index.d.ts +31 -0
  34. package/a2ui/dist/catalog/LineChart/index.js +195 -0
  35. package/a2ui/dist/catalog/LineChart/index.js.map +1 -0
  36. package/a2ui/dist/catalog/List/catalog.json +52 -0
  37. package/a2ui/dist/catalog/List/index.d.ts +15 -0
  38. package/a2ui/dist/catalog/List/index.js +53 -0
  39. package/a2ui/dist/catalog/List/index.js.map +1 -0
  40. package/a2ui/dist/catalog/Modal/catalog.json +18 -0
  41. package/a2ui/dist/catalog/Modal/index.d.ts +12 -0
  42. package/a2ui/dist/catalog/Modal/index.js +33 -0
  43. package/a2ui/dist/catalog/Modal/index.js.map +1 -0
  44. package/a2ui/dist/catalog/PieChart/catalog.json +87 -0
  45. package/a2ui/dist/catalog/PieChart/index.d.ts +37 -0
  46. package/a2ui/dist/catalog/PieChart/index.js +131 -0
  47. package/a2ui/dist/catalog/PieChart/index.js.map +1 -0
  48. package/a2ui/dist/catalog/RadioGroup/catalog.json +184 -0
  49. package/a2ui/dist/catalog/RadioGroup/index.d.ts +36 -0
  50. package/a2ui/dist/catalog/RadioGroup/index.js +36 -0
  51. package/a2ui/dist/catalog/RadioGroup/index.js.map +1 -0
  52. package/a2ui/dist/catalog/Row/catalog.json +57 -0
  53. package/a2ui/dist/catalog/Row/index.d.ts +15 -0
  54. package/a2ui/dist/catalog/Row/index.js +28 -0
  55. package/a2ui/dist/catalog/Row/index.js.map +1 -0
  56. package/a2ui/dist/catalog/Slider/catalog.json +183 -0
  57. package/a2ui/dist/catalog/Slider/index.d.ts +41 -0
  58. package/a2ui/dist/catalog/Slider/index.js +39 -0
  59. package/a2ui/dist/catalog/Slider/index.js.map +1 -0
  60. package/a2ui/dist/catalog/Slider/utils.d.ts +11 -0
  61. package/a2ui/dist/catalog/Slider/utils.js +58 -0
  62. package/a2ui/dist/catalog/Slider/utils.js.map +1 -0
  63. package/a2ui/dist/catalog/Tabs/catalog.json +28 -0
  64. package/a2ui/dist/catalog/Tabs/index.d.ts +12 -0
  65. package/a2ui/dist/catalog/Tabs/index.js +32 -0
  66. package/a2ui/dist/catalog/Tabs/index.js.map +1 -0
  67. package/a2ui/dist/catalog/Text/catalog.json +74 -0
  68. package/a2ui/dist/catalog/Text/index.d.ts +18 -0
  69. package/a2ui/dist/catalog/Text/index.js +27 -0
  70. package/a2ui/dist/catalog/Text/index.js.map +1 -0
  71. package/a2ui/dist/catalog/TextField/catalog.json +147 -0
  72. package/a2ui/dist/catalog/TextField/index.d.ts +35 -0
  73. package/a2ui/dist/catalog/TextField/index.js +43 -0
  74. package/a2ui/dist/catalog/TextField/index.js.map +1 -0
  75. package/a2ui/dist/catalog/TextField/utils.d.ts +7 -0
  76. package/a2ui/dist/catalog/TextField/utils.js +51 -0
  77. package/a2ui/dist/catalog/TextField/utils.js.map +1 -0
  78. package/a2ui/dist/catalog/defineCatalog.d.ts +119 -0
  79. package/a2ui/dist/catalog/defineCatalog.js +196 -0
  80. package/a2ui/dist/catalog/defineCatalog.js.map +1 -0
  81. package/a2ui/dist/catalog/index.d.ts +20 -0
  82. package/a2ui/dist/catalog/index.js +26 -0
  83. package/a2ui/dist/catalog/index.js.map +1 -0
  84. package/a2ui/dist/catalog/utils/chart.d.ts +3 -0
  85. package/a2ui/dist/catalog/utils/chart.js +28 -0
  86. package/a2ui/dist/catalog/utils/chart.js.map +1 -0
  87. package/a2ui/dist/functions/index.d.ts +19 -0
  88. package/a2ui/dist/functions/index.js +87 -0
  89. package/a2ui/dist/functions/index.js.map +1 -0
  90. package/a2ui/dist/index.d.ts +11 -0
  91. package/a2ui/dist/index.js +35 -0
  92. package/a2ui/dist/index.js.map +1 -0
  93. package/a2ui/dist/react/A2UI.d.ts +77 -0
  94. package/a2ui/dist/react/A2UI.js +159 -0
  95. package/a2ui/dist/react/A2UI.js.map +1 -0
  96. package/a2ui/dist/react/A2UIProvider.d.ts +25 -0
  97. package/a2ui/dist/react/A2UIProvider.js +20 -0
  98. package/a2ui/dist/react/A2UIProvider.js.map +1 -0
  99. package/a2ui/dist/react/A2UIRenderer.d.ts +34 -0
  100. package/a2ui/dist/react/A2UIRenderer.js +161 -0
  101. package/a2ui/dist/react/A2UIRenderer.js.map +1 -0
  102. package/a2ui/dist/react/FormContext.d.ts +10 -0
  103. package/a2ui/dist/react/FormContext.js +12 -0
  104. package/a2ui/dist/react/FormContext.js.map +1 -0
  105. package/a2ui/dist/react/index.d.ts +8 -0
  106. package/a2ui/dist/react/index.js +23 -0
  107. package/a2ui/dist/react/index.js.map +1 -0
  108. package/a2ui/dist/react/useA2UIContext.d.ts +7 -0
  109. package/a2ui/dist/react/useA2UIContext.js +19 -0
  110. package/a2ui/dist/react/useA2UIContext.js.map +1 -0
  111. package/a2ui/dist/react/useAction.d.ts +9 -0
  112. package/a2ui/dist/react/useAction.js +38 -0
  113. package/a2ui/dist/react/useAction.js.map +1 -0
  114. package/a2ui/dist/react/useCatalog.d.ts +7 -0
  115. package/a2ui/dist/react/useCatalog.js +13 -0
  116. package/a2ui/dist/react/useCatalog.js.map +1 -0
  117. package/a2ui/dist/react/useChecks.d.ts +27 -0
  118. package/a2ui/dist/react/useChecks.js +76 -0
  119. package/a2ui/dist/react/useChecks.js.map +1 -0
  120. package/a2ui/dist/react/useDataBinding.d.ts +10 -0
  121. package/a2ui/dist/react/useDataBinding.js +175 -0
  122. package/a2ui/dist/react/useDataBinding.js.map +1 -0
  123. package/a2ui/dist/store/FormController.d.ts +23 -0
  124. package/a2ui/dist/store/FormController.js +40 -0
  125. package/a2ui/dist/store/FormController.js.map +1 -0
  126. package/a2ui/dist/store/FunctionRegistry.d.ts +47 -0
  127. package/a2ui/dist/store/FunctionRegistry.js +23 -0
  128. package/a2ui/dist/store/FunctionRegistry.js.map +1 -0
  129. package/a2ui/dist/store/MessageProcessor.d.ts +28 -0
  130. package/a2ui/dist/store/MessageProcessor.js +408 -0
  131. package/a2ui/dist/store/MessageProcessor.js.map +1 -0
  132. package/a2ui/dist/store/MessageStore.d.ts +38 -0
  133. package/a2ui/dist/store/MessageStore.js +37 -0
  134. package/a2ui/dist/store/MessageStore.js.map +1 -0
  135. package/a2ui/dist/store/Resource.d.ts +45 -0
  136. package/a2ui/dist/store/Resource.js +80 -0
  137. package/a2ui/dist/store/Resource.js.map +1 -0
  138. package/a2ui/dist/store/SignalStore.d.ts +10 -0
  139. package/a2ui/dist/store/SignalStore.js +29 -0
  140. package/a2ui/dist/store/SignalStore.js.map +1 -0
  141. package/a2ui/dist/store/index.d.ts +14 -0
  142. package/a2ui/dist/store/index.js +15 -0
  143. package/a2ui/dist/store/index.js.map +1 -0
  144. package/a2ui/dist/store/payloadNormalizer.d.ts +27 -0
  145. package/a2ui/dist/store/payloadNormalizer.js +179 -0
  146. package/a2ui/dist/store/payloadNormalizer.js.map +1 -0
  147. package/a2ui/dist/store/resolveFunctionCall.d.ts +18 -0
  148. package/a2ui/dist/store/resolveFunctionCall.js +131 -0
  149. package/a2ui/dist/store/resolveFunctionCall.js.map +1 -0
  150. package/a2ui/dist/store/types.d.ts +68 -0
  151. package/a2ui/dist/store/types.js +2 -0
  152. package/a2ui/dist/store/types.js.map +1 -0
  153. package/a2ui/dist/tsconfig.build.tsbuildinfo +1 -0
  154. package/a2ui/styles/catalog/Button.css +83 -0
  155. package/a2ui/styles/catalog/Card.css +49 -0
  156. package/a2ui/styles/catalog/CheckBox.css +46 -0
  157. package/a2ui/styles/catalog/Column.css +89 -0
  158. package/a2ui/styles/catalog/Divider.css +20 -0
  159. package/a2ui/styles/catalog/Icon.css +39 -0
  160. package/a2ui/styles/catalog/Image.css +54 -0
  161. package/a2ui/styles/catalog/LineChart.css +116 -0
  162. package/a2ui/styles/catalog/List.css +38 -0
  163. package/a2ui/styles/catalog/Modal.css +60 -0
  164. package/a2ui/styles/catalog/PieChart.css +109 -0
  165. package/a2ui/styles/catalog/RadioGroup.css +123 -0
  166. package/a2ui/styles/catalog/Row.css +83 -0
  167. package/a2ui/styles/catalog/Slider.css +96 -0
  168. package/a2ui/styles/catalog/Tabs.css +46 -0
  169. package/a2ui/styles/catalog/Text.css +121 -0
  170. package/a2ui/styles/catalog/TextField.css +48 -0
  171. package/a2ui/styles/theme.css +62 -0
  172. package/a2ui-catalog-extractor/README.md +605 -0
  173. package/a2ui-catalog-extractor/bin/a2ui-catalog-extractor.js +6 -0
  174. package/a2ui-catalog-extractor/dist/cli.d.ts +12 -0
  175. package/a2ui-catalog-extractor/dist/cli.js +171 -0
  176. package/a2ui-catalog-extractor/dist/cli.js.map +1 -0
  177. package/a2ui-catalog-extractor/dist/index.d.ts +140 -0
  178. package/a2ui-catalog-extractor/dist/index.js +755 -0
  179. package/a2ui-catalog-extractor/dist/index.js.map +1 -0
  180. package/a2ui-catalog-extractor/dist/tsconfig.build.tsbuildinfo +1 -0
  181. package/a2ui-catalog-extractor/skills/a2ui-catalog-extractor/SKILL.md +30 -0
  182. package/a2ui-prompt/README.md +65 -0
  183. package/a2ui-prompt/dist/index.d.ts +91 -0
  184. package/a2ui-prompt/dist/index.js +767 -0
  185. package/cli/README.md +88 -0
  186. package/cli/bin/cli.js +271 -0
  187. package/dist/index.d.ts +10 -0
  188. package/dist/index.js +10 -0
  189. package/dist/index.js.map +1 -0
  190. package/dist/tsconfig.build.tsbuildinfo +1 -0
  191. package/index.ts +114 -0
  192. package/openui/README.md +211 -0
  193. package/openui/dist/catalog/Action/index.d.ts +20 -0
  194. package/openui/dist/catalog/Action/index.js +23 -0
  195. package/openui/dist/catalog/Action/index.js.map +1 -0
  196. package/openui/dist/catalog/Button/index.d.ts +64 -0
  197. package/openui/dist/catalog/Button/index.js +75 -0
  198. package/openui/dist/catalog/Button/index.js.map +1 -0
  199. package/openui/dist/catalog/Card/index.d.ts +34 -0
  200. package/openui/dist/catalog/Card/index.js +69 -0
  201. package/openui/dist/catalog/Card/index.js.map +1 -0
  202. package/openui/dist/catalog/CardHeader/index.d.ts +5 -0
  203. package/openui/dist/catalog/CardHeader/index.js +18 -0
  204. package/openui/dist/catalog/CardHeader/index.js.map +1 -0
  205. package/openui/dist/catalog/Separator/index.d.ts +2 -0
  206. package/openui/dist/catalog/Separator/index.js +13 -0
  207. package/openui/dist/catalog/Separator/index.js.map +1 -0
  208. package/openui/dist/catalog/Stack/index.d.ts +29 -0
  209. package/openui/dist/catalog/Stack/index.js +61 -0
  210. package/openui/dist/catalog/Stack/index.js.map +1 -0
  211. package/openui/dist/catalog/Tag/index.d.ts +4 -0
  212. package/openui/dist/catalog/Tag/index.js +15 -0
  213. package/openui/dist/catalog/Tag/index.js.map +1 -0
  214. package/openui/dist/catalog/TextContent/index.d.ts +11 -0
  215. package/openui/dist/catalog/TextContent/index.js +33 -0
  216. package/openui/dist/catalog/TextContent/index.js.map +1 -0
  217. package/openui/dist/catalog/index.d.ts +7 -0
  218. package/openui/dist/catalog/index.js +11 -0
  219. package/openui/dist/catalog/index.js.map +1 -0
  220. package/openui/dist/catalog/utils.d.ts +2 -0
  221. package/openui/dist/catalog/utils.js +17 -0
  222. package/openui/dist/catalog/utils.js.map +1 -0
  223. package/openui/dist/core/context.d.ts +112 -0
  224. package/openui/dist/core/context.js +99 -0
  225. package/openui/dist/core/context.js.map +1 -0
  226. package/openui/dist/core/createLibrary.d.ts +10 -0
  227. package/openui/dist/core/createLibrary.js +36 -0
  228. package/openui/dist/core/createLibrary.js.map +1 -0
  229. package/openui/dist/core/hooks/index.d.ts +4 -0
  230. package/openui/dist/core/hooks/index.js +6 -0
  231. package/openui/dist/core/hooks/index.js.map +1 -0
  232. package/openui/dist/core/hooks/useFormValidation.d.ts +13 -0
  233. package/openui/dist/core/hooks/useFormValidation.js +76 -0
  234. package/openui/dist/core/hooks/useFormValidation.js.map +1 -0
  235. package/openui/dist/core/hooks/useOpenUIState.d.ts +33 -0
  236. package/openui/dist/core/hooks/useOpenUIState.js +413 -0
  237. package/openui/dist/core/hooks/useOpenUIState.js.map +1 -0
  238. package/openui/dist/core/hooks/useStateField.d.ts +2 -0
  239. package/openui/dist/core/hooks/useStateField.js +11 -0
  240. package/openui/dist/core/hooks/useStateField.js.map +1 -0
  241. package/openui/dist/core/index.d.ts +7 -0
  242. package/openui/dist/core/index.js +8 -0
  243. package/openui/dist/core/index.js.map +1 -0
  244. package/openui/dist/core/library.d.ts +20 -0
  245. package/openui/dist/core/library.js +13 -0
  246. package/openui/dist/core/library.js.map +1 -0
  247. package/openui/dist/core/renderer.css +271 -0
  248. package/openui/dist/core/renderer.d.ts +9 -0
  249. package/openui/dist/core/renderer.js +139 -0
  250. package/openui/dist/core/renderer.js.map +1 -0
  251. package/openui/dist/core/utils.d.ts +1 -0
  252. package/openui/dist/core/utils.js +76 -0
  253. package/openui/dist/core/utils.js.map +1 -0
  254. package/package.json +120 -0
@@ -0,0 +1,211 @@
1
+ # @lynx-js/genui/openui
2
+
3
+ ReactLynx renderer for the [OpenUI DSL](https://www.openui.com/). Parses
4
+ OpenUI functional notation into a renderable tree and renders it via a
5
+ pluggable component catalog in Lynx applications.
6
+
7
+ This package includes:
8
+
9
+ - `createOpenUiLibrary`: factory that builds an OpenUI `Library` instance
10
+ with built-in components, fully customizable via options.
11
+ - `defineComponent`: define custom components with Zod-validated props.
12
+ - `OpenUiRenderer`: ReactLynx component that renders a parsed OpenUI tree.
13
+ - `createParser` / `createStreamingParser`: parse OpenUI DSL text
14
+ (functional notation) into a renderable AST.
15
+ - `catalog/*`: built-in component renderers (Stack, Card, CardHeader,
16
+ TextContent, Separator, Button, Buttons, Tag).
17
+
18
+ ## Exports
19
+
20
+ - `@lynx-js/genui/openui`: `createOpenUiLibrary`, `defineComponent`,
21
+ `OpenUiRenderer`, parser utilities, and all core types.
22
+ - `@lynx-js/genui/openui/catalog`: re-exports of built-in catalog
23
+ components for tree-shake-friendly subpath access.
24
+
25
+ ## Installation
26
+
27
+ Make sure your app provides the peer dependencies:
28
+
29
+ - `@lynx-js/react`
30
+
31
+ ```bash
32
+ pnpm add @lynx-js/genui
33
+ ```
34
+
35
+ ## Quick Start
36
+
37
+ 1. Create a library and get its JSON Schema.
38
+ 2. Create a streaming parser from the schema.
39
+ 3. Feed OpenUI DSL text (chunks or full) into the parser.
40
+ 4. Render the parse result with `<OpenUiRenderer>`.
41
+
42
+ ```tsx
43
+ import {
44
+ createOpenUiLibrary,
45
+ createStreamingParser,
46
+ OpenUiRenderer,
47
+ } from '@lynx-js/genui/openui';
48
+ import type { ParseResult } from '@lynx-js/genui/openui';
49
+ import { useEffect, useMemo, useState } from '@lynx-js/react';
50
+
51
+ const library = createOpenUiLibrary();
52
+ const schema = library.toJSONSchema();
53
+
54
+ export function App() {
55
+ const [result, setResult] = useState<ParseResult | null>(null);
56
+
57
+ useEffect(() => {
58
+ const parser = createStreamingParser(schema);
59
+
60
+ // OpenUI DSL uses functional notation:
61
+ const rawText = `
62
+ root = Stack([header, card], "column", "l", "center")
63
+ header = TextContent("Hello OpenUI", "large-heavy")
64
+ card = Card([content, btn], "card")
65
+ content = TextContent("Welcome to OpenUI")
66
+ btn = Buttons([Button("Get Started", Action([@ToAssistant("clicked")]), "primary")])
67
+ `.trim();
68
+
69
+ // Feed the entire text (or stream it chunk by chunk)
70
+ const parsed = parser.push(rawText);
71
+ setResult(parsed);
72
+ }, []);
73
+
74
+ if (!result?.root) return null;
75
+
76
+ return (
77
+ <OpenUiRenderer
78
+ result={result}
79
+ library={library}
80
+ onAction={(event) => {
81
+ console.log('Action:', event.humanFriendlyMessage);
82
+ }}
83
+ />
84
+ );
85
+ }
86
+ ```
87
+
88
+ ## Streaming
89
+
90
+ For real-time streaming scenarios (e.g., LLM output), feed chunks
91
+ incrementally:
92
+
93
+ ```tsx
94
+ import {
95
+ createOpenUiLibrary,
96
+ createStreamingParser,
97
+ OpenUiRenderer,
98
+ } from '@lynx-js/genui/openui';
99
+ import type { ParseResult } from '@lynx-js/genui/openui';
100
+ import { useEffect, useMemo, useRef, useState } from '@lynx-js/react';
101
+
102
+ const CHUNK_SIZE = 8;
103
+ const STREAM_DELAY_MS = 30;
104
+
105
+ export function StreamingApp({ rawText }: { rawText: string }) {
106
+ const library = useMemo(() => createOpenUiLibrary(), []);
107
+ const [result, setResult] = useState<ParseResult | null>(null);
108
+ const [isStreaming, setIsStreaming] = useState(false);
109
+
110
+ useEffect(() => {
111
+ let cancelled = false;
112
+ setIsStreaming(true);
113
+
114
+ const schema = library.toJSONSchema();
115
+ const parser = createStreamingParser(schema);
116
+ let offset = 0;
117
+
118
+ const tick = () => {
119
+ if (cancelled || offset >= rawText.length) {
120
+ setIsStreaming(false);
121
+ return;
122
+ }
123
+ const chunk = rawText.slice(offset, offset + CHUNK_SIZE);
124
+ offset += CHUNK_SIZE;
125
+ setResult(parser.push(chunk));
126
+ setTimeout(tick, STREAM_DELAY_MS);
127
+ };
128
+
129
+ tick();
130
+ return () => {
131
+ cancelled = true;
132
+ };
133
+ }, [library, rawText]);
134
+
135
+ if (!result?.root) return null;
136
+
137
+ return (
138
+ <OpenUiRenderer
139
+ result={result}
140
+ library={library}
141
+ isStreaming={isStreaming}
142
+ />
143
+ );
144
+ }
145
+ ```
146
+
147
+ ## Customizing the Library
148
+
149
+ `createOpenUiLibrary` accepts an optional `CreateOpenUiLibraryOptions`
150
+ object. Provided `components` and `componentGroups` are **merged** with
151
+ the built-in defaults (appended after the defaults):
152
+
153
+ ```tsx
154
+ import { createOpenUiLibrary, defineComponent } from '@lynx-js/genui/openui';
155
+ import { z } from 'zod/v4';
156
+
157
+ const MyBanner = defineComponent({
158
+ name: 'Banner',
159
+ description: 'A promotional banner',
160
+ props: z.object({ title: z.string(), color: z.string().optional() }),
161
+ component: (props) => (
162
+ <view style={{ backgroundColor: props.color ?? '#f0f0f0' }}>
163
+ <text>{props.title}</text>
164
+ </view>
165
+ ),
166
+ });
167
+
168
+ const library = createOpenUiLibrary({
169
+ root: 'Stack',
170
+ components: [MyBanner],
171
+ componentGroups: [
172
+ { name: 'Custom', components: ['Banner'] },
173
+ ],
174
+ });
175
+ ```
176
+
177
+ ### Options
178
+
179
+ | Option | Type | Default | Description |
180
+ | ----------------- | -------------------- | ------------- | ---------------------------------------------- |
181
+ | `root` | `string` | `'Stack'` | Name of the root component |
182
+ | `components` | `DefinedComponent[]` | `[]` (merged) | Additional components appended to built-in set |
183
+ | `componentGroups` | `ComponentGroup[]` | `[]` (merged) | Additional groups appended to built-in groups |
184
+
185
+ ## OpenUI DSL Syntax
186
+
187
+ The DSL uses a **functional notation** (not XML). Each statement assigns
188
+ a component instance to an identifier:
189
+
190
+ ```
191
+ root = Stack([header, card], "column", "l", "center")
192
+ header = TextContent("Choose Your Plan", "large-heavy")
193
+ card = Card([cardHeader, sep, features, btn], "card")
194
+ cardHeader = CardHeader("Pro", "For growing teams")
195
+ sep = Separator("horizontal", true)
196
+ features = Stack([f1, f2], "column", "s")
197
+ f1 = TextContent("✓ Unlimited projects")
198
+ f2 = TextContent("✓ Priority support")
199
+ btn = Buttons([Button("Start Trial", Action([@ToAssistant("start")]), "primary")])
200
+ ```
201
+
202
+ ## JSON Schema
203
+
204
+ Generate a JSON Schema representation of the library for LLM agent
205
+ handshakes:
206
+
207
+ ```ts
208
+ const library = createOpenUiLibrary();
209
+ const schema = library.toJSONSchema();
210
+ // Pass `schema` to your LLM / agent for structured output generation.
211
+ ```
@@ -0,0 +1,20 @@
1
+ import type { ActionEvent, ActionPlan } from '@openuidev/lang-core';
2
+ import { z } from 'zod/v4';
3
+ /** Shared action prop schema — shows as `ActionExpression` in prompt signatures. */
4
+ export interface LegacyActionConfig {
5
+ type?: ActionEvent['type'];
6
+ params?: Record<string, unknown>;
7
+ url?: string;
8
+ context?: string;
9
+ }
10
+ export type ActionLike = ActionPlan | LegacyActionConfig;
11
+ export declare const actionPropSchema: z.ZodUnion<readonly [z.ZodObject<{
12
+ steps: z.ZodArray<z.ZodObject<{
13
+ type: z.ZodString;
14
+ }, z.core.$loose>>;
15
+ }, z.core.$strip>, z.ZodObject<{
16
+ type: z.ZodOptional<z.ZodString>;
17
+ params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
18
+ url: z.ZodOptional<z.ZodString>;
19
+ context: z.ZodOptional<z.ZodString>;
20
+ }, z.core.$strip>]>;
@@ -0,0 +1,23 @@
1
+ // Copyright 2026 The Lynx Authors. All rights reserved.
2
+ // Licensed under the Apache License Version 2.0 that can be found in the
3
+ // LICENSE file in the root directory of this source tree.
4
+ import { tagSchemaId } from '@openuidev/lang-core';
5
+ import { z } from 'zod/v4';
6
+ const actionStepSchema = z.looseObject({
7
+ type: z.string(),
8
+ });
9
+ const actionPlanSchema = z.object({
10
+ steps: z.array(actionStepSchema),
11
+ });
12
+ const legacyActionSchema = z.object({
13
+ type: z.string().optional(),
14
+ params: z.record(z.string(), z.any()).optional(),
15
+ url: z.string().optional(),
16
+ context: z.string().optional(),
17
+ });
18
+ export const actionPropSchema = z.union([
19
+ actionPlanSchema,
20
+ legacyActionSchema,
21
+ ]);
22
+ tagSchemaId(actionPropSchema, 'ActionExpression');
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/catalog/Action/index.tsx"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAY3B,MAAM,gBAAgB,GAAG,CAAC,CAAC,WAAW,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;CACjB,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;CACjC,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;IAChD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC;IACtC,gBAAgB;IAChB,kBAAkB;CACnB,CAAC,CAAC;AACH,WAAW,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { z } from 'zod/v4';
2
+ export declare const Button: import("../../core/library.js").DefinedComponent<z.ZodObject<{
3
+ label: z.ZodString;
4
+ action: z.ZodUnion<readonly [z.ZodObject<{
5
+ steps: z.ZodArray<z.ZodObject<{
6
+ type: z.ZodString;
7
+ }, z.core.$loose>>;
8
+ }, z.core.$strip>, z.ZodObject<{
9
+ type: z.ZodOptional<z.ZodString>;
10
+ params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
11
+ url: z.ZodOptional<z.ZodString>;
12
+ context: z.ZodOptional<z.ZodString>;
13
+ }, z.core.$strip>]>;
14
+ variant: z.ZodOptional<z.ZodEnum<{
15
+ primary: "primary";
16
+ secondary: "secondary";
17
+ tertiary: "tertiary";
18
+ }>>;
19
+ type: z.ZodOptional<z.ZodEnum<{
20
+ normal: "normal";
21
+ destructive: "destructive";
22
+ }>>;
23
+ size: z.ZodOptional<z.ZodEnum<{
24
+ "extra-small": "extra-small";
25
+ small: "small";
26
+ medium: "medium";
27
+ large: "large";
28
+ }>>;
29
+ }, z.core.$strip>>;
30
+ export declare const Buttons: import("../../core/library.js").DefinedComponent<z.ZodObject<{
31
+ buttons: z.ZodArray<z.core.$ZodType<import("@openuidev/lang-core").SubComponentOf<{
32
+ label: string;
33
+ action: {
34
+ steps: {
35
+ [x: string]: unknown;
36
+ type: string;
37
+ }[];
38
+ } | {
39
+ type?: string | undefined;
40
+ params?: Record<string, any> | undefined;
41
+ url?: string | undefined;
42
+ context?: string | undefined;
43
+ };
44
+ variant?: "primary" | "secondary" | "tertiary" | undefined;
45
+ type?: "normal" | "destructive" | undefined;
46
+ size?: "extra-small" | "small" | "medium" | "large" | undefined;
47
+ }>, unknown, z.core.$ZodTypeInternals<import("@openuidev/lang-core").SubComponentOf<{
48
+ label: string;
49
+ action: {
50
+ steps: {
51
+ [x: string]: unknown;
52
+ type: string;
53
+ }[];
54
+ } | {
55
+ type?: string | undefined;
56
+ params?: Record<string, any> | undefined;
57
+ url?: string | undefined;
58
+ context?: string | undefined;
59
+ };
60
+ variant?: "primary" | "secondary" | "tertiary" | undefined;
61
+ type?: "normal" | "destructive" | undefined;
62
+ size?: "extra-small" | "small" | "medium" | "large" | undefined;
63
+ }>, unknown>>>;
64
+ }, z.core.$strip>>;
@@ -0,0 +1,75 @@
1
+ import { jsx as _jsx } from "@lynx-js/react/jsx-runtime";
2
+ // Copyright 2026 The Lynx Authors. All rights reserved.
3
+ // Licensed under the Apache License Version 2.0 that can be found in the
4
+ // LICENSE file in the root directory of this source tree.
5
+ import { BuiltinActionType } from '@openuidev/lang-core';
6
+ import { z } from 'zod/v4';
7
+ import { useFormName, useIsStreaming, useTriggerAction, } from '../../core/context.js';
8
+ import { useFormValidation } from '../../core/hooks/index.js';
9
+ import { defineComponent } from '../../core/library.js';
10
+ import { actionPropSchema } from '../Action/index.js';
11
+ import { asArray } from '../utils.js';
12
+ const CONTINUE_CONVERSATION_ACTION = String(BuiltinActionType.ContinueConversation);
13
+ const OPEN_URL_ACTION = String(BuiltinActionType.OpenUrl);
14
+ const buttonPropsSchema = z.object({
15
+ label: z.string(),
16
+ action: actionPropSchema,
17
+ variant: z.enum(['primary', 'secondary', 'tertiary']).optional(),
18
+ type: z.enum(['normal', 'destructive']).optional(),
19
+ size: z.enum(['extra-small', 'small', 'medium', 'large']).optional(),
20
+ });
21
+ function ButtonRenderer({ props }) {
22
+ const triggerAction = useTriggerAction();
23
+ const formName = useFormName();
24
+ const isStreaming = useIsStreaming();
25
+ const formValidation = useFormValidation();
26
+ const label = String(props.label ?? '');
27
+ const variant = props.variant ?? 'primary';
28
+ const action = props.action;
29
+ let className = 'OpenUIButton OpenUIButtonPrimary';
30
+ if (variant === 'secondary') {
31
+ className = 'OpenUIButton OpenUIButtonSecondary';
32
+ }
33
+ else if (variant === 'tertiary') {
34
+ className = 'OpenUIButton OpenUIButtonGhost';
35
+ }
36
+ const onTap = () => {
37
+ const legacyAction = action && !('steps' in action) ? action : undefined;
38
+ const actionType = legacyAction?.type ?? CONTINUE_CONVERSATION_ACTION;
39
+ if (formValidation && variant === 'primary'
40
+ && actionType === CONTINUE_CONVERSATION_ACTION) {
41
+ const valid = formValidation.validateForm();
42
+ if (!valid)
43
+ return;
44
+ }
45
+ const actionParams = actionType === OPEN_URL_ACTION
46
+ ? { url: legacyAction?.url }
47
+ : {
48
+ ...(legacyAction?.params ?? {}),
49
+ ...(legacyAction?.context ? { context: legacyAction.context } : {}),
50
+ };
51
+ void triggerAction(label, formName, {
52
+ type: actionType,
53
+ params: actionParams,
54
+ });
55
+ };
56
+ return (_jsx("view", { className: className, ...(isStreaming ? {} : ({ bindtap: onTap })), children: _jsx("text", { className: 'OpenUIButtonText', children: label }) }));
57
+ }
58
+ export const Button = defineComponent({
59
+ name: 'Button',
60
+ props: buttonPropsSchema,
61
+ description: 'Clickable button',
62
+ component: ButtonRenderer,
63
+ });
64
+ function ButtonsRenderer({ props, renderNode }) {
65
+ return (_jsx("view", { className: 'OpenUIButtonGroup', children: renderNode(asArray(props.buttons)) }));
66
+ }
67
+ export const Buttons = defineComponent({
68
+ name: 'Buttons',
69
+ props: z.object({
70
+ buttons: z.array(Button.ref),
71
+ }),
72
+ description: 'Button group',
73
+ component: ButtonsRenderer,
74
+ });
75
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/catalog/Button/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { z } from 'zod/v4';
2
+ export declare const Card: import("../../core/library.js").DefinedComponent<z.ZodObject<{
3
+ children: z.ZodArray<z.ZodAny>;
4
+ variant: z.ZodOptional<z.ZodEnum<{
5
+ card: "card";
6
+ sunk: "sunk";
7
+ clear: "clear";
8
+ }>>;
9
+ direction: z.ZodOptional<z.ZodEnum<{
10
+ row: "row";
11
+ column: "column";
12
+ }>>;
13
+ wrap: z.ZodOptional<z.ZodBoolean>;
14
+ gap: z.ZodOptional<z.ZodEnum<{
15
+ none: "none";
16
+ xs: "xs";
17
+ s: "s";
18
+ m: "m";
19
+ l: "l";
20
+ xl: "xl";
21
+ }>>;
22
+ align: z.ZodOptional<z.ZodEnum<{
23
+ start: "start";
24
+ center: "center";
25
+ end: "end";
26
+ stretch: "stretch";
27
+ }>>;
28
+ justify: z.ZodOptional<z.ZodEnum<{
29
+ start: "start";
30
+ center: "center";
31
+ end: "end";
32
+ between: "between";
33
+ }>>;
34
+ }, z.core.$strip>>;
@@ -0,0 +1,69 @@
1
+ import { jsx as _jsx } from "@lynx-js/react/jsx-runtime";
2
+ // Copyright 2026 The Lynx Authors. All rights reserved.
3
+ // Licensed under the Apache License Version 2.0 that can be found in the
4
+ // LICENSE file in the root directory of this source tree.
5
+ import { z } from 'zod/v4';
6
+ import { defineComponent } from '../../core/library.js';
7
+ import { GAP_CLASS, asArray } from '../utils.js';
8
+ function getAlignClass(align) {
9
+ switch (align) {
10
+ case 'start':
11
+ return 'OpenUIAlignStart';
12
+ case 'center':
13
+ return 'OpenUIAlignCenter';
14
+ case 'end':
15
+ return 'OpenUIAlignEnd';
16
+ default:
17
+ return 'OpenUIAlignStretch';
18
+ }
19
+ }
20
+ function getJustifyClass(justify) {
21
+ switch (justify) {
22
+ case 'center':
23
+ return 'OpenUIJustifyCenter';
24
+ case 'end':
25
+ return 'OpenUIJustifyEnd';
26
+ case 'between':
27
+ return 'OpenUIJustifyBetween';
28
+ default:
29
+ return 'OpenUIJustifyStart';
30
+ }
31
+ }
32
+ export const Card = defineComponent({
33
+ name: 'Card',
34
+ props: z.object({
35
+ children: z.array(z.any()),
36
+ variant: z.enum(['card', 'sunk', 'clear']).optional(),
37
+ direction: z.enum(['row', 'column']).optional(),
38
+ wrap: z.boolean().optional(),
39
+ gap: z.enum(['none', 'xs', 's', 'm', 'l', 'xl']).optional(),
40
+ align: z.enum(['start', 'center', 'end', 'stretch']).optional(),
41
+ justify: z.enum(['start', 'center', 'end', 'between']).optional(),
42
+ }),
43
+ description: 'Styled container (card/sunk/clear). Accept Stack layout parameters.',
44
+ component: ({ props, renderNode }) => {
45
+ const variant = props.variant ?? 'card';
46
+ let variantClass = 'OpenUICardVariantCard';
47
+ if (variant === 'sunk') {
48
+ variantClass = 'OpenUICardVariantSunk';
49
+ }
50
+ else if (variant === 'clear') {
51
+ variantClass = 'OpenUICardVariantClear';
52
+ }
53
+ const direction = props.direction ?? 'column';
54
+ const gap = props.gap ?? 'm';
55
+ const align = props.align ?? 'stretch';
56
+ const justify = props.justify ?? 'start';
57
+ const layoutClassName = [
58
+ direction === 'row' ? 'OpenUIStackRow' : 'OpenUIStackColumn',
59
+ props.wrap ? 'OpenUIStackWrap' : '',
60
+ GAP_CLASS[gap] ?? GAP_CLASS['m'],
61
+ getAlignClass(align),
62
+ getJustifyClass(justify),
63
+ ]
64
+ .filter(Boolean)
65
+ .join(' ');
66
+ return (_jsx("view", { className: `OpenUICard ${variantClass} ${layoutClassName}`, children: renderNode(asArray(props.children)) }));
67
+ },
68
+ });
69
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/catalog/Card/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { z } from 'zod/v4';
2
+ export declare const CardHeader: import("../../core/library.js").DefinedComponent<z.ZodObject<{
3
+ title: z.ZodString;
4
+ subtitle: z.ZodOptional<z.ZodString>;
5
+ }, z.core.$strip>>;
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@lynx-js/react/jsx-runtime";
2
+ // Copyright 2026 The Lynx Authors. All rights reserved.
3
+ // Licensed under the Apache License Version 2.0 that can be found in the
4
+ // LICENSE file in the root directory of this source tree.
5
+ import { z } from 'zod/v4';
6
+ import { defineComponent } from '../../core/library.js';
7
+ export const CardHeader = defineComponent({
8
+ name: 'CardHeader',
9
+ props: z.object({
10
+ title: z.string(),
11
+ subtitle: z.string().optional(),
12
+ }),
13
+ description: 'Card header with title and optional subtitle.',
14
+ component: ({ props }) => (_jsxs("view", { className: 'OpenUICardHeader', children: [_jsx("text", { className: 'OpenUICardHeaderTitle', children: props.title }), props.subtitle
15
+ ? _jsx("text", { className: 'OpenUICardHeaderSubtitle', children: props.subtitle })
16
+ : null] })),
17
+ });
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/catalog/CardHeader/index.tsx"],"names":[],"mappings":";AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAC1D,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAC;IACxC,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAChC,CAAC;IACF,WAAW,EAAE,+CAA+C;IAC5D,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CACxB,gBAAM,SAAS,EAAC,kBAAkB,aAChC,eAAM,SAAS,EAAC,uBAAuB,YAAE,KAAK,CAAC,KAAK,GAAQ,EAC3D,KAAK,CAAC,QAAQ;gBACb,CAAC,CAAC,eAAM,SAAS,EAAC,0BAA0B,YAAE,KAAK,CAAC,QAAQ,GAAQ;gBACpE,CAAC,CAAC,IAAI,IACH,CACR;CACF,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { z } from 'zod/v4';
2
+ export declare const Separator: import("../../core/library.js").DefinedComponent<z.ZodObject<{}, z.core.$strip>>;
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "@lynx-js/react/jsx-runtime";
2
+ // Copyright 2026 The Lynx Authors. All rights reserved.
3
+ // Licensed under the Apache License Version 2.0 that can be found in the
4
+ // LICENSE file in the root directory of this source tree.
5
+ import { z } from 'zod/v4';
6
+ import { defineComponent } from '../../core/library.js';
7
+ export const Separator = defineComponent({
8
+ name: 'Separator',
9
+ props: z.object({}),
10
+ description: 'Separator',
11
+ component: () => _jsx("view", { className: 'OpenUISeparator' }),
12
+ });
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/catalog/Separator/index.tsx"],"names":[],"mappings":";AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAC1D,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,CAAC,MAAM,SAAS,GAAG,eAAe,CAAC;IACvC,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACnB,WAAW,EAAE,WAAW;IACxB,SAAS,EAAE,GAAG,EAAE,CAAC,eAAM,SAAS,EAAC,iBAAiB,GAAG;CACtD,CAAC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { z } from 'zod/v4';
2
+ export declare const Stack: import("../../core/library.js").DefinedComponent<z.ZodObject<{
3
+ children: z.ZodArray<z.ZodAny>;
4
+ direction: z.ZodOptional<z.ZodEnum<{
5
+ row: "row";
6
+ column: "column";
7
+ }>>;
8
+ wrap: z.ZodOptional<z.ZodBoolean>;
9
+ gap: z.ZodOptional<z.ZodEnum<{
10
+ none: "none";
11
+ xs: "xs";
12
+ s: "s";
13
+ m: "m";
14
+ l: "l";
15
+ xl: "xl";
16
+ }>>;
17
+ align: z.ZodOptional<z.ZodEnum<{
18
+ start: "start";
19
+ center: "center";
20
+ end: "end";
21
+ stretch: "stretch";
22
+ }>>;
23
+ justify: z.ZodOptional<z.ZodEnum<{
24
+ start: "start";
25
+ center: "center";
26
+ end: "end";
27
+ between: "between";
28
+ }>>;
29
+ }, z.core.$strip>>;
@@ -0,0 +1,61 @@
1
+ import { jsx as _jsx } from "@lynx-js/react/jsx-runtime";
2
+ // Copyright 2026 The Lynx Authors. All rights reserved.
3
+ // Licensed under the Apache License Version 2.0 that can be found in the
4
+ // LICENSE file in the root directory of this source tree.
5
+ import { z } from 'zod/v4';
6
+ import { defineComponent } from '../../core/library.js';
7
+ import { GAP_CLASS, asArray } from '../utils.js';
8
+ function getAlignClass(align) {
9
+ switch (align) {
10
+ case 'start':
11
+ return 'OpenUIAlignStart';
12
+ case 'center':
13
+ return 'OpenUIAlignCenter';
14
+ case 'end':
15
+ return 'OpenUIAlignEnd';
16
+ default:
17
+ return 'OpenUIAlignStretch';
18
+ }
19
+ }
20
+ function getJustifyClass(justify) {
21
+ switch (justify) {
22
+ case 'center':
23
+ return 'OpenUIJustifyCenter';
24
+ case 'end':
25
+ return 'OpenUIJustifyEnd';
26
+ case 'between':
27
+ return 'OpenUIJustifyBetween';
28
+ default:
29
+ return 'OpenUIJustifyStart';
30
+ }
31
+ }
32
+ export const Stack = defineComponent({
33
+ name: 'Stack',
34
+ props: z.object({
35
+ children: z.array(z.any()),
36
+ direction: z.enum(['row', 'column']).optional(),
37
+ wrap: z.boolean().optional(),
38
+ gap: z.enum(['none', 'xs', 's', 'm', 'l', 'xl']).optional(),
39
+ align: z.enum(['start', 'center', 'end', 'stretch']).optional(),
40
+ justify: z.enum(['start', 'center', 'end', 'between']).optional(),
41
+ }),
42
+ description: 'Flex layout container',
43
+ component: ({ props, renderNode }) => {
44
+ const direction = props.direction ?? 'column';
45
+ const gap = props.gap ?? 'm';
46
+ const align = props.align ?? 'stretch';
47
+ const justify = props.justify ?? 'start';
48
+ const className = [
49
+ 'OpenUIStack',
50
+ direction === 'row' ? 'OpenUIStackRow' : 'OpenUIStackColumn',
51
+ props.wrap ? 'OpenUIStackWrap' : '',
52
+ GAP_CLASS[gap] ?? GAP_CLASS['m'],
53
+ getAlignClass(align),
54
+ getJustifyClass(justify),
55
+ ]
56
+ .filter(Boolean)
57
+ .join(' ');
58
+ return (_jsx("view", { className: className, children: renderNode(asArray(props.children)) }));
59
+ },
60
+ });
61
+ //# sourceMappingURL=index.js.map