@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.
Files changed (338) hide show
  1. package/dist/A2UIMessageRenderer.cjs +135 -0
  2. package/dist/A2UIMessageRenderer.cjs.map +1 -0
  3. package/dist/A2UIMessageRenderer.d.cts +11 -0
  4. package/dist/A2UIMessageRenderer.d.cts.map +1 -0
  5. package/dist/A2UIMessageRenderer.d.mts +11 -0
  6. package/dist/A2UIMessageRenderer.d.mts.map +1 -0
  7. package/dist/A2UIMessageRenderer.mjs +134 -0
  8. package/dist/A2UIMessageRenderer.mjs.map +1 -0
  9. package/dist/A2UIViewer.cjs +154 -0
  10. package/dist/A2UIViewer.cjs.map +1 -0
  11. package/dist/A2UIViewer.d.cts +39 -0
  12. package/dist/A2UIViewer.d.cts.map +1 -0
  13. package/dist/A2UIViewer.d.mts +39 -0
  14. package/dist/A2UIViewer.d.mts.map +1 -0
  15. package/dist/A2UIViewer.mjs +152 -0
  16. package/dist/A2UIViewer.mjs.map +1 -0
  17. package/dist/_virtual/_rolldown/runtime.cjs +29 -0
  18. package/dist/index.cjs +8 -0
  19. package/dist/index.d.cts +15 -0
  20. package/dist/index.d.cts.map +1 -0
  21. package/dist/index.d.mts +15 -0
  22. package/dist/index.d.mts.map +1 -0
  23. package/dist/index.mjs +5 -0
  24. package/dist/index.umd.js +3070 -2
  25. package/dist/index.umd.js.map +1 -1
  26. package/dist/react-renderer/components/content/AudioPlayer.cjs +34 -0
  27. package/dist/react-renderer/components/content/AudioPlayer.cjs.map +1 -0
  28. package/dist/react-renderer/components/content/AudioPlayer.mjs +33 -0
  29. package/dist/react-renderer/components/content/AudioPlayer.mjs.map +1 -0
  30. package/dist/react-renderer/components/content/Divider.cjs +31 -0
  31. package/dist/react-renderer/components/content/Divider.cjs.map +1 -0
  32. package/dist/react-renderer/components/content/Divider.mjs +30 -0
  33. package/dist/react-renderer/components/content/Divider.mjs.map +1 -0
  34. package/dist/react-renderer/components/content/Icon.cjs +50 -0
  35. package/dist/react-renderer/components/content/Icon.cjs.map +1 -0
  36. package/dist/react-renderer/components/content/Icon.mjs +49 -0
  37. package/dist/react-renderer/components/content/Icon.mjs.map +1 -0
  38. package/dist/react-renderer/components/content/Image.cjs +43 -0
  39. package/dist/react-renderer/components/content/Image.cjs.map +1 -0
  40. package/dist/react-renderer/components/content/Image.mjs +42 -0
  41. package/dist/react-renderer/components/content/Image.mjs.map +1 -0
  42. package/dist/react-renderer/components/content/Text.cjs +131 -0
  43. package/dist/react-renderer/components/content/Text.cjs.map +1 -0
  44. package/dist/react-renderer/components/content/Text.mjs +129 -0
  45. package/dist/react-renderer/components/content/Text.mjs.map +1 -0
  46. package/dist/react-renderer/components/content/Video.cjs +56 -0
  47. package/dist/react-renderer/components/content/Video.cjs.map +1 -0
  48. package/dist/react-renderer/components/content/Video.mjs +55 -0
  49. package/dist/react-renderer/components/content/Video.mjs.map +1 -0
  50. package/dist/react-renderer/components/interactive/Button.cjs +39 -0
  51. package/dist/react-renderer/components/interactive/Button.cjs.map +1 -0
  52. package/dist/react-renderer/components/interactive/Button.mjs +38 -0
  53. package/dist/react-renderer/components/interactive/Button.mjs.map +1 -0
  54. package/dist/react-renderer/components/interactive/CheckBox.cjs +58 -0
  55. package/dist/react-renderer/components/interactive/CheckBox.cjs.map +1 -0
  56. package/dist/react-renderer/components/interactive/CheckBox.mjs +57 -0
  57. package/dist/react-renderer/components/interactive/CheckBox.mjs.map +1 -0
  58. package/dist/react-renderer/components/interactive/DateTimeInput.cjs +65 -0
  59. package/dist/react-renderer/components/interactive/DateTimeInput.cjs.map +1 -0
  60. package/dist/react-renderer/components/interactive/DateTimeInput.mjs +64 -0
  61. package/dist/react-renderer/components/interactive/DateTimeInput.mjs.map +1 -0
  62. package/dist/react-renderer/components/interactive/MultipleChoice.cjs +54 -0
  63. package/dist/react-renderer/components/interactive/MultipleChoice.cjs.map +1 -0
  64. package/dist/react-renderer/components/interactive/MultipleChoice.mjs +53 -0
  65. package/dist/react-renderer/components/interactive/MultipleChoice.mjs.map +1 -0
  66. package/dist/react-renderer/components/interactive/Slider.cjs +72 -0
  67. package/dist/react-renderer/components/interactive/Slider.cjs.map +1 -0
  68. package/dist/react-renderer/components/interactive/Slider.mjs +71 -0
  69. package/dist/react-renderer/components/interactive/Slider.mjs.map +1 -0
  70. package/dist/react-renderer/components/interactive/TextField.cjs +74 -0
  71. package/dist/react-renderer/components/interactive/TextField.cjs.map +1 -0
  72. package/dist/react-renderer/components/interactive/TextField.mjs +73 -0
  73. package/dist/react-renderer/components/interactive/TextField.mjs.map +1 -0
  74. package/dist/react-renderer/components/layout/Card.cjs +46 -0
  75. package/dist/react-renderer/components/layout/Card.cjs.map +1 -0
  76. package/dist/react-renderer/components/layout/Card.mjs +45 -0
  77. package/dist/react-renderer/components/layout/Card.mjs.map +1 -0
  78. package/dist/react-renderer/components/layout/Column.cjs +43 -0
  79. package/dist/react-renderer/components/layout/Column.cjs.map +1 -0
  80. package/dist/react-renderer/components/layout/Column.mjs +42 -0
  81. package/dist/react-renderer/components/layout/Column.mjs.map +1 -0
  82. package/dist/react-renderer/components/layout/List.cjs +41 -0
  83. package/dist/react-renderer/components/layout/List.cjs.map +1 -0
  84. package/dist/react-renderer/components/layout/List.mjs +40 -0
  85. package/dist/react-renderer/components/layout/List.mjs.map +1 -0
  86. package/dist/react-renderer/components/layout/Modal.cjs +92 -0
  87. package/dist/react-renderer/components/layout/Modal.cjs.map +1 -0
  88. package/dist/react-renderer/components/layout/Modal.mjs +91 -0
  89. package/dist/react-renderer/components/layout/Modal.mjs.map +1 -0
  90. package/dist/react-renderer/components/layout/Row.cjs +43 -0
  91. package/dist/react-renderer/components/layout/Row.cjs.map +1 -0
  92. package/dist/react-renderer/components/layout/Row.mjs +42 -0
  93. package/dist/react-renderer/components/layout/Row.mjs.map +1 -0
  94. package/dist/react-renderer/components/layout/Tabs.cjs +47 -0
  95. package/dist/react-renderer/components/layout/Tabs.cjs.map +1 -0
  96. package/dist/react-renderer/components/layout/Tabs.mjs +46 -0
  97. package/dist/react-renderer/components/layout/Tabs.mjs.map +1 -0
  98. package/dist/react-renderer/core/A2UIProvider.cjs +123 -0
  99. package/dist/react-renderer/core/A2UIProvider.cjs.map +1 -0
  100. package/dist/react-renderer/core/A2UIProvider.mjs +120 -0
  101. package/dist/react-renderer/core/A2UIProvider.mjs.map +1 -0
  102. package/dist/react-renderer/core/A2UIRenderer.cjs +93 -0
  103. package/dist/react-renderer/core/A2UIRenderer.cjs.map +1 -0
  104. package/dist/react-renderer/core/A2UIRenderer.mjs +92 -0
  105. package/dist/react-renderer/core/A2UIRenderer.mjs.map +1 -0
  106. package/dist/react-renderer/core/ComponentNode.cjs +53 -0
  107. package/dist/react-renderer/core/ComponentNode.cjs.map +1 -0
  108. package/dist/react-renderer/core/ComponentNode.mjs +52 -0
  109. package/dist/react-renderer/core/ComponentNode.mjs.map +1 -0
  110. package/dist/react-renderer/hooks/useA2UI.cjs +46 -0
  111. package/dist/react-renderer/hooks/useA2UI.cjs.map +1 -0
  112. package/dist/react-renderer/hooks/useA2UI.mjs +46 -0
  113. package/dist/react-renderer/hooks/useA2UI.mjs.map +1 -0
  114. package/dist/react-renderer/hooks/useA2UIComponent.cjs +173 -0
  115. package/dist/react-renderer/hooks/useA2UIComponent.cjs.map +1 -0
  116. package/dist/react-renderer/hooks/useA2UIComponent.mjs +172 -0
  117. package/dist/react-renderer/hooks/useA2UIComponent.mjs.map +1 -0
  118. package/dist/react-renderer/lib/utils.cjs +39 -0
  119. package/dist/react-renderer/lib/utils.cjs.map +1 -0
  120. package/dist/react-renderer/lib/utils.mjs +37 -0
  121. package/dist/react-renderer/lib/utils.mjs.map +1 -0
  122. package/dist/react-renderer/registry/ComponentRegistry.cjs +114 -0
  123. package/dist/react-renderer/registry/ComponentRegistry.cjs.map +1 -0
  124. package/dist/react-renderer/registry/ComponentRegistry.mjs +113 -0
  125. package/dist/react-renderer/registry/ComponentRegistry.mjs.map +1 -0
  126. package/dist/react-renderer/registry/defaultCatalog.cjs +57 -0
  127. package/dist/react-renderer/registry/defaultCatalog.cjs.map +1 -0
  128. package/dist/react-renderer/registry/defaultCatalog.mjs +57 -0
  129. package/dist/react-renderer/registry/defaultCatalog.mjs.map +1 -0
  130. package/dist/react-renderer/styles/index.cjs +458 -0
  131. package/dist/react-renderer/styles/index.cjs.map +1 -0
  132. package/dist/react-renderer/styles/{index.js → index.mjs} +47 -64
  133. package/dist/react-renderer/styles/index.mjs.map +1 -0
  134. package/dist/react-renderer/styles/reset.cjs +29 -0
  135. package/dist/react-renderer/styles/reset.cjs.map +1 -0
  136. package/dist/react-renderer/styles/reset.mjs +28 -0
  137. package/dist/react-renderer/styles/reset.mjs.map +1 -0
  138. package/dist/react-renderer/theme/ThemeContext.cjs +35 -0
  139. package/dist/react-renderer/theme/ThemeContext.cjs.map +1 -0
  140. package/dist/react-renderer/theme/ThemeContext.mjs +33 -0
  141. package/dist/react-renderer/theme/ThemeContext.mjs.map +1 -0
  142. package/dist/react-renderer/theme/litTheme.cjs +368 -0
  143. package/dist/react-renderer/theme/litTheme.cjs.map +1 -0
  144. package/dist/react-renderer/theme/litTheme.mjs +367 -0
  145. package/dist/react-renderer/theme/litTheme.mjs.map +1 -0
  146. package/dist/react-renderer/theme/utils.cjs +41 -0
  147. package/dist/react-renderer/theme/utils.cjs.map +1 -0
  148. package/dist/react-renderer/theme/utils.mjs +39 -0
  149. package/dist/react-renderer/theme/utils.mjs.map +1 -0
  150. package/dist/theme/viewer-theme.cjs +366 -0
  151. package/dist/theme/viewer-theme.cjs.map +1 -0
  152. package/dist/theme/viewer-theme.d.cts +7 -0
  153. package/dist/theme/viewer-theme.d.cts.map +1 -0
  154. package/dist/theme/viewer-theme.d.mts +7 -0
  155. package/dist/theme/viewer-theme.d.mts.map +1 -0
  156. package/dist/theme/viewer-theme.mjs +365 -0
  157. package/dist/theme/viewer-theme.mjs.map +1 -0
  158. package/package.json +14 -9
  159. package/dist/.tsbuildinfo +0 -1
  160. package/dist/A2UIMessageRenderer.d.ts +0 -7
  161. package/dist/A2UIMessageRenderer.d.ts.map +0 -1
  162. package/dist/A2UIMessageRenderer.js +0 -126
  163. package/dist/A2UIMessageRenderer.js.map +0 -1
  164. package/dist/A2UIViewer.d.ts +0 -32
  165. package/dist/A2UIViewer.d.ts.map +0 -1
  166. package/dist/A2UIViewer.js +0 -121
  167. package/dist/A2UIViewer.js.map +0 -1
  168. package/dist/__tests__/A2UIMessageRenderer.test.d.ts +0 -2
  169. package/dist/__tests__/A2UIMessageRenderer.test.d.ts.map +0 -1
  170. package/dist/__tests__/A2UIMessageRenderer.test.js +0 -229
  171. package/dist/__tests__/A2UIMessageRenderer.test.js.map +0 -1
  172. package/dist/__tests__/clsx-shim.d.ts +0 -8
  173. package/dist/__tests__/clsx-shim.d.ts.map +0 -1
  174. package/dist/__tests__/clsx-shim.js +0 -24
  175. package/dist/__tests__/clsx-shim.js.map +0 -1
  176. package/dist/__tests__/setup.d.ts +0 -2
  177. package/dist/__tests__/setup.d.ts.map +0 -1
  178. package/dist/__tests__/setup.js +0 -29
  179. package/dist/__tests__/setup.js.map +0 -1
  180. package/dist/index.d.ts +0 -13
  181. package/dist/index.d.ts.map +0 -1
  182. package/dist/index.js +0 -19
  183. package/dist/index.js.map +0 -1
  184. package/dist/react-renderer/components/content/AudioPlayer.d.ts +0 -8
  185. package/dist/react-renderer/components/content/AudioPlayer.d.ts.map +0 -1
  186. package/dist/react-renderer/components/content/AudioPlayer.js +0 -23
  187. package/dist/react-renderer/components/content/AudioPlayer.js.map +0 -1
  188. package/dist/react-renderer/components/content/Divider.d.ts +0 -13
  189. package/dist/react-renderer/components/content/Divider.d.ts.map +0 -1
  190. package/dist/react-renderer/components/content/Divider.js +0 -22
  191. package/dist/react-renderer/components/content/Divider.js.map +0 -1
  192. package/dist/react-renderer/components/content/Icon.d.ts +0 -16
  193. package/dist/react-renderer/components/content/Icon.d.ts.map +0 -1
  194. package/dist/react-renderer/components/content/Icon.js +0 -40
  195. package/dist/react-renderer/components/content/Icon.js.map +0 -1
  196. package/dist/react-renderer/components/content/Image.d.ts +0 -11
  197. package/dist/react-renderer/components/content/Image.d.ts.map +0 -1
  198. package/dist/react-renderer/components/content/Image.js +0 -34
  199. package/dist/react-renderer/components/content/Image.js.map +0 -1
  200. package/dist/react-renderer/components/content/Text.d.ts +0 -28
  201. package/dist/react-renderer/components/content/Text.d.ts.map +0 -1
  202. package/dist/react-renderer/components/content/Text.js +0 -134
  203. package/dist/react-renderer/components/content/Text.js.map +0 -1
  204. package/dist/react-renderer/components/content/Video.d.ts +0 -10
  205. package/dist/react-renderer/components/content/Video.d.ts.map +0 -1
  206. package/dist/react-renderer/components/content/Video.js +0 -41
  207. package/dist/react-renderer/components/content/Video.js.map +0 -1
  208. package/dist/react-renderer/components/content/index.d.ts +0 -7
  209. package/dist/react-renderer/components/content/index.d.ts.map +0 -1
  210. package/dist/react-renderer/components/content/index.js +0 -7
  211. package/dist/react-renderer/components/content/index.js.map +0 -1
  212. package/dist/react-renderer/components/interactive/Button.d.ts +0 -11
  213. package/dist/react-renderer/components/interactive/Button.d.ts.map +0 -1
  214. package/dist/react-renderer/components/interactive/Button.js +0 -27
  215. package/dist/react-renderer/components/interactive/Button.js.map +0 -1
  216. package/dist/react-renderer/components/interactive/CheckBox.d.ts +0 -10
  217. package/dist/react-renderer/components/interactive/CheckBox.d.ts.map +0 -1
  218. package/dist/react-renderer/components/interactive/CheckBox.js +0 -55
  219. package/dist/react-renderer/components/interactive/CheckBox.js.map +0 -1
  220. package/dist/react-renderer/components/interactive/DateTimeInput.d.ts +0 -10
  221. package/dist/react-renderer/components/interactive/DateTimeInput.d.ts.map +0 -1
  222. package/dist/react-renderer/components/interactive/DateTimeInput.js +0 -68
  223. package/dist/react-renderer/components/interactive/DateTimeInput.js.map +0 -1
  224. package/dist/react-renderer/components/interactive/MultipleChoice.d.ts +0 -11
  225. package/dist/react-renderer/components/interactive/MultipleChoice.d.ts.map +0 -1
  226. package/dist/react-renderer/components/interactive/MultipleChoice.js +0 -43
  227. package/dist/react-renderer/components/interactive/MultipleChoice.js.map +0 -1
  228. package/dist/react-renderer/components/interactive/Slider.d.ts +0 -10
  229. package/dist/react-renderer/components/interactive/Slider.d.ts.map +0 -1
  230. package/dist/react-renderer/components/interactive/Slider.js +0 -62
  231. package/dist/react-renderer/components/interactive/Slider.js.map +0 -1
  232. package/dist/react-renderer/components/interactive/TextField.d.ts +0 -10
  233. package/dist/react-renderer/components/interactive/TextField.d.ts.map +0 -1
  234. package/dist/react-renderer/components/interactive/TextField.js +0 -59
  235. package/dist/react-renderer/components/interactive/TextField.js.map +0 -1
  236. package/dist/react-renderer/components/interactive/index.d.ts +0 -7
  237. package/dist/react-renderer/components/interactive/index.d.ts.map +0 -1
  238. package/dist/react-renderer/components/interactive/index.js +0 -7
  239. package/dist/react-renderer/components/interactive/index.js.map +0 -1
  240. package/dist/react-renderer/components/layout/Card.d.ts +0 -17
  241. package/dist/react-renderer/components/layout/Card.d.ts.map +0 -1
  242. package/dist/react-renderer/components/layout/Card.js +0 -39
  243. package/dist/react-renderer/components/layout/Card.js.map +0 -1
  244. package/dist/react-renderer/components/layout/Column.d.ts +0 -10
  245. package/dist/react-renderer/components/layout/Column.d.ts.map +0 -1
  246. package/dist/react-renderer/components/layout/Column.js +0 -33
  247. package/dist/react-renderer/components/layout/Column.js.map +0 -1
  248. package/dist/react-renderer/components/layout/List.d.ts +0 -10
  249. package/dist/react-renderer/components/layout/List.d.ts.map +0 -1
  250. package/dist/react-renderer/components/layout/List.js +0 -32
  251. package/dist/react-renderer/components/layout/List.js.map +0 -1
  252. package/dist/react-renderer/components/layout/Modal.d.ts +0 -15
  253. package/dist/react-renderer/components/layout/Modal.d.ts.map +0 -1
  254. package/dist/react-renderer/components/layout/Modal.js +0 -65
  255. package/dist/react-renderer/components/layout/Modal.js.map +0 -1
  256. package/dist/react-renderer/components/layout/Row.d.ts +0 -10
  257. package/dist/react-renderer/components/layout/Row.d.ts.map +0 -1
  258. package/dist/react-renderer/components/layout/Row.js +0 -33
  259. package/dist/react-renderer/components/layout/Row.js.map +0 -1
  260. package/dist/react-renderer/components/layout/Tabs.d.ts +0 -8
  261. package/dist/react-renderer/components/layout/Tabs.d.ts.map +0 -1
  262. package/dist/react-renderer/components/layout/Tabs.js +0 -29
  263. package/dist/react-renderer/components/layout/Tabs.js.map +0 -1
  264. package/dist/react-renderer/components/layout/index.d.ts +0 -7
  265. package/dist/react-renderer/components/layout/index.d.ts.map +0 -1
  266. package/dist/react-renderer/components/layout/index.js +0 -7
  267. package/dist/react-renderer/components/layout/index.js.map +0 -1
  268. package/dist/react-renderer/core/A2UIProvider.d.ts +0 -82
  269. package/dist/react-renderer/core/A2UIProvider.d.ts.map +0 -1
  270. package/dist/react-renderer/core/A2UIProvider.js +0 -156
  271. package/dist/react-renderer/core/A2UIProvider.js.map +0 -1
  272. package/dist/react-renderer/core/A2UIRenderer.d.ts +0 -36
  273. package/dist/react-renderer/core/A2UIRenderer.d.ts.map +0 -1
  274. package/dist/react-renderer/core/A2UIRenderer.js +0 -83
  275. package/dist/react-renderer/core/A2UIRenderer.js.map +0 -1
  276. package/dist/react-renderer/core/A2UIViewer.d.ts +0 -56
  277. package/dist/react-renderer/core/A2UIViewer.d.ts.map +0 -1
  278. package/dist/react-renderer/core/A2UIViewer.js +0 -135
  279. package/dist/react-renderer/core/A2UIViewer.js.map +0 -1
  280. package/dist/react-renderer/core/ComponentNode.d.ts +0 -25
  281. package/dist/react-renderer/core/ComponentNode.d.ts.map +0 -1
  282. package/dist/react-renderer/core/ComponentNode.js +0 -43
  283. package/dist/react-renderer/core/ComponentNode.js.map +0 -1
  284. package/dist/react-renderer/core/store.d.ts +0 -37
  285. package/dist/react-renderer/core/store.d.ts.map +0 -1
  286. package/dist/react-renderer/core/store.js +0 -2
  287. package/dist/react-renderer/core/store.js.map +0 -1
  288. package/dist/react-renderer/hooks/useA2UI.d.ts +0 -46
  289. package/dist/react-renderer/hooks/useA2UI.d.ts.map +0 -1
  290. package/dist/react-renderer/hooks/useA2UI.js +0 -41
  291. package/dist/react-renderer/hooks/useA2UI.js.map +0 -1
  292. package/dist/react-renderer/hooks/useA2UIComponent.d.ts +0 -52
  293. package/dist/react-renderer/hooks/useA2UIComponent.d.ts.map +0 -1
  294. package/dist/react-renderer/hooks/useA2UIComponent.js +0 -175
  295. package/dist/react-renderer/hooks/useA2UIComponent.js.map +0 -1
  296. package/dist/react-renderer/index.d.ts +0 -37
  297. package/dist/react-renderer/index.d.ts.map +0 -1
  298. package/dist/react-renderer/index.js +0 -40
  299. package/dist/react-renderer/index.js.map +0 -1
  300. package/dist/react-renderer/lib/utils.d.ts +0 -32
  301. package/dist/react-renderer/lib/utils.d.ts.map +0 -1
  302. package/dist/react-renderer/lib/utils.js +0 -41
  303. package/dist/react-renderer/lib/utils.js.map +0 -1
  304. package/dist/react-renderer/registry/ComponentRegistry.d.ts +0 -78
  305. package/dist/react-renderer/registry/ComponentRegistry.d.ts.map +0 -1
  306. package/dist/react-renderer/registry/ComponentRegistry.js +0 -113
  307. package/dist/react-renderer/registry/ComponentRegistry.js.map +0 -1
  308. package/dist/react-renderer/registry/defaultCatalog.d.ts +0 -13
  309. package/dist/react-renderer/registry/defaultCatalog.d.ts.map +0 -1
  310. package/dist/react-renderer/registry/defaultCatalog.js +0 -59
  311. package/dist/react-renderer/registry/defaultCatalog.js.map +0 -1
  312. package/dist/react-renderer/styles/index.d.ts +0 -41
  313. package/dist/react-renderer/styles/index.d.ts.map +0 -1
  314. package/dist/react-renderer/styles/index.js.map +0 -1
  315. package/dist/react-renderer/styles/reset.d.ts +0 -18
  316. package/dist/react-renderer/styles/reset.d.ts.map +0 -1
  317. package/dist/react-renderer/styles/reset.js +0 -24
  318. package/dist/react-renderer/styles/reset.js.map +0 -1
  319. package/dist/react-renderer/theme/ThemeContext.d.ts +0 -29
  320. package/dist/react-renderer/theme/ThemeContext.d.ts.map +0 -1
  321. package/dist/react-renderer/theme/ThemeContext.js +0 -35
  322. package/dist/react-renderer/theme/ThemeContext.js.map +0 -1
  323. package/dist/react-renderer/theme/litTheme.d.ts +0 -8
  324. package/dist/react-renderer/theme/litTheme.d.ts.map +0 -1
  325. package/dist/react-renderer/theme/litTheme.js +0 -401
  326. package/dist/react-renderer/theme/litTheme.js.map +0 -1
  327. package/dist/react-renderer/theme/utils.d.ts +0 -23
  328. package/dist/react-renderer/theme/utils.d.ts.map +0 -1
  329. package/dist/react-renderer/theme/utils.js +0 -46
  330. package/dist/react-renderer/theme/utils.js.map +0 -1
  331. package/dist/react-renderer/types.d.ts +0 -53
  332. package/dist/react-renderer/types.d.ts.map +0 -1
  333. package/dist/react-renderer/types.js +0 -2
  334. package/dist/react-renderer/types.js.map +0 -1
  335. package/dist/theme/viewer-theme.d.ts +0 -3
  336. package/dist/theme/viewer-theme.d.ts.map +0 -1
  337. package/dist/theme/viewer-theme.js +0 -391
  338. package/dist/theme/viewer-theme.js.map +0 -1
@@ -0,0 +1,129 @@
1
+ import { classMapToString, stylesToObject } from "../../theme/utils.mjs";
2
+ import { mergeClassMaps } from "../../lib/utils.mjs";
3
+ import { useA2UIComponent } from "../../hooks/useA2UIComponent.mjs";
4
+ import { memo, useMemo } from "react";
5
+ import { jsx } from "react/jsx-runtime";
6
+ import MarkdownIt from "markdown-it";
7
+
8
+ //#region src/react-renderer/components/content/Text.tsx
9
+ function isHintedStyles(styles) {
10
+ if (typeof styles !== "object" || !styles || Array.isArray(styles)) return false;
11
+ return [
12
+ "h1",
13
+ "h2",
14
+ "h3",
15
+ "h4",
16
+ "h5",
17
+ "caption",
18
+ "body"
19
+ ].some((v) => v in styles);
20
+ }
21
+ /**
22
+ * Markdown-it instance for rendering markdown text.
23
+ * Uses synchronous import to ensure availability at first render (matches Lit renderer).
24
+ *
25
+ * Configuration matches Lit's markdown directive (uses MarkdownIt defaults):
26
+ * - html: false (default) - Security: disable raw HTML
27
+ * - linkify: false (default) - Don't auto-convert URLs/emails to links
28
+ * - breaks: false (default) - Don't convert \n to <br>
29
+ * - typographer: false (default) - Don't use smart quotes/dashes
30
+ */
31
+ const markdownRenderer = new MarkdownIt();
32
+ /**
33
+ * Apply theme classes to markdown HTML elements.
34
+ * Replaces default element tags with themed versions.
35
+ */
36
+ function applyMarkdownTheme(html, markdownTheme) {
37
+ if (!markdownTheme) return html;
38
+ const replacements = [];
39
+ for (const [element, classes] of Object.entries(markdownTheme)) {
40
+ if (!classes || Array.isArray(classes) && classes.length === 0) continue;
41
+ const classString = Array.isArray(classes) ? classes.join(" ") : classMapToString(classes);
42
+ if (!classString) continue;
43
+ const tagRegex = new RegExp(`<${element}(?=\\s|>|/>)`, "gi");
44
+ replacements.push([tagRegex, `<${element} class="${classString}"`]);
45
+ }
46
+ let result = html;
47
+ for (const [regex, replacement] of replacements) result = result.replace(regex, replacement);
48
+ return result;
49
+ }
50
+ /**
51
+ * Text component - renders text content with markdown support.
52
+ *
53
+ * Structure mirrors Lit's Text component:
54
+ * <div class="a2ui-text"> ← :host equivalent
55
+ * <section class="..."> ← theme classes
56
+ * <h2>...</h2> ← rendered markdown content
57
+ * </section>
58
+ * </div>
59
+ *
60
+ * Text is parsed as markdown and rendered as HTML (matches Lit renderer behavior).
61
+ * Supports usageHint values: h1, h2, h3, h4, h5, caption, body
62
+ *
63
+ * Markdown features supported:
64
+ * - **Bold** and *italic* text
65
+ * - Lists (ordered and unordered)
66
+ * - `inline code` and code blocks
67
+ * - [Links](url) (auto-linkified URLs too)
68
+ * - Blockquotes
69
+ * - Horizontal rules
70
+ *
71
+ * Note: Raw HTML is disabled for security.
72
+ */
73
+ const Text = memo(function Text({ node, surfaceId }) {
74
+ const { theme, resolveString } = useA2UIComponent(node, surfaceId);
75
+ const props = node.properties;
76
+ const textValue = resolveString(props.text);
77
+ const usageHint = props.usageHint;
78
+ const classes = mergeClassMaps(theme.components.Text.all, usageHint ? theme.components.Text[usageHint] : {});
79
+ const additionalStyles = useMemo(() => {
80
+ const textStyles = theme.additionalStyles?.Text;
81
+ if (!textStyles) return void 0;
82
+ if (isHintedStyles(textStyles)) return stylesToObject(textStyles[usageHint ?? "body"]);
83
+ return stylesToObject(textStyles);
84
+ }, [theme.additionalStyles?.Text, usageHint]);
85
+ const renderedContent = useMemo(() => {
86
+ if (textValue === null || textValue === void 0) return null;
87
+ let markdownText = textValue;
88
+ switch (usageHint) {
89
+ case "h1":
90
+ markdownText = `# ${markdownText}`;
91
+ break;
92
+ case "h2":
93
+ markdownText = `## ${markdownText}`;
94
+ break;
95
+ case "h3":
96
+ markdownText = `### ${markdownText}`;
97
+ break;
98
+ case "h4":
99
+ markdownText = `#### ${markdownText}`;
100
+ break;
101
+ case "h5":
102
+ markdownText = `##### ${markdownText}`;
103
+ break;
104
+ case "caption":
105
+ markdownText = `*${markdownText}*`;
106
+ break;
107
+ default: break;
108
+ }
109
+ return { __html: applyMarkdownTheme(markdownRenderer.render(markdownText), theme.markdown) };
110
+ }, [
111
+ textValue,
112
+ theme.markdown,
113
+ usageHint
114
+ ]);
115
+ if (!renderedContent) return null;
116
+ return /* @__PURE__ */ jsx("div", {
117
+ className: "a2ui-text",
118
+ style: node.weight !== void 0 ? { "--weight": node.weight } : {},
119
+ children: /* @__PURE__ */ jsx("section", {
120
+ className: classMapToString(classes),
121
+ style: additionalStyles,
122
+ dangerouslySetInnerHTML: renderedContent
123
+ })
124
+ });
125
+ });
126
+
127
+ //#endregion
128
+ export { Text as default };
129
+ //# sourceMappingURL=Text.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Text.mjs","names":[],"sources":["../../../../src/react-renderer/components/content/Text.tsx"],"sourcesContent":["import { useMemo, memo } from \"react\";\nimport type { Types } from \"@a2ui/lit/0.8\";\nimport type { A2UIComponentProps } from \"../../types\";\nimport { useA2UIComponent } from \"../../hooks/useA2UIComponent\";\nimport {\n classMapToString,\n stylesToObject,\n mergeClassMaps,\n} from \"../../lib/utils\";\nimport MarkdownIt from \"markdown-it\";\n\ntype UsageHint = \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"caption\" | \"body\";\n\ninterface HintedStyles {\n h1: Record<string, string>;\n h2: Record<string, string>;\n h3: Record<string, string>;\n h4: Record<string, string>;\n h5: Record<string, string>;\n body: Record<string, string>;\n caption: Record<string, string>;\n}\n\nfunction isHintedStyles(styles: unknown): styles is HintedStyles {\n if (typeof styles !== \"object\" || !styles || Array.isArray(styles))\n return false;\n const expected = [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"caption\", \"body\"];\n return expected.some((v) => v in styles);\n}\n\n/**\n * Markdown-it instance for rendering markdown text.\n * Uses synchronous import to ensure availability at first render (matches Lit renderer).\n *\n * Configuration matches Lit's markdown directive (uses MarkdownIt defaults):\n * - html: false (default) - Security: disable raw HTML\n * - linkify: false (default) - Don't auto-convert URLs/emails to links\n * - breaks: false (default) - Don't convert \\n to <br>\n * - typographer: false (default) - Don't use smart quotes/dashes\n */\nconst markdownRenderer = new MarkdownIt();\n\n/**\n * Apply theme classes to markdown HTML elements.\n * Replaces default element tags with themed versions.\n */\nfunction applyMarkdownTheme(\n html: string,\n markdownTheme: Types.Theme[\"markdown\"],\n): string {\n if (!markdownTheme) return html;\n\n // Map of element -> classes\n const replacements: Array<[RegExp, string]> = [];\n\n for (const [element, classes] of Object.entries(markdownTheme)) {\n if (!classes || (Array.isArray(classes) && classes.length === 0)) continue;\n\n const classString = Array.isArray(classes)\n ? classes.join(\" \")\n : classMapToString(classes);\n if (!classString) continue;\n\n // Create regex to match opening tags (handles self-closing and regular)\n const tagRegex = new RegExp(`<${element}(?=\\\\s|>|/>)`, \"gi\");\n replacements.push([tagRegex, `<${element} class=\"${classString}\"`]);\n }\n\n let result = html;\n for (const [regex, replacement] of replacements) {\n result = result.replace(regex, replacement);\n }\n\n return result;\n}\n\n/**\n * Text component - renders text content with markdown support.\n *\n * Structure mirrors Lit's Text component:\n * <div class=\"a2ui-text\"> ← :host equivalent\n * <section class=\"...\"> ← theme classes\n * <h2>...</h2> ← rendered markdown content\n * </section>\n * </div>\n *\n * Text is parsed as markdown and rendered as HTML (matches Lit renderer behavior).\n * Supports usageHint values: h1, h2, h3, h4, h5, caption, body\n *\n * Markdown features supported:\n * - **Bold** and *italic* text\n * - Lists (ordered and unordered)\n * - `inline code` and code blocks\n * - [Links](url) (auto-linkified URLs too)\n * - Blockquotes\n * - Horizontal rules\n *\n * Note: Raw HTML is disabled for security.\n */\nexport const Text = memo(function Text({\n node,\n surfaceId,\n}: A2UIComponentProps<Types.TextNode>) {\n const { theme, resolveString } = useA2UIComponent(node, surfaceId);\n const props = node.properties;\n\n const textValue = resolveString(props.text);\n const usageHint = props.usageHint as UsageHint | undefined;\n\n // Get merged classes (matches Lit's Styles.merge)\n const classes = mergeClassMaps(\n theme.components.Text.all,\n usageHint ? theme.components.Text[usageHint] : {},\n );\n\n // Get additional styles based on usage hint\n const additionalStyles = useMemo(() => {\n const textStyles = theme.additionalStyles?.Text;\n if (!textStyles) return undefined;\n\n if (isHintedStyles(textStyles)) {\n const hint = usageHint ?? \"body\";\n return stylesToObject(textStyles[hint]);\n }\n return stylesToObject(textStyles as Record<string, string>);\n }, [theme.additionalStyles?.Text, usageHint]);\n\n // Render markdown content (matches Lit behavior - always uses markdown)\n const renderedContent = useMemo(() => {\n if (textValue === null || textValue === undefined) {\n return null;\n }\n\n // Add markdown prefix based on usageHint (matches Lit behavior)\n let markdownText = textValue;\n switch (usageHint) {\n case \"h1\":\n markdownText = `# ${markdownText}`;\n break;\n case \"h2\":\n markdownText = `## ${markdownText}`;\n break;\n case \"h3\":\n markdownText = `### ${markdownText}`;\n break;\n case \"h4\":\n markdownText = `#### ${markdownText}`;\n break;\n case \"h5\":\n markdownText = `##### ${markdownText}`;\n break;\n case \"caption\":\n markdownText = `*${markdownText}*`;\n break;\n default:\n break; // Body - no prefix\n }\n\n const rawHtml = markdownRenderer.render(markdownText);\n const themedHtml = applyMarkdownTheme(rawHtml, theme.markdown);\n return { __html: themedHtml };\n }, [textValue, theme.markdown, usageHint]);\n\n if (!renderedContent) {\n return null;\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 return (\n <div className=\"a2ui-text\" style={hostStyle}>\n <section\n className={classMapToString(classes)}\n style={additionalStyles}\n dangerouslySetInnerHTML={renderedContent}\n />\n </div>\n );\n});\n\nexport default Text;\n"],"mappings":";;;;;;;;AAuBA,SAAS,eAAe,QAAyC;AAC/D,KAAI,OAAO,WAAW,YAAY,CAAC,UAAU,MAAM,QAAQ,OAAO,CAChE,QAAO;AAET,QADiB;EAAC;EAAM;EAAM;EAAM;EAAM;EAAM;EAAW;EAAO,CAClD,MAAM,MAAM,KAAK,OAAO;;;;;;;;;;;;AAa1C,MAAM,mBAAmB,IAAI,YAAY;;;;;AAMzC,SAAS,mBACP,MACA,eACQ;AACR,KAAI,CAAC,cAAe,QAAO;CAG3B,MAAM,eAAwC,EAAE;AAEhD,MAAK,MAAM,CAAC,SAAS,YAAY,OAAO,QAAQ,cAAc,EAAE;AAC9D,MAAI,CAAC,WAAY,MAAM,QAAQ,QAAQ,IAAI,QAAQ,WAAW,EAAI;EAElE,MAAM,cAAc,MAAM,QAAQ,QAAQ,GACtC,QAAQ,KAAK,IAAI,GACjB,iBAAiB,QAAQ;AAC7B,MAAI,CAAC,YAAa;EAGlB,MAAM,WAAW,IAAI,OAAO,IAAI,QAAQ,eAAe,KAAK;AAC5D,eAAa,KAAK,CAAC,UAAU,IAAI,QAAQ,UAAU,YAAY,GAAG,CAAC;;CAGrE,IAAI,SAAS;AACb,MAAK,MAAM,CAAC,OAAO,gBAAgB,aACjC,UAAS,OAAO,QAAQ,OAAO,YAAY;AAG7C,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;AA0BT,MAAa,OAAO,KAAK,SAAS,KAAK,EACrC,MACA,aACqC;CACrC,MAAM,EAAE,OAAO,kBAAkB,iBAAiB,MAAM,UAAU;CAClE,MAAM,QAAQ,KAAK;CAEnB,MAAM,YAAY,cAAc,MAAM,KAAK;CAC3C,MAAM,YAAY,MAAM;CAGxB,MAAM,UAAU,eACd,MAAM,WAAW,KAAK,KACtB,YAAY,MAAM,WAAW,KAAK,aAAa,EAAE,CAClD;CAGD,MAAM,mBAAmB,cAAc;EACrC,MAAM,aAAa,MAAM,kBAAkB;AAC3C,MAAI,CAAC,WAAY,QAAO;AAExB,MAAI,eAAe,WAAW,CAE5B,QAAO,eAAe,WADT,aAAa,QACa;AAEzC,SAAO,eAAe,WAAqC;IAC1D,CAAC,MAAM,kBAAkB,MAAM,UAAU,CAAC;CAG7C,MAAM,kBAAkB,cAAc;AACpC,MAAI,cAAc,QAAQ,cAAc,OACtC,QAAO;EAIT,IAAI,eAAe;AACnB,UAAQ,WAAR;GACE,KAAK;AACH,mBAAe,KAAK;AACpB;GACF,KAAK;AACH,mBAAe,MAAM;AACrB;GACF,KAAK;AACH,mBAAe,OAAO;AACtB;GACF,KAAK;AACH,mBAAe,QAAQ;AACvB;GACF,KAAK;AACH,mBAAe,SAAS;AACxB;GACF,KAAK;AACH,mBAAe,IAAI,aAAa;AAChC;GACF,QACE;;AAKJ,SAAO,EAAE,QADU,mBADH,iBAAiB,OAAO,aAAa,EACN,MAAM,SAAS,EACjC;IAC5B;EAAC;EAAW,MAAM;EAAU;EAAU,CAAC;AAE1C,KAAI,CAAC,gBACH,QAAO;AAST,QACE,oBAAC;EAAI,WAAU;EAAY,OAL3B,KAAK,WAAW,SACX,EAAE,YAAY,KAAK,QAAQ,GAC5B,EAAE;YAIJ,oBAAC;GACC,WAAW,iBAAiB,QAAQ;GACpC,OAAO;GACP,yBAAyB;IACzB;GACE;EAER"}
@@ -0,0 +1,56 @@
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/content/Video.tsx
9
+ /**
10
+ * Check if a URL is a YouTube URL and extract the video ID.
11
+ */
12
+ function getYouTubeVideoId(url) {
13
+ for (const pattern of [/(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/)([^&\s?]+)/]) {
14
+ const match = url.match(pattern);
15
+ if (match && match.length > 1) return match[1];
16
+ }
17
+ return null;
18
+ }
19
+ /**
20
+ * Video component - renders a video player.
21
+ *
22
+ * Supports regular video URLs and YouTube URLs (renders as embedded iframe).
23
+ */
24
+ const Video = (0, react.memo)(function Video({ node, surfaceId }) {
25
+ const { theme, resolveString } = require_useA2UIComponent.useA2UIComponent(node, surfaceId);
26
+ const props = node.properties;
27
+ const url = resolveString(props.url);
28
+ if (!url) return null;
29
+ const youtubeId = getYouTubeVideoId(url);
30
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
31
+ className: "a2ui-video",
32
+ style: node.weight !== void 0 ? { "--weight": node.weight } : {},
33
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("section", {
34
+ className: require_utils.classMapToString(theme.components.Video),
35
+ style: require_utils.stylesToObject(theme.additionalStyles?.Video),
36
+ children: youtubeId ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("iframe", {
37
+ src: `https://www.youtube.com/embed/${youtubeId}`,
38
+ title: "YouTube video player",
39
+ allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
40
+ allowFullScreen: true,
41
+ style: {
42
+ border: "none",
43
+ width: "100%",
44
+ aspectRatio: "16/9"
45
+ }
46
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("video", {
47
+ src: url,
48
+ controls: true
49
+ })
50
+ })
51
+ });
52
+ });
53
+
54
+ //#endregion
55
+ exports.default = Video;
56
+ //# sourceMappingURL=Video.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Video.cjs","names":["useA2UIComponent","classMapToString","stylesToObject"],"sources":["../../../../src/react-renderer/components/content/Video.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\";\n\n/**\n * Check if a URL is a YouTube URL and extract the video ID.\n */\nfunction getYouTubeVideoId(url: string): string | null {\n const patterns = [\n /(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/|youtube\\.com\\/embed\\/)([^&\\s?]+)/,\n ];\n for (const pattern of patterns) {\n const match = url.match(pattern);\n if (match && match.length > 1) {\n // Non-null assertion is safe here since we checked match.length > 1\n\n return match[1]!;\n }\n }\n return null;\n}\n\n/**\n * Video component - renders a video player.\n *\n * Supports regular video URLs and YouTube URLs (renders as embedded iframe).\n */\nexport const Video = memo(function Video({\n node,\n surfaceId,\n}: A2UIComponentProps<Types.VideoNode>) {\n const { theme, resolveString } = useA2UIComponent(node, surfaceId);\n const props = node.properties;\n\n const url = resolveString(props.url);\n\n if (!url) {\n return null;\n }\n\n const youtubeId = getYouTubeVideoId(url);\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-video\" style={hostStyle}>\n <section\n className={classMapToString(theme.components.Video)}\n style={stylesToObject(theme.additionalStyles?.Video)}\n >\n {youtubeId ? (\n <iframe\n src={`https://www.youtube.com/embed/${youtubeId}`}\n title=\"YouTube video player\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n style={{ border: \"none\", width: \"100%\", aspectRatio: \"16/9\" }}\n />\n ) : (\n <video src={url} controls />\n )}\n </section>\n </div>\n );\n});\n\nexport default Video;\n"],"mappings":";;;;;;;;;;;AASA,SAAS,kBAAkB,KAA4B;AAIrD,MAAK,MAAM,WAHM,CACf,0EACD,EAC+B;EAC9B,MAAM,QAAQ,IAAI,MAAM,QAAQ;AAChC,MAAI,SAAS,MAAM,SAAS,EAG1B,QAAO,MAAM;;AAGjB,QAAO;;;;;;;AAQT,MAAa,wBAAa,SAAS,MAAM,EACvC,MACA,aACsC;CACtC,MAAM,EAAE,OAAO,kBAAkBA,0CAAiB,MAAM,UAAU;CAClE,MAAM,QAAQ,KAAK;CAEnB,MAAM,MAAM,cAAc,MAAM,IAAI;AAEpC,KAAI,CAAC,IACH,QAAO;CAGT,MAAM,YAAY,kBAAkB,IAAI;AAQxC,QACE,2CAAC;EAAI,WAAU;EAAa,OAL5B,KAAK,WAAW,SACX,EAAE,YAAY,KAAK,QAAQ,GAC5B,EAAE;YAIJ,2CAAC;GACC,WAAWC,+BAAiB,MAAM,WAAW,MAAM;GACnD,OAAOC,6BAAe,MAAM,kBAAkB,MAAM;aAEnD,YACC,2CAAC;IACC,KAAK,iCAAiC;IACtC,OAAM;IACN,OAAM;IACN;IACA,OAAO;KAAE,QAAQ;KAAQ,OAAO;KAAQ,aAAa;KAAQ;KAC7D,GAEF,2CAAC;IAAM,KAAK;IAAK;KAAW;IAEtB;GACN;EAER"}
@@ -0,0 +1,55 @@
1
+ import { classMapToString, stylesToObject } from "../../theme/utils.mjs";
2
+ import "../../lib/utils.mjs";
3
+ import { useA2UIComponent } from "../../hooks/useA2UIComponent.mjs";
4
+ import { memo } from "react";
5
+ import { jsx } from "react/jsx-runtime";
6
+
7
+ //#region src/react-renderer/components/content/Video.tsx
8
+ /**
9
+ * Check if a URL is a YouTube URL and extract the video ID.
10
+ */
11
+ function getYouTubeVideoId(url) {
12
+ for (const pattern of [/(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/)([^&\s?]+)/]) {
13
+ const match = url.match(pattern);
14
+ if (match && match.length > 1) return match[1];
15
+ }
16
+ return null;
17
+ }
18
+ /**
19
+ * Video component - renders a video player.
20
+ *
21
+ * Supports regular video URLs and YouTube URLs (renders as embedded iframe).
22
+ */
23
+ const Video = memo(function Video({ node, surfaceId }) {
24
+ const { theme, resolveString } = useA2UIComponent(node, surfaceId);
25
+ const props = node.properties;
26
+ const url = resolveString(props.url);
27
+ if (!url) return null;
28
+ const youtubeId = getYouTubeVideoId(url);
29
+ return /* @__PURE__ */ jsx("div", {
30
+ className: "a2ui-video",
31
+ style: node.weight !== void 0 ? { "--weight": node.weight } : {},
32
+ children: /* @__PURE__ */ jsx("section", {
33
+ className: classMapToString(theme.components.Video),
34
+ style: stylesToObject(theme.additionalStyles?.Video),
35
+ children: youtubeId ? /* @__PURE__ */ jsx("iframe", {
36
+ src: `https://www.youtube.com/embed/${youtubeId}`,
37
+ title: "YouTube video player",
38
+ allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
39
+ allowFullScreen: true,
40
+ style: {
41
+ border: "none",
42
+ width: "100%",
43
+ aspectRatio: "16/9"
44
+ }
45
+ }) : /* @__PURE__ */ jsx("video", {
46
+ src: url,
47
+ controls: true
48
+ })
49
+ })
50
+ });
51
+ });
52
+
53
+ //#endregion
54
+ export { Video as default };
55
+ //# sourceMappingURL=Video.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Video.mjs","names":[],"sources":["../../../../src/react-renderer/components/content/Video.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\";\n\n/**\n * Check if a URL is a YouTube URL and extract the video ID.\n */\nfunction getYouTubeVideoId(url: string): string | null {\n const patterns = [\n /(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/|youtube\\.com\\/embed\\/)([^&\\s?]+)/,\n ];\n for (const pattern of patterns) {\n const match = url.match(pattern);\n if (match && match.length > 1) {\n // Non-null assertion is safe here since we checked match.length > 1\n\n return match[1]!;\n }\n }\n return null;\n}\n\n/**\n * Video component - renders a video player.\n *\n * Supports regular video URLs and YouTube URLs (renders as embedded iframe).\n */\nexport const Video = memo(function Video({\n node,\n surfaceId,\n}: A2UIComponentProps<Types.VideoNode>) {\n const { theme, resolveString } = useA2UIComponent(node, surfaceId);\n const props = node.properties;\n\n const url = resolveString(props.url);\n\n if (!url) {\n return null;\n }\n\n const youtubeId = getYouTubeVideoId(url);\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-video\" style={hostStyle}>\n <section\n className={classMapToString(theme.components.Video)}\n style={stylesToObject(theme.additionalStyles?.Video)}\n >\n {youtubeId ? (\n <iframe\n src={`https://www.youtube.com/embed/${youtubeId}`}\n title=\"YouTube video player\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n style={{ border: \"none\", width: \"100%\", aspectRatio: \"16/9\" }}\n />\n ) : (\n <video src={url} controls />\n )}\n </section>\n </div>\n );\n});\n\nexport default Video;\n"],"mappings":";;;;;;;;;;AASA,SAAS,kBAAkB,KAA4B;AAIrD,MAAK,MAAM,WAHM,CACf,0EACD,EAC+B;EAC9B,MAAM,QAAQ,IAAI,MAAM,QAAQ;AAChC,MAAI,SAAS,MAAM,SAAS,EAG1B,QAAO,MAAM;;AAGjB,QAAO;;;;;;;AAQT,MAAa,QAAQ,KAAK,SAAS,MAAM,EACvC,MACA,aACsC;CACtC,MAAM,EAAE,OAAO,kBAAkB,iBAAiB,MAAM,UAAU;CAClE,MAAM,QAAQ,KAAK;CAEnB,MAAM,MAAM,cAAc,MAAM,IAAI;AAEpC,KAAI,CAAC,IACH,QAAO;CAGT,MAAM,YAAY,kBAAkB,IAAI;AAQxC,QACE,oBAAC;EAAI,WAAU;EAAa,OAL5B,KAAK,WAAW,SACX,EAAE,YAAY,KAAK,QAAQ,GAC5B,EAAE;YAIJ,oBAAC;GACC,WAAW,iBAAiB,MAAM,WAAW,MAAM;GACnD,OAAO,eAAe,MAAM,kBAAkB,MAAM;aAEnD,YACC,oBAAC;IACC,KAAK,iCAAiC;IACtC,OAAM;IACN,OAAM;IACN;IACA,OAAO;KAAE,QAAQ;KAAQ,OAAO;KAAQ,aAAa;KAAQ;KAC7D,GAEF,oBAAC;IAAM,KAAK;IAAK;KAAW;IAEtB;GACN;EAER"}
@@ -0,0 +1,39 @@
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/interactive/Button.tsx
10
+ /**
11
+ * Button component - a clickable element that triggers an action.
12
+ *
13
+ * Contains a child component (usually Text or Icon) and dispatches
14
+ * a user action when clicked.
15
+ */
16
+ const Button = (0, react.memo)(function Button({ node, surfaceId }) {
17
+ const { theme, sendAction } = require_useA2UIComponent.useA2UIComponent(node, surfaceId);
18
+ const props = node.properties;
19
+ const handleClick = (0, react.useCallback)(() => {
20
+ if (props.action) sendAction(props.action);
21
+ }, [props.action, sendAction]);
22
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
23
+ className: "a2ui-button",
24
+ style: node.weight !== void 0 ? { "--weight": node.weight } : {},
25
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
26
+ className: require_utils.classMapToString(theme.components.Button),
27
+ style: require_utils.stylesToObject(theme.additionalStyles?.Button),
28
+ onClick: handleClick,
29
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ComponentNode.default, {
30
+ node: props.child,
31
+ surfaceId
32
+ })
33
+ })
34
+ });
35
+ });
36
+
37
+ //#endregion
38
+ exports.default = Button;
39
+ //# sourceMappingURL=Button.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.cjs","names":["useA2UIComponent","classMapToString","stylesToObject","ComponentNode"],"sources":["../../../../src/react-renderer/components/interactive/Button.tsx"],"sourcesContent":["import { useCallback, 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 * Button component - a clickable element that triggers an action.\n *\n * Contains a child component (usually Text or Icon) and dispatches\n * a user action when clicked.\n */\nexport const Button = memo(function Button({\n node,\n surfaceId,\n}: A2UIComponentProps<Types.ButtonNode>) {\n const { theme, sendAction } = useA2UIComponent(node, surfaceId);\n const props = node.properties;\n\n const handleClick = useCallback(() => {\n if (props.action) {\n sendAction(props.action);\n }\n }, [props.action, sendAction]);\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-button\" style={hostStyle}>\n <button\n className={classMapToString(theme.components.Button)}\n style={stylesToObject(theme.additionalStyles?.Button)}\n onClick={handleClick}\n >\n <ComponentNode node={props.child} surfaceId={surfaceId} />\n </button>\n </div>\n );\n});\n\nexport default Button;\n"],"mappings":";;;;;;;;;;;;;;;AAaA,MAAa,yBAAc,SAAS,OAAO,EACzC,MACA,aACuC;CACvC,MAAM,EAAE,OAAO,eAAeA,0CAAiB,MAAM,UAAU;CAC/D,MAAM,QAAQ,KAAK;CAEnB,MAAM,2CAAgC;AACpC,MAAI,MAAM,OACR,YAAW,MAAM,OAAO;IAEzB,CAAC,MAAM,QAAQ,WAAW,CAAC;AAQ9B,QACE,2CAAC;EAAI,WAAU;EAAc,OAL7B,KAAK,WAAW,SACX,EAAE,YAAY,KAAK,QAAQ,GAC5B,EAAE;YAIJ,2CAAC;GACC,WAAWC,+BAAiB,MAAM,WAAW,OAAO;GACpD,OAAOC,6BAAe,MAAM,kBAAkB,OAAO;GACrD,SAAS;aAET,2CAACC;IAAc,MAAM,MAAM;IAAkB;KAAa;IACnD;GACL;EAER"}
@@ -0,0 +1,38 @@
1
+ import ComponentNode from "../../core/ComponentNode.mjs";
2
+ import { classMapToString, stylesToObject } from "../../theme/utils.mjs";
3
+ import "../../lib/utils.mjs";
4
+ import { useA2UIComponent } from "../../hooks/useA2UIComponent.mjs";
5
+ import { memo, useCallback } from "react";
6
+ import { jsx } from "react/jsx-runtime";
7
+
8
+ //#region src/react-renderer/components/interactive/Button.tsx
9
+ /**
10
+ * Button component - a clickable element that triggers an action.
11
+ *
12
+ * Contains a child component (usually Text or Icon) and dispatches
13
+ * a user action when clicked.
14
+ */
15
+ const Button = memo(function Button({ node, surfaceId }) {
16
+ const { theme, sendAction } = useA2UIComponent(node, surfaceId);
17
+ const props = node.properties;
18
+ const handleClick = useCallback(() => {
19
+ if (props.action) sendAction(props.action);
20
+ }, [props.action, sendAction]);
21
+ return /* @__PURE__ */ jsx("div", {
22
+ className: "a2ui-button",
23
+ style: node.weight !== void 0 ? { "--weight": node.weight } : {},
24
+ children: /* @__PURE__ */ jsx("button", {
25
+ className: classMapToString(theme.components.Button),
26
+ style: stylesToObject(theme.additionalStyles?.Button),
27
+ onClick: handleClick,
28
+ children: /* @__PURE__ */ jsx(ComponentNode, {
29
+ node: props.child,
30
+ surfaceId
31
+ })
32
+ })
33
+ });
34
+ });
35
+
36
+ //#endregion
37
+ export { Button as default };
38
+ //# sourceMappingURL=Button.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.mjs","names":[],"sources":["../../../../src/react-renderer/components/interactive/Button.tsx"],"sourcesContent":["import { useCallback, 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 * Button component - a clickable element that triggers an action.\n *\n * Contains a child component (usually Text or Icon) and dispatches\n * a user action when clicked.\n */\nexport const Button = memo(function Button({\n node,\n surfaceId,\n}: A2UIComponentProps<Types.ButtonNode>) {\n const { theme, sendAction } = useA2UIComponent(node, surfaceId);\n const props = node.properties;\n\n const handleClick = useCallback(() => {\n if (props.action) {\n sendAction(props.action);\n }\n }, [props.action, sendAction]);\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-button\" style={hostStyle}>\n <button\n className={classMapToString(theme.components.Button)}\n style={stylesToObject(theme.additionalStyles?.Button)}\n onClick={handleClick}\n >\n <ComponentNode node={props.child} surfaceId={surfaceId} />\n </button>\n </div>\n );\n});\n\nexport default Button;\n"],"mappings":";;;;;;;;;;;;;;AAaA,MAAa,SAAS,KAAK,SAAS,OAAO,EACzC,MACA,aACuC;CACvC,MAAM,EAAE,OAAO,eAAe,iBAAiB,MAAM,UAAU;CAC/D,MAAM,QAAQ,KAAK;CAEnB,MAAM,cAAc,kBAAkB;AACpC,MAAI,MAAM,OACR,YAAW,MAAM,OAAO;IAEzB,CAAC,MAAM,QAAQ,WAAW,CAAC;AAQ9B,QACE,oBAAC;EAAI,WAAU;EAAc,OAL7B,KAAK,WAAW,SACX,EAAE,YAAY,KAAK,QAAQ,GAC5B,EAAE;YAIJ,oBAAC;GACC,WAAW,iBAAiB,MAAM,WAAW,OAAO;GACpD,OAAO,eAAe,MAAM,kBAAkB,OAAO;GACrD,SAAS;aAET,oBAAC;IAAc,MAAM,MAAM;IAAkB;KAAa;IACnD;GACL;EAER"}
@@ -0,0 +1,58 @@
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/CheckBox.tsx
9
+ /**
10
+ * CheckBox component - a boolean toggle with a label.
11
+ *
12
+ * Supports two-way data binding for the checked state.
13
+ */
14
+ const CheckBox = (0, react.memo)(function CheckBox({ node, surfaceId }) {
15
+ const { theme, resolveString, resolveBoolean, 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 valuePath = props.value?.path;
20
+ const [checked, setChecked] = (0, react.useState)(resolveBoolean(props.value) ?? false);
21
+ (0, react.useEffect)(() => {
22
+ if (valuePath) {
23
+ const externalValue = getValue(valuePath);
24
+ if (externalValue !== null && Boolean(externalValue) !== checked) setChecked(Boolean(externalValue));
25
+ }
26
+ }, [valuePath, getValue]);
27
+ (0, react.useEffect)(() => {
28
+ if (props.value?.literalBoolean !== void 0) setChecked(props.value.literalBoolean);
29
+ }, [props.value?.literalBoolean]);
30
+ const handleChange = (0, react.useCallback)((e) => {
31
+ const newValue = e.target.checked;
32
+ setChecked(newValue);
33
+ if (valuePath) setValue(valuePath, newValue);
34
+ }, [valuePath, setValue]);
35
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
36
+ className: "a2ui-checkbox",
37
+ style: node.weight !== void 0 ? { "--weight": node.weight } : {},
38
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
39
+ className: require_utils.classMapToString(theme.components.CheckBox.container),
40
+ style: require_utils.stylesToObject(theme.additionalStyles?.CheckBox),
41
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42
+ type: "checkbox",
43
+ id,
44
+ checked,
45
+ onChange: handleChange,
46
+ className: require_utils.classMapToString(theme.components.CheckBox.element)
47
+ }), label && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
48
+ htmlFor: id,
49
+ className: require_utils.classMapToString(theme.components.CheckBox.label),
50
+ children: label
51
+ })]
52
+ })
53
+ });
54
+ });
55
+
56
+ //#endregion
57
+ exports.default = CheckBox;
58
+ //# sourceMappingURL=CheckBox.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CheckBox.cjs","names":["useA2UIComponent","classMapToString","stylesToObject"],"sources":["../../../../src/react-renderer/components/interactive/CheckBox.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 * CheckBox component - a boolean toggle with a label.\n *\n * Supports two-way data binding for the checked state.\n */\nexport const CheckBox = memo(function CheckBox({\n node,\n surfaceId,\n}: A2UIComponentProps<Types.CheckboxNode>) {\n const { theme, resolveString, resolveBoolean, setValue, getValue } =\n useA2UIComponent(node, surfaceId);\n const props = node.properties;\n const id = useId();\n\n const label = resolveString(props.label);\n const valuePath = props.value?.path;\n const initialChecked = resolveBoolean(props.value) ?? false;\n\n const [checked, setChecked] = useState(initialChecked);\n\n // Sync with external data model changes (path binding)\n useEffect(() => {\n if (valuePath) {\n const externalValue = getValue(valuePath);\n if (externalValue !== null && Boolean(externalValue) !== checked) {\n setChecked(Boolean(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?.literalBoolean !== undefined) {\n setChecked(props.value.literalBoolean);\n }\n }, [props.value?.literalBoolean]);\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.checked;\n setChecked(newValue);\n\n // Two-way binding: update data model\n if (valuePath) {\n setValue(valuePath, newValue);\n }\n },\n [valuePath, setValue],\n );\n\n // Structure mirrors Lit's CheckBox component:\n // <div class=\"a2ui-checkbox\"> ← :host equivalent\n // <section class=\"...\"> ← internal element\n // <input>...</input>\n // <label>...</label>\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-checkbox\" style={hostStyle}>\n <section\n className={classMapToString(theme.components.CheckBox.container)}\n style={stylesToObject(theme.additionalStyles?.CheckBox)}\n >\n <input\n type=\"checkbox\"\n id={id}\n checked={checked}\n onChange={handleChange}\n className={classMapToString(theme.components.CheckBox.element)}\n />\n {label && (\n <label\n htmlFor={id}\n className={classMapToString(theme.components.CheckBox.label)}\n >\n {label}\n </label>\n )}\n </section>\n </div>\n );\n});\n\nexport default CheckBox;\n"],"mappings":";;;;;;;;;;;;;AAWA,MAAa,2BAAgB,SAAS,SAAS,EAC7C,MACA,aACyC;CACzC,MAAM,EAAE,OAAO,eAAe,gBAAgB,UAAU,aACtDA,0CAAiB,MAAM,UAAU;CACnC,MAAM,QAAQ,KAAK;CACnB,MAAM,uBAAY;CAElB,MAAM,QAAQ,cAAc,MAAM,MAAM;CACxC,MAAM,YAAY,MAAM,OAAO;CAG/B,MAAM,CAAC,SAAS,kCAFO,eAAe,MAAM,MAAM,IAAI,MAEA;AAGtD,4BAAgB;AACd,MAAI,WAAW;GACb,MAAM,gBAAgB,SAAS,UAAU;AACzC,OAAI,kBAAkB,QAAQ,QAAQ,cAAc,KAAK,QACvD,YAAW,QAAQ,cAAc,CAAC;;IAGrC,CAAC,WAAW,SAAS,CAAC;AAGzB,4BAAgB;AACd,MAAI,MAAM,OAAO,mBAAmB,OAClC,YAAW,MAAM,MAAM,eAAe;IAEvC,CAAC,MAAM,OAAO,eAAe,CAAC;CAEjC,MAAM,uCACH,MAA2C;EAC1C,MAAM,WAAW,EAAE,OAAO;AAC1B,aAAW,SAAS;AAGpB,MAAI,UACF,UAAS,WAAW,SAAS;IAGjC,CAAC,WAAW,SAAS,CACtB;AAgBD,QACE,2CAAC;EAAI,WAAU;EAAgB,OAL/B,KAAK,WAAW,SACX,EAAE,YAAY,KAAK,QAAQ,GAC5B,EAAE;YAIJ,4CAAC;GACC,WAAWC,+BAAiB,MAAM,WAAW,SAAS,UAAU;GAChE,OAAOC,6BAAe,MAAM,kBAAkB,SAAS;cAEvD,2CAAC;IACC,MAAK;IACD;IACK;IACT,UAAU;IACV,WAAWD,+BAAiB,MAAM,WAAW,SAAS,QAAQ;KAC9D,EACD,SACC,2CAAC;IACC,SAAS;IACT,WAAWA,+BAAiB,MAAM,WAAW,SAAS,MAAM;cAE3D;KACK;IAEF;GACN;EAER"}
@@ -0,0 +1,57 @@
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/CheckBox.tsx
8
+ /**
9
+ * CheckBox component - a boolean toggle with a label.
10
+ *
11
+ * Supports two-way data binding for the checked state.
12
+ */
13
+ const CheckBox = memo(function CheckBox({ node, surfaceId }) {
14
+ const { theme, resolveString, resolveBoolean, setValue, getValue } = useA2UIComponent(node, surfaceId);
15
+ const props = node.properties;
16
+ const id = useId();
17
+ const label = resolveString(props.label);
18
+ const valuePath = props.value?.path;
19
+ const [checked, setChecked] = useState(resolveBoolean(props.value) ?? false);
20
+ useEffect(() => {
21
+ if (valuePath) {
22
+ const externalValue = getValue(valuePath);
23
+ if (externalValue !== null && Boolean(externalValue) !== checked) setChecked(Boolean(externalValue));
24
+ }
25
+ }, [valuePath, getValue]);
26
+ useEffect(() => {
27
+ if (props.value?.literalBoolean !== void 0) setChecked(props.value.literalBoolean);
28
+ }, [props.value?.literalBoolean]);
29
+ const handleChange = useCallback((e) => {
30
+ const newValue = e.target.checked;
31
+ setChecked(newValue);
32
+ if (valuePath) setValue(valuePath, newValue);
33
+ }, [valuePath, setValue]);
34
+ return /* @__PURE__ */ jsx("div", {
35
+ className: "a2ui-checkbox",
36
+ style: node.weight !== void 0 ? { "--weight": node.weight } : {},
37
+ children: /* @__PURE__ */ jsxs("section", {
38
+ className: classMapToString(theme.components.CheckBox.container),
39
+ style: stylesToObject(theme.additionalStyles?.CheckBox),
40
+ children: [/* @__PURE__ */ jsx("input", {
41
+ type: "checkbox",
42
+ id,
43
+ checked,
44
+ onChange: handleChange,
45
+ className: classMapToString(theme.components.CheckBox.element)
46
+ }), label && /* @__PURE__ */ jsx("label", {
47
+ htmlFor: id,
48
+ className: classMapToString(theme.components.CheckBox.label),
49
+ children: label
50
+ })]
51
+ })
52
+ });
53
+ });
54
+
55
+ //#endregion
56
+ export { CheckBox as default };
57
+ //# sourceMappingURL=CheckBox.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CheckBox.mjs","names":[],"sources":["../../../../src/react-renderer/components/interactive/CheckBox.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 * CheckBox component - a boolean toggle with a label.\n *\n * Supports two-way data binding for the checked state.\n */\nexport const CheckBox = memo(function CheckBox({\n node,\n surfaceId,\n}: A2UIComponentProps<Types.CheckboxNode>) {\n const { theme, resolveString, resolveBoolean, setValue, getValue } =\n useA2UIComponent(node, surfaceId);\n const props = node.properties;\n const id = useId();\n\n const label = resolveString(props.label);\n const valuePath = props.value?.path;\n const initialChecked = resolveBoolean(props.value) ?? false;\n\n const [checked, setChecked] = useState(initialChecked);\n\n // Sync with external data model changes (path binding)\n useEffect(() => {\n if (valuePath) {\n const externalValue = getValue(valuePath);\n if (externalValue !== null && Boolean(externalValue) !== checked) {\n setChecked(Boolean(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?.literalBoolean !== undefined) {\n setChecked(props.value.literalBoolean);\n }\n }, [props.value?.literalBoolean]);\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.checked;\n setChecked(newValue);\n\n // Two-way binding: update data model\n if (valuePath) {\n setValue(valuePath, newValue);\n }\n },\n [valuePath, setValue],\n );\n\n // Structure mirrors Lit's CheckBox component:\n // <div class=\"a2ui-checkbox\"> ← :host equivalent\n // <section class=\"...\"> ← internal element\n // <input>...</input>\n // <label>...</label>\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-checkbox\" style={hostStyle}>\n <section\n className={classMapToString(theme.components.CheckBox.container)}\n style={stylesToObject(theme.additionalStyles?.CheckBox)}\n >\n <input\n type=\"checkbox\"\n id={id}\n checked={checked}\n onChange={handleChange}\n className={classMapToString(theme.components.CheckBox.element)}\n />\n {label && (\n <label\n htmlFor={id}\n className={classMapToString(theme.components.CheckBox.label)}\n >\n {label}\n </label>\n )}\n </section>\n </div>\n );\n});\n\nexport default CheckBox;\n"],"mappings":";;;;;;;;;;;;AAWA,MAAa,WAAW,KAAK,SAAS,SAAS,EAC7C,MACA,aACyC;CACzC,MAAM,EAAE,OAAO,eAAe,gBAAgB,UAAU,aACtD,iBAAiB,MAAM,UAAU;CACnC,MAAM,QAAQ,KAAK;CACnB,MAAM,KAAK,OAAO;CAElB,MAAM,QAAQ,cAAc,MAAM,MAAM;CACxC,MAAM,YAAY,MAAM,OAAO;CAG/B,MAAM,CAAC,SAAS,cAAc,SAFP,eAAe,MAAM,MAAM,IAAI,MAEA;AAGtD,iBAAgB;AACd,MAAI,WAAW;GACb,MAAM,gBAAgB,SAAS,UAAU;AACzC,OAAI,kBAAkB,QAAQ,QAAQ,cAAc,KAAK,QACvD,YAAW,QAAQ,cAAc,CAAC;;IAGrC,CAAC,WAAW,SAAS,CAAC;AAGzB,iBAAgB;AACd,MAAI,MAAM,OAAO,mBAAmB,OAClC,YAAW,MAAM,MAAM,eAAe;IAEvC,CAAC,MAAM,OAAO,eAAe,CAAC;CAEjC,MAAM,eAAe,aAClB,MAA2C;EAC1C,MAAM,WAAW,EAAE,OAAO;AAC1B,aAAW,SAAS;AAGpB,MAAI,UACF,UAAS,WAAW,SAAS;IAGjC,CAAC,WAAW,SAAS,CACtB;AAgBD,QACE,oBAAC;EAAI,WAAU;EAAgB,OAL/B,KAAK,WAAW,SACX,EAAE,YAAY,KAAK,QAAQ,GAC5B,EAAE;YAIJ,qBAAC;GACC,WAAW,iBAAiB,MAAM,WAAW,SAAS,UAAU;GAChE,OAAO,eAAe,MAAM,kBAAkB,SAAS;cAEvD,oBAAC;IACC,MAAK;IACD;IACK;IACT,UAAU;IACV,WAAW,iBAAiB,MAAM,WAAW,SAAS,QAAQ;KAC9D,EACD,SACC,oBAAC;IACC,SAAS;IACT,WAAW,iBAAiB,MAAM,WAAW,SAAS,MAAM;cAE3D;KACK;IAEF;GACN;EAER"}
@@ -0,0 +1,65 @@
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/DateTimeInput.tsx
9
+ /**
10
+ * DateTimeInput component - a date and/or time picker.
11
+ *
12
+ * Supports enabling date, time, or both. Uses native HTML5 date/time inputs.
13
+ */
14
+ const DateTimeInput = (0, react.memo)(function DateTimeInput({ 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 valuePath = props.value?.path;
19
+ const initialValue = resolveString(props.value) ?? "";
20
+ const enableDate = props.enableDate ?? true;
21
+ const enableTime = props.enableTime ?? false;
22
+ const [value, setLocalValue] = (0, react.useState)(initialValue);
23
+ (0, react.useEffect)(() => {
24
+ if (valuePath) {
25
+ const externalValue = getValue(valuePath);
26
+ if (externalValue !== null && String(externalValue) !== value) setLocalValue(String(externalValue));
27
+ }
28
+ }, [valuePath, getValue]);
29
+ const handleChange = (0, react.useCallback)((e) => {
30
+ const newValue = e.target.value;
31
+ setLocalValue(newValue);
32
+ if (valuePath) setValue(valuePath, newValue);
33
+ }, [valuePath, setValue]);
34
+ let inputType = "date";
35
+ if (enableDate && enableTime) inputType = "datetime-local";
36
+ else if (enableTime && !enableDate) inputType = "time";
37
+ const getPlaceholderText = () => {
38
+ if (enableDate && enableTime) return "Date & Time";
39
+ else if (enableTime) return "Time";
40
+ return "Date";
41
+ };
42
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
43
+ className: "a2ui-datetime-input",
44
+ style: node.weight !== void 0 ? { "--weight": node.weight } : {},
45
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
46
+ className: require_utils.classMapToString(theme.components.DateTimeInput.container),
47
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
48
+ htmlFor: id,
49
+ className: require_utils.classMapToString(theme.components.DateTimeInput.label),
50
+ children: getPlaceholderText()
51
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
52
+ type: inputType,
53
+ id,
54
+ value,
55
+ onChange: handleChange,
56
+ className: require_utils.classMapToString(theme.components.DateTimeInput.element),
57
+ style: require_utils.stylesToObject(theme.additionalStyles?.DateTimeInput)
58
+ })]
59
+ })
60
+ });
61
+ });
62
+
63
+ //#endregion
64
+ exports.default = DateTimeInput;
65
+ //# sourceMappingURL=DateTimeInput.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DateTimeInput.cjs","names":["useA2UIComponent","classMapToString","stylesToObject"],"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,gCAAqB,SAAS,cAAc,EACvD,MACA,aAC8C;CAC9C,MAAM,EAAE,OAAO,eAAe,UAAU,aAAaA,0CACnD,MACA,UACD;CACD,MAAM,QAAQ,KAAK;CACnB,MAAM,uBAAY;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,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;CAEzB,MAAM,uCACH,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,2CAAC;EAAI,WAAU;EAAsB,OALrC,KAAK,WAAW,SACX,EAAE,YAAY,KAAK,QAAQ,GAC5B,EAAE;YAIJ,4CAAC;GACC,WAAWC,+BAAiB,MAAM,WAAW,cAAc,UAAU;cAErE,2CAAC;IACC,SAAS;IACT,WAAWA,+BAAiB,MAAM,WAAW,cAAc,MAAM;cAEhE,oBAAoB;KACf,EACR,2CAAC;IACC,MAAM;IACF;IACG;IACP,UAAU;IACV,WAAWA,+BAAiB,MAAM,WAAW,cAAc,QAAQ;IACnE,OAAOC,6BAAe,MAAM,kBAAkB,cAAc;KAC5D;IACM;GACN;EAER"}