@elabs-ai/components-ai 4.2.0 → 5.1.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-BA3AEMOU.js +21 -0
  106. package/dist/chunk-BA3AEMOU.js.map +1 -0
  107. package/dist/chunk-BBHFOYML.js +336 -0
  108. package/dist/chunk-BBHFOYML.js.map +1 -0
  109. package/dist/chunk-BHUVISIY.js +221 -0
  110. package/dist/chunk-BHUVISIY.js.map +1 -0
  111. package/dist/chunk-BM2LWERA.js +100 -0
  112. package/dist/chunk-BM2LWERA.js.map +1 -0
  113. package/dist/chunk-CMOYXNPJ.js +211 -0
  114. package/dist/chunk-CMOYXNPJ.js.map +1 -0
  115. package/dist/chunk-CZP3RHC4.js +74 -0
  116. package/dist/chunk-CZP3RHC4.js.map +1 -0
  117. package/dist/chunk-DDG5JHQT.js +112 -0
  118. package/dist/chunk-DDG5JHQT.js.map +1 -0
  119. package/dist/chunk-DJODXO7I.js +38 -0
  120. package/dist/chunk-DJODXO7I.js.map +1 -0
  121. package/dist/chunk-DWJDJLPU.js +192 -0
  122. package/dist/chunk-DWJDJLPU.js.map +1 -0
  123. package/dist/chunk-DZW6LM22.js +45 -0
  124. package/dist/chunk-DZW6LM22.js.map +1 -0
  125. package/dist/chunk-ELGCZLZF.js +305 -0
  126. package/dist/chunk-ELGCZLZF.js.map +1 -0
  127. package/dist/chunk-EV3U6ZZB.js +209 -0
  128. package/dist/chunk-EV3U6ZZB.js.map +1 -0
  129. package/dist/chunk-EY7LVUKQ.js +87 -0
  130. package/dist/chunk-EY7LVUKQ.js.map +1 -0
  131. package/dist/chunk-F4C74F7M.js +230 -0
  132. package/dist/chunk-F4C74F7M.js.map +1 -0
  133. package/dist/chunk-FERYDFZA.js +108 -0
  134. package/dist/chunk-FERYDFZA.js.map +1 -0
  135. package/dist/chunk-FUIYG2DS.js +166 -0
  136. package/dist/chunk-FUIYG2DS.js.map +1 -0
  137. package/dist/chunk-GA7M34KU.js +236 -0
  138. package/dist/chunk-GA7M34KU.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-L4SU3QJV.js +174 -0
  156. package/dist/chunk-L4SU3QJV.js.map +1 -0
  157. package/dist/chunk-LMNSBOBG.js +19 -0
  158. package/dist/chunk-LMNSBOBG.js.map +1 -0
  159. package/dist/chunk-MBI7D6IL.js +42 -0
  160. package/dist/chunk-MBI7D6IL.js.map +1 -0
  161. package/dist/chunk-MLFMYCPH.js +192 -0
  162. package/dist/chunk-MLFMYCPH.js.map +1 -0
  163. package/dist/chunk-MOK66734.js +33 -0
  164. package/dist/chunk-MOK66734.js.map +1 -0
  165. package/dist/chunk-MXTAWPYM.js +196 -0
  166. package/dist/chunk-MXTAWPYM.js.map +1 -0
  167. package/dist/chunk-NCL2UZKI.js +96 -0
  168. package/dist/chunk-NCL2UZKI.js.map +1 -0
  169. package/dist/chunk-NET4YLRY.js +107 -0
  170. package/dist/chunk-NET4YLRY.js.map +1 -0
  171. package/dist/chunk-NIG67CFM.js +329 -0
  172. package/dist/chunk-NIG67CFM.js.map +1 -0
  173. package/dist/chunk-NMVNNO3L.js +10 -0
  174. package/dist/chunk-NMVNNO3L.js.map +1 -0
  175. package/dist/chunk-NP7VID4K.js +2 -0
  176. package/dist/chunk-NP7VID4K.js.map +1 -0
  177. package/dist/chunk-NPUCMAG2.js +382 -0
  178. package/dist/chunk-NPUCMAG2.js.map +1 -0
  179. package/dist/chunk-NSCLRHES.js +102 -0
  180. package/dist/chunk-NSCLRHES.js.map +1 -0
  181. package/dist/chunk-OEUXHVFW.js +86 -0
  182. package/dist/chunk-OEUXHVFW.js.map +1 -0
  183. package/dist/chunk-ONBHFIMZ.js +137 -0
  184. package/dist/chunk-ONBHFIMZ.js.map +1 -0
  185. package/dist/chunk-OPH2HHL2.js +228 -0
  186. package/dist/chunk-OPH2HHL2.js.map +1 -0
  187. package/dist/chunk-OQERHIQP.js +287 -0
  188. package/dist/chunk-OQERHIQP.js.map +1 -0
  189. package/dist/chunk-P6YJAZFG.js +103 -0
  190. package/dist/chunk-P6YJAZFG.js.map +1 -0
  191. package/dist/chunk-PG7ERDOD.js +65 -0
  192. package/dist/chunk-PG7ERDOD.js.map +1 -0
  193. package/dist/chunk-PIB5JBMA.js +90 -0
  194. package/dist/chunk-PIB5JBMA.js.map +1 -0
  195. package/dist/chunk-PQ5BPIWQ.js +22 -0
  196. package/dist/chunk-PQ5BPIWQ.js.map +1 -0
  197. package/dist/chunk-PQBF6ZIQ.js +55 -0
  198. package/dist/chunk-PQBF6ZIQ.js.map +1 -0
  199. package/dist/chunk-PTWCTSZL.js +173 -0
  200. package/dist/chunk-PTWCTSZL.js.map +1 -0
  201. package/dist/chunk-QJUNPVOS.js +101 -0
  202. package/dist/chunk-QJUNPVOS.js.map +1 -0
  203. package/dist/chunk-QOBSEGCG.js +996 -0
  204. package/dist/chunk-QOBSEGCG.js.map +1 -0
  205. package/dist/chunk-QUDZOTRV.js +43 -0
  206. package/dist/chunk-QUDZOTRV.js.map +1 -0
  207. package/dist/chunk-RB7G65JC.js +213 -0
  208. package/dist/chunk-RB7G65JC.js.map +1 -0
  209. package/dist/chunk-RPHAOR7P.js +45 -0
  210. package/dist/chunk-RPHAOR7P.js.map +1 -0
  211. package/dist/chunk-RTCSH2AN.js +331 -0
  212. package/dist/chunk-RTCSH2AN.js.map +1 -0
  213. package/dist/chunk-S3ISPW3A.js +28 -0
  214. package/dist/chunk-S3ISPW3A.js.map +1 -0
  215. package/dist/chunk-SEVN656N.js +36 -0
  216. package/dist/chunk-SEVN656N.js.map +1 -0
  217. package/dist/chunk-SKVG672B.js +64 -0
  218. package/dist/chunk-SKVG672B.js.map +1 -0
  219. package/dist/chunk-SSGJ6MEM.js +1076 -0
  220. package/dist/chunk-SSGJ6MEM.js.map +1 -0
  221. package/dist/chunk-SSKZ2AED.js +118 -0
  222. package/dist/chunk-SSKZ2AED.js.map +1 -0
  223. package/dist/chunk-T56JFGXI.js +561 -0
  224. package/dist/chunk-T56JFGXI.js.map +1 -0
  225. package/dist/chunk-TCB6O74A.js +137 -0
  226. package/dist/chunk-TCB6O74A.js.map +1 -0
  227. package/dist/chunk-TTEYPO6X.js +57 -0
  228. package/dist/chunk-TTEYPO6X.js.map +1 -0
  229. package/dist/chunk-TWPHAJNM.js +462 -0
  230. package/dist/chunk-TWPHAJNM.js.map +1 -0
  231. package/dist/chunk-TXJJLP4O.js +336 -0
  232. package/dist/chunk-TXJJLP4O.js.map +1 -0
  233. package/dist/chunk-TZ6TB7VM.js +245 -0
  234. package/dist/chunk-TZ6TB7VM.js.map +1 -0
  235. package/dist/chunk-UBLKJJ7K.js +278 -0
  236. package/dist/chunk-UBLKJJ7K.js.map +1 -0
  237. package/dist/chunk-UCJ6IUFS.js +52 -0
  238. package/dist/chunk-UCJ6IUFS.js.map +1 -0
  239. package/dist/chunk-UCKFJ3QF.js +197 -0
  240. package/dist/chunk-UCKFJ3QF.js.map +1 -0
  241. package/dist/chunk-UPXSLILN.js +20 -0
  242. package/dist/chunk-UPXSLILN.js.map +1 -0
  243. package/dist/chunk-V4DORGWJ.js +92 -0
  244. package/dist/chunk-V4DORGWJ.js.map +1 -0
  245. package/dist/chunk-V6E5DYZD.js +80 -0
  246. package/dist/chunk-V6E5DYZD.js.map +1 -0
  247. package/dist/chunk-VLLYKF3P.js +96 -0
  248. package/dist/chunk-VLLYKF3P.js.map +1 -0
  249. package/dist/chunk-VLNBTOH6.js +43 -0
  250. package/dist/chunk-VLNBTOH6.js.map +1 -0
  251. package/dist/chunk-WMDSMSPL.js +303 -0
  252. package/dist/chunk-WMDSMSPL.js.map +1 -0
  253. package/dist/chunk-WU5BLGTF.js +149 -0
  254. package/dist/chunk-WU5BLGTF.js.map +1 -0
  255. package/dist/chunk-WYTZVSGK.js +245 -0
  256. package/dist/chunk-WYTZVSGK.js.map +1 -0
  257. package/dist/chunk-X47QMM6K.js +187 -0
  258. package/dist/chunk-X47QMM6K.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 +5434 -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 +1019 -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,336 @@
1
+ "use client";
2
+
3
+ // src/stack-trace.tsx
4
+ import { useControllableState } from "@radix-ui/react-use-controllable-state";
5
+ import { Button } from "@elabs-ai/components-ui";
6
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@elabs-ai/components-ui";
7
+ import { useCopyToClipboard, useLocale } from "@elabs-ai/components-ui";
8
+ import { cn } from "@elabs-ai/components-ui/lib/cn";
9
+ import { AlertTriangleIcon, CheckIcon, ChevronDownIcon, CopyIcon } from "lucide-react";
10
+ import { createContext, memo, useCallback, useContext, useMemo } from "react";
11
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
12
+ var STACK_FRAME_WITH_PARENS_REGEX = /^at\s+(.+?)\s+\((.+):(\d+):(\d+)\)$/;
13
+ var STACK_FRAME_WITHOUT_FN_REGEX = /^at\s+(.+):(\d+):(\d+)$/;
14
+ var ERROR_TYPE_REGEX = /^(\w+Error|Error):\s*(.*)$/;
15
+ var AT_PREFIX_REGEX = /^at\s+/;
16
+ var StackTraceContext = createContext(null);
17
+ var useStackTrace = () => {
18
+ const context = useContext(StackTraceContext);
19
+ if (!context) {
20
+ throw new Error("StackTrace components must be used within StackTrace");
21
+ }
22
+ return context;
23
+ };
24
+ var parseStackFrame = (line) => {
25
+ const trimmed = line.trim();
26
+ const withParensMatch = trimmed.match(STACK_FRAME_WITH_PARENS_REGEX);
27
+ if (withParensMatch) {
28
+ const [, functionName, filePath, lineNum, colNum] = withParensMatch;
29
+ const isInternal = (filePath?.includes("node_modules") ?? false) || (filePath?.startsWith("node:") ?? false) || (filePath?.includes("internal/") ?? false);
30
+ return {
31
+ columnNumber: colNum ? Number.parseInt(colNum, 10) : null,
32
+ filePath: filePath ?? null,
33
+ functionName: functionName ?? null,
34
+ isInternal,
35
+ lineNumber: lineNum ? Number.parseInt(lineNum, 10) : null,
36
+ raw: trimmed
37
+ };
38
+ }
39
+ const withoutFnMatch = trimmed.match(STACK_FRAME_WITHOUT_FN_REGEX);
40
+ if (withoutFnMatch) {
41
+ const [, filePath, lineNum, colNum] = withoutFnMatch;
42
+ const isInternal = (filePath?.includes("node_modules") ?? false) || (filePath?.startsWith("node:") ?? false) || (filePath?.includes("internal/") ?? false);
43
+ return {
44
+ columnNumber: colNum ? Number.parseInt(colNum, 10) : null,
45
+ filePath: filePath ?? null,
46
+ functionName: null,
47
+ isInternal,
48
+ lineNumber: lineNum ? Number.parseInt(lineNum, 10) : null,
49
+ raw: trimmed
50
+ };
51
+ }
52
+ return {
53
+ columnNumber: null,
54
+ filePath: null,
55
+ functionName: null,
56
+ isInternal: trimmed.includes("node_modules") || trimmed.includes("node:"),
57
+ lineNumber: null,
58
+ raw: trimmed
59
+ };
60
+ };
61
+ var parseStackTrace = (trace) => {
62
+ const lines = trace.split("\n").filter((line) => line.trim());
63
+ if (lines.length === 0) {
64
+ return {
65
+ errorMessage: trace,
66
+ errorType: null,
67
+ frames: [],
68
+ raw: trace
69
+ };
70
+ }
71
+ const firstLine = lines[0]?.trim() ?? "";
72
+ let errorType = null;
73
+ let errorMessage = firstLine;
74
+ const errorMatch = firstLine.match(ERROR_TYPE_REGEX);
75
+ if (errorMatch) {
76
+ const [, type, msg] = errorMatch;
77
+ errorType = type ?? null;
78
+ errorMessage = msg || "";
79
+ }
80
+ const frames = lines.slice(1).filter((line) => line.trim().startsWith("at ")).map(parseStackFrame);
81
+ return {
82
+ errorMessage,
83
+ errorType,
84
+ frames,
85
+ raw: trace
86
+ };
87
+ };
88
+ var StackTrace = memo(
89
+ ({
90
+ trace,
91
+ className,
92
+ open,
93
+ defaultOpen = false,
94
+ onOpenChange,
95
+ onFilePathClick,
96
+ children,
97
+ ...props
98
+ }) => {
99
+ const [isOpen, setIsOpen] = useControllableState({
100
+ defaultProp: defaultOpen,
101
+ onChange: onOpenChange,
102
+ prop: open
103
+ });
104
+ const parsedTrace = useMemo(() => parseStackTrace(trace), [trace]);
105
+ const contextValue = useMemo(
106
+ () => ({
107
+ isOpen,
108
+ onFilePathClick,
109
+ raw: trace,
110
+ setIsOpen,
111
+ trace: parsedTrace
112
+ }),
113
+ [parsedTrace, trace, isOpen, setIsOpen, onFilePathClick]
114
+ );
115
+ return /* @__PURE__ */ jsx(StackTraceContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
116
+ "div",
117
+ {
118
+ className: cn(
119
+ "not-prose w-full overflow-hidden rounded-lg border bg-background font-mono text-body",
120
+ className
121
+ ),
122
+ ...props,
123
+ children
124
+ }
125
+ ) });
126
+ }
127
+ );
128
+ var StackTraceHeader = memo(({ className, children, ...props }) => {
129
+ const { isOpen, setIsOpen } = useStackTrace();
130
+ return /* @__PURE__ */ jsx(Collapsible, { onOpenChange: setIsOpen, open: isOpen, children: /* @__PURE__ */ jsx(CollapsibleTrigger, { asChild: true, ...props, children: /* @__PURE__ */ jsx(
131
+ "div",
132
+ {
133
+ className: cn(
134
+ "flex w-full cursor-pointer items-center gap-3 p-3 text-start transition-colors hover:bg-muted/50",
135
+ className
136
+ ),
137
+ children
138
+ }
139
+ ) }) });
140
+ });
141
+ var StackTraceError = memo(({ className, children, ...props }) => /* @__PURE__ */ jsxs("div", { className: cn("flex flex-1 items-center gap-2 overflow-hidden", className), ...props, children: [
142
+ /* @__PURE__ */ jsx(AlertTriangleIcon, { className: "size-4 shrink-0 text-destructive" }),
143
+ children
144
+ ] }));
145
+ var StackTraceErrorType = memo(
146
+ ({ className, children, ...props }) => {
147
+ const { trace } = useStackTrace();
148
+ return (
149
+ // #124: the error type NAME is running text (e.g. "TypeError"), not a
150
+ // mark — ink rung, unlike the AlertTriangleIcon mark above.
151
+ /* @__PURE__ */ jsx("span", { className: cn("shrink-0 font-semibold text-destructive-text", className), ...props, children: children ?? trace.errorType })
152
+ );
153
+ }
154
+ );
155
+ var StackTraceErrorMessage = memo(
156
+ ({ className, children, ...props }) => {
157
+ const { trace } = useStackTrace();
158
+ return /* @__PURE__ */ jsx("span", { className: cn("truncate text-foreground", className), ...props, children: children ?? trace.errorMessage });
159
+ }
160
+ );
161
+ var handleActionsClick = (e) => e.stopPropagation();
162
+ var handleActionsKeyDown = (e) => {
163
+ if (e.key === "Enter" || e.key === " ") {
164
+ e.stopPropagation();
165
+ }
166
+ };
167
+ var StackTraceActions = memo(
168
+ ({ className, children, ...props }) => /* @__PURE__ */ jsx(
169
+ "div",
170
+ {
171
+ className: cn("flex shrink-0 items-center gap-1", className),
172
+ onClick: handleActionsClick,
173
+ onKeyDown: handleActionsKeyDown,
174
+ role: "group",
175
+ ...props,
176
+ children
177
+ }
178
+ )
179
+ );
180
+ var StackTraceCopyButton = memo(
181
+ ({
182
+ onCopy,
183
+ onError,
184
+ timeout,
185
+ className,
186
+ children,
187
+ "aria-label": ariaLabel,
188
+ ...props
189
+ }) => {
190
+ const { t } = useLocale();
191
+ const { raw } = useStackTrace();
192
+ const { copied: isCopied, copy } = useCopyToClipboard(
193
+ timeout === void 0 ? void 0 : { resetAfterMs: timeout }
194
+ );
195
+ const copyToClipboard = useCallback(async () => {
196
+ const ok = await copy(raw);
197
+ if (ok) {
198
+ onCopy?.();
199
+ } else {
200
+ onError?.(new Error("Clipboard API not available"));
201
+ }
202
+ }, [copy, raw, onCopy, onError]);
203
+ const Icon = isCopied ? CheckIcon : CopyIcon;
204
+ return /* @__PURE__ */ jsx(
205
+ Button,
206
+ {
207
+ "aria-label": ariaLabel ?? t("copy"),
208
+ className: cn("size-7", className),
209
+ onClick: copyToClipboard,
210
+ size: "icon",
211
+ variant: "ghost",
212
+ ...props,
213
+ children: children ?? /* @__PURE__ */ jsx(Icon, { size: 14 })
214
+ }
215
+ );
216
+ }
217
+ );
218
+ var StackTraceExpandButton = memo(
219
+ ({ className, ...props }) => {
220
+ const { isOpen } = useStackTrace();
221
+ return /* @__PURE__ */ jsx("div", { className: cn("flex size-7 items-center justify-center", className), ...props, children: /* @__PURE__ */ jsx(
222
+ ChevronDownIcon,
223
+ {
224
+ className: cn(
225
+ "size-4 text-muted-foreground transition-transform",
226
+ isOpen ? "rotate-180" : "rotate-0"
227
+ )
228
+ }
229
+ ) });
230
+ }
231
+ );
232
+ var StackTraceContent = memo(
233
+ ({ className, maxHeight = 400, children, ...props }) => {
234
+ const { isOpen } = useStackTrace();
235
+ return /* @__PURE__ */ jsx(Collapsible, { open: isOpen, children: /* @__PURE__ */ jsx(
236
+ CollapsibleContent,
237
+ {
238
+ className: cn(
239
+ "overflow-auto border-t bg-muted/30",
240
+ "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:animate-out data-[state=open]:animate-in",
241
+ className
242
+ ),
243
+ style: { maxHeight },
244
+ ...props,
245
+ children
246
+ }
247
+ ) });
248
+ }
249
+ );
250
+ var FilePathButton = memo(({ frame, onFilePathClick }) => {
251
+ const handleClick = useCallback(() => {
252
+ if (frame.filePath) {
253
+ onFilePathClick?.(
254
+ frame.filePath,
255
+ frame.lineNumber ?? void 0,
256
+ frame.columnNumber ?? void 0
257
+ );
258
+ }
259
+ }, [frame, onFilePathClick]);
260
+ return /* @__PURE__ */ jsxs(
261
+ "button",
262
+ {
263
+ className: cn(
264
+ // #399 — a frame link is body text; the hover ink takes the `-text` rung.
265
+ "underline decoration-dotted hover:text-primary-text",
266
+ onFilePathClick && "cursor-pointer"
267
+ ),
268
+ disabled: !onFilePathClick,
269
+ onClick: handleClick,
270
+ type: "button",
271
+ children: [
272
+ frame.filePath,
273
+ frame.lineNumber !== null && `:${frame.lineNumber}`,
274
+ frame.columnNumber !== null && `:${frame.columnNumber}`
275
+ ]
276
+ }
277
+ );
278
+ });
279
+ FilePathButton.displayName = "FilePathButton";
280
+ var StackTraceFrames = memo(
281
+ ({ className, showInternalFrames = true, ...props }) => {
282
+ const { trace, onFilePathClick } = useStackTrace();
283
+ const { t } = useLocale();
284
+ const framesToShow = showInternalFrames ? trace.frames : trace.frames.filter((f) => !f.isInternal);
285
+ return /* @__PURE__ */ jsxs("div", { className: cn("space-y-1 p-3", className), ...props, children: [
286
+ framesToShow.map((frame) => /* @__PURE__ */ jsxs(
287
+ "div",
288
+ {
289
+ className: cn(
290
+ "text-meta",
291
+ frame.isInternal ? "text-muted-foreground/50" : "text-foreground/90"
292
+ ),
293
+ children: [
294
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "at " }),
295
+ frame.functionName && /* @__PURE__ */ jsxs("span", { className: frame.isInternal ? "" : "text-foreground", children: [
296
+ frame.functionName,
297
+ " "
298
+ ] }),
299
+ frame.filePath && /* @__PURE__ */ jsxs(Fragment, { children: [
300
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "(" }),
301
+ /* @__PURE__ */ jsx(FilePathButton, { frame, onFilePathClick }),
302
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: ")" })
303
+ ] }),
304
+ !(frame.filePath || frame.functionName) && /* @__PURE__ */ jsx("span", { children: frame.raw.replace(AT_PREFIX_REGEX, "") })
305
+ ]
306
+ },
307
+ frame.raw
308
+ )),
309
+ framesToShow.length === 0 && /* @__PURE__ */ jsx("div", { className: "text-muted-foreground text-meta", children: t("ai.stackTrace.empty") })
310
+ ] });
311
+ }
312
+ );
313
+ StackTrace.displayName = "StackTrace";
314
+ StackTraceHeader.displayName = "StackTraceHeader";
315
+ StackTraceError.displayName = "StackTraceError";
316
+ StackTraceErrorType.displayName = "StackTraceErrorType";
317
+ StackTraceErrorMessage.displayName = "StackTraceErrorMessage";
318
+ StackTraceActions.displayName = "StackTraceActions";
319
+ StackTraceCopyButton.displayName = "StackTraceCopyButton";
320
+ StackTraceExpandButton.displayName = "StackTraceExpandButton";
321
+ StackTraceContent.displayName = "StackTraceContent";
322
+ StackTraceFrames.displayName = "StackTraceFrames";
323
+
324
+ export {
325
+ StackTrace,
326
+ StackTraceHeader,
327
+ StackTraceError,
328
+ StackTraceErrorType,
329
+ StackTraceErrorMessage,
330
+ StackTraceActions,
331
+ StackTraceCopyButton,
332
+ StackTraceExpandButton,
333
+ StackTraceContent,
334
+ StackTraceFrames
335
+ };
336
+ //# sourceMappingURL=chunk-BBHFOYML.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stack-trace.tsx"],"sourcesContent":["\"use client\";\n\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { Button } from \"@elabs-ai/components-ui\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@elabs-ai/components-ui\";\nimport { useCopyToClipboard, useLocale } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { AlertTriangleIcon, CheckIcon, ChevronDownIcon, CopyIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { createContext, memo, useCallback, useContext, useMemo } from \"react\";\n\n// Regex patterns for parsing stack traces\nconst STACK_FRAME_WITH_PARENS_REGEX = /^at\\s+(.+?)\\s+\\((.+):(\\d+):(\\d+)\\)$/;\nconst STACK_FRAME_WITHOUT_FN_REGEX = /^at\\s+(.+):(\\d+):(\\d+)$/;\nconst ERROR_TYPE_REGEX = /^(\\w+Error|Error):\\s*(.*)$/;\nconst AT_PREFIX_REGEX = /^at\\s+/;\n\ninterface StackFrame {\n raw: string;\n functionName: string | null;\n filePath: string | null;\n lineNumber: number | null;\n columnNumber: number | null;\n isInternal: boolean;\n}\n\ninterface ParsedStackTrace {\n errorType: string | null;\n errorMessage: string;\n frames: StackFrame[];\n raw: string;\n}\n\ninterface StackTraceContextValue {\n trace: ParsedStackTrace;\n raw: string;\n isOpen: boolean;\n setIsOpen: (open: boolean) => void;\n onFilePathClick?: (filePath: string, line?: number, column?: number) => void;\n}\n\nconst StackTraceContext = createContext<StackTraceContextValue | null>(null);\n\nconst useStackTrace = () => {\n const context = useContext(StackTraceContext);\n if (!context) {\n throw new Error(\"StackTrace components must be used within StackTrace\");\n }\n return context;\n};\n\nconst parseStackFrame = (line: string): StackFrame => {\n const trimmed = line.trim();\n\n // Pattern: at functionName (filePath:line:column)\n const withParensMatch = trimmed.match(STACK_FRAME_WITH_PARENS_REGEX);\n if (withParensMatch) {\n const [, functionName, filePath, lineNum, colNum] = withParensMatch;\n const isInternal =\n (filePath?.includes(\"node_modules\") ?? false) ||\n (filePath?.startsWith(\"node:\") ?? false) ||\n (filePath?.includes(\"internal/\") ?? false);\n return {\n columnNumber: colNum ? Number.parseInt(colNum, 10) : null,\n filePath: filePath ?? null,\n functionName: functionName ?? null,\n isInternal,\n lineNumber: lineNum ? Number.parseInt(lineNum, 10) : null,\n raw: trimmed,\n };\n }\n\n // Pattern: at filePath:line:column (no function name)\n const withoutFnMatch = trimmed.match(STACK_FRAME_WITHOUT_FN_REGEX);\n if (withoutFnMatch) {\n const [, filePath, lineNum, colNum] = withoutFnMatch;\n const isInternal =\n (filePath?.includes(\"node_modules\") ?? false) ||\n (filePath?.startsWith(\"node:\") ?? false) ||\n (filePath?.includes(\"internal/\") ?? false);\n return {\n columnNumber: colNum ? Number.parseInt(colNum, 10) : null,\n filePath: filePath ?? null,\n functionName: null,\n isInternal,\n lineNumber: lineNum ? Number.parseInt(lineNum, 10) : null,\n raw: trimmed,\n };\n }\n\n // Fallback: unparseable line\n return {\n columnNumber: null,\n filePath: null,\n functionName: null,\n isInternal: trimmed.includes(\"node_modules\") || trimmed.includes(\"node:\"),\n lineNumber: null,\n raw: trimmed,\n };\n};\n\nconst parseStackTrace = (trace: string): ParsedStackTrace => {\n const lines = trace.split(\"\\n\").filter((line) => line.trim());\n\n if (lines.length === 0) {\n return {\n errorMessage: trace,\n errorType: null,\n frames: [],\n raw: trace,\n };\n }\n\n const firstLine = lines[0]?.trim() ?? \"\";\n let errorType: string | null = null;\n let errorMessage = firstLine;\n\n // Try to extract error type from \"ErrorType: message\" format\n const errorMatch = firstLine.match(ERROR_TYPE_REGEX);\n if (errorMatch) {\n const [, type, msg] = errorMatch;\n errorType = type ?? null;\n errorMessage = msg || \"\";\n }\n\n // Parse stack frames (lines starting with \"at\")\n const frames = lines\n .slice(1)\n .filter((line) => line.trim().startsWith(\"at \"))\n .map(parseStackFrame);\n\n return {\n errorMessage,\n errorType,\n frames,\n raw: trace,\n };\n};\n\nexport type StackTraceProps = ComponentProps<\"div\"> & {\n trace: string;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n onFilePathClick?: (filePath: string, line?: number, column?: number) => void;\n};\n\nexport const StackTrace = memo(\n ({\n trace,\n className,\n open,\n defaultOpen = false,\n onOpenChange,\n onFilePathClick,\n children,\n ...props\n }: StackTraceProps) => {\n const [isOpen, setIsOpen] = useControllableState({\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n prop: open,\n });\n\n const parsedTrace = useMemo(() => parseStackTrace(trace), [trace]);\n\n const contextValue = useMemo(\n () => ({\n isOpen,\n onFilePathClick,\n raw: trace,\n setIsOpen,\n trace: parsedTrace,\n }),\n [parsedTrace, trace, isOpen, setIsOpen, onFilePathClick],\n );\n\n return (\n <StackTraceContext.Provider value={contextValue}>\n <div\n className={cn(\n \"not-prose w-full overflow-hidden rounded-lg border bg-background font-mono text-body\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n </StackTraceContext.Provider>\n );\n },\n);\n\nexport type StackTraceHeaderProps = ComponentProps<typeof CollapsibleTrigger>;\n\nexport const StackTraceHeader = memo(({ className, children, ...props }: StackTraceHeaderProps) => {\n const { isOpen, setIsOpen } = useStackTrace();\n\n return (\n <Collapsible onOpenChange={setIsOpen} open={isOpen}>\n <CollapsibleTrigger asChild {...props}>\n <div\n className={cn(\n \"flex w-full cursor-pointer items-center gap-3 p-3 text-start transition-colors hover:bg-muted/50\",\n className,\n )}\n >\n {children}\n </div>\n </CollapsibleTrigger>\n </Collapsible>\n );\n});\n\nexport type StackTraceErrorProps = ComponentProps<\"div\">;\n\nexport const StackTraceError = memo(({ className, children, ...props }: StackTraceErrorProps) => (\n <div className={cn(\"flex flex-1 items-center gap-2 overflow-hidden\", className)} {...props}>\n <AlertTriangleIcon className=\"size-4 shrink-0 text-destructive\" />\n {children}\n </div>\n));\n\nexport type StackTraceErrorTypeProps = ComponentProps<\"span\">;\n\nexport const StackTraceErrorType = memo(\n ({ className, children, ...props }: StackTraceErrorTypeProps) => {\n const { trace } = useStackTrace();\n\n return (\n // #124: the error type NAME is running text (e.g. \"TypeError\"), not a\n // mark — ink rung, unlike the AlertTriangleIcon mark above.\n <span className={cn(\"shrink-0 font-semibold text-destructive-text\", className)} {...props}>\n {children ?? trace.errorType}\n </span>\n );\n },\n);\n\nexport type StackTraceErrorMessageProps = ComponentProps<\"span\">;\n\nexport const StackTraceErrorMessage = memo(\n ({ className, children, ...props }: StackTraceErrorMessageProps) => {\n const { trace } = useStackTrace();\n\n return (\n <span className={cn(\"truncate text-foreground\", className)} {...props}>\n {children ?? trace.errorMessage}\n </span>\n );\n },\n);\n\nexport type StackTraceActionsProps = ComponentProps<\"div\">;\n\nconst handleActionsClick = (e: React.MouseEvent) => e.stopPropagation();\nconst handleActionsKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.stopPropagation();\n }\n};\n\nexport const StackTraceActions = memo(\n ({ className, children, ...props }: StackTraceActionsProps) => (\n <div\n className={cn(\"flex shrink-0 items-center gap-1\", className)}\n onClick={handleActionsClick}\n onKeyDown={handleActionsKeyDown}\n role=\"group\"\n {...props}\n >\n {children}\n </div>\n ),\n);\n\nexport type StackTraceCopyButtonProps = ComponentProps<typeof Button> & {\n onCopy?: () => void;\n onError?: (error: Error) => void;\n timeout?: number;\n};\n\nexport const StackTraceCopyButton = memo(\n ({\n onCopy,\n onError,\n timeout,\n className,\n children,\n \"aria-label\": ariaLabel,\n ...props\n }: StackTraceCopyButtonProps) => {\n const { t } = useLocale();\n const { raw } = useStackTrace();\n // Shared implementation (`@elabs-ai/components-ui`) instead of a private\n // copy of the same copy-to-clipboard state machine (issue-workflow.md\n // dedupe finding) — see `CodeBlockCopyButton` for the reference usage.\n const { copied: isCopied, copy } = useCopyToClipboard(\n timeout === undefined ? undefined : { resetAfterMs: timeout },\n );\n\n const copyToClipboard = useCallback(async () => {\n const ok = await copy(raw);\n if (ok) {\n onCopy?.();\n } else {\n onError?.(new Error(\"Clipboard API not available\"));\n }\n }, [copy, raw, onCopy, onError]);\n\n const Icon = isCopied ? CheckIcon : CopyIcon;\n\n return (\n <Button\n aria-label={ariaLabel ?? t(\"copy\")}\n className={cn(\"size-7\", className)}\n onClick={copyToClipboard}\n size=\"icon\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <Icon size={14} />}\n </Button>\n );\n },\n);\n\nexport type StackTraceExpandButtonProps = ComponentProps<\"div\">;\n\nexport const StackTraceExpandButton = memo(\n ({ className, ...props }: StackTraceExpandButtonProps) => {\n const { isOpen } = useStackTrace();\n\n return (\n <div className={cn(\"flex size-7 items-center justify-center\", className)} {...props}>\n <ChevronDownIcon\n className={cn(\n \"size-4 text-muted-foreground transition-transform\",\n isOpen ? \"rotate-180\" : \"rotate-0\",\n )}\n />\n </div>\n );\n },\n);\n\nexport type StackTraceContentProps = ComponentProps<typeof CollapsibleContent> & {\n maxHeight?: number;\n};\n\nexport const StackTraceContent = memo(\n ({ className, maxHeight = 400, children, ...props }: StackTraceContentProps) => {\n const { isOpen } = useStackTrace();\n\n return (\n <Collapsible open={isOpen}>\n <CollapsibleContent\n className={cn(\n \"overflow-auto border-t bg-muted/30\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:animate-out data-[state=open]:animate-in\",\n className,\n )}\n style={{ maxHeight }}\n {...props}\n >\n {children}\n </CollapsibleContent>\n </Collapsible>\n );\n },\n);\n\nexport type StackTraceFramesProps = ComponentProps<\"div\"> & {\n showInternalFrames?: boolean;\n};\n\ninterface FilePathButtonProps {\n frame: StackFrame;\n onFilePathClick?: (filePath: string, lineNumber?: number, columnNumber?: number) => void;\n}\n\nconst FilePathButton = memo(({ frame, onFilePathClick }: FilePathButtonProps) => {\n const handleClick = useCallback(() => {\n if (frame.filePath) {\n onFilePathClick?.(\n frame.filePath,\n frame.lineNumber ?? undefined,\n frame.columnNumber ?? undefined,\n );\n }\n }, [frame, onFilePathClick]);\n\n return (\n <button\n className={cn(\n // #399 — a frame link is body text; the hover ink takes the `-text` rung.\n \"underline decoration-dotted hover:text-primary-text\",\n onFilePathClick && \"cursor-pointer\",\n )}\n disabled={!onFilePathClick}\n onClick={handleClick}\n type=\"button\"\n >\n {frame.filePath}\n {frame.lineNumber !== null && `:${frame.lineNumber}`}\n {frame.columnNumber !== null && `:${frame.columnNumber}`}\n </button>\n );\n});\n\nFilePathButton.displayName = \"FilePathButton\";\n\nexport const StackTraceFrames = memo(\n ({ className, showInternalFrames = true, ...props }: StackTraceFramesProps) => {\n const { trace, onFilePathClick } = useStackTrace();\n const { t } = useLocale();\n\n const framesToShow = showInternalFrames\n ? trace.frames\n : trace.frames.filter((f) => !f.isInternal);\n\n return (\n <div className={cn(\"space-y-1 p-3\", className)} {...props}>\n {framesToShow.map((frame) => (\n <div\n className={cn(\n \"text-meta\",\n frame.isInternal ? \"text-muted-foreground/50\" : \"text-foreground/90\",\n )}\n key={frame.raw}\n >\n <span className=\"text-muted-foreground\">at </span>\n {frame.functionName && (\n <span className={frame.isInternal ? \"\" : \"text-foreground\"}>\n {frame.functionName}{\" \"}\n </span>\n )}\n {frame.filePath && (\n <>\n <span className=\"text-muted-foreground\">(</span>\n <FilePathButton frame={frame} onFilePathClick={onFilePathClick} />\n <span className=\"text-muted-foreground\">)</span>\n </>\n )}\n {!(frame.filePath || frame.functionName) && (\n <span>{frame.raw.replace(AT_PREFIX_REGEX, \"\")}</span>\n )}\n </div>\n ))}\n {framesToShow.length === 0 && (\n <div className=\"text-muted-foreground text-meta\">{t(\"ai.stackTrace.empty\")}</div>\n )}\n </div>\n );\n },\n);\n\nStackTrace.displayName = \"StackTrace\";\nStackTraceHeader.displayName = \"StackTraceHeader\";\nStackTraceError.displayName = \"StackTraceError\";\nStackTraceErrorType.displayName = \"StackTraceErrorType\";\nStackTraceErrorMessage.displayName = \"StackTraceErrorMessage\";\nStackTraceActions.displayName = \"StackTraceActions\";\nStackTraceCopyButton.displayName = \"StackTraceCopyButton\";\nStackTraceExpandButton.displayName = \"StackTraceExpandButton\";\nStackTraceContent.displayName = \"StackTraceContent\";\nStackTraceFrames.displayName = \"StackTraceFrames\";\n"],"mappings":"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","names":[]}
@@ -0,0 +1,221 @@
1
+ "use client";
2
+ import {
3
+ EMPTY_CELL,
4
+ badgeToneForValue,
5
+ compareCellValues,
6
+ formatCellValue,
7
+ isEmptyCell,
8
+ isNumericFormat,
9
+ normalizeTableSpec
10
+ } from "./chunk-DWJDJLPU.js";
11
+
12
+ // src/message-table.tsx
13
+ import { forwardRef, useId, useMemo, useState } from "react";
14
+ import { ChevronDown, ChevronUp, ChevronsUpDown } from "lucide-react";
15
+ import {
16
+ Badge,
17
+ Skeleton,
18
+ Table,
19
+ TableBody,
20
+ TableCaption,
21
+ TableCell,
22
+ TableHead,
23
+ TableHeader,
24
+ TableRow
25
+ } from "@elabs-ai/components-ui";
26
+ import { cn } from "@elabs-ai/components-ui/lib/cn";
27
+ import { useLocale } from "@elabs-ai/components-ui";
28
+ import { jsx, jsxs } from "react/jsx-runtime";
29
+ var MessageTableFallback = forwardRef(
30
+ function MessageTableFallback2({ message = "This table could not be displayed.", className, ...props }, ref) {
31
+ return /* @__PURE__ */ jsx(
32
+ "div",
33
+ {
34
+ ref,
35
+ role: "status",
36
+ "aria-live": "polite",
37
+ className: cn(
38
+ // Sole structural cue is the border (no fill) — reads in every theme,
39
+ // incl. themes where surface-muted ≈ background. border-strong is
40
+ // contrast-guaranteed vs the background.
41
+ "flex items-center justify-center rounded-md border border-border-strong px-4 py-6 text-center text-body text-muted-foreground",
42
+ className
43
+ ),
44
+ ...props,
45
+ children: message
46
+ }
47
+ );
48
+ }
49
+ );
50
+ var MessageTable = forwardRef(function MessageTable2({
51
+ spec,
52
+ sortable = false,
53
+ sort: sortProp,
54
+ defaultSort = null,
55
+ onSortChange,
56
+ maxRows,
57
+ renderCell,
58
+ isStreaming,
59
+ streaming = false,
60
+ className,
61
+ ...props
62
+ }, ref) {
63
+ const resolvedStreaming = isStreaming ?? streaming;
64
+ const { t } = useLocale();
65
+ const reactId = useId();
66
+ const isControlled = sortProp !== void 0;
67
+ const [internalSort, setInternalSort] = useState(defaultSort);
68
+ const resolvedSort = isControlled ? sortProp : internalSort;
69
+ const result = normalizeTableSpec(spec);
70
+ const normalized = result.ok ? result.spec : null;
71
+ const sortedRows = useMemo(() => {
72
+ if (!normalized || !resolvedSort) return normalized?.rows ?? [];
73
+ const column = normalized.columns.find((c) => c.key === resolvedSort.key);
74
+ if (!column) return normalized.rows;
75
+ const direction = resolvedSort.direction === "asc" ? 1 : -1;
76
+ return [...normalized.rows].sort(
77
+ (a, b) => direction * compareCellValues(a[column.key], b[column.key], column.format)
78
+ );
79
+ }, [normalized, resolvedSort]);
80
+ if (!result.ok) {
81
+ return /* @__PURE__ */ jsx(MessageTableFallback, { ref, message: result.reason, className, ...props });
82
+ }
83
+ const { columns, title, emptyText } = result.spec;
84
+ if (columns.length === 0) {
85
+ if (resolvedStreaming) {
86
+ return /* @__PURE__ */ jsxs("div", { ref, className: cn("w-full", className), ...props, children: [
87
+ /* @__PURE__ */ jsx("span", { className: "sr-only", role: "status", "aria-live": "polite", children: "Loading table\u2026" }),
88
+ /* @__PURE__ */ jsxs(
89
+ "div",
90
+ {
91
+ "aria-hidden": "true",
92
+ className: "flex flex-col gap-2 rounded-md border border-border p-3",
93
+ children: [
94
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-5 w-40" }),
95
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-full" }),
96
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-full" }),
97
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-3/4" })
98
+ ]
99
+ }
100
+ )
101
+ ] });
102
+ }
103
+ return /* @__PURE__ */ jsx(
104
+ MessageTableFallback,
105
+ {
106
+ ref,
107
+ message: "This table has no columns to display.",
108
+ className,
109
+ ...props
110
+ }
111
+ );
112
+ }
113
+ const total = sortedRows.length;
114
+ const cappedRows = maxRows !== void 0 && maxRows >= 0 ? sortedRows.slice(0, maxRows) : sortedRows;
115
+ const truncatedCount = total - cappedRows.length;
116
+ const titleId = title ? `${reactId}-title` : void 0;
117
+ const setSort = (next) => {
118
+ if (!isControlled) setInternalSort(next);
119
+ onSortChange?.(next);
120
+ };
121
+ const toggleSort = (column) => {
122
+ if (resolvedSort?.key === column.key) {
123
+ setSort({ key: column.key, direction: resolvedSort.direction === "asc" ? "desc" : "asc" });
124
+ } else {
125
+ setSort({ key: column.key, direction: "asc" });
126
+ }
127
+ };
128
+ const renderCellContent = (column, row, rowIndex) => {
129
+ const value = row[column.key];
130
+ if (renderCell) {
131
+ const overridden = renderCell({ value, column, row, rowIndex });
132
+ if (overridden !== void 0) return overridden;
133
+ }
134
+ if (isEmptyCell(value)) {
135
+ return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: EMPTY_CELL });
136
+ }
137
+ if (column.format === "badge") {
138
+ return /* @__PURE__ */ jsx(Badge, { variant: badgeToneForValue(value), children: String(value) });
139
+ }
140
+ return formatCellValue(value, column.format);
141
+ };
142
+ return /* @__PURE__ */ jsxs("div", { ref, className: cn("w-full", className), ...props, children: [
143
+ title && /* @__PURE__ */ jsx("p", { id: titleId, className: "mb-1 text-body font-semibold text-foreground text-balance", children: title }),
144
+ /* @__PURE__ */ jsxs("div", { className: "overflow-hidden rounded-md border border-border", children: [
145
+ resolvedStreaming && cappedRows.length === 0 && /* @__PURE__ */ jsx("span", { className: "sr-only", role: "status", "aria-live": "polite", children: "Loading table\u2026" }),
146
+ /* @__PURE__ */ jsxs(
147
+ Table,
148
+ {
149
+ "aria-labelledby": titleId,
150
+ "aria-label": title ? void 0 : t("ai.messageTable.label"),
151
+ "aria-busy": resolvedStreaming && cappedRows.length === 0 || void 0,
152
+ children: [
153
+ truncatedCount > 0 && /* @__PURE__ */ jsxs(TableCaption, { className: "mb-2 mt-3 px-3 text-caption", children: [
154
+ "Showing ",
155
+ cappedRows.length,
156
+ " of ",
157
+ total,
158
+ " rows"
159
+ ] }),
160
+ /* @__PURE__ */ jsx(TableHeader, { children: /* @__PURE__ */ jsx(TableRow, { children: columns.map((column) => {
161
+ const numeric = isNumericFormat(column.format);
162
+ const active = resolvedSort?.key === column.key;
163
+ const ariaSort = active ? resolvedSort?.direction === "asc" ? "ascending" : "descending" : sortable ? "none" : void 0;
164
+ const label = column.label ?? column.key;
165
+ return /* @__PURE__ */ jsx(
166
+ TableHead,
167
+ {
168
+ scope: "col",
169
+ "aria-sort": ariaSort,
170
+ className: cn(numeric && "text-end"),
171
+ children: sortable ? /* @__PURE__ */ jsxs(
172
+ "button",
173
+ {
174
+ type: "button",
175
+ onClick: () => toggleSort(column),
176
+ className: cn(
177
+ "inline-flex items-center gap-1 rounded-sm font-medium",
178
+ "focus-ring",
179
+ "hover:text-foreground transition-colors duration-fast ease-standard motion-reduce:transition-none",
180
+ numeric && "flex-row-reverse"
181
+ ),
182
+ children: [
183
+ /* @__PURE__ */ jsx("span", { children: label }),
184
+ active ? resolvedSort?.direction === "asc" ? /* @__PURE__ */ jsx(ChevronUp, { "aria-hidden": "true", className: "size-3.5" }) : /* @__PURE__ */ jsx(ChevronDown, { "aria-hidden": "true", className: "size-3.5" }) : /* @__PURE__ */ jsx(ChevronsUpDown, { "aria-hidden": "true", className: "size-3.5 opacity-50" })
185
+ ]
186
+ }
187
+ ) : label
188
+ },
189
+ column.key
190
+ );
191
+ }) }) }),
192
+ /* @__PURE__ */ jsx(TableBody, { children: cappedRows.length === 0 && resolvedStreaming ? [0, 1, 2].map((i) => /* @__PURE__ */ jsx(TableRow, { "aria-hidden": "true", children: columns.map((column) => /* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-full" }) }, column.key)) }, `skeleton-${i}`)) : cappedRows.length === 0 ? /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(
193
+ TableCell,
194
+ {
195
+ colSpan: columns.length,
196
+ className: "py-6 text-center text-muted-foreground",
197
+ children: emptyText ?? "No rows to display"
198
+ }
199
+ ) }) : cappedRows.map((row, rowIndex) => /* @__PURE__ */ jsx(TableRow, { children: columns.map((column) => {
200
+ const numeric = isNumericFormat(column.format);
201
+ return /* @__PURE__ */ jsx(
202
+ TableCell,
203
+ {
204
+ className: cn(numeric && "text-end tabular-nums"),
205
+ children: renderCellContent(column, row, rowIndex)
206
+ },
207
+ column.key
208
+ );
209
+ }) }, rowIndex)) })
210
+ ]
211
+ }
212
+ )
213
+ ] })
214
+ ] });
215
+ });
216
+
217
+ export {
218
+ MessageTableFallback,
219
+ MessageTable
220
+ };
221
+ //# sourceMappingURL=chunk-BHUVISIY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/message-table.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * MessageTable — a model-emittable data table rendered inside a chat message.\n *\n * The model emits a serializable, column-oriented `TableSpec` (see\n * `message-table-spec.ts`); MessageTable renders a lightweight table (NOT the\n * app-chrome `@elabs-ai/components-data` DataTable — this is message content).\n *\n * Design bar (mirrors AutoChart):\n * - Spec-driven, zod-validated; the model never chooses the look.\n * - Never throws. A malformed spec → `MessageTableFallback`; an unknown format\n * falls back to text; a missing cell renders an em-dash.\n * - Streaming-tolerant. Half-arrived columns/rows are dropped or render\n * progressively; a spec with columns but no rows yet shows skeleton rows.\n * - Tokens only; numeric columns are end-aligned + `tabular-nums`.\n * - Optional client-side sort (controlled OR uncontrolled) and an optional\n * per-cell `renderCell` override for consumer composition.\n *\n * Composes the `@elabs-ai/components-ui` `Table` primitive.\n */\n\nimport { forwardRef, useId, useMemo, useState, type HTMLAttributes, type ReactNode } from \"react\";\nimport { ChevronDown, ChevronUp, ChevronsUpDown } from \"lucide-react\";\nimport {\n Badge,\n Skeleton,\n Table,\n TableBody,\n TableCaption,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\n\nimport {\n badgeToneForValue,\n compareCellValues,\n EMPTY_CELL,\n formatCellValue,\n isEmptyCell,\n isNumericFormat,\n normalizeTableSpec,\n type ColumnSpec,\n type TableRowData,\n type TableSpec,\n} from \"./message-table-spec\";\n\n// ─── Sort ─────────────────────────────────────────────────────────────────────\n\nexport interface TableSort {\n /** The sorted column's key. */\n key: string;\n direction: \"asc\" | \"desc\";\n}\n\n/** Per-cell render override — return `undefined` to fall back to default rendering. */\nexport type RenderCell = (args: {\n value: unknown;\n column: ColumnSpec;\n row: TableRowData;\n rowIndex: number;\n}) => ReactNode;\n\n// ─── Fallback ─────────────────────────────────────────────────────────────────\n\nexport interface MessageTableFallbackProps extends HTMLAttributes<HTMLDivElement> {\n /** Short human reason the table could not render. */\n message?: string;\n}\n\n/** Shown when the spec is unusable. Mirrors `ChartFallback` semantics. */\nexport const MessageTableFallback = forwardRef<HTMLDivElement, MessageTableFallbackProps>(\n function MessageTableFallback(\n { message = \"This table could not be displayed.\", className, ...props },\n ref,\n ) {\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-live=\"polite\"\n className={cn(\n // Sole structural cue is the border (no fill) — reads in every theme,\n // incl. themes where surface-muted ≈ background. border-strong is\n // contrast-guaranteed vs the background.\n \"flex items-center justify-center rounded-md border border-border-strong px-4 py-6 text-center text-body text-muted-foreground\",\n className,\n )}\n {...props}\n >\n {message}\n </div>\n );\n },\n);\n\n// ─── MessageTable ─────────────────────────────────────────────────────────────\n\nexport interface MessageTableProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** The serializable table specification produced by an LLM tool-call. */\n spec: TableSpec | unknown;\n /** Enable click-to-sort column headers. @default false */\n sortable?: boolean;\n /** Controlled sort. When provided, `onSortChange` is the only way to update it. */\n sort?: TableSort | null;\n /** Uncontrolled initial sort. */\n defaultSort?: TableSort | null;\n /** Called with the next sort (or `null`) when a header is clicked. */\n onSortChange?: (sort: TableSort | null) => void;\n /** Cap the number of rendered rows; shows a \"Showing N of M rows\" notice. */\n maxRows?: number;\n /** Per-cell render override for custom composition. */\n renderCell?: RenderCell;\n /** The spec is still streaming (columns-but-no-rows shows skeleton rows). */\n isStreaming?: boolean;\n /** @deprecated Use `isStreaming`. */\n streaming?: boolean;\n}\n\n/**\n * MessageTable — renders a `TableSpec` as a lightweight message-body table.\n *\n * Intentionally bare: no toolbar, no expand chrome. Growing one here would be\n * `ChartFrame` re-implemented inside this package.\n *\n * **To make it expandable, wrap it in `ExpandDialog`**\n * (`@elabs-ai/components-ui`) — the shared two-pane expand surface,\n * the same one a chart opens. Do NOT hand-roll a lightbox or a full-screen\n * breakout; four of those already existed before the component was shared, and\n * each one taught users a different meaning for the same button.\n *\n * The context pane for a table is its SHAPE, not statistics: row count,\n * \"showing N of M\", column count, each column's declared `format`. A\n * model-emitted table's numerics may already be formatted strings, so min/max/avg\n * over them is wrong more often than right.\n */\nexport const MessageTable = forwardRef<HTMLDivElement, MessageTableProps>(function MessageTable(\n {\n spec,\n sortable = false,\n sort: sortProp,\n defaultSort = null,\n onSortChange,\n maxRows,\n renderCell,\n isStreaming,\n streaming = false,\n className,\n ...props\n },\n ref,\n) {\n const resolvedStreaming = isStreaming ?? streaming;\n const { t } = useLocale();\n const reactId = useId();\n const isControlled = sortProp !== undefined;\n const [internalSort, setInternalSort] = useState<TableSort | null>(defaultSort);\n const resolvedSort = isControlled ? (sortProp as TableSort | null) : internalSort;\n\n const result = normalizeTableSpec(spec);\n\n const normalized = result.ok ? result.spec : null;\n\n const sortedRows = useMemo<TableRowData[]>(() => {\n if (!normalized || !resolvedSort) return normalized?.rows ?? [];\n const column = normalized.columns.find((c) => c.key === resolvedSort.key);\n if (!column) return normalized.rows;\n const direction = resolvedSort.direction === \"asc\" ? 1 : -1;\n return [...normalized.rows].sort(\n (a, b) => direction * compareCellValues(a[column.key], b[column.key], column.format),\n );\n }, [normalized, resolvedSort]);\n\n if (!result.ok) {\n return (\n <MessageTableFallback ref={ref} message={result.reason} className={className} {...props} />\n );\n }\n\n const { columns, title, emptyText } = result.spec;\n\n // No columns: skeleton while streaming, otherwise a fallback.\n if (columns.length === 0) {\n if (resolvedStreaming) {\n return (\n <div ref={ref} className={cn(\"w-full\", className)} {...props}>\n <span className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n Loading table…\n </span>\n <div\n aria-hidden=\"true\"\n className=\"flex flex-col gap-2 rounded-md border border-border p-3\"\n >\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-3/4\" />\n </div>\n </div>\n );\n }\n return (\n <MessageTableFallback\n ref={ref}\n message=\"This table has no columns to display.\"\n className={className}\n {...props}\n />\n );\n }\n\n const total = sortedRows.length;\n const cappedRows =\n maxRows !== undefined && maxRows >= 0 ? sortedRows.slice(0, maxRows) : sortedRows;\n const truncatedCount = total - cappedRows.length;\n\n const titleId = title ? `${reactId}-title` : undefined;\n\n const setSort = (next: TableSort | null) => {\n if (!isControlled) setInternalSort(next);\n onSortChange?.(next);\n };\n\n const toggleSort = (column: ColumnSpec) => {\n if (resolvedSort?.key === column.key) {\n setSort({ key: column.key, direction: resolvedSort.direction === \"asc\" ? \"desc\" : \"asc\" });\n } else {\n setSort({ key: column.key, direction: \"asc\" });\n }\n };\n\n const renderCellContent = (\n column: ColumnSpec,\n row: TableRowData,\n rowIndex: number,\n ): ReactNode => {\n const value = row[column.key];\n if (renderCell) {\n const overridden = renderCell({ value, column, row, rowIndex });\n if (overridden !== undefined) return overridden;\n }\n if (isEmptyCell(value)) {\n return <span className=\"text-muted-foreground\">{EMPTY_CELL}</span>;\n }\n if (column.format === \"badge\") {\n return <Badge variant={badgeToneForValue(value)}>{String(value)}</Badge>;\n }\n return formatCellValue(value, column.format);\n };\n\n return (\n <div ref={ref} className={cn(\"w-full\", className)} {...props}>\n {title && (\n <p id={titleId} className=\"mb-1 text-body font-semibold text-foreground text-balance\">\n {title}\n </p>\n )}\n <div className=\"overflow-hidden rounded-md border border-border\">\n {resolvedStreaming && cappedRows.length === 0 && (\n <span className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n Loading table…\n </span>\n )}\n <Table\n aria-labelledby={titleId}\n aria-label={title ? undefined : t(\"ai.messageTable.label\")}\n aria-busy={(resolvedStreaming && cappedRows.length === 0) || undefined}\n >\n {truncatedCount > 0 && (\n <TableCaption className=\"mb-2 mt-3 px-3 text-caption\">\n Showing {cappedRows.length} of {total} rows\n </TableCaption>\n )}\n <TableHeader>\n <TableRow>\n {columns.map((column) => {\n const numeric = isNumericFormat(column.format);\n const active = resolvedSort?.key === column.key;\n const ariaSort = active\n ? resolvedSort?.direction === \"asc\"\n ? \"ascending\"\n : \"descending\"\n : sortable\n ? \"none\"\n : undefined;\n const label = column.label ?? column.key;\n return (\n <TableHead\n key={column.key}\n scope=\"col\"\n aria-sort={ariaSort}\n className={cn(numeric && \"text-end\")}\n >\n {sortable ? (\n <button\n type=\"button\"\n onClick={() => toggleSort(column)}\n className={cn(\n \"inline-flex items-center gap-1 rounded-sm font-medium\",\n \"focus-ring\",\n \"hover:text-foreground transition-colors duration-fast ease-standard motion-reduce:transition-none\",\n numeric && \"flex-row-reverse\",\n )}\n >\n <span>{label}</span>\n {active ? (\n resolvedSort?.direction === \"asc\" ? (\n <ChevronUp aria-hidden=\"true\" className=\"size-3.5\" />\n ) : (\n <ChevronDown aria-hidden=\"true\" className=\"size-3.5\" />\n )\n ) : (\n <ChevronsUpDown aria-hidden=\"true\" className=\"size-3.5 opacity-50\" />\n )}\n </button>\n ) : (\n label\n )}\n </TableHead>\n );\n })}\n </TableRow>\n </TableHeader>\n <TableBody>\n {cappedRows.length === 0 && resolvedStreaming ? (\n [0, 1, 2].map((i) => (\n <TableRow key={`skeleton-${i}`} aria-hidden=\"true\">\n {columns.map((column) => (\n <TableCell key={column.key}>\n <Skeleton className=\"h-4 w-full\" />\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : cappedRows.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={columns.length}\n className=\"py-6 text-center text-muted-foreground\"\n >\n {emptyText ?? \"No rows to display\"}\n </TableCell>\n </TableRow>\n ) : (\n cappedRows.map((row, rowIndex) => (\n <TableRow key={rowIndex}>\n {columns.map((column) => {\n const numeric = isNumericFormat(column.format);\n return (\n <TableCell\n key={column.key}\n className={cn(numeric && \"text-end tabular-nums\")}\n >\n {renderCellContent(column, row, rowIndex)}\n </TableCell>\n );\n })}\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n </div>\n );\n});\n"],"mappings":"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","names":["MessageTableFallback","MessageTable"]}