@elabs-ai/components-ai 4.2.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (462) hide show
  1. package/README.md +1 -1
  2. package/dist/{_audio-player-media-chrome-T3XVXWRZ.js → _audio-player-media-chrome.js} +1 -1
  3. package/dist/_code-block-theme.js +12 -0
  4. package/dist/_code-block-theme.js.map +1 -0
  5. package/dist/{_flow-boundary-SHNWLQG5.js → _flow-boundary.js} +1 -1
  6. package/dist/_flow-boundary.js.map +1 -0
  7. package/dist/_flow-lazy.js +8 -0
  8. package/dist/_flow-lazy.js.map +1 -0
  9. package/dist/_lazy-boundary-conformance.js +2 -0
  10. package/dist/_lazy-boundary-conformance.js.map +1 -0
  11. package/dist/_lazy-cjk.js +13 -0
  12. package/dist/_lazy-cjk.js.map +1 -0
  13. package/dist/_lazy-engine-boundary.js +9 -0
  14. package/dist/_lazy-engine-boundary.js.map +1 -0
  15. package/dist/_lazy-math.js +13 -0
  16. package/dist/_lazy-math.js.map +1 -0
  17. package/dist/_lazy-mermaid.js +12 -0
  18. package/dist/_lazy-mermaid.js.map +1 -0
  19. package/dist/_mermaid-error-panel.js +9 -0
  20. package/dist/_mermaid-error-panel.js.map +1 -0
  21. package/dist/{_persona-rive-JEG44YHX.js → _persona-rive.js} +19 -24
  22. package/dist/_persona-rive.js.map +1 -0
  23. package/dist/_streamdown-i18n.js +21 -0
  24. package/dist/_streamdown-i18n.js.map +1 -0
  25. package/dist/_streamdown-safety.js +10 -0
  26. package/dist/_streamdown-safety.js.map +1 -0
  27. package/dist/_theme-scope-store.js +13 -0
  28. package/dist/_theme-scope-store.js.map +1 -0
  29. package/dist/a2ui/a2ui-surface.js +17 -0
  30. package/dist/a2ui/a2ui-surface.js.map +1 -0
  31. package/dist/a2ui/core/catalog.generated.js +10 -0
  32. package/dist/a2ui/core/catalog.generated.js.map +1 -0
  33. package/dist/a2ui/core/complete-json.js +10 -0
  34. package/dist/a2ui/core/complete-json.js.map +1 -0
  35. package/dist/a2ui/core/index.js +37 -0
  36. package/dist/a2ui/core/index.js.map +1 -0
  37. package/dist/a2ui/core/schema.js +11 -0
  38. package/dist/a2ui/core/schema.js.map +1 -0
  39. package/dist/a2ui/core/spec.js +10 -0
  40. package/dist/a2ui/core/spec.js.map +1 -0
  41. package/dist/a2ui/core/validate.js +16 -0
  42. package/dist/a2ui/core/validate.js.map +1 -0
  43. package/dist/a2ui/index.js +54 -0
  44. package/dist/a2ui/index.js.map +1 -0
  45. package/dist/a2ui/ui-catalog.js +18 -0
  46. package/dist/a2ui/ui-catalog.js.map +1 -0
  47. package/dist/agent-event.js +10 -0
  48. package/dist/agent-event.js.map +1 -0
  49. package/dist/agent-timeline.js +11 -0
  50. package/dist/agent-timeline.js.map +1 -0
  51. package/dist/agent.js +25 -0
  52. package/dist/agent.js.map +1 -0
  53. package/dist/artifact.js +23 -0
  54. package/dist/artifact.js.map +1 -0
  55. package/dist/asset-preview.js +22 -0
  56. package/dist/asset-preview.js.map +1 -0
  57. package/dist/attachments.js +33 -0
  58. package/dist/attachments.js.map +1 -0
  59. package/dist/audio-player.js +30 -0
  60. package/dist/audio-player.js.map +1 -0
  61. package/dist/audio-visualizer.js +9 -0
  62. package/dist/audio-visualizer.js.map +1 -0
  63. package/dist/canvas.js +10 -0
  64. package/dist/canvas.js.map +1 -0
  65. package/dist/chain-of-thought.js +22 -0
  66. package/dist/chain-of-thought.js.map +1 -0
  67. package/dist/chat-greeting.js +8 -0
  68. package/dist/chat-greeting.js.map +1 -0
  69. package/dist/chat-shell.js +9 -0
  70. package/dist/chat-shell.js.map +1 -0
  71. package/dist/checkpoint.js +13 -0
  72. package/dist/checkpoint.js.map +1 -0
  73. package/dist/chunk-2XOIG5TG.js +72 -0
  74. package/dist/chunk-2XOIG5TG.js.map +1 -0
  75. package/dist/chunk-34CQ2VHM.js +172 -0
  76. package/dist/chunk-34CQ2VHM.js.map +1 -0
  77. package/dist/chunk-3TDHPXZZ.js +60 -0
  78. package/dist/chunk-3TDHPXZZ.js.map +1 -0
  79. package/dist/chunk-3XNPMDZY.js +478 -0
  80. package/dist/chunk-3XNPMDZY.js.map +1 -0
  81. package/dist/chunk-3YPT3V7L.js +56 -0
  82. package/dist/chunk-3YPT3V7L.js.map +1 -0
  83. package/dist/chunk-475UEU2Q.js +87 -0
  84. package/dist/chunk-475UEU2Q.js.map +1 -0
  85. package/dist/chunk-4CBTII2I.js +95 -0
  86. package/dist/chunk-4CBTII2I.js.map +1 -0
  87. package/dist/chunk-4XRNIZMG.js +22 -0
  88. package/dist/chunk-4XRNIZMG.js.map +1 -0
  89. package/dist/chunk-5NNWUKK5.js +2 -0
  90. package/dist/chunk-5NNWUKK5.js.map +1 -0
  91. package/dist/chunk-5UOMU27Z.js +164 -0
  92. package/dist/chunk-5UOMU27Z.js.map +1 -0
  93. package/dist/chunk-5VGYZ62I.js +264 -0
  94. package/dist/chunk-5VGYZ62I.js.map +1 -0
  95. package/dist/chunk-6IQPH2OS.js +21 -0
  96. package/dist/chunk-6IQPH2OS.js.map +1 -0
  97. package/dist/chunk-6PB2MXCI.js +482 -0
  98. package/dist/chunk-6PB2MXCI.js.map +1 -0
  99. package/dist/chunk-7FD5CZEU.js +215 -0
  100. package/dist/chunk-7FD5CZEU.js.map +1 -0
  101. package/dist/chunk-7RL6KZDF.js +266 -0
  102. package/dist/chunk-7RL6KZDF.js.map +1 -0
  103. package/dist/chunk-ADOYAGGK.js +482 -0
  104. package/dist/chunk-ADOYAGGK.js.map +1 -0
  105. package/dist/chunk-AXMNJMMH.js +984 -0
  106. package/dist/chunk-AXMNJMMH.js.map +1 -0
  107. package/dist/chunk-BA3AEMOU.js +21 -0
  108. package/dist/chunk-BA3AEMOU.js.map +1 -0
  109. package/dist/chunk-BBHFOYML.js +336 -0
  110. package/dist/chunk-BBHFOYML.js.map +1 -0
  111. package/dist/chunk-BHUVISIY.js +221 -0
  112. package/dist/chunk-BHUVISIY.js.map +1 -0
  113. package/dist/chunk-BM2LWERA.js +100 -0
  114. package/dist/chunk-BM2LWERA.js.map +1 -0
  115. package/dist/chunk-CMOYXNPJ.js +211 -0
  116. package/dist/chunk-CMOYXNPJ.js.map +1 -0
  117. package/dist/chunk-CZP3RHC4.js +74 -0
  118. package/dist/chunk-CZP3RHC4.js.map +1 -0
  119. package/dist/chunk-DDG5JHQT.js +112 -0
  120. package/dist/chunk-DDG5JHQT.js.map +1 -0
  121. package/dist/chunk-DJODXO7I.js +38 -0
  122. package/dist/chunk-DJODXO7I.js.map +1 -0
  123. package/dist/chunk-DWJDJLPU.js +192 -0
  124. package/dist/chunk-DWJDJLPU.js.map +1 -0
  125. package/dist/chunk-DZW6LM22.js +45 -0
  126. package/dist/chunk-DZW6LM22.js.map +1 -0
  127. package/dist/chunk-ELGCZLZF.js +305 -0
  128. package/dist/chunk-ELGCZLZF.js.map +1 -0
  129. package/dist/chunk-EV3U6ZZB.js +209 -0
  130. package/dist/chunk-EV3U6ZZB.js.map +1 -0
  131. package/dist/chunk-EY7LVUKQ.js +87 -0
  132. package/dist/chunk-EY7LVUKQ.js.map +1 -0
  133. package/dist/chunk-F4C74F7M.js +230 -0
  134. package/dist/chunk-F4C74F7M.js.map +1 -0
  135. package/dist/chunk-FERYDFZA.js +108 -0
  136. package/dist/chunk-FERYDFZA.js.map +1 -0
  137. package/dist/chunk-FUIYG2DS.js +166 -0
  138. package/dist/chunk-FUIYG2DS.js.map +1 -0
  139. package/dist/chunk-GKYZT3LA.js +136 -0
  140. package/dist/chunk-GKYZT3LA.js.map +1 -0
  141. package/dist/chunk-H42LRUQ4.js +102 -0
  142. package/dist/chunk-H42LRUQ4.js.map +1 -0
  143. package/dist/chunk-HVXM2G5F.js +222 -0
  144. package/dist/chunk-HVXM2G5F.js.map +1 -0
  145. package/dist/chunk-I4RDAGVY.js +53 -0
  146. package/dist/chunk-I4RDAGVY.js.map +1 -0
  147. package/dist/chunk-IQJG4IDX.js +208 -0
  148. package/dist/chunk-IQJG4IDX.js.map +1 -0
  149. package/dist/chunk-IX2PXG4Y.js +144 -0
  150. package/dist/chunk-IX2PXG4Y.js.map +1 -0
  151. package/dist/chunk-IXICSOOP.js +287 -0
  152. package/dist/chunk-IXICSOOP.js.map +1 -0
  153. package/dist/chunk-JY5HSN4D.js +84 -0
  154. package/dist/chunk-JY5HSN4D.js.map +1 -0
  155. package/dist/chunk-LMNSBOBG.js +19 -0
  156. package/dist/chunk-LMNSBOBG.js.map +1 -0
  157. package/dist/chunk-MBI7D6IL.js +42 -0
  158. package/dist/chunk-MBI7D6IL.js.map +1 -0
  159. package/dist/chunk-MLFMYCPH.js +192 -0
  160. package/dist/chunk-MLFMYCPH.js.map +1 -0
  161. package/dist/chunk-MOK66734.js +33 -0
  162. package/dist/chunk-MOK66734.js.map +1 -0
  163. package/dist/chunk-MXTAWPYM.js +196 -0
  164. package/dist/chunk-MXTAWPYM.js.map +1 -0
  165. package/dist/chunk-NCL2UZKI.js +96 -0
  166. package/dist/chunk-NCL2UZKI.js.map +1 -0
  167. package/dist/chunk-NET4YLRY.js +107 -0
  168. package/dist/chunk-NET4YLRY.js.map +1 -0
  169. package/dist/chunk-NIG67CFM.js +329 -0
  170. package/dist/chunk-NIG67CFM.js.map +1 -0
  171. package/dist/chunk-NMVNNO3L.js +10 -0
  172. package/dist/chunk-NMVNNO3L.js.map +1 -0
  173. package/dist/chunk-NP7VID4K.js +2 -0
  174. package/dist/chunk-NP7VID4K.js.map +1 -0
  175. package/dist/chunk-NPUCMAG2.js +382 -0
  176. package/dist/chunk-NPUCMAG2.js.map +1 -0
  177. package/dist/chunk-NSCLRHES.js +102 -0
  178. package/dist/chunk-NSCLRHES.js.map +1 -0
  179. package/dist/chunk-OEUXHVFW.js +86 -0
  180. package/dist/chunk-OEUXHVFW.js.map +1 -0
  181. package/dist/chunk-ONBHFIMZ.js +137 -0
  182. package/dist/chunk-ONBHFIMZ.js.map +1 -0
  183. package/dist/chunk-OPH2HHL2.js +228 -0
  184. package/dist/chunk-OPH2HHL2.js.map +1 -0
  185. package/dist/chunk-OQERHIQP.js +287 -0
  186. package/dist/chunk-OQERHIQP.js.map +1 -0
  187. package/dist/chunk-P6YJAZFG.js +103 -0
  188. package/dist/chunk-P6YJAZFG.js.map +1 -0
  189. package/dist/chunk-PG7ERDOD.js +65 -0
  190. package/dist/chunk-PG7ERDOD.js.map +1 -0
  191. package/dist/chunk-PIB5JBMA.js +90 -0
  192. package/dist/chunk-PIB5JBMA.js.map +1 -0
  193. package/dist/chunk-PQ5BPIWQ.js +22 -0
  194. package/dist/chunk-PQ5BPIWQ.js.map +1 -0
  195. package/dist/chunk-PQBF6ZIQ.js +55 -0
  196. package/dist/chunk-PQBF6ZIQ.js.map +1 -0
  197. package/dist/chunk-PTWCTSZL.js +173 -0
  198. package/dist/chunk-PTWCTSZL.js.map +1 -0
  199. package/dist/chunk-QJUNPVOS.js +101 -0
  200. package/dist/chunk-QJUNPVOS.js.map +1 -0
  201. package/dist/chunk-QUDZOTRV.js +43 -0
  202. package/dist/chunk-QUDZOTRV.js.map +1 -0
  203. package/dist/chunk-RB7G65JC.js +213 -0
  204. package/dist/chunk-RB7G65JC.js.map +1 -0
  205. package/dist/chunk-RPHAOR7P.js +45 -0
  206. package/dist/chunk-RPHAOR7P.js.map +1 -0
  207. package/dist/chunk-RTCSH2AN.js +331 -0
  208. package/dist/chunk-RTCSH2AN.js.map +1 -0
  209. package/dist/chunk-S3ISPW3A.js +28 -0
  210. package/dist/chunk-S3ISPW3A.js.map +1 -0
  211. package/dist/chunk-SEVN656N.js +36 -0
  212. package/dist/chunk-SEVN656N.js.map +1 -0
  213. package/dist/chunk-SKVG672B.js +64 -0
  214. package/dist/chunk-SKVG672B.js.map +1 -0
  215. package/dist/chunk-SPQIU7GA.js +236 -0
  216. package/dist/chunk-SPQIU7GA.js.map +1 -0
  217. package/dist/chunk-SSGJ6MEM.js +1076 -0
  218. package/dist/chunk-SSGJ6MEM.js.map +1 -0
  219. package/dist/chunk-SSKZ2AED.js +118 -0
  220. package/dist/chunk-SSKZ2AED.js.map +1 -0
  221. package/dist/chunk-T56JFGXI.js +561 -0
  222. package/dist/chunk-T56JFGXI.js.map +1 -0
  223. package/dist/chunk-TCB6O74A.js +137 -0
  224. package/dist/chunk-TCB6O74A.js.map +1 -0
  225. package/dist/chunk-TTEYPO6X.js +57 -0
  226. package/dist/chunk-TTEYPO6X.js.map +1 -0
  227. package/dist/chunk-TWPHAJNM.js +462 -0
  228. package/dist/chunk-TWPHAJNM.js.map +1 -0
  229. package/dist/chunk-TXJJLP4O.js +336 -0
  230. package/dist/chunk-TXJJLP4O.js.map +1 -0
  231. package/dist/chunk-TZ6TB7VM.js +245 -0
  232. package/dist/chunk-TZ6TB7VM.js.map +1 -0
  233. package/dist/chunk-UBLKJJ7K.js +278 -0
  234. package/dist/chunk-UBLKJJ7K.js.map +1 -0
  235. package/dist/chunk-UCJ6IUFS.js +52 -0
  236. package/dist/chunk-UCJ6IUFS.js.map +1 -0
  237. package/dist/chunk-UCKFJ3QF.js +197 -0
  238. package/dist/chunk-UCKFJ3QF.js.map +1 -0
  239. package/dist/chunk-UPXSLILN.js +20 -0
  240. package/dist/chunk-UPXSLILN.js.map +1 -0
  241. package/dist/chunk-V4DORGWJ.js +92 -0
  242. package/dist/chunk-V4DORGWJ.js.map +1 -0
  243. package/dist/chunk-V6E5DYZD.js +80 -0
  244. package/dist/chunk-V6E5DYZD.js.map +1 -0
  245. package/dist/chunk-VLLYKF3P.js +96 -0
  246. package/dist/chunk-VLLYKF3P.js.map +1 -0
  247. package/dist/chunk-VLNBTOH6.js +43 -0
  248. package/dist/chunk-VLNBTOH6.js.map +1 -0
  249. package/dist/chunk-WMDSMSPL.js +303 -0
  250. package/dist/chunk-WMDSMSPL.js.map +1 -0
  251. package/dist/chunk-WU5BLGTF.js +149 -0
  252. package/dist/chunk-WU5BLGTF.js.map +1 -0
  253. package/dist/chunk-WYTZVSGK.js +245 -0
  254. package/dist/chunk-WYTZVSGK.js.map +1 -0
  255. package/dist/chunk-X47QMM6K.js +187 -0
  256. package/dist/chunk-X47QMM6K.js.map +1 -0
  257. package/dist/chunk-XNBKO32Y.js +174 -0
  258. package/dist/chunk-XNBKO32Y.js.map +1 -0
  259. package/dist/chunk-YHUSW7D2.js +40 -0
  260. package/dist/chunk-YHUSW7D2.js.map +1 -0
  261. package/dist/chunk-YSKD7UXX.js +126 -0
  262. package/dist/chunk-YSKD7UXX.js.map +1 -0
  263. package/dist/chunk-YYRDGWOU.js +72 -0
  264. package/dist/chunk-YYRDGWOU.js.map +1 -0
  265. package/dist/chunk-ZIGZMWM7.js +19 -0
  266. package/dist/chunk-ZIGZMWM7.js.map +1 -0
  267. package/dist/chunk-ZKRTUKNP.js +40 -0
  268. package/dist/chunk-ZKRTUKNP.js.map +1 -0
  269. package/dist/code-block.js +38 -0
  270. package/dist/code-block.js.map +1 -0
  271. package/dist/commit.js +51 -0
  272. package/dist/commit.js.map +1 -0
  273. package/dist/composer.js +15 -0
  274. package/dist/composer.js.map +1 -0
  275. package/dist/confirmation.js +53 -0
  276. package/dist/confirmation.js.map +1 -0
  277. package/dist/connection.js +8 -0
  278. package/dist/connection.js.map +1 -0
  279. package/dist/context-panel.js +25 -0
  280. package/dist/context-panel.js.map +1 -0
  281. package/dist/controls.js +10 -0
  282. package/dist/controls.js.map +1 -0
  283. package/dist/conversation.js +19 -0
  284. package/dist/conversation.js.map +1 -0
  285. package/dist/diff-view.js +15 -0
  286. package/dist/diff-view.js.map +1 -0
  287. package/dist/edge.js +10 -0
  288. package/dist/edge.js.map +1 -0
  289. package/dist/environment-variables.js +29 -0
  290. package/dist/environment-variables.js.map +1 -0
  291. package/dist/file-tree.js +23 -0
  292. package/dist/file-tree.js.map +1 -0
  293. package/dist/gallery.js +9 -0
  294. package/dist/gallery.js.map +1 -0
  295. package/dist/grouped-parts.js +21 -0
  296. package/dist/grouped-parts.js.map +1 -0
  297. package/dist/image.js +9 -0
  298. package/dist/image.js.map +1 -0
  299. package/dist/index.d.ts +366 -98
  300. package/dist/index.js +672 -13577
  301. package/dist/index.js.map +1 -1
  302. package/dist/inline-citation.js +39 -0
  303. package/dist/inline-citation.js.map +1 -0
  304. package/dist/jsx-preview.js +17 -0
  305. package/dist/jsx-preview.js.map +1 -0
  306. package/dist/markdown-view.js +17 -0
  307. package/dist/markdown-view.js.map +1 -0
  308. package/dist/message-compare.js +12 -0
  309. package/dist/message-compare.js.map +1 -0
  310. package/dist/message-edit.js +19 -0
  311. package/dist/message-edit.js.map +1 -0
  312. package/dist/message-feedback.js +11 -0
  313. package/dist/message-feedback.js.map +1 -0
  314. package/dist/message-form-spec.js +38 -0
  315. package/dist/message-form-spec.js.map +1 -0
  316. package/dist/message-form.js +26 -0
  317. package/dist/message-form.js.map +1 -0
  318. package/dist/message-table-spec.js +26 -0
  319. package/dist/message-table-spec.js.map +1 -0
  320. package/dist/message-table.js +12 -0
  321. package/dist/message-table.js.map +1 -0
  322. package/dist/message.js +51 -0
  323. package/dist/message.js.map +1 -0
  324. package/dist/mic-selector.js +27 -0
  325. package/dist/mic-selector.js.map +1 -0
  326. package/dist/model-provider-logo.js +13 -0
  327. package/dist/model-provider-logo.js.map +1 -0
  328. package/dist/motion-config.js +9 -0
  329. package/dist/motion-config.js.map +1 -0
  330. package/dist/node.js +22 -0
  331. package/dist/node.js.map +1 -0
  332. package/dist/open-in-chat.js +31 -0
  333. package/dist/open-in-chat.js.map +1 -0
  334. package/dist/package-info.js +25 -0
  335. package/dist/package-info.js.map +1 -0
  336. package/dist/panel.js +10 -0
  337. package/dist/panel.js.map +1 -0
  338. package/dist/part-groups.js +18 -0
  339. package/dist/part-groups.js.map +1 -0
  340. package/dist/permission-mode-select.js +9 -0
  341. package/dist/permission-mode-select.js.map +1 -0
  342. package/dist/persona-sources.js +8 -0
  343. package/dist/persona-sources.js.map +1 -0
  344. package/dist/persona.js +14 -0
  345. package/dist/persona.js.map +1 -0
  346. package/dist/plan.js +32 -0
  347. package/dist/plan.js.map +1 -0
  348. package/dist/prompt-input-effort.js +9 -0
  349. package/dist/prompt-input-effort.js.map +1 -0
  350. package/dist/prompt-input-mode.js +10 -0
  351. package/dist/prompt-input-mode.js.map +1 -0
  352. package/dist/prompt-input-slash.js +12 -0
  353. package/dist/prompt-input-slash.js.map +1 -0
  354. package/dist/prompt-input.js +89 -0
  355. package/dist/prompt-input.js.map +1 -0
  356. package/dist/queue.js +37 -0
  357. package/dist/queue.js.map +1 -0
  358. package/dist/reasoning.js +23 -0
  359. package/dist/reasoning.js.map +1 -0
  360. package/dist/sandbox.js +28 -0
  361. package/dist/sandbox.js.map +1 -0
  362. package/dist/schema-display.js +33 -0
  363. package/dist/schema-display.js.map +1 -0
  364. package/dist/selection-toolbar.js +11 -0
  365. package/dist/selection-toolbar.js.map +1 -0
  366. package/dist/session-header.js +9 -0
  367. package/dist/session-header.js.map +1 -0
  368. package/dist/session-status-bar.js +9 -0
  369. package/dist/session-status-bar.js.map +1 -0
  370. package/dist/shimmer.js +9 -0
  371. package/dist/shimmer.js.map +1 -0
  372. package/dist/snippet.js +17 -0
  373. package/dist/snippet.js.map +1 -0
  374. package/dist/sources.js +17 -0
  375. package/dist/sources.js.map +1 -0
  376. package/dist/speech-input.js +9 -0
  377. package/dist/speech-input.js.map +1 -0
  378. package/dist/stack-trace.js +27 -0
  379. package/dist/stack-trace.js.map +1 -0
  380. package/dist/suggestion.js +16 -0
  381. package/dist/suggestion.js.map +1 -0
  382. package/dist/task.js +18 -0
  383. package/dist/task.js.map +1 -0
  384. package/dist/test-results.js +43 -0
  385. package/dist/test-results.js.map +1 -0
  386. package/dist/token-usage.js +27 -0
  387. package/dist/token-usage.js.map +1 -0
  388. package/dist/tool-result-card.js +9 -0
  389. package/dist/tool-result-card.js.map +1 -0
  390. package/dist/tool.js +27 -0
  391. package/dist/tool.js.map +1 -0
  392. package/dist/toolbar.js +10 -0
  393. package/dist/toolbar.js.map +1 -0
  394. package/dist/transcription.js +11 -0
  395. package/dist/transcription.js.map +1 -0
  396. package/dist/turn-status.js +9 -0
  397. package/dist/turn-status.js.map +1 -0
  398. package/dist/use-audio-level.js +9 -0
  399. package/dist/use-audio-level.js.map +1 -0
  400. package/dist/voice-selector.js +47 -0
  401. package/dist/voice-selector.js.map +1 -0
  402. package/dist/web-preview.js +19 -0
  403. package/dist/web-preview.js.map +1 -0
  404. package/package.json +11 -9
  405. package/schemas/a2ui-surface.v1.schema.json +5425 -0
  406. package/src/_chat-shell-rail.tsx +3 -1
  407. package/src/_flow-boundary.tsx +2 -2
  408. package/src/_persona-rive.tsx +27 -41
  409. package/src/a2ui/a2ui-surface.stories.tsx +662 -0
  410. package/src/a2ui/a2ui-surface.test.tsx +201 -0
  411. package/src/a2ui/a2ui-surface.tsx +354 -0
  412. package/src/a2ui/catalog.source.json +772 -0
  413. package/src/a2ui/core/a2ui-core.test.ts +178 -0
  414. package/src/a2ui/core/catalog.generated.ts +1006 -0
  415. package/src/a2ui/core/complete-json.ts +81 -0
  416. package/src/a2ui/core/index.ts +10 -0
  417. package/src/a2ui/core/schema.ts +111 -0
  418. package/src/a2ui/core/spec.ts +148 -0
  419. package/src/a2ui/core/validate.ts +266 -0
  420. package/src/a2ui/index.ts +7 -0
  421. package/src/a2ui/ui-catalog.tsx +225 -0
  422. package/src/a2ui/wave1-chart-spec.test.ts +87 -0
  423. package/src/a2ui/wave2-chart-spec.test.ts +108 -0
  424. package/src/agentic-workspace.stories.tsx +6 -45
  425. package/src/chat-shell.test.tsx +40 -10
  426. package/src/chat-shell.tsx +90 -44
  427. package/src/chat.stories.tsx +47 -42
  428. package/src/composer.stories.tsx +4 -5
  429. package/src/composer.test.tsx +45 -0
  430. package/src/composer.tsx +104 -21
  431. package/src/context-panel.stories.tsx +1 -1
  432. package/src/context-panel.tsx +1 -1
  433. package/src/conversation.stories.tsx +1 -0
  434. package/src/conversation.test.tsx +16 -0
  435. package/src/conversation.tsx +16 -2
  436. package/src/diff-view.stories.tsx +79 -0
  437. package/src/diff-view.tsx +3 -2
  438. package/src/file-tree.tsx +24 -17
  439. package/src/gallery.stories.tsx +42 -0
  440. package/src/gallery.tsx +2 -2
  441. package/src/grouped-parts.stories.tsx +23 -0
  442. package/src/grouped-parts.tsx +1 -1
  443. package/src/index.ts +1 -0
  444. package/src/message-compare.stories.tsx +40 -0
  445. package/src/message-compare.tsx +2 -1
  446. package/src/message-form.tsx +1 -1
  447. package/src/message-table.stories.tsx +24 -0
  448. package/src/message-table.tsx +1 -1
  449. package/src/package-info.tsx +12 -9
  450. package/src/reasoning.stories.tsx +27 -0
  451. package/src/reasoning.tsx +1 -1
  452. package/src/session-header.stories.tsx +35 -1
  453. package/src/session-header.tsx +1 -1
  454. package/src/sources.stories.tsx +30 -0
  455. package/src/sources.tsx +4 -1
  456. package/src/templates-ai-assistant.stories.tsx +151 -87
  457. package/src/tool.stories.tsx +39 -0
  458. package/src/tool.tsx +3 -3
  459. package/src/toolbar.tsx +0 -10
  460. package/dist/_flow-boundary-SHNWLQG5.js.map +0 -1
  461. package/dist/_persona-rive-JEG44YHX.js.map +0 -1
  462. /package/dist/{_audio-player-media-chrome-T3XVXWRZ.js.map → _audio-player-media-chrome.js.map} +0 -0
@@ -0,0 +1,287 @@
1
+ "use client";
2
+
3
+ // src/schema-display.tsx
4
+ import { Badge } from "@elabs-ai/components-ui";
5
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@elabs-ai/components-ui";
6
+ import { useLocale } from "@elabs-ai/components-ui";
7
+ import { cn } from "@elabs-ai/components-ui/lib/cn";
8
+ import { ChevronRightIcon } from "lucide-react";
9
+ import { createContext, Fragment, useContext, useMemo } from "react";
10
+ import { Fragment as Fragment2, jsx, jsxs } from "react/jsx-runtime";
11
+ var SchemaDisplayContext = createContext({
12
+ method: "GET",
13
+ path: ""
14
+ });
15
+ var methodStyles = {
16
+ DELETE: "border-destructive/40 bg-destructive/10 text-destructive-text",
17
+ GET: "border-success/40 bg-success/10 text-success-text",
18
+ PATCH: "border-warning/40 bg-warning/10 text-warning-text",
19
+ POST: "border-info/40 bg-info/10 text-info-text",
20
+ PUT: "border-warning/40 bg-warning/10 text-warning-text"
21
+ };
22
+ function splitSchemaPath(path) {
23
+ const parts = [];
24
+ const regex = /\{([^}]+)\}/g;
25
+ let lastIndex = 0;
26
+ let match = regex.exec(path);
27
+ while (match !== null) {
28
+ if (match.index > lastIndex) {
29
+ parts.push({ isParam: false, text: path.slice(lastIndex, match.index) });
30
+ }
31
+ parts.push({ isParam: true, text: match[0] });
32
+ lastIndex = match.index + match[0].length;
33
+ match = regex.exec(path);
34
+ }
35
+ if (lastIndex < path.length) {
36
+ parts.push({ isParam: false, text: path.slice(lastIndex) });
37
+ }
38
+ return parts;
39
+ }
40
+ var SchemaDisplayHeader = ({
41
+ className,
42
+ children,
43
+ ...props
44
+ }) => /* @__PURE__ */ jsx("div", { className: cn("flex items-center gap-3 border-b px-4 py-3", className), ...props, children });
45
+ var SchemaDisplayMethod = ({
46
+ className,
47
+ children,
48
+ ...props
49
+ }) => {
50
+ const { method } = useContext(SchemaDisplayContext);
51
+ return /* @__PURE__ */ jsx(
52
+ Badge,
53
+ {
54
+ className: cn("font-mono text-meta", methodStyles[method], className),
55
+ variant: "secondary",
56
+ ...props,
57
+ children: children ?? method
58
+ }
59
+ );
60
+ };
61
+ var SchemaDisplayPath = ({ className, children, ...props }) => {
62
+ const { path } = useContext(SchemaDisplayContext);
63
+ const pathNodes = useMemo(
64
+ () => splitSchemaPath(path).map(
65
+ (part, index) => part.isParam ? /* @__PURE__ */ jsx("span", { className: "text-info-text", children: part.text }, `${part.text}-${index}`) : /* @__PURE__ */ jsx(Fragment, { children: part.text }, `${part.text}-${index}`)
66
+ ),
67
+ [path]
68
+ );
69
+ return /* @__PURE__ */ jsx("span", { className: cn("font-mono text-body", className), ...props, children: children ?? pathNodes });
70
+ };
71
+ var SchemaDisplayDescription = ({
72
+ className,
73
+ children,
74
+ ...props
75
+ }) => {
76
+ const { description } = useContext(SchemaDisplayContext);
77
+ return /* @__PURE__ */ jsx("p", { className: cn("border-b px-4 py-3 text-muted-foreground text-body", className), ...props, children: children ?? description });
78
+ };
79
+ var SchemaDisplayContent = ({
80
+ className,
81
+ children,
82
+ ...props
83
+ }) => /* @__PURE__ */ jsx("div", { className: cn("divide-y", className), ...props, children });
84
+ var SchemaDisplayParameter = ({
85
+ name,
86
+ type,
87
+ required,
88
+ description,
89
+ location,
90
+ className,
91
+ ...props
92
+ }) => /* @__PURE__ */ jsxs("div", { className: cn("px-4 py-3 ps-10", className), ...props, children: [
93
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
94
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-body", children: name }),
95
+ /* @__PURE__ */ jsx(Badge, { className: "text-meta", variant: "outline", children: type }),
96
+ location && /* @__PURE__ */ jsx(Badge, { className: "text-meta", variant: "secondary", children: location }),
97
+ required && /* @__PURE__ */ jsx(
98
+ Badge,
99
+ {
100
+ className: "border-destructive/40 bg-destructive/10 text-destructive-text text-meta",
101
+ variant: "secondary",
102
+ children: "required"
103
+ }
104
+ )
105
+ ] }),
106
+ description && /* @__PURE__ */ jsx("p", { className: "mt-1 text-muted-foreground text-body", children: description })
107
+ ] });
108
+ var SchemaDisplayParameters = ({
109
+ className,
110
+ children,
111
+ ...props
112
+ }) => {
113
+ const { parameters } = useContext(SchemaDisplayContext);
114
+ const { t } = useLocale();
115
+ return /* @__PURE__ */ jsxs(Collapsible, { className: cn(className), defaultOpen: true, ...props, children: [
116
+ /* @__PURE__ */ jsxs(CollapsibleTrigger, { className: "group flex w-full items-center gap-2 px-4 py-3 text-start transition-colors hover:bg-muted/50", children: [
117
+ /* @__PURE__ */ jsx(ChevronRightIcon, { className: "size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90" }),
118
+ /* @__PURE__ */ jsx("span", { className: "font-medium text-body", children: t("ai.schemaDisplay.parameters") }),
119
+ /* @__PURE__ */ jsx(Badge, { className: "ms-auto text-meta", variant: "secondary", children: parameters?.length })
120
+ ] }),
121
+ /* @__PURE__ */ jsx(CollapsibleContent, { children: /* @__PURE__ */ jsx("div", { className: "divide-y border-t", children: children ?? parameters?.map((param) => /* @__PURE__ */ jsx(SchemaDisplayParameter, { ...param }, param.name)) }) })
122
+ ] });
123
+ };
124
+ var SchemaDisplayProperty = ({
125
+ name,
126
+ type,
127
+ required,
128
+ description,
129
+ properties,
130
+ items,
131
+ depth = 0,
132
+ className,
133
+ ...props
134
+ }) => {
135
+ const hasChildren = properties || items;
136
+ const paddingLeft = 40 + depth * 16;
137
+ if (hasChildren) {
138
+ return /* @__PURE__ */ jsxs(Collapsible, { defaultOpen: depth < 2, children: [
139
+ /* @__PURE__ */ jsxs(
140
+ CollapsibleTrigger,
141
+ {
142
+ className: cn(
143
+ "group flex w-full items-center gap-2 py-3 text-start transition-colors hover:bg-muted/50",
144
+ className
145
+ ),
146
+ style: { paddingLeft },
147
+ children: [
148
+ /* @__PURE__ */ jsx(ChevronRightIcon, { className: "size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90" }),
149
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-body", children: name }),
150
+ /* @__PURE__ */ jsx(Badge, { className: "text-meta", variant: "outline", children: type }),
151
+ required && /* @__PURE__ */ jsx(
152
+ Badge,
153
+ {
154
+ className: "border-destructive/40 bg-destructive/10 text-destructive-text text-meta",
155
+ variant: "secondary",
156
+ children: "required"
157
+ }
158
+ )
159
+ ]
160
+ }
161
+ ),
162
+ description && /* @__PURE__ */ jsx(
163
+ "p",
164
+ {
165
+ className: "pb-2 text-muted-foreground text-body",
166
+ style: { paddingLeft: paddingLeft + 24 },
167
+ children: description
168
+ }
169
+ ),
170
+ /* @__PURE__ */ jsx(CollapsibleContent, { children: /* @__PURE__ */ jsxs("div", { className: "divide-y border-t", children: [
171
+ properties?.map((prop) => /* @__PURE__ */ jsx(SchemaDisplayProperty, { ...prop, depth: depth + 1 }, prop.name)),
172
+ items && /* @__PURE__ */ jsx(SchemaDisplayProperty, { ...items, depth: depth + 1, name: `${name}[]` })
173
+ ] }) })
174
+ ] });
175
+ }
176
+ return /* @__PURE__ */ jsxs("div", { className: cn("py-3 pe-4", className), style: { paddingLeft }, ...props, children: [
177
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
178
+ /* @__PURE__ */ jsx("span", { className: "size-4" }),
179
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-body", children: name }),
180
+ /* @__PURE__ */ jsx(Badge, { className: "text-meta", variant: "outline", children: type }),
181
+ required && /* @__PURE__ */ jsx(
182
+ Badge,
183
+ {
184
+ className: "border-destructive/40 bg-destructive/10 text-destructive-text text-meta",
185
+ variant: "secondary",
186
+ children: "required"
187
+ }
188
+ )
189
+ ] }),
190
+ description && /* @__PURE__ */ jsx("p", { className: "mt-1 ps-6 text-muted-foreground text-body", children: description })
191
+ ] });
192
+ };
193
+ var SchemaDisplayRequest = ({
194
+ className,
195
+ children,
196
+ ...props
197
+ }) => {
198
+ const { requestBody } = useContext(SchemaDisplayContext);
199
+ const { t } = useLocale();
200
+ return /* @__PURE__ */ jsxs(Collapsible, { className: cn(className), defaultOpen: true, ...props, children: [
201
+ /* @__PURE__ */ jsxs(CollapsibleTrigger, { className: "group flex w-full items-center gap-2 px-4 py-3 text-start transition-colors hover:bg-muted/50", children: [
202
+ /* @__PURE__ */ jsx(ChevronRightIcon, { className: "size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90" }),
203
+ /* @__PURE__ */ jsx("span", { className: "font-medium text-body", children: t("ai.schemaDisplay.requestBody") })
204
+ ] }),
205
+ /* @__PURE__ */ jsx(CollapsibleContent, { children: /* @__PURE__ */ jsx("div", { className: "border-t", children: children ?? requestBody?.map((prop) => /* @__PURE__ */ jsx(SchemaDisplayProperty, { ...prop, depth: 0 }, prop.name)) }) })
206
+ ] });
207
+ };
208
+ var SchemaDisplayResponse = ({
209
+ className,
210
+ children,
211
+ ...props
212
+ }) => {
213
+ const { responseBody } = useContext(SchemaDisplayContext);
214
+ const { t } = useLocale();
215
+ return /* @__PURE__ */ jsxs(Collapsible, { className: cn(className), defaultOpen: true, ...props, children: [
216
+ /* @__PURE__ */ jsxs(CollapsibleTrigger, { className: "group flex w-full items-center gap-2 px-4 py-3 text-start transition-colors hover:bg-muted/50", children: [
217
+ /* @__PURE__ */ jsx(ChevronRightIcon, { className: "size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90" }),
218
+ /* @__PURE__ */ jsx("span", { className: "font-medium text-body", children: t("ai.schemaDisplay.response") })
219
+ ] }),
220
+ /* @__PURE__ */ jsx(CollapsibleContent, { children: /* @__PURE__ */ jsx("div", { className: "border-t", children: children ?? responseBody?.map((prop) => /* @__PURE__ */ jsx(SchemaDisplayProperty, { ...prop, depth: 0 }, prop.name)) }) })
221
+ ] });
222
+ };
223
+ var SchemaDisplay = ({
224
+ method,
225
+ path,
226
+ description,
227
+ parameters,
228
+ requestBody,
229
+ responseBody,
230
+ className,
231
+ children,
232
+ ...props
233
+ }) => {
234
+ const contextValue = useMemo(
235
+ () => ({
236
+ description,
237
+ method,
238
+ parameters,
239
+ path,
240
+ requestBody,
241
+ responseBody
242
+ }),
243
+ [description, method, parameters, path, requestBody, responseBody]
244
+ );
245
+ return /* @__PURE__ */ jsx(SchemaDisplayContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx("div", { className: cn("overflow-hidden rounded-lg border bg-background", className), ...props, children: children ?? /* @__PURE__ */ jsxs(Fragment2, { children: [
246
+ /* @__PURE__ */ jsx(SchemaDisplayHeader, { children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
247
+ /* @__PURE__ */ jsx(SchemaDisplayMethod, {}),
248
+ /* @__PURE__ */ jsx(SchemaDisplayPath, {})
249
+ ] }) }),
250
+ description && /* @__PURE__ */ jsx(SchemaDisplayDescription, {}),
251
+ /* @__PURE__ */ jsxs(SchemaDisplayContent, { children: [
252
+ parameters && parameters.length > 0 && /* @__PURE__ */ jsx(SchemaDisplayParameters, {}),
253
+ requestBody && requestBody.length > 0 && /* @__PURE__ */ jsx(SchemaDisplayRequest, {}),
254
+ responseBody && responseBody.length > 0 && /* @__PURE__ */ jsx(SchemaDisplayResponse, {})
255
+ ] })
256
+ ] }) }) });
257
+ };
258
+ var SchemaDisplayBody = ({ className, children, ...props }) => /* @__PURE__ */ jsx("div", { className: cn("divide-y", className), ...props, children });
259
+ var SchemaDisplayExample = ({
260
+ className,
261
+ children,
262
+ ...props
263
+ }) => /* @__PURE__ */ jsx(
264
+ "pre",
265
+ {
266
+ className: cn("mx-4 mb-4 overflow-auto rounded-md bg-muted p-4 font-mono text-body", className),
267
+ ...props,
268
+ children
269
+ }
270
+ );
271
+
272
+ export {
273
+ SchemaDisplayHeader,
274
+ SchemaDisplayMethod,
275
+ SchemaDisplayPath,
276
+ SchemaDisplayDescription,
277
+ SchemaDisplayContent,
278
+ SchemaDisplayParameter,
279
+ SchemaDisplayParameters,
280
+ SchemaDisplayProperty,
281
+ SchemaDisplayRequest,
282
+ SchemaDisplayResponse,
283
+ SchemaDisplay,
284
+ SchemaDisplayBody,
285
+ SchemaDisplayExample
286
+ };
287
+ //# sourceMappingURL=chunk-IXICSOOP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema-display.tsx"],"sourcesContent":["\"use client\";\n\nimport { Badge } from \"@elabs-ai/components-ui\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@elabs-ai/components-ui\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { ChevronRightIcon } from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes, ReactNode } from \"react\";\nimport { createContext, Fragment, useContext, useMemo } from \"react\";\n\ntype HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\ninterface SchemaParameter {\n name: string;\n type: string;\n required?: boolean;\n description?: string;\n location?: \"path\" | \"query\" | \"header\";\n}\n\ninterface SchemaProperty {\n name: string;\n type: string;\n required?: boolean;\n description?: string;\n properties?: SchemaProperty[];\n items?: SchemaProperty;\n}\n\ninterface SchemaDisplayContextType {\n method: HttpMethod;\n path: string;\n description?: string;\n parameters?: SchemaParameter[];\n requestBody?: SchemaProperty[];\n responseBody?: SchemaProperty[];\n}\n\nconst SchemaDisplayContext = createContext<SchemaDisplayContextType>({\n method: \"GET\",\n path: \"\",\n});\n\nconst methodStyles: Record<HttpMethod, string> = {\n DELETE: \"border-destructive/40 bg-destructive/10 text-destructive-text\",\n GET: \"border-success/40 bg-success/10 text-success-text\",\n PATCH: \"border-warning/40 bg-warning/10 text-warning-text\",\n POST: \"border-info/40 bg-info/10 text-info-text\",\n PUT: \"border-warning/40 bg-warning/10 text-warning-text\",\n};\n\n/** Splits a `{param}` path into plain-text and parameter segments for safe rendering. */\nfunction splitSchemaPath(path: string): Array<{ text: string; isParam: boolean }> {\n const parts: Array<{ text: string; isParam: boolean }> = [];\n const regex = /\\{([^}]+)\\}/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null = regex.exec(path);\n\n while (match !== null) {\n if (match.index > lastIndex) {\n parts.push({ isParam: false, text: path.slice(lastIndex, match.index) });\n }\n parts.push({ isParam: true, text: match[0] });\n lastIndex = match.index + match[0].length;\n match = regex.exec(path);\n }\n\n if (lastIndex < path.length) {\n parts.push({ isParam: false, text: path.slice(lastIndex) });\n }\n\n return parts;\n}\n\nexport type SchemaDisplayHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport const SchemaDisplayHeader = ({\n className,\n children,\n ...props\n}: SchemaDisplayHeaderProps) => (\n <div className={cn(\"flex items-center gap-3 border-b px-4 py-3\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type SchemaDisplayMethodProps = ComponentProps<typeof Badge>;\n\nexport const SchemaDisplayMethod = ({\n className,\n children,\n ...props\n}: SchemaDisplayMethodProps) => {\n const { method } = useContext(SchemaDisplayContext);\n\n return (\n <Badge\n className={cn(\"font-mono text-meta\", methodStyles[method], className)}\n variant=\"secondary\"\n {...props}\n >\n {children ?? method}\n </Badge>\n );\n};\n\nexport type SchemaDisplayPathProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const SchemaDisplayPath = ({ className, children, ...props }: SchemaDisplayPathProps) => {\n const { path } = useContext(SchemaDisplayContext);\n\n // Highlight path parameters as real elements — the path is untrusted\n // (tool/model output) and must never reach dangerouslySetInnerHTML.\n const pathNodes = useMemo<ReactNode>(\n () =>\n splitSchemaPath(path).map((part, index) =>\n part.isParam ? (\n <span className=\"text-info-text\" key={`${part.text}-${index}`}>\n {part.text}\n </span>\n ) : (\n <Fragment key={`${part.text}-${index}`}>{part.text}</Fragment>\n ),\n ),\n [path],\n );\n\n return (\n <span className={cn(\"font-mono text-body\", className)} {...props}>\n {children ?? pathNodes}\n </span>\n );\n};\n\nexport type SchemaDisplayDescriptionProps = HTMLAttributes<HTMLParagraphElement>;\n\nexport const SchemaDisplayDescription = ({\n className,\n children,\n ...props\n}: SchemaDisplayDescriptionProps) => {\n const { description } = useContext(SchemaDisplayContext);\n\n return (\n <p className={cn(\"border-b px-4 py-3 text-muted-foreground text-body\", className)} {...props}>\n {children ?? description}\n </p>\n );\n};\n\nexport type SchemaDisplayContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const SchemaDisplayContent = ({\n className,\n children,\n ...props\n}: SchemaDisplayContentProps) => (\n <div className={cn(\"divide-y\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type SchemaDisplayParameterProps = HTMLAttributes<HTMLDivElement> & SchemaParameter;\n\nexport const SchemaDisplayParameter = ({\n name,\n type,\n required,\n description,\n location,\n className,\n ...props\n}: SchemaDisplayParameterProps) => (\n <div className={cn(\"px-4 py-3 ps-10\", className)} {...props}>\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono text-body\">{name}</span>\n <Badge className=\"text-meta\" variant=\"outline\">\n {type}\n </Badge>\n {location && (\n <Badge className=\"text-meta\" variant=\"secondary\">\n {location}\n </Badge>\n )}\n {required && (\n <Badge\n className=\"border-destructive/40 bg-destructive/10 text-destructive-text text-meta\"\n variant=\"secondary\"\n >\n required\n </Badge>\n )}\n </div>\n {description && <p className=\"mt-1 text-muted-foreground text-body\">{description}</p>}\n </div>\n);\n\nexport type SchemaDisplayParametersProps = ComponentProps<typeof Collapsible>;\n\nexport const SchemaDisplayParameters = ({\n className,\n children,\n ...props\n}: SchemaDisplayParametersProps) => {\n const { parameters } = useContext(SchemaDisplayContext);\n const { t } = useLocale();\n\n return (\n <Collapsible className={cn(className)} defaultOpen {...props}>\n <CollapsibleTrigger className=\"group flex w-full items-center gap-2 px-4 py-3 text-start transition-colors hover:bg-muted/50\">\n <ChevronRightIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n <span className=\"font-medium text-body\">{t(\"ai.schemaDisplay.parameters\")}</span>\n <Badge className=\"ms-auto text-meta\" variant=\"secondary\">\n {parameters?.length}\n </Badge>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"divide-y border-t\">\n {children ??\n parameters?.map((param) => <SchemaDisplayParameter key={param.name} {...param} />)}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n};\n\nexport type SchemaDisplayPropertyProps = HTMLAttributes<HTMLDivElement> &\n SchemaProperty & {\n depth?: number;\n };\n\nexport const SchemaDisplayProperty = ({\n name,\n type,\n required,\n description,\n properties,\n items,\n depth = 0,\n className,\n ...props\n}: SchemaDisplayPropertyProps) => {\n const hasChildren = properties || items;\n const paddingLeft = 40 + depth * 16;\n\n if (hasChildren) {\n return (\n <Collapsible defaultOpen={depth < 2}>\n <CollapsibleTrigger\n className={cn(\n \"group flex w-full items-center gap-2 py-3 text-start transition-colors hover:bg-muted/50\",\n className,\n )}\n style={{ paddingLeft }}\n >\n <ChevronRightIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n <span className=\"font-mono text-body\">{name}</span>\n <Badge className=\"text-meta\" variant=\"outline\">\n {type}\n </Badge>\n {required && (\n <Badge\n className=\"border-destructive/40 bg-destructive/10 text-destructive-text text-meta\"\n variant=\"secondary\"\n >\n required\n </Badge>\n )}\n </CollapsibleTrigger>\n {description && (\n <p\n className=\"pb-2 text-muted-foreground text-body\"\n style={{ paddingLeft: paddingLeft + 24 }}\n >\n {description}\n </p>\n )}\n <CollapsibleContent>\n <div className=\"divide-y border-t\">\n {properties?.map((prop) => (\n <SchemaDisplayProperty key={prop.name} {...prop} depth={depth + 1} />\n ))}\n {items && <SchemaDisplayProperty {...items} depth={depth + 1} name={`${name}[]`} />}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n }\n\n return (\n <div className={cn(\"py-3 pe-4\", className)} style={{ paddingLeft }} {...props}>\n <div className=\"flex items-center gap-2\">\n {/* Spacer for alignment */}\n <span className=\"size-4\" />\n <span className=\"font-mono text-body\">{name}</span>\n <Badge className=\"text-meta\" variant=\"outline\">\n {type}\n </Badge>\n {required && (\n <Badge\n className=\"border-destructive/40 bg-destructive/10 text-destructive-text text-meta\"\n variant=\"secondary\"\n >\n required\n </Badge>\n )}\n </div>\n {description && <p className=\"mt-1 ps-6 text-muted-foreground text-body\">{description}</p>}\n </div>\n );\n};\n\nexport type SchemaDisplayRequestProps = ComponentProps<typeof Collapsible>;\n\nexport const SchemaDisplayRequest = ({\n className,\n children,\n ...props\n}: SchemaDisplayRequestProps) => {\n const { requestBody } = useContext(SchemaDisplayContext);\n const { t } = useLocale();\n\n return (\n <Collapsible className={cn(className)} defaultOpen {...props}>\n <CollapsibleTrigger className=\"group flex w-full items-center gap-2 px-4 py-3 text-start transition-colors hover:bg-muted/50\">\n <ChevronRightIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n <span className=\"font-medium text-body\">{t(\"ai.schemaDisplay.requestBody\")}</span>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"border-t\">\n {children ??\n requestBody?.map((prop) => (\n <SchemaDisplayProperty key={prop.name} {...prop} depth={0} />\n ))}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n};\n\nexport type SchemaDisplayResponseProps = ComponentProps<typeof Collapsible>;\n\nexport const SchemaDisplayResponse = ({\n className,\n children,\n ...props\n}: SchemaDisplayResponseProps) => {\n const { responseBody } = useContext(SchemaDisplayContext);\n const { t } = useLocale();\n\n return (\n <Collapsible className={cn(className)} defaultOpen {...props}>\n <CollapsibleTrigger className=\"group flex w-full items-center gap-2 px-4 py-3 text-start transition-colors hover:bg-muted/50\">\n <ChevronRightIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n <span className=\"font-medium text-body\">{t(\"ai.schemaDisplay.response\")}</span>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"border-t\">\n {children ??\n responseBody?.map((prop) => (\n <SchemaDisplayProperty key={prop.name} {...prop} depth={0} />\n ))}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n};\n\nexport type SchemaDisplayProps = HTMLAttributes<HTMLDivElement> & {\n method: HttpMethod;\n path: string;\n description?: string;\n parameters?: SchemaParameter[];\n requestBody?: SchemaProperty[];\n responseBody?: SchemaProperty[];\n};\n\nexport const SchemaDisplay = ({\n method,\n path,\n description,\n parameters,\n requestBody,\n responseBody,\n className,\n children,\n ...props\n}: SchemaDisplayProps) => {\n const contextValue = useMemo(\n () => ({\n description,\n method,\n parameters,\n path,\n requestBody,\n responseBody,\n }),\n [description, method, parameters, path, requestBody, responseBody],\n );\n\n return (\n <SchemaDisplayContext.Provider value={contextValue}>\n <div className={cn(\"overflow-hidden rounded-lg border bg-background\", className)} {...props}>\n {children ?? (\n <>\n <SchemaDisplayHeader>\n <div className=\"flex items-center gap-3\">\n <SchemaDisplayMethod />\n <SchemaDisplayPath />\n </div>\n </SchemaDisplayHeader>\n {description && <SchemaDisplayDescription />}\n <SchemaDisplayContent>\n {parameters && parameters.length > 0 && <SchemaDisplayParameters />}\n {requestBody && requestBody.length > 0 && <SchemaDisplayRequest />}\n {responseBody && responseBody.length > 0 && <SchemaDisplayResponse />}\n </SchemaDisplayContent>\n </>\n )}\n </div>\n </SchemaDisplayContext.Provider>\n );\n};\n\nexport type SchemaDisplayBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const SchemaDisplayBody = ({ className, children, ...props }: SchemaDisplayBodyProps) => (\n <div className={cn(\"divide-y\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type SchemaDisplayExampleProps = HTMLAttributes<HTMLPreElement>;\n\nexport const SchemaDisplayExample = ({\n className,\n children,\n ...props\n}: SchemaDisplayExampleProps) => (\n <pre\n className={cn(\"mx-4 mb-4 overflow-auto rounded-md bg-muted p-4 font-mono text-body\", className)}\n {...props}\n >\n {children}\n </pre>\n);\n"],"mappings":";;;AAEA,SAAS,aAAa;AACtB,SAAS,aAAa,oBAAoB,0BAA0B;AACpE,SAAS,iBAAiB;AAC1B,SAAS,UAAU;AACnB,SAAS,wBAAwB;AAEjC,SAAS,eAAe,UAAU,YAAY,eAAe;AAyE3D,SAmUQ,YAAAA,WAnUR,KA6FE,YA7FF;AA3CF,IAAM,uBAAuB,cAAwC;AAAA,EACnE,QAAQ;AAAA,EACR,MAAM;AACR,CAAC;AAED,IAAM,eAA2C;AAAA,EAC/C,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AACP;AAGA,SAAS,gBAAgB,MAAyD;AAChF,QAAM,QAAmD,CAAC;AAC1D,QAAM,QAAQ;AACd,MAAI,YAAY;AAChB,MAAI,QAAgC,MAAM,KAAK,IAAI;AAEnD,SAAO,UAAU,MAAM;AACrB,QAAI,MAAM,QAAQ,WAAW;AAC3B,YAAM,KAAK,EAAE,SAAS,OAAO,MAAM,KAAK,MAAM,WAAW,MAAM,KAAK,EAAE,CAAC;AAAA,IACzE;AACA,UAAM,KAAK,EAAE,SAAS,MAAM,MAAM,MAAM,CAAC,EAAE,CAAC;AAC5C,gBAAY,MAAM,QAAQ,MAAM,CAAC,EAAE;AACnC,YAAQ,MAAM,KAAK,IAAI;AAAA,EACzB;AAEA,MAAI,YAAY,KAAK,QAAQ;AAC3B,UAAM,KAAK,EAAE,SAAS,OAAO,MAAM,KAAK,MAAM,SAAS,EAAE,CAAC;AAAA,EAC5D;AAEA,SAAO;AACT;AAIO,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA,GAAG;AACL,MACE,oBAAC,SAAI,WAAW,GAAG,8CAA8C,SAAS,GAAI,GAAG,OAC9E,UACH;AAKK,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAgC;AAC9B,QAAM,EAAE,OAAO,IAAI,WAAW,oBAAoB;AAElD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,uBAAuB,aAAa,MAAM,GAAG,SAAS;AAAA,MACpE,SAAQ;AAAA,MACP,GAAG;AAAA,MAEH,sBAAY;AAAA;AAAA,EACf;AAEJ;AAIO,IAAM,oBAAoB,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,MAA8B;AAC9F,QAAM,EAAE,KAAK,IAAI,WAAW,oBAAoB;AAIhD,QAAM,YAAY;AAAA,IAChB,MACE,gBAAgB,IAAI,EAAE;AAAA,MAAI,CAAC,MAAM,UAC/B,KAAK,UACH,oBAAC,UAAK,WAAU,kBACb,eAAK,QAD8B,GAAG,KAAK,IAAI,IAAI,KAAK,EAE3D,IAEA,oBAAC,YAAwC,eAAK,QAA/B,GAAG,KAAK,IAAI,IAAI,KAAK,EAAe;AAAA,IAEvD;AAAA,IACF,CAAC,IAAI;AAAA,EACP;AAEA,SACE,oBAAC,UAAK,WAAW,GAAG,uBAAuB,SAAS,GAAI,GAAG,OACxD,sBAAY,WACf;AAEJ;AAIO,IAAM,2BAA2B,CAAC;AAAA,EACvC;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAqC;AACnC,QAAM,EAAE,YAAY,IAAI,WAAW,oBAAoB;AAEvD,SACE,oBAAC,OAAE,WAAW,GAAG,sDAAsD,SAAS,GAAI,GAAG,OACpF,sBAAY,aACf;AAEJ;AAIO,IAAM,uBAAuB,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA,GAAG;AACL,MACE,oBAAC,SAAI,WAAW,GAAG,YAAY,SAAS,GAAI,GAAG,OAC5C,UACH;AAKK,IAAM,yBAAyB,CAAC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MACE,qBAAC,SAAI,WAAW,GAAG,mBAAmB,SAAS,GAAI,GAAG,OACpD;AAAA,uBAAC,SAAI,WAAU,2BACb;AAAA,wBAAC,UAAK,WAAU,uBAAuB,gBAAK;AAAA,IAC5C,oBAAC,SAAM,WAAU,aAAY,SAAQ,WAClC,gBACH;AAAA,IACC,YACC,oBAAC,SAAM,WAAU,aAAY,SAAQ,aAClC,oBACH;AAAA,IAED,YACC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAQ;AAAA,QACT;AAAA;AAAA,IAED;AAAA,KAEJ;AAAA,EACC,eAAe,oBAAC,OAAE,WAAU,wCAAwC,uBAAY;AAAA,GACnF;AAKK,IAAM,0BAA0B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAoC;AAClC,QAAM,EAAE,WAAW,IAAI,WAAW,oBAAoB;AACtD,QAAM,EAAE,EAAE,IAAI,UAAU;AAExB,SACE,qBAAC,eAAY,WAAW,GAAG,SAAS,GAAG,aAAW,MAAE,GAAG,OACrD;AAAA,yBAAC,sBAAmB,WAAU,iGAC5B;AAAA,0BAAC,oBAAiB,WAAU,gGAA+F;AAAA,MAC3H,oBAAC,UAAK,WAAU,yBAAyB,YAAE,6BAA6B,GAAE;AAAA,MAC1E,oBAAC,SAAM,WAAU,qBAAoB,SAAQ,aAC1C,sBAAY,QACf;AAAA,OACF;AAAA,IACA,oBAAC,sBACC,8BAAC,SAAI,WAAU,qBACZ,sBACC,YAAY,IAAI,CAAC,UAAU,oBAAC,0BAAyC,GAAG,SAAhB,MAAM,IAAiB,CAAE,GACrF,GACF;AAAA,KACF;AAEJ;AAOO,IAAM,wBAAwB,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,GAAG;AACL,MAAkC;AAChC,QAAM,cAAc,cAAc;AAClC,QAAM,cAAc,KAAK,QAAQ;AAEjC,MAAI,aAAa;AACf,WACE,qBAAC,eAAY,aAAa,QAAQ,GAChC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAO,EAAE,YAAY;AAAA,UAErB;AAAA,gCAAC,oBAAiB,WAAU,gGAA+F;AAAA,YAC3H,oBAAC,UAAK,WAAU,uBAAuB,gBAAK;AAAA,YAC5C,oBAAC,SAAM,WAAU,aAAY,SAAQ,WAClC,gBACH;AAAA,YACC,YACC;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,SAAQ;AAAA,gBACT;AAAA;AAAA,YAED;AAAA;AAAA;AAAA,MAEJ;AAAA,MACC,eACC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,aAAa,cAAc,GAAG;AAAA,UAEtC;AAAA;AAAA,MACH;AAAA,MAEF,oBAAC,sBACC,+BAAC,SAAI,WAAU,qBACZ;AAAA,oBAAY,IAAI,CAAC,SAChB,oBAAC,yBAAuC,GAAG,MAAM,OAAO,QAAQ,KAApC,KAAK,IAAkC,CACpE;AAAA,QACA,SAAS,oBAAC,yBAAuB,GAAG,OAAO,OAAO,QAAQ,GAAG,MAAM,GAAG,IAAI,MAAM;AAAA,SACnF,GACF;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,qBAAC,SAAI,WAAW,GAAG,aAAa,SAAS,GAAG,OAAO,EAAE,YAAY,GAAI,GAAG,OACtE;AAAA,yBAAC,SAAI,WAAU,2BAEb;AAAA,0BAAC,UAAK,WAAU,UAAS;AAAA,MACzB,oBAAC,UAAK,WAAU,uBAAuB,gBAAK;AAAA,MAC5C,oBAAC,SAAM,WAAU,aAAY,SAAQ,WAClC,gBACH;AAAA,MACC,YACC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAQ;AAAA,UACT;AAAA;AAAA,MAED;AAAA,OAEJ;AAAA,IACC,eAAe,oBAAC,OAAE,WAAU,6CAA6C,uBAAY;AAAA,KACxF;AAEJ;AAIO,IAAM,uBAAuB,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAiC;AAC/B,QAAM,EAAE,YAAY,IAAI,WAAW,oBAAoB;AACvD,QAAM,EAAE,EAAE,IAAI,UAAU;AAExB,SACE,qBAAC,eAAY,WAAW,GAAG,SAAS,GAAG,aAAW,MAAE,GAAG,OACrD;AAAA,yBAAC,sBAAmB,WAAU,iGAC5B;AAAA,0BAAC,oBAAiB,WAAU,gGAA+F;AAAA,MAC3H,oBAAC,UAAK,WAAU,yBAAyB,YAAE,8BAA8B,GAAE;AAAA,OAC7E;AAAA,IACA,oBAAC,sBACC,8BAAC,SAAI,WAAU,YACZ,sBACC,aAAa,IAAI,CAAC,SAChB,oBAAC,yBAAuC,GAAG,MAAM,OAAO,KAA5B,KAAK,IAA0B,CAC5D,GACL,GACF;AAAA,KACF;AAEJ;AAIO,IAAM,wBAAwB,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAkC;AAChC,QAAM,EAAE,aAAa,IAAI,WAAW,oBAAoB;AACxD,QAAM,EAAE,EAAE,IAAI,UAAU;AAExB,SACE,qBAAC,eAAY,WAAW,GAAG,SAAS,GAAG,aAAW,MAAE,GAAG,OACrD;AAAA,yBAAC,sBAAmB,WAAU,iGAC5B;AAAA,0BAAC,oBAAiB,WAAU,gGAA+F;AAAA,MAC3H,oBAAC,UAAK,WAAU,yBAAyB,YAAE,2BAA2B,GAAE;AAAA,OAC1E;AAAA,IACA,oBAAC,sBACC,8BAAC,SAAI,WAAU,YACZ,sBACC,cAAc,IAAI,CAAC,SACjB,oBAAC,yBAAuC,GAAG,MAAM,OAAO,KAA5B,KAAK,IAA0B,CAC5D,GACL,GACF;AAAA,KACF;AAEJ;AAWO,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAA0B;AACxB,QAAM,eAAe;AAAA,IACnB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,aAAa,QAAQ,YAAY,MAAM,aAAa,YAAY;AAAA,EACnE;AAEA,SACE,oBAAC,qBAAqB,UAArB,EAA8B,OAAO,cACpC,8BAAC,SAAI,WAAW,GAAG,mDAAmD,SAAS,GAAI,GAAG,OACnF,sBACC,qBAAAA,WAAA,EACE;AAAA,wBAAC,uBACC,+BAAC,SAAI,WAAU,2BACb;AAAA,0BAAC,uBAAoB;AAAA,MACrB,oBAAC,qBAAkB;AAAA,OACrB,GACF;AAAA,IACC,eAAe,oBAAC,4BAAyB;AAAA,IAC1C,qBAAC,wBACE;AAAA,oBAAc,WAAW,SAAS,KAAK,oBAAC,2BAAwB;AAAA,MAChE,eAAe,YAAY,SAAS,KAAK,oBAAC,wBAAqB;AAAA,MAC/D,gBAAgB,aAAa,SAAS,KAAK,oBAAC,yBAAsB;AAAA,OACrE;AAAA,KACF,GAEJ,GACF;AAEJ;AAIO,IAAM,oBAAoB,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,MAChE,oBAAC,SAAI,WAAW,GAAG,YAAY,SAAS,GAAI,GAAG,OAC5C,UACH;AAKK,IAAM,uBAAuB,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA,GAAG;AACL,MACE;AAAA,EAAC;AAAA;AAAA,IACC,WAAW,GAAG,uEAAuE,SAAS;AAAA,IAC7F,GAAG;AAAA,IAEH;AAAA;AACH;","names":["Fragment"]}
@@ -0,0 +1,84 @@
1
+ "use client";
2
+
3
+ // src/message-feedback.tsx
4
+ import { forwardRef, useState } from "react";
5
+ import { ThumbsDown, ThumbsUp } from "lucide-react";
6
+ import { cva } from "class-variance-authority";
7
+ import { Button } from "@elabs-ai/components-ui";
8
+ import { cn } from "@elabs-ai/components-ui/lib/cn";
9
+ import { useLocale } from "@elabs-ai/components-ui";
10
+ import { jsx, jsxs } from "react/jsx-runtime";
11
+ var messageFeedbackVariants = cva("inline-flex items-center", {
12
+ variants: {
13
+ compact: { true: "gap-0.5", false: "gap-1" }
14
+ },
15
+ defaultVariants: { compact: false }
16
+ });
17
+ var MessageFeedback = forwardRef(
18
+ function MessageFeedback2({
19
+ value: valueProp,
20
+ defaultValue = null,
21
+ onSubmit,
22
+ disabled = false,
23
+ compact = false,
24
+ positiveLabel = "Good response",
25
+ negativeLabel = "Bad response",
26
+ className,
27
+ ...props
28
+ }, ref) {
29
+ const { t } = useLocale();
30
+ const isControlled = valueProp !== void 0;
31
+ const [internal, setInternal] = useState(defaultValue);
32
+ const selected = isControlled ? valueProp : internal;
33
+ const submitted = selected != null;
34
+ const choose = (type) => {
35
+ if (submitted || disabled) return;
36
+ if (!isControlled) setInternal(type);
37
+ onSubmit?.({ type });
38
+ };
39
+ const compactBtn = compact ? "size-7 [&_svg]:size-3.5" : void 0;
40
+ const renderButton = (type, label, Icon) => {
41
+ const active = selected === type;
42
+ return /* @__PURE__ */ jsx(
43
+ Button,
44
+ {
45
+ type: "button",
46
+ variant: "ghost",
47
+ size: "icon-sm",
48
+ "aria-label": label,
49
+ "aria-pressed": active,
50
+ disabled: disabled || submitted,
51
+ onClick: () => choose(type),
52
+ className: cn(
53
+ "text-muted-foreground hover:text-foreground",
54
+ active && "text-primary disabled:opacity-100 [&_svg]:fill-current",
55
+ compactBtn
56
+ ),
57
+ children: /* @__PURE__ */ jsx(Icon, { "aria-hidden": "true" })
58
+ }
59
+ );
60
+ };
61
+ return /* @__PURE__ */ jsxs(
62
+ "div",
63
+ {
64
+ ref,
65
+ role: "group",
66
+ "aria-label": t("ai.message.feedback"),
67
+ "data-submitted": submitted || void 0,
68
+ "data-feedback": selected ?? void 0,
69
+ className: cn(messageFeedbackVariants({ compact }), className),
70
+ ...props,
71
+ children: [
72
+ renderButton("positive", positiveLabel, ThumbsUp),
73
+ renderButton("negative", negativeLabel, ThumbsDown)
74
+ ]
75
+ }
76
+ );
77
+ }
78
+ );
79
+
80
+ export {
81
+ messageFeedbackVariants,
82
+ MessageFeedback
83
+ };
84
+ //# sourceMappingURL=chunk-JY5HSN4D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/message-feedback.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * MessageFeedback — thumbs up / down for a single assistant message.\n *\n * Presentational only: it emits `onSubmit({ type })` and reflects the chosen\n * state; it does NOT persist anything (the host owns storage). After a choice\n * the buttons auto-disable (feedback is submit-once) and the root carries\n * `data-submitted` + `data-feedback`. Controlled (`value`) or uncontrolled.\n */\n\nimport { forwardRef, useState, type HTMLAttributes } from \"react\";\nimport { ThumbsDown, ThumbsUp } from \"lucide-react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Button } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\n\nexport type FeedbackType = \"positive\" | \"negative\";\n\nexport const messageFeedbackVariants = cva(\"inline-flex items-center\", {\n variants: {\n compact: { true: \"gap-0.5\", false: \"gap-1\" },\n },\n defaultVariants: { compact: false },\n});\n\nexport interface MessageFeedbackProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, \"onSubmit\" | \"defaultValue\">,\n VariantProps<typeof messageFeedbackVariants> {\n /** Controlled selected feedback. When set, `onSubmit` is the only updater. */\n value?: FeedbackType | null;\n /** Uncontrolled initial selection. @default null */\n defaultValue?: FeedbackType | null;\n /** Called once with the chosen feedback. No persistence — host-owned. */\n onSubmit?: (feedback: { type: FeedbackType }) => void;\n /** Force-disable both controls (e.g. while the message is still streaming). */\n disabled?: boolean;\n /** aria-label for the positive control. @default \"Good response\" */\n positiveLabel?: string;\n /** aria-label for the negative control. @default \"Bad response\" */\n negativeLabel?: string;\n}\n\n/**\n * Two icon buttons. The chosen one stays prominent after submit; the other\n * recedes. `compact` tightens spacing/size for message toolbars.\n */\nexport const MessageFeedback = forwardRef<HTMLDivElement, MessageFeedbackProps>(\n function MessageFeedback(\n {\n value: valueProp,\n defaultValue = null,\n onSubmit,\n disabled = false,\n compact = false,\n positiveLabel = \"Good response\",\n negativeLabel = \"Bad response\",\n className,\n ...props\n },\n ref,\n ) {\n const { t } = useLocale();\n const isControlled = valueProp !== undefined;\n const [internal, setInternal] = useState<FeedbackType | null>(defaultValue);\n const selected = isControlled ? (valueProp as FeedbackType | null) : internal;\n const submitted = selected != null;\n\n const choose = (type: FeedbackType) => {\n if (submitted || disabled) return;\n if (!isControlled) setInternal(type);\n onSubmit?.({ type });\n };\n\n const compactBtn = compact ? \"size-7 [&_svg]:size-3.5\" : undefined;\n\n const renderButton = (type: FeedbackType, label: string, Icon: typeof ThumbsUp) => {\n const active = selected === type;\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={label}\n aria-pressed={active}\n // After submit both are inert; keep the chosen one at full opacity.\n disabled={disabled || submitted}\n onClick={() => choose(type)}\n className={cn(\n \"text-muted-foreground hover:text-foreground\",\n active && \"text-primary disabled:opacity-100 [&_svg]:fill-current\",\n compactBtn,\n )}\n >\n <Icon aria-hidden=\"true\" />\n </Button>\n );\n };\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={t(\"ai.message.feedback\")}\n data-submitted={submitted || undefined}\n data-feedback={selected ?? undefined}\n className={cn(messageFeedbackVariants({ compact }), className)}\n {...props}\n >\n {renderButton(\"positive\", positiveLabel, ThumbsUp)}\n {renderButton(\"negative\", negativeLabel, ThumbsDown)}\n </div>\n );\n },\n);\n"],"mappings":";;;AAWA,SAAS,YAAY,gBAAqC;AAC1D,SAAS,YAAY,gBAAgB;AACrC,SAAS,WAA8B;AACvC,SAAS,cAAc;AACvB,SAAS,UAAU;AACnB,SAAS,iBAAiB;AAgFhB,cAMJ,YANI;AA5EH,IAAM,0BAA0B,IAAI,4BAA4B;AAAA,EACrE,UAAU;AAAA,IACR,SAAS,EAAE,MAAM,WAAW,OAAO,QAAQ;AAAA,EAC7C;AAAA,EACA,iBAAiB,EAAE,SAAS,MAAM;AACpC,CAAC;AAwBM,IAAM,kBAAkB;AAAA,EAC7B,SAASA,iBACP;AAAA,IACE,OAAO;AAAA,IACP,eAAe;AAAA,IACf;AAAA,IACA,WAAW;AAAA,IACX,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB;AAAA,IACA,GAAG;AAAA,EACL,GACA,KACA;AACA,UAAM,EAAE,EAAE,IAAI,UAAU;AACxB,UAAM,eAAe,cAAc;AACnC,UAAM,CAAC,UAAU,WAAW,IAAI,SAA8B,YAAY;AAC1E,UAAM,WAAW,eAAgB,YAAoC;AACrE,UAAM,YAAY,YAAY;AAE9B,UAAM,SAAS,CAAC,SAAuB;AACrC,UAAI,aAAa,SAAU;AAC3B,UAAI,CAAC,aAAc,aAAY,IAAI;AACnC,iBAAW,EAAE,KAAK,CAAC;AAAA,IACrB;AAEA,UAAM,aAAa,UAAU,4BAA4B;AAEzD,UAAM,eAAe,CAAC,MAAoB,OAAe,SAA0B;AACjF,YAAM,SAAS,aAAa;AAC5B,aACE;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,cAAY;AAAA,UACZ,gBAAc;AAAA,UAEd,UAAU,YAAY;AAAA,UACtB,SAAS,MAAM,OAAO,IAAI;AAAA,UAC1B,WAAW;AAAA,YACT;AAAA,YACA,UAAU;AAAA,YACV;AAAA,UACF;AAAA,UAEA,8BAAC,QAAK,eAAY,QAAO;AAAA;AAAA,MAC3B;AAAA,IAEJ;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,cAAY,EAAE,qBAAqB;AAAA,QACnC,kBAAgB,aAAa;AAAA,QAC7B,iBAAe,YAAY;AAAA,QAC3B,WAAW,GAAG,wBAAwB,EAAE,QAAQ,CAAC,GAAG,SAAS;AAAA,QAC5D,GAAG;AAAA,QAEH;AAAA,uBAAa,YAAY,eAAe,QAAQ;AAAA,UAChD,aAAa,YAAY,eAAe,UAAU;AAAA;AAAA;AAAA,IACrD;AAAA,EAEJ;AACF;","names":["MessageFeedback"]}
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import {
3
+ lazyFlowPart
4
+ } from "./chunk-NMVNNO3L.js";
5
+
6
+ // src/panel.tsx
7
+ import { Suspense } from "react";
8
+ import { jsx } from "react/jsx-runtime";
9
+ var PanelImpl = lazyFlowPart((m) => m.Panel);
10
+ var Panel = (props) => (
11
+ // An overlay inside an already-loaded `<Canvas>`, so there is no box to
12
+ // reserve — the engine chunk it needs is the one the canvas already fetched.
13
+ /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(PanelImpl, { ...props }) })
14
+ );
15
+
16
+ export {
17
+ Panel
18
+ };
19
+ //# sourceMappingURL=chunk-LMNSBOBG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/panel.tsx"],"sourcesContent":["\"use client\";\n\nimport type { Panel as PanelPrimitive } from \"@xyflow/react\";\nimport type { ComponentProps } from \"react\";\nimport { Suspense } from \"react\";\n\nimport { lazyFlowPart } from \"./_flow-lazy\";\n\nexport type PanelProps = ComponentProps<typeof PanelPrimitive>;\n\n/** React Flow lives behind a dynamic import — see `_flow-lazy.ts` and ADR 0019. */\nconst PanelImpl = lazyFlowPart<PanelProps>((m) => m.Panel);\n\nexport const Panel = (props: PanelProps) => (\n // An overlay inside an already-loaded `<Canvas>`, so there is no box to\n // reserve — the engine chunk it needs is the one the canvas already fetched.\n <Suspense fallback={null}>\n <PanelImpl {...props} />\n </Suspense>\n);\n"],"mappings":";;;;;;AAIA,SAAS,gBAAgB;AAarB;AANJ,IAAM,YAAY,aAAyB,CAAC,MAAM,EAAE,KAAK;AAElD,IAAM,QAAQ,CAAC;AAAA;AAAA;AAAA,EAGpB,oBAAC,YAAS,UAAU,MAClB,8BAAC,aAAW,GAAG,OAAO,GACxB;AAAA;","names":[]}
@@ -0,0 +1,42 @@
1
+ "use client";
2
+ import {
3
+ lazyFlowPart
4
+ } from "./chunk-NMVNNO3L.js";
5
+
6
+ // src/node.tsx
7
+ import {
8
+ CardAction,
9
+ CardContent,
10
+ CardDescription,
11
+ CardFooter,
12
+ CardHeader,
13
+ CardTitle
14
+ } from "@elabs-ai/components-ui";
15
+ import { cn } from "@elabs-ai/components-ui/lib/cn";
16
+ import { Suspense } from "react";
17
+ import { jsx } from "react/jsx-runtime";
18
+ var NodeImpl = lazyFlowPart((m) => m.Node);
19
+ var Node = (props) => /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(NodeImpl, { ...props }) });
20
+ var NodeHeader = ({ className, ...props }) => /* @__PURE__ */ jsx(
21
+ CardHeader,
22
+ {
23
+ className: cn("gap-0.5 rounded-t-md border-b bg-secondary p-3!", className),
24
+ ...props
25
+ }
26
+ );
27
+ var NodeTitle = (props) => /* @__PURE__ */ jsx(CardTitle, { ...props });
28
+ var NodeDescription = (props) => /* @__PURE__ */ jsx(CardDescription, { ...props });
29
+ var NodeAction = (props) => /* @__PURE__ */ jsx(CardAction, { ...props });
30
+ var NodeContent = ({ className, ...props }) => /* @__PURE__ */ jsx(CardContent, { className: cn("p-3", className), ...props });
31
+ var NodeFooter = ({ className, ...props }) => /* @__PURE__ */ jsx(CardFooter, { className: cn("rounded-b-md border-t bg-secondary p-3!", className), ...props });
32
+
33
+ export {
34
+ Node,
35
+ NodeHeader,
36
+ NodeTitle,
37
+ NodeDescription,
38
+ NodeAction,
39
+ NodeContent,
40
+ NodeFooter
41
+ };
42
+ //# sourceMappingURL=chunk-MBI7D6IL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/node.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n Card,\n CardAction,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { ComponentProps } from \"react\";\nimport { Suspense } from \"react\";\n\nimport { lazyFlowPart } from \"./_flow-lazy\";\n\nexport type NodeProps = ComponentProps<typeof Card> & {\n handles: {\n target: boolean;\n source: boolean;\n };\n};\n\n/**\n * React Flow lives behind a dynamic import — see `_flow-lazy.ts` and ADR 0019.\n * The WHOLE node (card + handles) is behind the boundary rather than just the\n * two `<Handle>`s: React Flow re-reads a node's handle bounds when its measured\n * box changes, so handles appearing inside an already-measured card could leave\n * the bounds stale. Going 0 → full size guarantees the re-measure.\n */\nconst NodeImpl = lazyFlowPart<NodeProps>((m) => m.Node);\n\nexport const Node = (props: NodeProps) => (\n <Suspense fallback={null}>\n <NodeImpl {...props} />\n </Suspense>\n);\n\nexport type NodeHeaderProps = ComponentProps<typeof CardHeader>;\n\nexport const NodeHeader = ({ className, ...props }: NodeHeaderProps) => (\n <CardHeader\n className={cn(\"gap-0.5 rounded-t-md border-b bg-secondary p-3!\", className)}\n {...props}\n />\n);\n\nexport type NodeTitleProps = ComponentProps<typeof CardTitle>;\n\nexport const NodeTitle = (props: NodeTitleProps) => <CardTitle {...props} />;\n\nexport type NodeDescriptionProps = ComponentProps<typeof CardDescription>;\n\nexport const NodeDescription = (props: NodeDescriptionProps) => <CardDescription {...props} />;\n\nexport type NodeActionProps = ComponentProps<typeof CardAction>;\n\nexport const NodeAction = (props: NodeActionProps) => <CardAction {...props} />;\n\nexport type NodeContentProps = ComponentProps<typeof CardContent>;\n\nexport const NodeContent = ({ className, ...props }: NodeContentProps) => (\n <CardContent className={cn(\"p-3\", className)} {...props} />\n);\n\nexport type NodeFooterProps = ComponentProps<typeof CardFooter>;\n\nexport const NodeFooter = ({ className, ...props }: NodeFooterProps) => (\n <CardFooter className={cn(\"rounded-b-md border-t bg-secondary p-3!\", className)} {...props} />\n);\n"],"mappings":";;;;;;AAEA;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,UAAU;AAEnB,SAAS,gBAAgB;AAsBrB;AAJJ,IAAM,WAAW,aAAwB,CAAC,MAAM,EAAE,IAAI;AAE/C,IAAM,OAAO,CAAC,UACnB,oBAAC,YAAS,UAAU,MAClB,8BAAC,YAAU,GAAG,OAAO,GACvB;AAKK,IAAM,aAAa,CAAC,EAAE,WAAW,GAAG,MAAM,MAC/C;AAAA,EAAC;AAAA;AAAA,IACC,WAAW,GAAG,mDAAmD,SAAS;AAAA,IACzE,GAAG;AAAA;AACN;AAKK,IAAM,YAAY,CAAC,UAA0B,oBAAC,aAAW,GAAG,OAAO;AAInE,IAAM,kBAAkB,CAAC,UAAgC,oBAAC,mBAAiB,GAAG,OAAO;AAIrF,IAAM,aAAa,CAAC,UAA2B,oBAAC,cAAY,GAAG,OAAO;AAItE,IAAM,cAAc,CAAC,EAAE,WAAW,GAAG,MAAM,MAChD,oBAAC,eAAY,WAAW,GAAG,OAAO,SAAS,GAAI,GAAG,OAAO;AAKpD,IAAM,aAAa,CAAC,EAAE,WAAW,GAAG,MAAM,MAC/C,oBAAC,cAAW,WAAW,GAAG,2CAA2C,SAAS,GAAI,GAAG,OAAO;","names":[]}