@elabs-ai/components-ai 4.1.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 (527) hide show
  1. package/README.md +3 -3
  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 +403 -108
  300. package/dist/index.js +671 -13205
  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 +12 -10
  405. package/schemas/a2ui-surface.v1.schema.json +5425 -0
  406. package/src/__contract__/audio-visualizer.contract.test.tsx +49 -0
  407. package/src/__contract__/chat-shell.contract.test.tsx +49 -0
  408. package/src/__contract__/grouped-parts.contract.test.tsx +49 -0
  409. package/src/__contract__/image.contract.test.tsx +49 -0
  410. package/src/__contract__/markdown-view.contract.test.tsx +49 -0
  411. package/src/__contract__/message-feedback.contract.test.tsx +49 -0
  412. package/src/__contract__/message-form.contract.test.tsx +49 -0
  413. package/src/__contract__/message-table.contract.test.tsx +49 -0
  414. package/src/__contract__/model-provider-logo.contract.test.tsx +49 -0
  415. package/src/__contract__/persona.contract.test.tsx +49 -0
  416. package/src/__contract__/prompt-input-effort.contract.test.tsx +49 -0
  417. package/src/__contract__/prompt-input-mode.contract.test.tsx +49 -0
  418. package/src/_chat-shell-rail.tsx +4 -2
  419. package/src/_flow-boundary.tsx +2 -2
  420. package/src/_lazy-cjk.test.ts +43 -0
  421. package/src/_lazy-cjk.ts +73 -0
  422. package/src/_lazy-math.test.ts +63 -0
  423. package/src/_lazy-math.ts +90 -0
  424. package/src/_persona-rive.tsx +27 -41
  425. package/src/_streamdown-i18n.ts +73 -21
  426. package/src/_streamdown-safety.ts +2 -2
  427. package/src/_theme-scope-store.test.ts +83 -0
  428. package/src/_theme-scope-store.ts +103 -0
  429. package/src/a2ui/a2ui-surface.stories.tsx +662 -0
  430. package/src/a2ui/a2ui-surface.test.tsx +201 -0
  431. package/src/a2ui/a2ui-surface.tsx +354 -0
  432. package/src/a2ui/catalog.source.json +772 -0
  433. package/src/a2ui/core/a2ui-core.test.ts +178 -0
  434. package/src/a2ui/core/catalog.generated.ts +1006 -0
  435. package/src/a2ui/core/complete-json.ts +81 -0
  436. package/src/a2ui/core/index.ts +10 -0
  437. package/src/a2ui/core/schema.ts +111 -0
  438. package/src/a2ui/core/spec.ts +148 -0
  439. package/src/a2ui/core/validate.ts +266 -0
  440. package/src/a2ui/index.ts +7 -0
  441. package/src/a2ui/ui-catalog.tsx +225 -0
  442. package/src/a2ui/wave1-chart-spec.test.ts +87 -0
  443. package/src/a2ui/wave2-chart-spec.test.ts +108 -0
  444. package/src/agent-event.tsx +1 -1
  445. package/src/agent.tsx +18 -13
  446. package/src/agentic-workspace.stories.tsx +6 -45
  447. package/src/artifact.tsx +2 -2
  448. package/src/asset-preview.test.tsx +40 -0
  449. package/src/asset-preview.tsx +83 -12
  450. package/src/attachments.tsx +7 -4
  451. package/src/chat-shell.test.tsx +40 -10
  452. package/src/chat-shell.tsx +90 -44
  453. package/src/chat.stories.tsx +47 -42
  454. package/src/code-block.test.tsx +100 -1
  455. package/src/code-block.tsx +166 -103
  456. package/src/commit.tsx +30 -41
  457. package/src/composer.stories.tsx +4 -5
  458. package/src/composer.test.tsx +45 -0
  459. package/src/composer.tsx +104 -21
  460. package/src/confirmation.tsx +1 -1
  461. package/src/context-panel.stories.tsx +1 -1
  462. package/src/context-panel.tsx +2 -2
  463. package/src/conversation.stories.tsx +24 -0
  464. package/src/conversation.test.tsx +69 -0
  465. package/src/conversation.tsx +47 -8
  466. package/src/diff-view.stories.tsx +79 -0
  467. package/src/diff-view.test.tsx +52 -2
  468. package/src/diff-view.tsx +92 -36
  469. package/src/environment-variables.tsx +20 -37
  470. package/src/file-tree.test.tsx +21 -0
  471. package/src/file-tree.tsx +33 -16
  472. package/src/gallery.stories.tsx +42 -0
  473. package/src/gallery.tsx +2 -2
  474. package/src/grouped-parts.stories.tsx +23 -0
  475. package/src/grouped-parts.tsx +1 -1
  476. package/src/index.ts +1 -0
  477. package/src/inline-citation.tsx +5 -5
  478. package/src/jsx-preview.tsx +151 -43
  479. package/src/markdown-view.test.tsx +7 -3
  480. package/src/markdown-view.tsx +8 -1
  481. package/src/message-compare.stories.tsx +40 -0
  482. package/src/message-compare.tsx +2 -1
  483. package/src/message-form.stories.tsx +36 -3
  484. package/src/message-form.test.tsx +8 -2
  485. package/src/message-form.tsx +16 -8
  486. package/src/message-table.stories.tsx +26 -2
  487. package/src/message-table.test.tsx +7 -0
  488. package/src/message-table.tsx +9 -5
  489. package/src/message.test.tsx +73 -3
  490. package/src/message.tsx +36 -12
  491. package/src/model-provider-logo.test.tsx +57 -3
  492. package/src/model-provider-logo.tsx +45 -11
  493. package/src/open-in-chat.tsx +50 -29
  494. package/src/package-info.tsx +23 -20
  495. package/src/prompt-input-slash.stories.tsx +1 -1
  496. package/src/prompt-input.test.tsx +67 -1
  497. package/src/prompt-input.tsx +42 -4
  498. package/src/queue.tsx +4 -4
  499. package/src/reasoning.stories.tsx +27 -0
  500. package/src/reasoning.tsx +17 -6
  501. package/src/sandbox.tsx +3 -3
  502. package/src/schema-display.test.tsx +56 -0
  503. package/src/schema-display.tsx +68 -37
  504. package/src/session-header.stories.tsx +35 -1
  505. package/src/session-header.tsx +1 -1
  506. package/src/snippet.test.tsx +6 -2
  507. package/src/snippet.tsx +14 -34
  508. package/src/sources.stories.tsx +30 -0
  509. package/src/sources.tsx +4 -1
  510. package/src/speech-input.test.tsx +109 -0
  511. package/src/speech-input.tsx +31 -3
  512. package/src/stack-trace.tsx +20 -36
  513. package/src/streamdown-i18n.test.tsx +23 -0
  514. package/src/templates-ai-assistant.stories.tsx +151 -87
  515. package/src/test-results.tsx +47 -27
  516. package/src/token-usage.tsx +6 -6
  517. package/src/tool.stories.tsx +39 -0
  518. package/src/tool.test.tsx +65 -0
  519. package/src/tool.tsx +61 -25
  520. package/src/toolbar.tsx +0 -10
  521. package/src/transcription.tsx +1 -1
  522. package/src/voice-selector.tsx +5 -5
  523. package/src/web-preview.test.tsx +51 -1
  524. package/src/web-preview.tsx +39 -8
  525. package/dist/_flow-boundary-SHNWLQG5.js.map +0 -1
  526. package/dist/_persona-rive-JEG44YHX.js.map +0 -1
  527. /package/dist/{_audio-player-media-chrome-T3XVXWRZ.js.map → _audio-player-media-chrome.js.map} +0 -0
@@ -0,0 +1,264 @@
1
+ "use client";
2
+ import {
3
+ Shimmer
4
+ } from "./chunk-3YPT3V7L.js";
5
+
6
+ // src/message-compare.tsx
7
+ import {
8
+ createContext,
9
+ forwardRef,
10
+ useCallback,
11
+ useEffect,
12
+ useId,
13
+ useMemo,
14
+ useRef,
15
+ useState,
16
+ use,
17
+ Children,
18
+ Fragment
19
+ } from "react";
20
+ import { AlertTriangleIcon } from "lucide-react";
21
+ import {
22
+ ResizableHandle,
23
+ ResizablePanel,
24
+ ResizablePanelGroup,
25
+ Tabs,
26
+ TabsContent,
27
+ TabsList,
28
+ TabsTrigger,
29
+ useIsMobile,
30
+ useLocale
31
+ } from "@elabs-ai/components-ui";
32
+ import { cn } from "@elabs-ai/components-ui/lib/cn";
33
+ import { jsx, jsxs } from "react/jsx-runtime";
34
+ var MessageCompareContext = createContext(null);
35
+ function useMessageCompare() {
36
+ const ctx = use(MessageCompareContext);
37
+ if (!ctx) {
38
+ throw new Error("useMessageCompare must be used within a MessageCompareProvider.");
39
+ }
40
+ return ctx;
41
+ }
42
+ var MessageCompareInternalContext = createContext(null);
43
+ function useMessageCompareInternal() {
44
+ const ctx = use(MessageCompareInternalContext);
45
+ if (!ctx) {
46
+ throw new Error("MessageCompareColumn must be used within a MessageCompare.");
47
+ }
48
+ return ctx;
49
+ }
50
+ function MessageCompareProvider({
51
+ children,
52
+ columns,
53
+ syncScroll: syncScrollProp,
54
+ defaultSyncScroll = false,
55
+ onSyncScrollChange
56
+ }) {
57
+ const isControlled = syncScrollProp !== void 0;
58
+ const [internalSyncScroll, setInternalSyncScroll] = useState(defaultSyncScroll);
59
+ const syncScroll = isControlled ? syncScrollProp : internalSyncScroll;
60
+ const isMobile = useIsMobile();
61
+ const setSyncScroll = useCallback(
62
+ (value) => {
63
+ if (!isControlled) setInternalSyncScroll(value);
64
+ onSyncScrollChange?.(value);
65
+ },
66
+ [isControlled, onSyncScrollChange]
67
+ );
68
+ const columnsRef = useRef(/* @__PURE__ */ new Map());
69
+ const syncScrollRef = useRef(syncScroll);
70
+ useEffect(() => {
71
+ syncScrollRef.current = syncScroll;
72
+ }, [syncScroll]);
73
+ const registerColumn = useCallback((id, node) => {
74
+ if (node) columnsRef.current.set(id, { node, suppressNextScroll: false });
75
+ else columnsRef.current.delete(id);
76
+ }, []);
77
+ const reportScroll = useCallback((id) => {
78
+ const entry = columnsRef.current.get(id);
79
+ if (!entry) return;
80
+ if (entry.suppressNextScroll) {
81
+ entry.suppressNextScroll = false;
82
+ return;
83
+ }
84
+ if (!syncScrollRef.current) return;
85
+ const { node } = entry;
86
+ const range = node.scrollHeight - node.clientHeight;
87
+ const ratio = range > 0 ? node.scrollTop / range : 0;
88
+ columnsRef.current.forEach((other, otherId) => {
89
+ if (otherId === id) return;
90
+ const otherRange = other.node.scrollHeight - other.node.clientHeight;
91
+ if (otherRange <= 0) return;
92
+ const previousScrollTop = other.node.scrollTop;
93
+ other.node.scrollTop = ratio * otherRange;
94
+ if (other.node.scrollTop !== previousScrollTop) {
95
+ other.suppressNextScroll = true;
96
+ }
97
+ });
98
+ }, []);
99
+ const state = useMemo(() => ({ syncScroll }), [syncScroll]);
100
+ const actions = useMemo(() => ({ setSyncScroll }), [setSyncScroll]);
101
+ const meta = useMemo(() => ({ columns, isMobile }), [columns, isMobile]);
102
+ const contextValue = useMemo(
103
+ () => ({ state, actions, meta }),
104
+ [state, actions, meta]
105
+ );
106
+ const internalValue = useMemo(
107
+ () => ({ registerColumn, reportScroll }),
108
+ [registerColumn, reportScroll]
109
+ );
110
+ return /* @__PURE__ */ jsx(MessageCompareContext, { value: contextValue, children: /* @__PURE__ */ jsx(MessageCompareInternalContext, { value: internalValue, children }) });
111
+ }
112
+ function columnKey(child, index) {
113
+ return child.key ?? String(index);
114
+ }
115
+ var MessageCompare = forwardRef(
116
+ function MessageCompare2({
117
+ children,
118
+ columns,
119
+ syncScroll,
120
+ defaultSyncScroll,
121
+ onSyncScrollChange,
122
+ tabsLabel,
123
+ className,
124
+ ...props
125
+ }, ref) {
126
+ return /* @__PURE__ */ jsx(
127
+ MessageCompareProvider,
128
+ {
129
+ columns,
130
+ defaultSyncScroll,
131
+ onSyncScrollChange,
132
+ syncScroll,
133
+ children: /* @__PURE__ */ jsx(MessageCompareLayout, { ref, className, tabsLabel, ...props, children })
134
+ }
135
+ );
136
+ }
137
+ );
138
+ var MessageCompareLayout = forwardRef(
139
+ function MessageCompareLayout2({ children, tabsLabel, className, ...props }, ref) {
140
+ const { meta } = useMessageCompare();
141
+ const { t } = useLocale();
142
+ const items = Children.toArray(children);
143
+ if (meta.isMobile) {
144
+ const firstKey = items[0] ? columnKey(items[0], 0) : void 0;
145
+ return /* @__PURE__ */ jsx(
146
+ "div",
147
+ {
148
+ ref,
149
+ className: cn("flex h-full min-h-0 flex-col", className),
150
+ "data-slot": "message-compare",
151
+ ...props,
152
+ children: /* @__PURE__ */ jsxs(Tabs, { className: "flex h-full min-h-0 flex-col", defaultValue: firstKey, children: [
153
+ /* @__PURE__ */ jsx(
154
+ TabsList,
155
+ {
156
+ "aria-label": tabsLabel ?? t("ai.messageCompare.tabs"),
157
+ className: "w-full shrink-0",
158
+ children: items.map((child, index) => {
159
+ const key = columnKey(child, index);
160
+ const props2 = child.props;
161
+ return /* @__PURE__ */ jsx(TabsTrigger, { className: "flex-1", value: key, children: props2.model?.name ?? key }, key);
162
+ })
163
+ }
164
+ ),
165
+ items.map((child, index) => {
166
+ const key = columnKey(child, index);
167
+ return /* @__PURE__ */ jsx(
168
+ TabsContent,
169
+ {
170
+ className: "mt-2 min-h-0 flex-1 data-[state=active]:flex",
171
+ forceMount: true,
172
+ value: key,
173
+ children: child
174
+ },
175
+ key
176
+ );
177
+ })
178
+ ] })
179
+ }
180
+ );
181
+ }
182
+ return /* @__PURE__ */ jsx(
183
+ "div",
184
+ {
185
+ ref,
186
+ className: cn("h-full min-h-0", className),
187
+ "data-slot": "message-compare",
188
+ ...props,
189
+ children: /* @__PURE__ */ jsx(ResizablePanelGroup, { direction: "horizontal", children: items.map((child, index) => /* @__PURE__ */ jsxs(Fragment, { children: [
190
+ index > 0 && /* @__PURE__ */ jsx(ResizableHandle, { withHandle: true }),
191
+ /* @__PURE__ */ jsx(ResizablePanel, { defaultSize: 100 / items.length, minSize: 15, children: child })
192
+ ] }, columnKey(child, index))) })
193
+ }
194
+ );
195
+ }
196
+ );
197
+ var MessageCompareColumn = forwardRef(
198
+ function MessageCompareColumn2({ model, status, children, className, id: idProp, ...props }, ref) {
199
+ const { registerColumn, reportScroll } = useMessageCompareInternal();
200
+ const { t } = useLocale();
201
+ const generatedId = useId();
202
+ const id = idProp ?? generatedId;
203
+ const setScrollRef = useCallback(
204
+ (node) => registerColumn(id, node),
205
+ [id, registerColumn]
206
+ );
207
+ const handleScroll = useCallback(() => reportScroll(id), [id, reportScroll]);
208
+ const isBusy = status === "streaming" || status === "submitted";
209
+ const isError = status === "error";
210
+ return /* @__PURE__ */ jsxs(
211
+ "div",
212
+ {
213
+ ref,
214
+ "aria-label": model.name,
215
+ className: cn("flex h-full min-h-0 min-w-0 flex-col", className),
216
+ "data-slot": "message-compare-column",
217
+ id,
218
+ role: "region",
219
+ ...props,
220
+ children: [
221
+ /* @__PURE__ */ jsxs(
222
+ "div",
223
+ {
224
+ className: "flex shrink-0 items-center justify-between gap-2 border-b px-3 py-2",
225
+ "data-slot": "message-compare-column-header",
226
+ children: [
227
+ /* @__PURE__ */ jsx("span", { className: "truncate text-body font-medium", children: model.name }),
228
+ isBusy && /* @__PURE__ */ jsx("span", { className: "shrink-0", role: "status", "aria-live": "polite", children: /* @__PURE__ */ jsx(Shimmer, { as: "span", className: "text-meta", duration: 1.5, children: t("loading") }) }),
229
+ isError && /* @__PURE__ */ jsxs(
230
+ "span",
231
+ {
232
+ className: "flex shrink-0 items-center gap-1 text-meta text-destructive-text",
233
+ role: "alert",
234
+ children: [
235
+ /* @__PURE__ */ jsx(AlertTriangleIcon, { "aria-hidden": "true", className: "size-3.5" }),
236
+ t("ai.messageCompare.error")
237
+ ]
238
+ }
239
+ )
240
+ ]
241
+ }
242
+ ),
243
+ /* @__PURE__ */ jsx(
244
+ "div",
245
+ {
246
+ className: "min-h-0 flex-1 overflow-y-auto p-4 focus-ring-inset",
247
+ "data-slot": "message-compare-column-body",
248
+ onScroll: handleScroll,
249
+ ref: setScrollRef,
250
+ tabIndex: 0,
251
+ children
252
+ }
253
+ )
254
+ ]
255
+ }
256
+ );
257
+ }
258
+ );
259
+
260
+ export {
261
+ MessageCompare,
262
+ MessageCompareColumn
263
+ };
264
+ //# sourceMappingURL=chunk-5VGYZ62I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/message-compare.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * MessageCompare — side-by-side comparison of 2-4 model responses to the same\n * prompt (issue #23). The one-at-a-time sibling of `MessageBranch`\n * (`message.tsx`): `MessageBranch` switches between responses; `MessageCompare`\n * shows several at once, each with its own status, its own scroll position, and\n * its own `MessageFeedback`.\n *\n * Architecture (lifted state, INTERNAL-ONLY — not the ChartFrame/PromptInputProvider\n * PUBLIC-provider shape): `MessageCompareProvider` + `useMessageCompare()` hold the\n * `state`/`actions`/`meta` that back the grid, but both are unexported implementation\n * details, like `ChartFrameProvider` (`.claude/rules/chart-components.md` — \"not\n * exported publicly\"). `MessageCompare` always mounts its own private instance and\n * treats every child as a column (`Children.toArray`), so there is no seam where an\n * ambient provider or a sibling control could attach to that SAME instance without\n * corrupting the grid (an extra `ResizablePanel`, or a spurious tab with no model\n * name). The supported way to add a \"Sync scroll\" toggle beside the grid is the\n * ordinary controlled-prop pattern — external `useState` plus `syncScroll`/\n * `onSyncScrollChange` on `MessageCompare` (see `SyncedScrollDemo` in\n * `message-compare.stories.tsx`) — which needs neither export. Column registration\n * and the scroll-sync broadcast live on a second, also-unexported context — the same\n * internal-context-splitting shape `context-panel.tsx` uses for its own refs.\n *\n * Independent streaming/scroll (the issue's core requirement): a column never\n * auto-scrolls itself or a sibling — there is no shared \"stick to bottom\"\n * driver here (that's `Conversation`'s job for a single transcript). Content\n * growing in one column therefore cannot move a sibling's scroll position by\n * construction; the only way scroll moves across columns is the opt-in\n * `syncScroll` broadcast below.\n *\n * Responsive collapse: under the `md` breakpoint (768px, the same threshold\n * `useIsMobile` already drives for `ContextPanel`'s Sheet fallback) the\n * side-by-side grid becomes a `Tabs` strip, per the issue. Every column stays\n * mounted (`forceMount` + Radix's own `hidden` attribute on the inactive\n * panel) rather than unmounting on tab switch, so a column's scroll position\n * survives flipping between tabs.\n */\n\nimport {\n createContext,\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n use,\n Children,\n Fragment,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport type { ChatStatus } from \"ai\";\nimport { AlertTriangleIcon } from \"lucide-react\";\nimport {\n ResizableHandle,\n ResizablePanel,\n ResizablePanelGroup,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n useIsMobile,\n useLocale,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { Shimmer } from \"./shimmer\";\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\n/** The minimum a column needs to identify itself — mainly its accessible name. */\nexport interface MessageCompareModel {\n /** Rendered in the column header AND used as the region's `aria-label`. */\n name: string;\n /** Optional stable id, e.g. for analytics — not used for layout or a11y. */\n id?: string;\n}\n\n/** `MessageCompare` supports 2-4 side-by-side responses (issue #23). */\nexport type MessageCompareColumnsCount = 2 | 3 | 4;\n\ninterface MessageCompareState {\n syncScroll: boolean;\n}\n\ninterface MessageCompareActions {\n setSyncScroll: (value: boolean) => void;\n}\n\ninterface MessageCompareMeta {\n columns: MessageCompareColumnsCount;\n isMobile: boolean;\n}\n\ninterface MessageCompareContextValue {\n state: MessageCompareState;\n actions: MessageCompareActions;\n meta: MessageCompareMeta;\n}\n\n// ── Internal state context (NOT exported — see the file's architecture comment) ─\n\nconst MessageCompareContext = createContext<MessageCompareContextValue | null>(null);\n\n/**\n * INTERNAL — reads the `state`/`actions`/`meta` `MessageCompareProvider` computes.\n * Not exported: `MessageCompare` always owns a private `MessageCompareProvider`\n * instance, so there is no ambient instance for an outside caller to read.\n */\nfunction useMessageCompare(): MessageCompareContextValue {\n const ctx = use(MessageCompareContext);\n if (!ctx) {\n throw new Error(\"useMessageCompare must be used within a MessageCompareProvider.\");\n }\n return ctx;\n}\n\n// ── Internal context (column registry + scroll broadcast — not public API) ───\n\ninterface MessageCompareColumnEntry {\n node: HTMLDivElement;\n /** Set right before a programmatic scroll so the column's own handler knows\n * to swallow the resulting `scroll` event instead of re-broadcasting it. */\n suppressNextScroll: boolean;\n}\n\ninterface MessageCompareInternalValue {\n registerColumn: (id: string, node: HTMLDivElement | null) => void;\n reportScroll: (id: string) => void;\n}\n\nconst MessageCompareInternalContext = createContext<MessageCompareInternalValue | null>(null);\n\nfunction useMessageCompareInternal(): MessageCompareInternalValue {\n const ctx = use(MessageCompareInternalContext);\n if (!ctx) {\n throw new Error(\"MessageCompareColumn must be used within a MessageCompare.\");\n }\n return ctx;\n}\n\n// ── Provider (INTERNAL — not exported; see the file's architecture comment) ────\n\ninterface MessageCompareProviderProps {\n children: ReactNode;\n columns: MessageCompareColumnsCount;\n /** Controlled sync-scroll flag. Omit for the uncontrolled default. */\n syncScroll?: boolean;\n /** Uncontrolled initial value. @default false */\n defaultSyncScroll?: boolean;\n onSyncScrollChange?: (value: boolean) => void;\n}\n\nfunction MessageCompareProvider({\n children,\n columns,\n syncScroll: syncScrollProp,\n defaultSyncScroll = false,\n onSyncScrollChange,\n}: MessageCompareProviderProps) {\n const isControlled = syncScrollProp !== undefined;\n const [internalSyncScroll, setInternalSyncScroll] = useState(defaultSyncScroll);\n const syncScroll = isControlled ? syncScrollProp : internalSyncScroll;\n const isMobile = useIsMobile();\n\n const setSyncScroll = useCallback(\n (value: boolean) => {\n if (!isControlled) setInternalSyncScroll(value);\n onSyncScrollChange?.(value);\n },\n [isControlled, onSyncScrollChange],\n );\n\n // A ref, not state: scroll happens far too often to route through a render.\n const columnsRef = useRef<Map<string, MessageCompareColumnEntry>>(new Map());\n const syncScrollRef = useRef(syncScroll);\n useEffect(() => {\n syncScrollRef.current = syncScroll;\n }, [syncScroll]);\n\n const registerColumn = useCallback((id: string, node: HTMLDivElement | null) => {\n if (node) columnsRef.current.set(id, { node, suppressNextScroll: false });\n else columnsRef.current.delete(id);\n }, []);\n\n const reportScroll = useCallback((id: string) => {\n const entry = columnsRef.current.get(id);\n if (!entry) return;\n\n // This scroll was OUR OWN programmatic write (a broadcast landing on this\n // column) — swallow it once rather than re-broadcasting, which is what\n // would otherwise ping-pong two synced columns back and forth.\n if (entry.suppressNextScroll) {\n entry.suppressNextScroll = false;\n return;\n }\n\n if (!syncScrollRef.current) return;\n\n const { node } = entry;\n const range = node.scrollHeight - node.clientHeight;\n const ratio = range > 0 ? node.scrollTop / range : 0;\n\n columnsRef.current.forEach((other, otherId) => {\n if (otherId === id) return;\n const otherRange = other.node.scrollHeight - other.node.clientHeight;\n if (otherRange <= 0) return;\n // Assign first, THEN compare the browser's actual (possibly rounded)\n // scrollTop to what it was before — never predict equality from the\n // unrounded `ratio * otherRange` math, since scrollTop is an integer\n // pixel value and the destination can already sit at that pixel. Only\n // arm suppression when the write really changed something: if it\n // didn't, no scroll event will fire to clear the flag, and the\n // destination's NEXT real user scroll (a single keyboard PageDown/Home\n // in particular) would otherwise be silently swallowed instead of\n // propagating to its siblings (#12/#53 review, P2).\n const previousScrollTop = other.node.scrollTop;\n other.node.scrollTop = ratio * otherRange;\n if (other.node.scrollTop !== previousScrollTop) {\n other.suppressNextScroll = true;\n }\n });\n }, []);\n\n const state = useMemo<MessageCompareState>(() => ({ syncScroll }), [syncScroll]);\n const actions = useMemo<MessageCompareActions>(() => ({ setSyncScroll }), [setSyncScroll]);\n const meta = useMemo<MessageCompareMeta>(() => ({ columns, isMobile }), [columns, isMobile]);\n const contextValue = useMemo<MessageCompareContextValue>(\n () => ({ state, actions, meta }),\n [state, actions, meta],\n );\n const internalValue = useMemo<MessageCompareInternalValue>(\n () => ({ registerColumn, reportScroll }),\n [registerColumn, reportScroll],\n );\n\n return (\n <MessageCompareContext value={contextValue}>\n <MessageCompareInternalContext value={internalValue}>\n {children}\n </MessageCompareInternalContext>\n </MessageCompareContext>\n );\n}\n\n// ── MessageCompare (layout) ───────────────────────────────────────────────────\n\nfunction columnKey(child: ReactElement, index: number): string {\n return child.key ?? String(index);\n}\n\nexport type MessageCompareProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n /** `MessageCompareColumn` elements — 2 to 4. */\n children: ReactNode;\n columns: MessageCompareColumnsCount;\n /** Controlled sync-scroll flag. Omit for the uncontrolled default (off). */\n syncScroll?: boolean;\n /** Uncontrolled initial value. @default false */\n defaultSyncScroll?: boolean;\n onSyncScrollChange?: (value: boolean) => void;\n /** aria-label for the narrow-viewport tab strip. Defaults to microcopy. */\n tabsLabel?: string;\n};\n\n/**\n * Responsive side-by-side comparison of 2-4 `MessageCompareColumn`s. Desktop:\n * resizable columns (`ResizablePanelGroup`). Under `md`: a `Tabs` strip, per\n * the issue's named narrow-viewport treatment.\n */\nexport const MessageCompare = forwardRef<HTMLDivElement, MessageCompareProps>(\n function MessageCompare(\n {\n children,\n columns,\n syncScroll,\n defaultSyncScroll,\n onSyncScrollChange,\n tabsLabel,\n className,\n ...props\n },\n ref,\n ) {\n return (\n <MessageCompareProvider\n columns={columns}\n defaultSyncScroll={defaultSyncScroll}\n onSyncScrollChange={onSyncScrollChange}\n syncScroll={syncScroll}\n >\n <MessageCompareLayout ref={ref} className={className} tabsLabel={tabsLabel} {...props}>\n {children}\n </MessageCompareLayout>\n </MessageCompareProvider>\n );\n },\n);\n\ntype MessageCompareLayoutProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n children: ReactNode;\n tabsLabel?: string;\n};\n\nconst MessageCompareLayout = forwardRef<HTMLDivElement, MessageCompareLayoutProps>(\n function MessageCompareLayout({ children, tabsLabel, className, ...props }, ref) {\n const { meta } = useMessageCompare();\n const { t } = useLocale();\n const items = Children.toArray(children) as ReactElement[];\n\n if (meta.isMobile) {\n const firstKey = items[0] ? columnKey(items[0], 0) : undefined;\n return (\n <div\n ref={ref}\n className={cn(\"flex h-full min-h-0 flex-col\", className)}\n data-slot=\"message-compare\"\n {...props}\n >\n <Tabs className=\"flex h-full min-h-0 flex-col\" defaultValue={firstKey}>\n <TabsList\n aria-label={tabsLabel ?? t(\"ai.messageCompare.tabs\")}\n className=\"w-full shrink-0\"\n >\n {items.map((child, index) => {\n const key = columnKey(child, index);\n const props = child.props as { model?: MessageCompareModel };\n return (\n <TabsTrigger className=\"flex-1\" key={key} value={key}>\n {props.model?.name ?? key}\n </TabsTrigger>\n );\n })}\n </TabsList>\n {items.map((child, index) => {\n const key = columnKey(child, index);\n return (\n <TabsContent\n className=\"mt-2 min-h-0 flex-1 data-[state=active]:flex\"\n forceMount\n key={key}\n value={key}\n >\n {child}\n </TabsContent>\n );\n })}\n </Tabs>\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n className={cn(\"h-full min-h-0\", className)}\n data-slot=\"message-compare\"\n {...props}\n >\n <ResizablePanelGroup direction=\"horizontal\">\n {items.map((child, index) => (\n <Fragment key={columnKey(child, index)}>\n {index > 0 && <ResizableHandle withHandle />}\n <ResizablePanel defaultSize={100 / items.length} minSize={15}>\n {child}\n </ResizablePanel>\n </Fragment>\n ))}\n </ResizablePanelGroup>\n </div>\n );\n },\n);\n\n// ── MessageCompareColumn ──────────────────────────────────────────────────────\n\nexport type MessageCompareColumnProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n /** Identifies the column — its `name` becomes the region's accessible name. */\n model: MessageCompareModel;\n /** In-flight state for this column's OWN response, independent of siblings. */\n status?: ChatStatus;\n /** The consumer's own `Message`/`MessageResponse` composition for this column. */\n children?: ReactNode;\n};\n\n/**\n * One labelled, independently-scrolling response column. `role=\"region\"` +\n * `aria-label={model.name}` so a screen-reader user can tell which answer\n * they're in (issue #23 a11y requirement).\n */\nexport const MessageCompareColumn = forwardRef<HTMLDivElement, MessageCompareColumnProps>(\n function MessageCompareColumn({ model, status, children, className, id: idProp, ...props }, ref) {\n const { registerColumn, reportScroll } = useMessageCompareInternal();\n const { t } = useLocale();\n const generatedId = useId();\n const id = idProp ?? generatedId;\n\n const setScrollRef = useCallback(\n (node: HTMLDivElement | null) => registerColumn(id, node),\n [id, registerColumn],\n );\n const handleScroll = useCallback(() => reportScroll(id), [id, reportScroll]);\n\n const isBusy = status === \"streaming\" || status === \"submitted\";\n const isError = status === \"error\";\n\n return (\n <div\n ref={ref}\n aria-label={model.name}\n className={cn(\"flex h-full min-h-0 min-w-0 flex-col\", className)}\n data-slot=\"message-compare-column\"\n id={id}\n role=\"region\"\n {...props}\n >\n {/* header-band-exempt: a column header inside the comparison grid, not shell chrome */}\n <div\n className=\"flex shrink-0 items-center justify-between gap-2 border-b px-3 py-2\"\n data-slot=\"message-compare-column-header\"\n >\n <span className=\"truncate text-body font-medium\">{model.name}</span>\n {isBusy && (\n <span className=\"shrink-0\" role=\"status\" aria-live=\"polite\">\n <Shimmer as=\"span\" className=\"text-meta\" duration={1.5}>\n {t(\"loading\")}\n </Shimmer>\n </span>\n )}\n {isError && (\n <span\n className=\"flex shrink-0 items-center gap-1 text-meta text-destructive-text\"\n role=\"alert\"\n >\n <AlertTriangleIcon aria-hidden=\"true\" className=\"size-3.5\" />\n {t(\"ai.messageCompare.error\")}\n </span>\n )}\n </div>\n <div\n className=\"min-h-0 flex-1 overflow-y-auto p-4 focus-ring-inset\"\n data-slot=\"message-compare-column-body\"\n onScroll={handleScroll}\n ref={setScrollRef}\n tabIndex={0}\n >\n {children}\n </div>\n </div>\n );\n },\n);\n"],"mappings":"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","names":["MessageCompare","MessageCompareLayout","props","MessageCompareColumn"]}
@@ -0,0 +1,21 @@
1
+ "use client";
2
+ import {
3
+ lazyFlowPart
4
+ } from "./chunk-NMVNNO3L.js";
5
+
6
+ // src/edge.tsx
7
+ import { Suspense } from "react";
8
+ import { jsx } from "react/jsx-runtime";
9
+ var AnimatedImpl = lazyFlowPart((m) => m.EdgeAnimated);
10
+ var TemporaryImpl = lazyFlowPart((m) => m.EdgeTemporary);
11
+ var Animated = (props) => /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(AnimatedImpl, { ...props }) });
12
+ var Temporary = (props) => /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(TemporaryImpl, { ...props }) });
13
+ var Edge = {
14
+ Animated,
15
+ Temporary
16
+ };
17
+
18
+ export {
19
+ Edge
20
+ };
21
+ //# sourceMappingURL=chunk-6IQPH2OS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/edge.tsx"],"sourcesContent":["\"use client\";\n\nimport type { EdgeProps } from \"@xyflow/react\";\nimport { Suspense } from \"react\";\n\nimport { lazyFlowPart } from \"./_flow-lazy\";\n\n/**\n * React Flow lives behind a dynamic import — see `_flow-lazy.ts` and ADR 0019.\n * `EdgeProps` above is a TYPE import and erases.\n */\nconst AnimatedImpl = lazyFlowPart<EdgeProps>((m) => m.EdgeAnimated);\nconst TemporaryImpl = lazyFlowPart<EdgeProps>((m) => m.EdgeTemporary);\n\n// Edges render inside React Flow's `<svg>`, so the fallback must be `null` —\n// there is no box to reserve, and the engine chunk is the one the surrounding\n// `<Canvas>` already fetched.\nconst Animated = (props: EdgeProps) => (\n <Suspense fallback={null}>\n <AnimatedImpl {...props} />\n </Suspense>\n);\n\nconst Temporary = (props: EdgeProps) => (\n <Suspense fallback={null}>\n <TemporaryImpl {...props} />\n </Suspense>\n);\n\nexport const Edge = {\n Animated,\n Temporary,\n};\n"],"mappings":";;;;;;AAGA,SAAS,gBAAgB;AAgBrB;AARJ,IAAM,eAAe,aAAwB,CAAC,MAAM,EAAE,YAAY;AAClE,IAAM,gBAAgB,aAAwB,CAAC,MAAM,EAAE,aAAa;AAKpE,IAAM,WAAW,CAAC,UAChB,oBAAC,YAAS,UAAU,MAClB,8BAAC,gBAAc,GAAG,OAAO,GAC3B;AAGF,IAAM,YAAY,CAAC,UACjB,oBAAC,YAAS,UAAU,MAClB,8BAAC,iBAAe,GAAG,OAAO,GAC5B;AAGK,IAAM,OAAO;AAAA,EAClB;AAAA,EACA;AACF;","names":[]}