@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 @@
1
+ {"version":3,"file":"Tabs.cjs","names":["useA2UIComponent","classMapToString","stylesToObject","mergeClassMaps","ComponentNode"],"sources":["../../../../src/react-renderer/components/layout/Tabs.tsx"],"sourcesContent":["import { useState, 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 { ComponentNode } from \"../../core/ComponentNode\";\n\n/**\n * Tabs component - displays content in switchable tabs.\n */\nexport const Tabs = memo(function Tabs({\n node,\n surfaceId,\n}: A2UIComponentProps<Types.TabsNode>) {\n const { theme, resolveString } = useA2UIComponent(node, surfaceId);\n const props = node.properties;\n\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const tabItems = props.tabItems ?? [];\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-tabs\" style={hostStyle}>\n <section\n className={classMapToString(theme.components.Tabs.container)}\n style={stylesToObject(theme.additionalStyles?.Tabs)}\n >\n {/* Tab buttons - uses Tabs.element for the container */}\n <div\n id=\"buttons\"\n className={classMapToString(theme.components.Tabs.element)}\n >\n {tabItems.map((tab, index) => {\n const title = resolveString(tab.title);\n const isSelected = index === selectedIndex;\n\n // Lit merges all + selected classes when selected\n const classes = isSelected\n ? mergeClassMaps(\n theme.components.Tabs.controls.all,\n theme.components.Tabs.controls.selected,\n )\n : theme.components.Tabs.controls.all;\n\n return (\n <button\n key={index}\n disabled={isSelected}\n className={classMapToString(classes)}\n onClick={() => setSelectedIndex(index)}\n >\n {title}\n </button>\n );\n })}\n </div>\n\n {/* Tab content */}\n {tabItems[selectedIndex] && (\n <ComponentNode\n node={tabItems[selectedIndex].child}\n surfaceId={surfaceId}\n />\n )}\n </section>\n </div>\n );\n});\n\nexport default Tabs;\n"],"mappings":";;;;;;;;;;;;AAcA,MAAa,uBAAY,SAAS,KAAK,EACrC,MACA,aACqC;CACrC,MAAM,EAAE,OAAO,kBAAkBA,0CAAiB,MAAM,UAAU;CAClE,MAAM,QAAQ,KAAK;CAEnB,MAAM,CAAC,eAAe,wCAA6B,EAAE;CAErD,MAAM,WAAW,MAAM,YAAY,EAAE;AAQrC,QACE,2CAAC;EAAI,WAAU;EAAY,OAL3B,KAAK,WAAW,SACX,EAAE,YAAY,KAAK,QAAQ,GAC5B,EAAE;YAIJ,4CAAC;GACC,WAAWC,+BAAiB,MAAM,WAAW,KAAK,UAAU;GAC5D,OAAOC,6BAAe,MAAM,kBAAkB,KAAK;cAGnD,2CAAC;IACC,IAAG;IACH,WAAWD,+BAAiB,MAAM,WAAW,KAAK,QAAQ;cAEzD,SAAS,KAAK,KAAK,UAAU;KAC5B,MAAM,QAAQ,cAAc,IAAI,MAAM;KACtC,MAAM,aAAa,UAAU;AAU7B,YACE,2CAAC;MAEC,UAAU;MACV,WAAWA,+BAXC,aACZE,+BACE,MAAM,WAAW,KAAK,SAAS,KAC/B,MAAM,WAAW,KAAK,SAAS,SAChC,GACD,MAAM,WAAW,KAAK,SAAS,IAMK;MACpC,eAAe,iBAAiB,MAAM;gBAErC;QALI,MAME;MAEX;KACE,EAGL,SAAS,kBACR,2CAACC;IACC,MAAM,SAAS,eAAe;IACnB;KACX;IAEI;GACN;EAER"}
@@ -0,0 +1,46 @@
1
+ import ComponentNode from "../../core/ComponentNode.mjs";
2
+ import { classMapToString, stylesToObject } from "../../theme/utils.mjs";
3
+ import { mergeClassMaps } from "../../lib/utils.mjs";
4
+ import { useA2UIComponent } from "../../hooks/useA2UIComponent.mjs";
5
+ import { memo, useState } from "react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+
8
+ //#region src/react-renderer/components/layout/Tabs.tsx
9
+ /**
10
+ * Tabs component - displays content in switchable tabs.
11
+ */
12
+ const Tabs = memo(function Tabs({ node, surfaceId }) {
13
+ const { theme, resolveString } = useA2UIComponent(node, surfaceId);
14
+ const props = node.properties;
15
+ const [selectedIndex, setSelectedIndex] = useState(0);
16
+ const tabItems = props.tabItems ?? [];
17
+ return /* @__PURE__ */ jsx("div", {
18
+ className: "a2ui-tabs",
19
+ style: node.weight !== void 0 ? { "--weight": node.weight } : {},
20
+ children: /* @__PURE__ */ jsxs("section", {
21
+ className: classMapToString(theme.components.Tabs.container),
22
+ style: stylesToObject(theme.additionalStyles?.Tabs),
23
+ children: [/* @__PURE__ */ jsx("div", {
24
+ id: "buttons",
25
+ className: classMapToString(theme.components.Tabs.element),
26
+ children: tabItems.map((tab, index) => {
27
+ const title = resolveString(tab.title);
28
+ const isSelected = index === selectedIndex;
29
+ return /* @__PURE__ */ jsx("button", {
30
+ disabled: isSelected,
31
+ className: classMapToString(isSelected ? mergeClassMaps(theme.components.Tabs.controls.all, theme.components.Tabs.controls.selected) : theme.components.Tabs.controls.all),
32
+ onClick: () => setSelectedIndex(index),
33
+ children: title
34
+ }, index);
35
+ })
36
+ }), tabItems[selectedIndex] && /* @__PURE__ */ jsx(ComponentNode, {
37
+ node: tabItems[selectedIndex].child,
38
+ surfaceId
39
+ })]
40
+ })
41
+ });
42
+ });
43
+
44
+ //#endregion
45
+ export { Tabs as default };
46
+ //# sourceMappingURL=Tabs.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs.mjs","names":[],"sources":["../../../../src/react-renderer/components/layout/Tabs.tsx"],"sourcesContent":["import { useState, 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 { ComponentNode } from \"../../core/ComponentNode\";\n\n/**\n * Tabs component - displays content in switchable tabs.\n */\nexport const Tabs = memo(function Tabs({\n node,\n surfaceId,\n}: A2UIComponentProps<Types.TabsNode>) {\n const { theme, resolveString } = useA2UIComponent(node, surfaceId);\n const props = node.properties;\n\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const tabItems = props.tabItems ?? [];\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-tabs\" style={hostStyle}>\n <section\n className={classMapToString(theme.components.Tabs.container)}\n style={stylesToObject(theme.additionalStyles?.Tabs)}\n >\n {/* Tab buttons - uses Tabs.element for the container */}\n <div\n id=\"buttons\"\n className={classMapToString(theme.components.Tabs.element)}\n >\n {tabItems.map((tab, index) => {\n const title = resolveString(tab.title);\n const isSelected = index === selectedIndex;\n\n // Lit merges all + selected classes when selected\n const classes = isSelected\n ? mergeClassMaps(\n theme.components.Tabs.controls.all,\n theme.components.Tabs.controls.selected,\n )\n : theme.components.Tabs.controls.all;\n\n return (\n <button\n key={index}\n disabled={isSelected}\n className={classMapToString(classes)}\n onClick={() => setSelectedIndex(index)}\n >\n {title}\n </button>\n );\n })}\n </div>\n\n {/* Tab content */}\n {tabItems[selectedIndex] && (\n <ComponentNode\n node={tabItems[selectedIndex].child}\n surfaceId={surfaceId}\n />\n )}\n </section>\n </div>\n );\n});\n\nexport default Tabs;\n"],"mappings":";;;;;;;;;;;AAcA,MAAa,OAAO,KAAK,SAAS,KAAK,EACrC,MACA,aACqC;CACrC,MAAM,EAAE,OAAO,kBAAkB,iBAAiB,MAAM,UAAU;CAClE,MAAM,QAAQ,KAAK;CAEnB,MAAM,CAAC,eAAe,oBAAoB,SAAS,EAAE;CAErD,MAAM,WAAW,MAAM,YAAY,EAAE;AAQrC,QACE,oBAAC;EAAI,WAAU;EAAY,OAL3B,KAAK,WAAW,SACX,EAAE,YAAY,KAAK,QAAQ,GAC5B,EAAE;YAIJ,qBAAC;GACC,WAAW,iBAAiB,MAAM,WAAW,KAAK,UAAU;GAC5D,OAAO,eAAe,MAAM,kBAAkB,KAAK;cAGnD,oBAAC;IACC,IAAG;IACH,WAAW,iBAAiB,MAAM,WAAW,KAAK,QAAQ;cAEzD,SAAS,KAAK,KAAK,UAAU;KAC5B,MAAM,QAAQ,cAAc,IAAI,MAAM;KACtC,MAAM,aAAa,UAAU;AAU7B,YACE,oBAAC;MAEC,UAAU;MACV,WAAW,iBAXC,aACZ,eACE,MAAM,WAAW,KAAK,SAAS,KAC/B,MAAM,WAAW,KAAK,SAAS,SAChC,GACD,MAAM,WAAW,KAAK,SAAS,IAMK;MACpC,eAAe,iBAAiB,MAAM;gBAErC;QALI,MAME;MAEX;KACE,EAGL,SAAS,kBACR,oBAAC;IACC,MAAM,SAAS,eAAe;IACnB;KACX;IAEI;GACN;EAER"}
@@ -0,0 +1,123 @@
1
+ const require_runtime = require('../../_virtual/_rolldown/runtime.cjs');
2
+ const require_ThemeContext = require('../theme/ThemeContext.cjs');
3
+ let react = require("react");
4
+ let _a2ui_lit_0_8 = require("@a2ui/lit/0.8");
5
+ let react_jsx_runtime = require("react/jsx-runtime");
6
+
7
+ //#region src/react-renderer/core/A2UIProvider.tsx
8
+ /**
9
+ * Context for stable actions (never changes reference, prevents re-renders).
10
+ * Components that only need to dispatch actions or read data won't re-render.
11
+ */
12
+ const A2UIActionsContext = (0, react.createContext)(null);
13
+ /**
14
+ * Context for reactive state (changes trigger re-renders).
15
+ * Only components that need to react to state changes subscribe to this.
16
+ */
17
+ const A2UIStateContext = (0, react.createContext)(null);
18
+ /**
19
+ * Provider component that sets up the A2UI context for descendant components.
20
+ *
21
+ * This provider uses a two-context architecture for performance:
22
+ * - A2UIActionsContext: Stable actions that never change (no re-renders)
23
+ * - A2UIStateContext: Reactive state that triggers re-renders when needed
24
+ *
25
+ * @example
26
+ * ```tsx
27
+ * function App() {
28
+ * const handleAction = async (message) => {
29
+ * const response = await fetch('/api/a2ui', {
30
+ * method: 'POST',
31
+ * body: JSON.stringify(message)
32
+ * });
33
+ * const newMessages = await response.json();
34
+ * };
35
+ *
36
+ * return (
37
+ * <A2UIProvider onAction={handleAction}>
38
+ * <A2UIRenderer surfaceId="main" />
39
+ * </A2UIProvider>
40
+ * );
41
+ * }
42
+ * ```
43
+ */
44
+ function A2UIProvider({ onAction, theme, children }) {
45
+ const processorRef = (0, react.useRef)(null);
46
+ if (!processorRef.current) processorRef.current = _a2ui_lit_0_8.Data.createSignalA2uiMessageProcessor();
47
+ const processor = processorRef.current;
48
+ const [version, setVersion] = (0, react.useState)(0);
49
+ const onActionRef = (0, react.useRef)(onAction ?? null);
50
+ onActionRef.current = onAction ?? null;
51
+ const actionsRef = (0, react.useRef)(null);
52
+ if (!actionsRef.current) actionsRef.current = {
53
+ processMessages: (messages) => {
54
+ processor.processMessages(messages);
55
+ setVersion((v) => v + 1);
56
+ },
57
+ setData: (node, path, value, surfaceId) => {
58
+ processor.setData(node, path, value, surfaceId);
59
+ setVersion((v) => v + 1);
60
+ },
61
+ dispatch: (message) => {
62
+ if (onActionRef.current) onActionRef.current(message);
63
+ },
64
+ clearSurfaces: () => {
65
+ processor.clearSurfaces();
66
+ setVersion((v) => v + 1);
67
+ },
68
+ getSurface: (surfaceId) => {
69
+ return processor.getSurfaces().get(surfaceId);
70
+ },
71
+ getSurfaces: () => {
72
+ return processor.getSurfaces();
73
+ },
74
+ getData: (node, path, surfaceId) => {
75
+ return processor.getData(node, path, surfaceId);
76
+ },
77
+ resolvePath: (path, dataContextPath) => {
78
+ return processor.resolvePath(path, dataContextPath);
79
+ }
80
+ };
81
+ const actions = actionsRef.current;
82
+ const stateValue = (0, react.useMemo)(() => ({ version }), [version]);
83
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(A2UIActionsContext.Provider, {
84
+ value: actions,
85
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(A2UIStateContext.Provider, {
86
+ value: stateValue,
87
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ThemeContext.ThemeProvider, {
88
+ theme,
89
+ children
90
+ })
91
+ })
92
+ });
93
+ }
94
+ /**
95
+ * Hook to access stable A2UI actions (won't cause re-renders).
96
+ * Use this when you only need to dispatch actions or read data.
97
+ *
98
+ * @returns Stable actions object
99
+ * @throws If used outside of an A2UIProvider
100
+ */
101
+ function useA2UIActions() {
102
+ const actions = (0, react.useContext)(A2UIActionsContext);
103
+ if (!actions) throw new Error("useA2UIActions must be used within an A2UIProvider");
104
+ return actions;
105
+ }
106
+ /**
107
+ * Hook to subscribe to A2UI state changes.
108
+ * Components using this will re-render when state changes.
109
+ *
110
+ * @returns Current version number
111
+ * @throws If used outside of an A2UIProvider
112
+ */
113
+ function useA2UIState() {
114
+ const state = (0, react.useContext)(A2UIStateContext);
115
+ if (!state) throw new Error("useA2UIState must be used within an A2UIProvider");
116
+ return state;
117
+ }
118
+
119
+ //#endregion
120
+ exports.A2UIProvider = A2UIProvider;
121
+ exports.useA2UIActions = useA2UIActions;
122
+ exports.useA2UIState = useA2UIState;
123
+ //# sourceMappingURL=A2UIProvider.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"A2UIProvider.cjs","names":["Data","ThemeProvider"],"sources":["../../../src/react-renderer/core/A2UIProvider.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n useRef,\n useState,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport { Data, type Types } from \"@a2ui/lit/0.8\";\nimport type { A2UIContextValue, A2UIActions } from \"./store\";\nimport { ThemeProvider } from \"../theme/ThemeContext\";\nimport type { OnActionCallback } from \"../types\";\n\n/**\n * Context for stable actions (never changes reference, prevents re-renders).\n * Components that only need to dispatch actions or read data won't re-render.\n */\nconst A2UIActionsContext = createContext<A2UIActions | null>(null);\n\n/**\n * Context for reactive state (changes trigger re-renders).\n * Only components that need to react to state changes subscribe to this.\n */\nconst A2UIStateContext = createContext<{ version: number } | null>(null);\n\n/**\n * Props for the A2UIProvider component.\n */\nexport interface A2UIProviderProps {\n /** Callback invoked when a user action is dispatched (button click, etc.) */\n onAction?: OnActionCallback;\n /** Theme configuration. Falls back to default theme if not provided. */\n theme?: Types.Theme;\n /** Child components */\n children: ReactNode;\n}\n\n/**\n * Provider component that sets up the A2UI context for descendant components.\n *\n * This provider uses a two-context architecture for performance:\n * - A2UIActionsContext: Stable actions that never change (no re-renders)\n * - A2UIStateContext: Reactive state that triggers re-renders when needed\n *\n * @example\n * ```tsx\n * function App() {\n * const handleAction = async (message) => {\n * const response = await fetch('/api/a2ui', {\n * method: 'POST',\n * body: JSON.stringify(message)\n * });\n * const newMessages = await response.json();\n * };\n *\n * return (\n * <A2UIProvider onAction={handleAction}>\n * <A2UIRenderer surfaceId=\"main\" />\n * </A2UIProvider>\n * );\n * }\n * ```\n */\nexport function A2UIProvider({ onAction, theme, children }: A2UIProviderProps) {\n // Create message processor only once using ref\n const processorRef = useRef<Types.MessageProcessor | null>(null);\n if (!processorRef.current) {\n processorRef.current = Data.createSignalA2uiMessageProcessor();\n }\n const processor = processorRef.current;\n\n // Version counter for triggering re-renders\n const [version, setVersion] = useState(0);\n\n // Store onAction in a ref so callbacks always have the latest value\n const onActionRef = useRef<OnActionCallback | null>(onAction ?? null);\n onActionRef.current = onAction ?? null;\n\n // Create stable actions object once - stored in ref, never changes\n const actionsRef = useRef<A2UIActions | null>(null);\n if (!actionsRef.current) {\n actionsRef.current = {\n processMessages: (messages: Types.ServerToClientMessage[]) => {\n processor.processMessages(messages);\n setVersion((v) => v + 1);\n },\n\n setData: (\n node: Types.AnyComponentNode | null,\n path: string,\n value: Types.DataValue,\n surfaceId: string,\n ) => {\n processor.setData(node, path, value, surfaceId);\n setVersion((v) => v + 1);\n },\n\n dispatch: (message: Types.A2UIClientEventMessage) => {\n if (onActionRef.current) {\n onActionRef.current(message);\n }\n },\n\n clearSurfaces: () => {\n processor.clearSurfaces();\n setVersion((v) => v + 1);\n },\n\n getSurface: (surfaceId: string) => {\n return processor.getSurfaces().get(surfaceId);\n },\n\n getSurfaces: () => {\n return processor.getSurfaces();\n },\n\n getData: (\n node: Types.AnyComponentNode,\n path: string,\n surfaceId: string,\n ) => {\n return processor.getData(node, path, surfaceId);\n },\n\n resolvePath: (path: string, dataContextPath?: string) => {\n return processor.resolvePath(path, dataContextPath);\n },\n };\n }\n const actions = actionsRef.current;\n\n // State context value - only changes when version changes\n const stateValue = useMemo(() => ({ version }), [version]);\n\n return (\n <A2UIActionsContext.Provider value={actions}>\n <A2UIStateContext.Provider value={stateValue}>\n <ThemeProvider theme={theme}>{children}</ThemeProvider>\n </A2UIStateContext.Provider>\n </A2UIActionsContext.Provider>\n );\n}\n\n/**\n * Hook to access stable A2UI actions (won't cause re-renders).\n * Use this when you only need to dispatch actions or read data.\n *\n * @returns Stable actions object\n * @throws If used outside of an A2UIProvider\n */\nexport function useA2UIActions(): A2UIActions {\n const actions = useContext(A2UIActionsContext);\n if (!actions) {\n throw new Error(\"useA2UIActions must be used within an A2UIProvider\");\n }\n return actions;\n}\n\n/**\n * Hook to subscribe to A2UI state changes.\n * Components using this will re-render when state changes.\n *\n * @returns Current version number\n * @throws If used outside of an A2UIProvider\n */\nexport function useA2UIState(): { version: number } {\n const state = useContext(A2UIStateContext);\n if (!state) {\n throw new Error(\"useA2UIState must be used within an A2UIProvider\");\n }\n return state;\n}\n\n/**\n * Hook to access the full A2UI context (actions + state).\n * Components using this will re-render when state changes.\n *\n * @returns The A2UI context value\n * @throws If used outside of an A2UIProvider\n */\nexport function useA2UIContext(): A2UIContextValue {\n const actions = useA2UIActions();\n const state = useA2UIState();\n\n // Memoize combined value - only changes when state changes\n // Actions are stable, so this only re-creates when version changes\n return useMemo(\n () => ({\n ...actions,\n processor: null as unknown as Types.MessageProcessor, // Not exposed directly\n version: state.version,\n onAction: null, // Use dispatch instead\n }),\n [actions, state.version],\n );\n}\n\n/**\n * @deprecated Use useA2UIContext instead. This alias exists for backward compatibility only.\n */\nexport const useA2UIStore = useA2UIContext;\n\n/**\n * @deprecated This selector pattern does not provide performance benefits with React Context.\n * Components will re-render on any context change regardless of what you select.\n * Use useA2UIContext() or useA2UI() directly instead.\n *\n * @param selector - Function to select a slice of state\n * @returns The selected state\n */\nexport function useA2UIStoreSelector<T>(\n selector: (state: A2UIContextValue) => T,\n): T {\n const context = useA2UIContext();\n return selector(context);\n}\n"],"mappings":";;;;;;;;;;;AAiBA,MAAM,8CAAuD,KAAK;;;;;AAMlE,MAAM,4CAA6D,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCxE,SAAgB,aAAa,EAAE,UAAU,OAAO,YAA+B;CAE7E,MAAM,iCAAqD,KAAK;AAChE,KAAI,CAAC,aAAa,QAChB,cAAa,UAAUA,mBAAK,kCAAkC;CAEhE,MAAM,YAAY,aAAa;CAG/B,MAAM,CAAC,SAAS,kCAAuB,EAAE;CAGzC,MAAM,gCAA8C,YAAY,KAAK;AACrE,aAAY,UAAU,YAAY;CAGlC,MAAM,+BAAwC,KAAK;AACnD,KAAI,CAAC,WAAW,QACd,YAAW,UAAU;EACnB,kBAAkB,aAA4C;AAC5D,aAAU,gBAAgB,SAAS;AACnC,eAAY,MAAM,IAAI,EAAE;;EAG1B,UACE,MACA,MACA,OACA,cACG;AACH,aAAU,QAAQ,MAAM,MAAM,OAAO,UAAU;AAC/C,eAAY,MAAM,IAAI,EAAE;;EAG1B,WAAW,YAA0C;AACnD,OAAI,YAAY,QACd,aAAY,QAAQ,QAAQ;;EAIhC,qBAAqB;AACnB,aAAU,eAAe;AACzB,eAAY,MAAM,IAAI,EAAE;;EAG1B,aAAa,cAAsB;AACjC,UAAO,UAAU,aAAa,CAAC,IAAI,UAAU;;EAG/C,mBAAmB;AACjB,UAAO,UAAU,aAAa;;EAGhC,UACE,MACA,MACA,cACG;AACH,UAAO,UAAU,QAAQ,MAAM,MAAM,UAAU;;EAGjD,cAAc,MAAc,oBAA6B;AACvD,UAAO,UAAU,YAAY,MAAM,gBAAgB;;EAEtD;CAEH,MAAM,UAAU,WAAW;CAG3B,MAAM,uCAA4B,EAAE,SAAS,GAAG,CAAC,QAAQ,CAAC;AAE1D,QACE,2CAAC,mBAAmB;EAAS,OAAO;YAClC,2CAAC,iBAAiB;GAAS,OAAO;aAChC,2CAACC;IAAqB;IAAQ;KAAyB;IAC7B;GACA;;;;;;;;;AAWlC,SAAgB,iBAA8B;CAC5C,MAAM,gCAAqB,mBAAmB;AAC9C,KAAI,CAAC,QACH,OAAM,IAAI,MAAM,qDAAqD;AAEvE,QAAO;;;;;;;;;AAUT,SAAgB,eAAoC;CAClD,MAAM,8BAAmB,iBAAiB;AAC1C,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,mDAAmD;AAErE,QAAO"}
@@ -0,0 +1,120 @@
1
+ import { ThemeProvider } from "../theme/ThemeContext.mjs";
2
+ import { createContext, useContext, useMemo, useRef, useState } from "react";
3
+ import { Data } from "@a2ui/lit/0.8";
4
+ import { jsx } from "react/jsx-runtime";
5
+
6
+ //#region src/react-renderer/core/A2UIProvider.tsx
7
+ /**
8
+ * Context for stable actions (never changes reference, prevents re-renders).
9
+ * Components that only need to dispatch actions or read data won't re-render.
10
+ */
11
+ const A2UIActionsContext = createContext(null);
12
+ /**
13
+ * Context for reactive state (changes trigger re-renders).
14
+ * Only components that need to react to state changes subscribe to this.
15
+ */
16
+ const A2UIStateContext = createContext(null);
17
+ /**
18
+ * Provider component that sets up the A2UI context for descendant components.
19
+ *
20
+ * This provider uses a two-context architecture for performance:
21
+ * - A2UIActionsContext: Stable actions that never change (no re-renders)
22
+ * - A2UIStateContext: Reactive state that triggers re-renders when needed
23
+ *
24
+ * @example
25
+ * ```tsx
26
+ * function App() {
27
+ * const handleAction = async (message) => {
28
+ * const response = await fetch('/api/a2ui', {
29
+ * method: 'POST',
30
+ * body: JSON.stringify(message)
31
+ * });
32
+ * const newMessages = await response.json();
33
+ * };
34
+ *
35
+ * return (
36
+ * <A2UIProvider onAction={handleAction}>
37
+ * <A2UIRenderer surfaceId="main" />
38
+ * </A2UIProvider>
39
+ * );
40
+ * }
41
+ * ```
42
+ */
43
+ function A2UIProvider({ onAction, theme, children }) {
44
+ const processorRef = useRef(null);
45
+ if (!processorRef.current) processorRef.current = Data.createSignalA2uiMessageProcessor();
46
+ const processor = processorRef.current;
47
+ const [version, setVersion] = useState(0);
48
+ const onActionRef = useRef(onAction ?? null);
49
+ onActionRef.current = onAction ?? null;
50
+ const actionsRef = useRef(null);
51
+ if (!actionsRef.current) actionsRef.current = {
52
+ processMessages: (messages) => {
53
+ processor.processMessages(messages);
54
+ setVersion((v) => v + 1);
55
+ },
56
+ setData: (node, path, value, surfaceId) => {
57
+ processor.setData(node, path, value, surfaceId);
58
+ setVersion((v) => v + 1);
59
+ },
60
+ dispatch: (message) => {
61
+ if (onActionRef.current) onActionRef.current(message);
62
+ },
63
+ clearSurfaces: () => {
64
+ processor.clearSurfaces();
65
+ setVersion((v) => v + 1);
66
+ },
67
+ getSurface: (surfaceId) => {
68
+ return processor.getSurfaces().get(surfaceId);
69
+ },
70
+ getSurfaces: () => {
71
+ return processor.getSurfaces();
72
+ },
73
+ getData: (node, path, surfaceId) => {
74
+ return processor.getData(node, path, surfaceId);
75
+ },
76
+ resolvePath: (path, dataContextPath) => {
77
+ return processor.resolvePath(path, dataContextPath);
78
+ }
79
+ };
80
+ const actions = actionsRef.current;
81
+ const stateValue = useMemo(() => ({ version }), [version]);
82
+ return /* @__PURE__ */ jsx(A2UIActionsContext.Provider, {
83
+ value: actions,
84
+ children: /* @__PURE__ */ jsx(A2UIStateContext.Provider, {
85
+ value: stateValue,
86
+ children: /* @__PURE__ */ jsx(ThemeProvider, {
87
+ theme,
88
+ children
89
+ })
90
+ })
91
+ });
92
+ }
93
+ /**
94
+ * Hook to access stable A2UI actions (won't cause re-renders).
95
+ * Use this when you only need to dispatch actions or read data.
96
+ *
97
+ * @returns Stable actions object
98
+ * @throws If used outside of an A2UIProvider
99
+ */
100
+ function useA2UIActions() {
101
+ const actions = useContext(A2UIActionsContext);
102
+ if (!actions) throw new Error("useA2UIActions must be used within an A2UIProvider");
103
+ return actions;
104
+ }
105
+ /**
106
+ * Hook to subscribe to A2UI state changes.
107
+ * Components using this will re-render when state changes.
108
+ *
109
+ * @returns Current version number
110
+ * @throws If used outside of an A2UIProvider
111
+ */
112
+ function useA2UIState() {
113
+ const state = useContext(A2UIStateContext);
114
+ if (!state) throw new Error("useA2UIState must be used within an A2UIProvider");
115
+ return state;
116
+ }
117
+
118
+ //#endregion
119
+ export { A2UIProvider, useA2UIActions, useA2UIState };
120
+ //# sourceMappingURL=A2UIProvider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"A2UIProvider.mjs","names":[],"sources":["../../../src/react-renderer/core/A2UIProvider.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n useRef,\n useState,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport { Data, type Types } from \"@a2ui/lit/0.8\";\nimport type { A2UIContextValue, A2UIActions } from \"./store\";\nimport { ThemeProvider } from \"../theme/ThemeContext\";\nimport type { OnActionCallback } from \"../types\";\n\n/**\n * Context for stable actions (never changes reference, prevents re-renders).\n * Components that only need to dispatch actions or read data won't re-render.\n */\nconst A2UIActionsContext = createContext<A2UIActions | null>(null);\n\n/**\n * Context for reactive state (changes trigger re-renders).\n * Only components that need to react to state changes subscribe to this.\n */\nconst A2UIStateContext = createContext<{ version: number } | null>(null);\n\n/**\n * Props for the A2UIProvider component.\n */\nexport interface A2UIProviderProps {\n /** Callback invoked when a user action is dispatched (button click, etc.) */\n onAction?: OnActionCallback;\n /** Theme configuration. Falls back to default theme if not provided. */\n theme?: Types.Theme;\n /** Child components */\n children: ReactNode;\n}\n\n/**\n * Provider component that sets up the A2UI context for descendant components.\n *\n * This provider uses a two-context architecture for performance:\n * - A2UIActionsContext: Stable actions that never change (no re-renders)\n * - A2UIStateContext: Reactive state that triggers re-renders when needed\n *\n * @example\n * ```tsx\n * function App() {\n * const handleAction = async (message) => {\n * const response = await fetch('/api/a2ui', {\n * method: 'POST',\n * body: JSON.stringify(message)\n * });\n * const newMessages = await response.json();\n * };\n *\n * return (\n * <A2UIProvider onAction={handleAction}>\n * <A2UIRenderer surfaceId=\"main\" />\n * </A2UIProvider>\n * );\n * }\n * ```\n */\nexport function A2UIProvider({ onAction, theme, children }: A2UIProviderProps) {\n // Create message processor only once using ref\n const processorRef = useRef<Types.MessageProcessor | null>(null);\n if (!processorRef.current) {\n processorRef.current = Data.createSignalA2uiMessageProcessor();\n }\n const processor = processorRef.current;\n\n // Version counter for triggering re-renders\n const [version, setVersion] = useState(0);\n\n // Store onAction in a ref so callbacks always have the latest value\n const onActionRef = useRef<OnActionCallback | null>(onAction ?? null);\n onActionRef.current = onAction ?? null;\n\n // Create stable actions object once - stored in ref, never changes\n const actionsRef = useRef<A2UIActions | null>(null);\n if (!actionsRef.current) {\n actionsRef.current = {\n processMessages: (messages: Types.ServerToClientMessage[]) => {\n processor.processMessages(messages);\n setVersion((v) => v + 1);\n },\n\n setData: (\n node: Types.AnyComponentNode | null,\n path: string,\n value: Types.DataValue,\n surfaceId: string,\n ) => {\n processor.setData(node, path, value, surfaceId);\n setVersion((v) => v + 1);\n },\n\n dispatch: (message: Types.A2UIClientEventMessage) => {\n if (onActionRef.current) {\n onActionRef.current(message);\n }\n },\n\n clearSurfaces: () => {\n processor.clearSurfaces();\n setVersion((v) => v + 1);\n },\n\n getSurface: (surfaceId: string) => {\n return processor.getSurfaces().get(surfaceId);\n },\n\n getSurfaces: () => {\n return processor.getSurfaces();\n },\n\n getData: (\n node: Types.AnyComponentNode,\n path: string,\n surfaceId: string,\n ) => {\n return processor.getData(node, path, surfaceId);\n },\n\n resolvePath: (path: string, dataContextPath?: string) => {\n return processor.resolvePath(path, dataContextPath);\n },\n };\n }\n const actions = actionsRef.current;\n\n // State context value - only changes when version changes\n const stateValue = useMemo(() => ({ version }), [version]);\n\n return (\n <A2UIActionsContext.Provider value={actions}>\n <A2UIStateContext.Provider value={stateValue}>\n <ThemeProvider theme={theme}>{children}</ThemeProvider>\n </A2UIStateContext.Provider>\n </A2UIActionsContext.Provider>\n );\n}\n\n/**\n * Hook to access stable A2UI actions (won't cause re-renders).\n * Use this when you only need to dispatch actions or read data.\n *\n * @returns Stable actions object\n * @throws If used outside of an A2UIProvider\n */\nexport function useA2UIActions(): A2UIActions {\n const actions = useContext(A2UIActionsContext);\n if (!actions) {\n throw new Error(\"useA2UIActions must be used within an A2UIProvider\");\n }\n return actions;\n}\n\n/**\n * Hook to subscribe to A2UI state changes.\n * Components using this will re-render when state changes.\n *\n * @returns Current version number\n * @throws If used outside of an A2UIProvider\n */\nexport function useA2UIState(): { version: number } {\n const state = useContext(A2UIStateContext);\n if (!state) {\n throw new Error(\"useA2UIState must be used within an A2UIProvider\");\n }\n return state;\n}\n\n/**\n * Hook to access the full A2UI context (actions + state).\n * Components using this will re-render when state changes.\n *\n * @returns The A2UI context value\n * @throws If used outside of an A2UIProvider\n */\nexport function useA2UIContext(): A2UIContextValue {\n const actions = useA2UIActions();\n const state = useA2UIState();\n\n // Memoize combined value - only changes when state changes\n // Actions are stable, so this only re-creates when version changes\n return useMemo(\n () => ({\n ...actions,\n processor: null as unknown as Types.MessageProcessor, // Not exposed directly\n version: state.version,\n onAction: null, // Use dispatch instead\n }),\n [actions, state.version],\n );\n}\n\n/**\n * @deprecated Use useA2UIContext instead. This alias exists for backward compatibility only.\n */\nexport const useA2UIStore = useA2UIContext;\n\n/**\n * @deprecated This selector pattern does not provide performance benefits with React Context.\n * Components will re-render on any context change regardless of what you select.\n * Use useA2UIContext() or useA2UI() directly instead.\n *\n * @param selector - Function to select a slice of state\n * @returns The selected state\n */\nexport function useA2UIStoreSelector<T>(\n selector: (state: A2UIContextValue) => T,\n): T {\n const context = useA2UIContext();\n return selector(context);\n}\n"],"mappings":";;;;;;;;;;AAiBA,MAAM,qBAAqB,cAAkC,KAAK;;;;;AAMlE,MAAM,mBAAmB,cAA0C,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCxE,SAAgB,aAAa,EAAE,UAAU,OAAO,YAA+B;CAE7E,MAAM,eAAe,OAAsC,KAAK;AAChE,KAAI,CAAC,aAAa,QAChB,cAAa,UAAU,KAAK,kCAAkC;CAEhE,MAAM,YAAY,aAAa;CAG/B,MAAM,CAAC,SAAS,cAAc,SAAS,EAAE;CAGzC,MAAM,cAAc,OAAgC,YAAY,KAAK;AACrE,aAAY,UAAU,YAAY;CAGlC,MAAM,aAAa,OAA2B,KAAK;AACnD,KAAI,CAAC,WAAW,QACd,YAAW,UAAU;EACnB,kBAAkB,aAA4C;AAC5D,aAAU,gBAAgB,SAAS;AACnC,eAAY,MAAM,IAAI,EAAE;;EAG1B,UACE,MACA,MACA,OACA,cACG;AACH,aAAU,QAAQ,MAAM,MAAM,OAAO,UAAU;AAC/C,eAAY,MAAM,IAAI,EAAE;;EAG1B,WAAW,YAA0C;AACnD,OAAI,YAAY,QACd,aAAY,QAAQ,QAAQ;;EAIhC,qBAAqB;AACnB,aAAU,eAAe;AACzB,eAAY,MAAM,IAAI,EAAE;;EAG1B,aAAa,cAAsB;AACjC,UAAO,UAAU,aAAa,CAAC,IAAI,UAAU;;EAG/C,mBAAmB;AACjB,UAAO,UAAU,aAAa;;EAGhC,UACE,MACA,MACA,cACG;AACH,UAAO,UAAU,QAAQ,MAAM,MAAM,UAAU;;EAGjD,cAAc,MAAc,oBAA6B;AACvD,UAAO,UAAU,YAAY,MAAM,gBAAgB;;EAEtD;CAEH,MAAM,UAAU,WAAW;CAG3B,MAAM,aAAa,eAAe,EAAE,SAAS,GAAG,CAAC,QAAQ,CAAC;AAE1D,QACE,oBAAC,mBAAmB;EAAS,OAAO;YAClC,oBAAC,iBAAiB;GAAS,OAAO;aAChC,oBAAC;IAAqB;IAAQ;KAAyB;IAC7B;GACA;;;;;;;;;AAWlC,SAAgB,iBAA8B;CAC5C,MAAM,UAAU,WAAW,mBAAmB;AAC9C,KAAI,CAAC,QACH,OAAM,IAAI,MAAM,qDAAqD;AAEvE,QAAO;;;;;;;;;AAUT,SAAgB,eAAoC;CAClD,MAAM,QAAQ,WAAW,iBAAiB;AAC1C,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,mDAAmD;AAErE,QAAO"}
@@ -0,0 +1,93 @@
1
+ const require_runtime = require('../../_virtual/_rolldown/runtime.cjs');
2
+ const require_useA2UI = require('../hooks/useA2UI.cjs');
3
+ const require_ComponentNode = require('./ComponentNode.cjs');
4
+ const require_utils = require('../lib/utils.cjs');
5
+ let react = require("react");
6
+ let react_jsx_runtime = require("react/jsx-runtime");
7
+
8
+ //#region src/react-renderer/core/A2UIRenderer.tsx
9
+ /** Default loading fallback - memoized to prevent recreation */
10
+ const DefaultLoadingFallback = (0, react.memo)(function DefaultLoadingFallback() {
11
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12
+ className: "a2ui-loading",
13
+ style: {
14
+ padding: "16px",
15
+ opacity: .5
16
+ },
17
+ children: "Loading..."
18
+ });
19
+ });
20
+ /**
21
+ * A2UIRenderer - renders an A2UI surface.
22
+ *
23
+ * This is the main entry point for rendering A2UI content in your React app.
24
+ * It reads the surface state from the A2UI store and renders the component tree.
25
+ *
26
+ * Memoized to prevent unnecessary re-renders when props haven't changed.
27
+ *
28
+ * @example
29
+ * ```tsx
30
+ * function App() {
31
+ * return (
32
+ * <A2UIProvider onAction={handleAction}>
33
+ * <A2UIRenderer surfaceId="main" />
34
+ * </A2UIProvider>
35
+ * );
36
+ * }
37
+ * ```
38
+ */
39
+ const A2UIRenderer = (0, react.memo)(function A2UIRenderer({ surfaceId, className, fallback = null, loadingFallback, registry }) {
40
+ const { getSurface, version } = require_useA2UI.useA2UI();
41
+ const surface = getSurface(surfaceId);
42
+ const surfaceStyles = (0, react.useMemo)(() => {
43
+ if (!surface?.styles) return {};
44
+ const styles = {};
45
+ for (const [key, value] of Object.entries(surface.styles)) switch (key) {
46
+ case "primaryColor":
47
+ styles["--p-100"] = "#ffffff";
48
+ styles["--p-99"] = `color-mix(in srgb, ${value} 2%, white 98%)`;
49
+ styles["--p-98"] = `color-mix(in srgb, ${value} 4%, white 96%)`;
50
+ styles["--p-95"] = `color-mix(in srgb, ${value} 10%, white 90%)`;
51
+ styles["--p-90"] = `color-mix(in srgb, ${value} 20%, white 80%)`;
52
+ styles["--p-80"] = `color-mix(in srgb, ${value} 40%, white 60%)`;
53
+ styles["--p-70"] = `color-mix(in srgb, ${value} 60%, white 40%)`;
54
+ styles["--p-60"] = `color-mix(in srgb, ${value} 80%, white 20%)`;
55
+ styles["--p-50"] = String(value);
56
+ styles["--p-40"] = `color-mix(in srgb, ${value} 80%, black 20%)`;
57
+ styles["--p-35"] = `color-mix(in srgb, ${value} 70%, black 30%)`;
58
+ styles["--p-30"] = `color-mix(in srgb, ${value} 60%, black 40%)`;
59
+ styles["--p-25"] = `color-mix(in srgb, ${value} 50%, black 50%)`;
60
+ styles["--p-20"] = `color-mix(in srgb, ${value} 40%, black 60%)`;
61
+ styles["--p-15"] = `color-mix(in srgb, ${value} 30%, black 70%)`;
62
+ styles["--p-10"] = `color-mix(in srgb, ${value} 20%, black 80%)`;
63
+ styles["--p-5"] = `color-mix(in srgb, ${value} 10%, black 90%)`;
64
+ styles["--p-0"] = "#000000";
65
+ break;
66
+ case "font":
67
+ styles["--font-family"] = String(value);
68
+ styles["--font-family-flex"] = String(value);
69
+ break;
70
+ }
71
+ return styles;
72
+ }, [surface?.styles]);
73
+ if (!surface || !surface.componentTree) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: fallback });
74
+ const actualLoadingFallback = loadingFallback ?? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DefaultLoadingFallback, {});
75
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
76
+ className: require_utils.cn("a2ui-surface", className),
77
+ style: surfaceStyles,
78
+ "data-surface-id": surfaceId,
79
+ "data-version": version,
80
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react.Suspense, {
81
+ fallback: actualLoadingFallback,
82
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ComponentNode.default, {
83
+ node: surface.componentTree,
84
+ surfaceId,
85
+ registry
86
+ })
87
+ })
88
+ });
89
+ });
90
+
91
+ //#endregion
92
+ exports.default = A2UIRenderer;
93
+ //# sourceMappingURL=A2UIRenderer.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"A2UIRenderer.cjs","names":["useA2UI","cn","Suspense","ComponentNode"],"sources":["../../../src/react-renderer/core/A2UIRenderer.tsx"],"sourcesContent":["import { Suspense, useMemo, memo, type ReactNode } from \"react\";\nimport { useA2UI } from \"../hooks/useA2UI\";\nimport { ComponentNode } from \"./ComponentNode\";\nimport { type ComponentRegistry } from \"../registry/ComponentRegistry\";\nimport { cn } from \"../lib/utils\";\n\n/** Default loading fallback - memoized to prevent recreation */\nconst DefaultLoadingFallback = memo(function DefaultLoadingFallback() {\n return (\n <div className=\"a2ui-loading\" style={{ padding: \"16px\", opacity: 0.5 }}>\n Loading...\n </div>\n );\n});\n\nexport interface A2UIRendererProps {\n /** The surface ID to render */\n surfaceId: string;\n /** Additional CSS classes for the surface container */\n className?: string;\n /** Fallback content when surface is not yet available */\n fallback?: ReactNode;\n /** Loading fallback for lazy-loaded components */\n loadingFallback?: ReactNode;\n /** Optional custom component registry */\n registry?: ComponentRegistry;\n}\n\n/**\n * A2UIRenderer - renders an A2UI surface.\n *\n * This is the main entry point for rendering A2UI content in your React app.\n * It reads the surface state from the A2UI store and renders the component tree.\n *\n * Memoized to prevent unnecessary re-renders when props haven't changed.\n *\n * @example\n * ```tsx\n * function App() {\n * return (\n * <A2UIProvider onAction={handleAction}>\n * <A2UIRenderer surfaceId=\"main\" />\n * </A2UIProvider>\n * );\n * }\n * ```\n */\nexport const A2UIRenderer = memo(function A2UIRenderer({\n surfaceId,\n className,\n fallback = null,\n loadingFallback,\n registry,\n}: A2UIRendererProps) {\n const { getSurface, version } = useA2UI();\n\n // Get surface - this will re-render when version changes\n const surface = getSurface(surfaceId);\n\n // Memoize surface styles to prevent object recreation\n // Matches Lit renderer's transformation logic in surface.ts\n const surfaceStyles = useMemo<React.CSSProperties>(() => {\n if (!surface?.styles) return {};\n\n const styles: React.CSSProperties & Record<string, string> = {};\n\n for (const [key, value] of Object.entries(surface.styles)) {\n switch (key) {\n // Generate a color palette from the primary color.\n // Values range from 0-100 where 0=black, 100=white, 50=primary color.\n // Uses color-mix to create intermediate values.\n case \"primaryColor\": {\n styles[\"--p-100\"] = \"#ffffff\";\n styles[\"--p-99\"] = `color-mix(in srgb, ${value} 2%, white 98%)`;\n styles[\"--p-98\"] = `color-mix(in srgb, ${value} 4%, white 96%)`;\n styles[\"--p-95\"] = `color-mix(in srgb, ${value} 10%, white 90%)`;\n styles[\"--p-90\"] = `color-mix(in srgb, ${value} 20%, white 80%)`;\n styles[\"--p-80\"] = `color-mix(in srgb, ${value} 40%, white 60%)`;\n styles[\"--p-70\"] = `color-mix(in srgb, ${value} 60%, white 40%)`;\n styles[\"--p-60\"] = `color-mix(in srgb, ${value} 80%, white 20%)`;\n styles[\"--p-50\"] = String(value);\n styles[\"--p-40\"] = `color-mix(in srgb, ${value} 80%, black 20%)`;\n styles[\"--p-35\"] = `color-mix(in srgb, ${value} 70%, black 30%)`;\n styles[\"--p-30\"] = `color-mix(in srgb, ${value} 60%, black 40%)`;\n styles[\"--p-25\"] = `color-mix(in srgb, ${value} 50%, black 50%)`;\n styles[\"--p-20\"] = `color-mix(in srgb, ${value} 40%, black 60%)`;\n styles[\"--p-15\"] = `color-mix(in srgb, ${value} 30%, black 70%)`;\n styles[\"--p-10\"] = `color-mix(in srgb, ${value} 20%, black 80%)`;\n styles[\"--p-5\"] = `color-mix(in srgb, ${value} 10%, black 90%)`;\n styles[\"--p-0\"] = \"#000000\";\n break;\n }\n\n case \"font\": {\n styles[\"--font-family\"] = String(value);\n styles[\"--font-family-flex\"] = String(value);\n break;\n }\n }\n }\n return styles;\n }, [surface?.styles]);\n\n // No surface yet\n if (!surface || !surface.componentTree) {\n return <>{fallback}</>;\n }\n\n // Use provided fallback or default memoized component\n const actualLoadingFallback = loadingFallback ?? <DefaultLoadingFallback />;\n\n return (\n <div\n className={cn(\"a2ui-surface\", className)}\n style={surfaceStyles}\n data-surface-id={surfaceId}\n data-version={version}\n >\n <Suspense fallback={actualLoadingFallback}>\n <ComponentNode\n node={surface.componentTree}\n surfaceId={surfaceId}\n registry={registry}\n />\n </Suspense>\n </div>\n );\n});\n\nexport default A2UIRenderer;\n"],"mappings":";;;;;;;;;AAOA,MAAM,yCAA8B,SAAS,yBAAyB;AACpE,QACE,2CAAC;EAAI,WAAU;EAAe,OAAO;GAAE,SAAS;GAAQ,SAAS;GAAK;YAAE;GAElE;EAER;;;;;;;;;;;;;;;;;;;;AAkCF,MAAa,+BAAoB,SAAS,aAAa,EACrD,WACA,WACA,WAAW,MACX,iBACA,YACoB;CACpB,MAAM,EAAE,YAAY,YAAYA,yBAAS;CAGzC,MAAM,UAAU,WAAW,UAAU;CAIrC,MAAM,yCAAmD;AACvD,MAAI,CAAC,SAAS,OAAQ,QAAO,EAAE;EAE/B,MAAM,SAAuD,EAAE;AAE/D,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,OAAO,CACvD,SAAQ,KAAR;GAIE,KAAK;AACH,WAAO,aAAa;AACpB,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,OAAO,MAAM;AAChC,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,WAAW,sBAAsB,MAAM;AAC9C,WAAO,WAAW;AAClB;GAGF,KAAK;AACH,WAAO,mBAAmB,OAAO,MAAM;AACvC,WAAO,wBAAwB,OAAO,MAAM;AAC5C;;AAIN,SAAO;IACN,CAAC,SAAS,OAAO,CAAC;AAGrB,KAAI,CAAC,WAAW,CAAC,QAAQ,cACvB,QAAO,mFAAG,WAAY;CAIxB,MAAM,wBAAwB,mBAAmB,2CAAC,2BAAyB;AAE3E,QACE,2CAAC;EACC,WAAWC,iBAAG,gBAAgB,UAAU;EACxC,OAAO;EACP,mBAAiB;EACjB,gBAAc;YAEd,2CAACC;GAAS,UAAU;aAClB,2CAACC;IACC,MAAM,QAAQ;IACH;IACD;KACV;IACO;GACP;EAER"}
@@ -0,0 +1,92 @@
1
+ import { useA2UI } from "../hooks/useA2UI.mjs";
2
+ import ComponentNode from "./ComponentNode.mjs";
3
+ import { cn } from "../lib/utils.mjs";
4
+ import { Suspense, memo, useMemo } from "react";
5
+ import { Fragment, jsx } from "react/jsx-runtime";
6
+
7
+ //#region src/react-renderer/core/A2UIRenderer.tsx
8
+ /** Default loading fallback - memoized to prevent recreation */
9
+ const DefaultLoadingFallback = memo(function DefaultLoadingFallback() {
10
+ return /* @__PURE__ */ jsx("div", {
11
+ className: "a2ui-loading",
12
+ style: {
13
+ padding: "16px",
14
+ opacity: .5
15
+ },
16
+ children: "Loading..."
17
+ });
18
+ });
19
+ /**
20
+ * A2UIRenderer - renders an A2UI surface.
21
+ *
22
+ * This is the main entry point for rendering A2UI content in your React app.
23
+ * It reads the surface state from the A2UI store and renders the component tree.
24
+ *
25
+ * Memoized to prevent unnecessary re-renders when props haven't changed.
26
+ *
27
+ * @example
28
+ * ```tsx
29
+ * function App() {
30
+ * return (
31
+ * <A2UIProvider onAction={handleAction}>
32
+ * <A2UIRenderer surfaceId="main" />
33
+ * </A2UIProvider>
34
+ * );
35
+ * }
36
+ * ```
37
+ */
38
+ const A2UIRenderer = memo(function A2UIRenderer({ surfaceId, className, fallback = null, loadingFallback, registry }) {
39
+ const { getSurface, version } = useA2UI();
40
+ const surface = getSurface(surfaceId);
41
+ const surfaceStyles = useMemo(() => {
42
+ if (!surface?.styles) return {};
43
+ const styles = {};
44
+ for (const [key, value] of Object.entries(surface.styles)) switch (key) {
45
+ case "primaryColor":
46
+ styles["--p-100"] = "#ffffff";
47
+ styles["--p-99"] = `color-mix(in srgb, ${value} 2%, white 98%)`;
48
+ styles["--p-98"] = `color-mix(in srgb, ${value} 4%, white 96%)`;
49
+ styles["--p-95"] = `color-mix(in srgb, ${value} 10%, white 90%)`;
50
+ styles["--p-90"] = `color-mix(in srgb, ${value} 20%, white 80%)`;
51
+ styles["--p-80"] = `color-mix(in srgb, ${value} 40%, white 60%)`;
52
+ styles["--p-70"] = `color-mix(in srgb, ${value} 60%, white 40%)`;
53
+ styles["--p-60"] = `color-mix(in srgb, ${value} 80%, white 20%)`;
54
+ styles["--p-50"] = String(value);
55
+ styles["--p-40"] = `color-mix(in srgb, ${value} 80%, black 20%)`;
56
+ styles["--p-35"] = `color-mix(in srgb, ${value} 70%, black 30%)`;
57
+ styles["--p-30"] = `color-mix(in srgb, ${value} 60%, black 40%)`;
58
+ styles["--p-25"] = `color-mix(in srgb, ${value} 50%, black 50%)`;
59
+ styles["--p-20"] = `color-mix(in srgb, ${value} 40%, black 60%)`;
60
+ styles["--p-15"] = `color-mix(in srgb, ${value} 30%, black 70%)`;
61
+ styles["--p-10"] = `color-mix(in srgb, ${value} 20%, black 80%)`;
62
+ styles["--p-5"] = `color-mix(in srgb, ${value} 10%, black 90%)`;
63
+ styles["--p-0"] = "#000000";
64
+ break;
65
+ case "font":
66
+ styles["--font-family"] = String(value);
67
+ styles["--font-family-flex"] = String(value);
68
+ break;
69
+ }
70
+ return styles;
71
+ }, [surface?.styles]);
72
+ if (!surface || !surface.componentTree) return /* @__PURE__ */ jsx(Fragment, { children: fallback });
73
+ const actualLoadingFallback = loadingFallback ?? /* @__PURE__ */ jsx(DefaultLoadingFallback, {});
74
+ return /* @__PURE__ */ jsx("div", {
75
+ className: cn("a2ui-surface", className),
76
+ style: surfaceStyles,
77
+ "data-surface-id": surfaceId,
78
+ "data-version": version,
79
+ children: /* @__PURE__ */ jsx(Suspense, {
80
+ fallback: actualLoadingFallback,
81
+ children: /* @__PURE__ */ jsx(ComponentNode, {
82
+ node: surface.componentTree,
83
+ surfaceId,
84
+ registry
85
+ })
86
+ })
87
+ });
88
+ });
89
+
90
+ //#endregion
91
+ export { A2UIRenderer as default };
92
+ //# sourceMappingURL=A2UIRenderer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"A2UIRenderer.mjs","names":[],"sources":["../../../src/react-renderer/core/A2UIRenderer.tsx"],"sourcesContent":["import { Suspense, useMemo, memo, type ReactNode } from \"react\";\nimport { useA2UI } from \"../hooks/useA2UI\";\nimport { ComponentNode } from \"./ComponentNode\";\nimport { type ComponentRegistry } from \"../registry/ComponentRegistry\";\nimport { cn } from \"../lib/utils\";\n\n/** Default loading fallback - memoized to prevent recreation */\nconst DefaultLoadingFallback = memo(function DefaultLoadingFallback() {\n return (\n <div className=\"a2ui-loading\" style={{ padding: \"16px\", opacity: 0.5 }}>\n Loading...\n </div>\n );\n});\n\nexport interface A2UIRendererProps {\n /** The surface ID to render */\n surfaceId: string;\n /** Additional CSS classes for the surface container */\n className?: string;\n /** Fallback content when surface is not yet available */\n fallback?: ReactNode;\n /** Loading fallback for lazy-loaded components */\n loadingFallback?: ReactNode;\n /** Optional custom component registry */\n registry?: ComponentRegistry;\n}\n\n/**\n * A2UIRenderer - renders an A2UI surface.\n *\n * This is the main entry point for rendering A2UI content in your React app.\n * It reads the surface state from the A2UI store and renders the component tree.\n *\n * Memoized to prevent unnecessary re-renders when props haven't changed.\n *\n * @example\n * ```tsx\n * function App() {\n * return (\n * <A2UIProvider onAction={handleAction}>\n * <A2UIRenderer surfaceId=\"main\" />\n * </A2UIProvider>\n * );\n * }\n * ```\n */\nexport const A2UIRenderer = memo(function A2UIRenderer({\n surfaceId,\n className,\n fallback = null,\n loadingFallback,\n registry,\n}: A2UIRendererProps) {\n const { getSurface, version } = useA2UI();\n\n // Get surface - this will re-render when version changes\n const surface = getSurface(surfaceId);\n\n // Memoize surface styles to prevent object recreation\n // Matches Lit renderer's transformation logic in surface.ts\n const surfaceStyles = useMemo<React.CSSProperties>(() => {\n if (!surface?.styles) return {};\n\n const styles: React.CSSProperties & Record<string, string> = {};\n\n for (const [key, value] of Object.entries(surface.styles)) {\n switch (key) {\n // Generate a color palette from the primary color.\n // Values range from 0-100 where 0=black, 100=white, 50=primary color.\n // Uses color-mix to create intermediate values.\n case \"primaryColor\": {\n styles[\"--p-100\"] = \"#ffffff\";\n styles[\"--p-99\"] = `color-mix(in srgb, ${value} 2%, white 98%)`;\n styles[\"--p-98\"] = `color-mix(in srgb, ${value} 4%, white 96%)`;\n styles[\"--p-95\"] = `color-mix(in srgb, ${value} 10%, white 90%)`;\n styles[\"--p-90\"] = `color-mix(in srgb, ${value} 20%, white 80%)`;\n styles[\"--p-80\"] = `color-mix(in srgb, ${value} 40%, white 60%)`;\n styles[\"--p-70\"] = `color-mix(in srgb, ${value} 60%, white 40%)`;\n styles[\"--p-60\"] = `color-mix(in srgb, ${value} 80%, white 20%)`;\n styles[\"--p-50\"] = String(value);\n styles[\"--p-40\"] = `color-mix(in srgb, ${value} 80%, black 20%)`;\n styles[\"--p-35\"] = `color-mix(in srgb, ${value} 70%, black 30%)`;\n styles[\"--p-30\"] = `color-mix(in srgb, ${value} 60%, black 40%)`;\n styles[\"--p-25\"] = `color-mix(in srgb, ${value} 50%, black 50%)`;\n styles[\"--p-20\"] = `color-mix(in srgb, ${value} 40%, black 60%)`;\n styles[\"--p-15\"] = `color-mix(in srgb, ${value} 30%, black 70%)`;\n styles[\"--p-10\"] = `color-mix(in srgb, ${value} 20%, black 80%)`;\n styles[\"--p-5\"] = `color-mix(in srgb, ${value} 10%, black 90%)`;\n styles[\"--p-0\"] = \"#000000\";\n break;\n }\n\n case \"font\": {\n styles[\"--font-family\"] = String(value);\n styles[\"--font-family-flex\"] = String(value);\n break;\n }\n }\n }\n return styles;\n }, [surface?.styles]);\n\n // No surface yet\n if (!surface || !surface.componentTree) {\n return <>{fallback}</>;\n }\n\n // Use provided fallback or default memoized component\n const actualLoadingFallback = loadingFallback ?? <DefaultLoadingFallback />;\n\n return (\n <div\n className={cn(\"a2ui-surface\", className)}\n style={surfaceStyles}\n data-surface-id={surfaceId}\n data-version={version}\n >\n <Suspense fallback={actualLoadingFallback}>\n <ComponentNode\n node={surface.componentTree}\n surfaceId={surfaceId}\n registry={registry}\n />\n </Suspense>\n </div>\n );\n});\n\nexport default A2UIRenderer;\n"],"mappings":";;;;;;;;AAOA,MAAM,yBAAyB,KAAK,SAAS,yBAAyB;AACpE,QACE,oBAAC;EAAI,WAAU;EAAe,OAAO;GAAE,SAAS;GAAQ,SAAS;GAAK;YAAE;GAElE;EAER;;;;;;;;;;;;;;;;;;;;AAkCF,MAAa,eAAe,KAAK,SAAS,aAAa,EACrD,WACA,WACA,WAAW,MACX,iBACA,YACoB;CACpB,MAAM,EAAE,YAAY,YAAY,SAAS;CAGzC,MAAM,UAAU,WAAW,UAAU;CAIrC,MAAM,gBAAgB,cAAmC;AACvD,MAAI,CAAC,SAAS,OAAQ,QAAO,EAAE;EAE/B,MAAM,SAAuD,EAAE;AAE/D,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,OAAO,CACvD,SAAQ,KAAR;GAIE,KAAK;AACH,WAAO,aAAa;AACpB,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,OAAO,MAAM;AAChC,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,YAAY,sBAAsB,MAAM;AAC/C,WAAO,WAAW,sBAAsB,MAAM;AAC9C,WAAO,WAAW;AAClB;GAGF,KAAK;AACH,WAAO,mBAAmB,OAAO,MAAM;AACvC,WAAO,wBAAwB,OAAO,MAAM;AAC5C;;AAIN,SAAO;IACN,CAAC,SAAS,OAAO,CAAC;AAGrB,KAAI,CAAC,WAAW,CAAC,QAAQ,cACvB,QAAO,0CAAG,WAAY;CAIxB,MAAM,wBAAwB,mBAAmB,oBAAC,2BAAyB;AAE3E,QACE,oBAAC;EACC,WAAW,GAAG,gBAAgB,UAAU;EACxC,OAAO;EACP,mBAAiB;EACjB,gBAAc;YAEd,oBAAC;GAAS,UAAU;aAClB,oBAAC;IACC,MAAM,QAAQ;IACH;IACD;KACV;IACO;GACP;EAER"}
@@ -0,0 +1,53 @@
1
+ const require_runtime = require('../../_virtual/_rolldown/runtime.cjs');
2
+ const require_ComponentRegistry = require('../registry/ComponentRegistry.cjs');
3
+ let react = require("react");
4
+ let react_jsx_runtime = require("react/jsx-runtime");
5
+
6
+ //#region src/react-renderer/core/ComponentNode.tsx
7
+ /** Memoized loading fallback to avoid recreating on each render */
8
+ const LoadingFallback = (0, react.memo)(function LoadingFallback() {
9
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
10
+ className: "a2ui-loading",
11
+ style: {
12
+ padding: "8px",
13
+ opacity: .5
14
+ },
15
+ children: "Loading..."
16
+ });
17
+ });
18
+ /**
19
+ * ComponentNode - dynamically renders an A2UI component based on its type.
20
+ *
21
+ * Looks up the component in the registry and renders it with the appropriate props.
22
+ * Supports lazy-loaded components via React.Suspense.
23
+ *
24
+ * No wrapper div is rendered - the component's root div (e.g., .a2ui-image) is the
25
+ * direct flex child, exactly matching Lit's structure where the :host element IS
26
+ * the flex item. Each component handles --weight CSS variable on its root div.
27
+ *
28
+ * Memoized to prevent unnecessary re-renders when parent updates but node hasn't changed.
29
+ */
30
+ const ComponentNode = (0, react.memo)(function ComponentNode({ node, surfaceId, registry }) {
31
+ const actualRegistry = registry ?? require_ComponentRegistry.ComponentRegistry.getInstance();
32
+ const nodeType = node && typeof node === "object" && "type" in node ? node.type : null;
33
+ const Component = (0, react.useMemo)(() => nodeType ? actualRegistry.get(nodeType) : null, [actualRegistry, nodeType]);
34
+ if (!nodeType) {
35
+ if (node) console.warn("[A2UI] Invalid component node (not resolved?):", node);
36
+ return null;
37
+ }
38
+ if (!Component) {
39
+ console.warn(`[A2UI] Unknown component type: ${nodeType}`);
40
+ return null;
41
+ }
42
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react.Suspense, {
43
+ fallback: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(LoadingFallback, {}),
44
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Component, {
45
+ node,
46
+ surfaceId
47
+ })
48
+ });
49
+ });
50
+
51
+ //#endregion
52
+ exports.default = ComponentNode;
53
+ //# sourceMappingURL=ComponentNode.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComponentNode.cjs","names":["ComponentRegistry","Suspense"],"sources":["../../../src/react-renderer/core/ComponentNode.tsx"],"sourcesContent":["import { Suspense, useMemo, memo } from \"react\";\nimport type { Types } from \"@a2ui/lit/0.8\";\nimport { ComponentRegistry } from \"../registry/ComponentRegistry\";\n\n/** Memoized loading fallback to avoid recreating on each render */\nconst LoadingFallback = memo(function LoadingFallback() {\n return (\n <div className=\"a2ui-loading\" style={{ padding: \"8px\", opacity: 0.5 }}>\n Loading...\n </div>\n );\n});\n\ninterface ComponentNodeProps {\n /** The component node to render (can be null/undefined for safety) */\n node: Types.AnyComponentNode | null | undefined;\n /** The surface ID this component belongs to */\n surfaceId: string;\n /** Optional custom registry. Falls back to singleton. */\n registry?: ComponentRegistry;\n}\n\n/**\n * ComponentNode - dynamically renders an A2UI component based on its type.\n *\n * Looks up the component in the registry and renders it with the appropriate props.\n * Supports lazy-loaded components via React.Suspense.\n *\n * No wrapper div is rendered - the component's root div (e.g., .a2ui-image) is the\n * direct flex child, exactly matching Lit's structure where the :host element IS\n * the flex item. Each component handles --weight CSS variable on its root div.\n *\n * Memoized to prevent unnecessary re-renders when parent updates but node hasn't changed.\n */\nexport const ComponentNode = memo(function ComponentNode({\n node,\n surfaceId,\n registry,\n}: ComponentNodeProps) {\n const actualRegistry = registry ?? ComponentRegistry.getInstance();\n\n // useMemo must be called unconditionally (Rules of Hooks)\n // We handle invalid nodes by returning null component type\n const nodeType =\n node && typeof node === \"object\" && \"type\" in node ? node.type : null;\n\n const Component = useMemo(\n () => (nodeType ? actualRegistry.get(nodeType) : null),\n [actualRegistry, nodeType],\n );\n\n // Handle null/undefined/invalid nodes gracefully\n if (!nodeType) {\n if (node) {\n console.warn(\"[A2UI] Invalid component node (not resolved?):\", node);\n }\n return null;\n }\n\n if (!Component) {\n console.warn(`[A2UI] Unknown component type: ${nodeType}`);\n return null;\n }\n\n // No wrapper div - component's root div is the :host equivalent\n // Suspense doesn't add DOM elements, preserving the correct hierarchy\n // Type assertion is safe: we've already validated node is valid (nodeType check above)\n return (\n <Suspense fallback={<LoadingFallback />}>\n <Component node={node as Types.AnyComponentNode} surfaceId={surfaceId} />\n </Suspense>\n );\n});\n\nexport default ComponentNode;\n"],"mappings":";;;;;;;AAKA,MAAM,kCAAuB,SAAS,kBAAkB;AACtD,QACE,2CAAC;EAAI,WAAU;EAAe,OAAO;GAAE,SAAS;GAAO,SAAS;GAAK;YAAE;GAEjE;EAER;;;;;;;;;;;;;AAuBF,MAAa,gCAAqB,SAAS,cAAc,EACvD,MACA,WACA,YACqB;CACrB,MAAM,iBAAiB,YAAYA,4CAAkB,aAAa;CAIlE,MAAM,WACJ,QAAQ,OAAO,SAAS,YAAY,UAAU,OAAO,KAAK,OAAO;CAEnE,MAAM,qCACG,WAAW,eAAe,IAAI,SAAS,GAAG,MACjD,CAAC,gBAAgB,SAAS,CAC3B;AAGD,KAAI,CAAC,UAAU;AACb,MAAI,KACF,SAAQ,KAAK,kDAAkD,KAAK;AAEtE,SAAO;;AAGT,KAAI,CAAC,WAAW;AACd,UAAQ,KAAK,kCAAkC,WAAW;AAC1D,SAAO;;AAMT,QACE,2CAACC;EAAS,UAAU,2CAAC,oBAAkB;YACrC,2CAAC;GAAgB;GAA2C;IAAa;GAChE;EAEb"}