@theokit/ui 0.13.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 (715) hide show
  1. package/CHANGELOG.md +1325 -0
  2. package/DESIGN.md +456 -0
  3. package/LICENSE +201 -0
  4. package/NOTICE +38 -0
  5. package/README.md +467 -0
  6. package/dist/chunk-27ENTTY7.js +146 -0
  7. package/dist/chunk-27ENTTY7.js.map +1 -0
  8. package/dist/chunk-2H6TQELG.js +33 -0
  9. package/dist/chunk-2H6TQELG.js.map +1 -0
  10. package/dist/chunk-2L6MRJD4.js +120 -0
  11. package/dist/chunk-2L6MRJD4.js.map +1 -0
  12. package/dist/chunk-2Y5V2PAL.js +80 -0
  13. package/dist/chunk-2Y5V2PAL.js.map +1 -0
  14. package/dist/chunk-34NAFDVL.js +46 -0
  15. package/dist/chunk-34NAFDVL.js.map +1 -0
  16. package/dist/chunk-36KJGXEK.js +112 -0
  17. package/dist/chunk-36KJGXEK.js.map +1 -0
  18. package/dist/chunk-3BMYYNN6.js +124 -0
  19. package/dist/chunk-3BMYYNN6.js.map +1 -0
  20. package/dist/chunk-3OHV7EEI.js +34 -0
  21. package/dist/chunk-3OHV7EEI.js.map +1 -0
  22. package/dist/chunk-3QKTS6F5.js +88 -0
  23. package/dist/chunk-3QKTS6F5.js.map +1 -0
  24. package/dist/chunk-3TBXLYNM.js +42 -0
  25. package/dist/chunk-3TBXLYNM.js.map +1 -0
  26. package/dist/chunk-4AM2HSXU.js +67 -0
  27. package/dist/chunk-4AM2HSXU.js.map +1 -0
  28. package/dist/chunk-4BCGKM65.js +44 -0
  29. package/dist/chunk-4BCGKM65.js.map +1 -0
  30. package/dist/chunk-4D3JILQX.js +145 -0
  31. package/dist/chunk-4D3JILQX.js.map +1 -0
  32. package/dist/chunk-4EJU2GBG.js +48 -0
  33. package/dist/chunk-4EJU2GBG.js.map +1 -0
  34. package/dist/chunk-4WKO3G5C.js +110 -0
  35. package/dist/chunk-4WKO3G5C.js.map +1 -0
  36. package/dist/chunk-53XPKI7Q.js +97 -0
  37. package/dist/chunk-53XPKI7Q.js.map +1 -0
  38. package/dist/chunk-55TDVDPG.js +58 -0
  39. package/dist/chunk-55TDVDPG.js.map +1 -0
  40. package/dist/chunk-56BJLFW7.js +26 -0
  41. package/dist/chunk-56BJLFW7.js.map +1 -0
  42. package/dist/chunk-5HOQLE6Y.js +35 -0
  43. package/dist/chunk-5HOQLE6Y.js.map +1 -0
  44. package/dist/chunk-5TY3NYF5.js +144 -0
  45. package/dist/chunk-5TY3NYF5.js.map +1 -0
  46. package/dist/chunk-5VOSCJKQ.js +92 -0
  47. package/dist/chunk-5VOSCJKQ.js.map +1 -0
  48. package/dist/chunk-65NVO6TK.js +171 -0
  49. package/dist/chunk-65NVO6TK.js.map +1 -0
  50. package/dist/chunk-6A5TPCKP.js +64 -0
  51. package/dist/chunk-6A5TPCKP.js.map +1 -0
  52. package/dist/chunk-6CO4LEXZ.js +41 -0
  53. package/dist/chunk-6CO4LEXZ.js.map +1 -0
  54. package/dist/chunk-6FVUPNPG.js +56 -0
  55. package/dist/chunk-6FVUPNPG.js.map +1 -0
  56. package/dist/chunk-76YWTIWK.js +106 -0
  57. package/dist/chunk-76YWTIWK.js.map +1 -0
  58. package/dist/chunk-7EI7424P.js +78 -0
  59. package/dist/chunk-7EI7424P.js.map +1 -0
  60. package/dist/chunk-AHTVYOPQ.js +26 -0
  61. package/dist/chunk-AHTVYOPQ.js.map +1 -0
  62. package/dist/chunk-AJTJNHKK.js +85 -0
  63. package/dist/chunk-AJTJNHKK.js.map +1 -0
  64. package/dist/chunk-AMT3CPMC.js +155 -0
  65. package/dist/chunk-AMT3CPMC.js.map +1 -0
  66. package/dist/chunk-AX5EH73R.js +59 -0
  67. package/dist/chunk-AX5EH73R.js.map +1 -0
  68. package/dist/chunk-B3VAJSZ2.js +35 -0
  69. package/dist/chunk-B3VAJSZ2.js.map +1 -0
  70. package/dist/chunk-B4CQMQ64.js +25 -0
  71. package/dist/chunk-B4CQMQ64.js.map +1 -0
  72. package/dist/chunk-BMRZXT5T.js +115 -0
  73. package/dist/chunk-BMRZXT5T.js.map +1 -0
  74. package/dist/chunk-BYZ6OFH4.js +73 -0
  75. package/dist/chunk-BYZ6OFH4.js.map +1 -0
  76. package/dist/chunk-C55VUQ7N.js +156 -0
  77. package/dist/chunk-C55VUQ7N.js.map +1 -0
  78. package/dist/chunk-D4GEAV4C.js +91 -0
  79. package/dist/chunk-D4GEAV4C.js.map +1 -0
  80. package/dist/chunk-DC43CHAM.js +152 -0
  81. package/dist/chunk-DC43CHAM.js.map +1 -0
  82. package/dist/chunk-DKCRLN35.js +92 -0
  83. package/dist/chunk-DKCRLN35.js.map +1 -0
  84. package/dist/chunk-DN5BUDBI.js +86 -0
  85. package/dist/chunk-DN5BUDBI.js.map +1 -0
  86. package/dist/chunk-DOLKDYMS.js +88 -0
  87. package/dist/chunk-DOLKDYMS.js.map +1 -0
  88. package/dist/chunk-DW34WXCG.js +28 -0
  89. package/dist/chunk-DW34WXCG.js.map +1 -0
  90. package/dist/chunk-DZAAKHGZ.js +135 -0
  91. package/dist/chunk-DZAAKHGZ.js.map +1 -0
  92. package/dist/chunk-E4IRSSHO.js +116 -0
  93. package/dist/chunk-E4IRSSHO.js.map +1 -0
  94. package/dist/chunk-E67WQXBV.js +104 -0
  95. package/dist/chunk-E67WQXBV.js.map +1 -0
  96. package/dist/chunk-EG6IHP3H.js +128 -0
  97. package/dist/chunk-EG6IHP3H.js.map +1 -0
  98. package/dist/chunk-EO7LOXG2.js +82 -0
  99. package/dist/chunk-EO7LOXG2.js.map +1 -0
  100. package/dist/chunk-EWDN56AS.js +24 -0
  101. package/dist/chunk-EWDN56AS.js.map +1 -0
  102. package/dist/chunk-F5P5P2SC.js +141 -0
  103. package/dist/chunk-F5P5P2SC.js.map +1 -0
  104. package/dist/chunk-FAWPRZTM.js +79 -0
  105. package/dist/chunk-FAWPRZTM.js.map +1 -0
  106. package/dist/chunk-FGYJ2WPX.js +36 -0
  107. package/dist/chunk-FGYJ2WPX.js.map +1 -0
  108. package/dist/chunk-GBG3I5I5.js +46 -0
  109. package/dist/chunk-GBG3I5I5.js.map +1 -0
  110. package/dist/chunk-GDMCDW66.js +19 -0
  111. package/dist/chunk-GDMCDW66.js.map +1 -0
  112. package/dist/chunk-H6HSQCOW.js +80 -0
  113. package/dist/chunk-H6HSQCOW.js.map +1 -0
  114. package/dist/chunk-HDM4RCIF.js +111 -0
  115. package/dist/chunk-HDM4RCIF.js.map +1 -0
  116. package/dist/chunk-HNTOGGVD.js +77 -0
  117. package/dist/chunk-HNTOGGVD.js.map +1 -0
  118. package/dist/chunk-HQW2ABO4.js +28 -0
  119. package/dist/chunk-HQW2ABO4.js.map +1 -0
  120. package/dist/chunk-HRDRGZ2Y.js +76 -0
  121. package/dist/chunk-HRDRGZ2Y.js.map +1 -0
  122. package/dist/chunk-HUOVA7SF.js +83 -0
  123. package/dist/chunk-HUOVA7SF.js.map +1 -0
  124. package/dist/chunk-ITA3SNOR.js +133 -0
  125. package/dist/chunk-ITA3SNOR.js.map +1 -0
  126. package/dist/chunk-IYNUPG2G.js +61 -0
  127. package/dist/chunk-IYNUPG2G.js.map +1 -0
  128. package/dist/chunk-JJ65ZI4P.js +199 -0
  129. package/dist/chunk-JJ65ZI4P.js.map +1 -0
  130. package/dist/chunk-JRBGZ6NI.js +106 -0
  131. package/dist/chunk-JRBGZ6NI.js.map +1 -0
  132. package/dist/chunk-K45OO62F.js +108 -0
  133. package/dist/chunk-K45OO62F.js.map +1 -0
  134. package/dist/chunk-KDTKA667.js +67 -0
  135. package/dist/chunk-KDTKA667.js.map +1 -0
  136. package/dist/chunk-KI7KZBSN.js +142 -0
  137. package/dist/chunk-KI7KZBSN.js.map +1 -0
  138. package/dist/chunk-KOJ7XOPZ.js +87 -0
  139. package/dist/chunk-KOJ7XOPZ.js.map +1 -0
  140. package/dist/chunk-KQTHJ22B.js +82 -0
  141. package/dist/chunk-KQTHJ22B.js.map +1 -0
  142. package/dist/chunk-KRC43RZR.js +77 -0
  143. package/dist/chunk-KRC43RZR.js.map +1 -0
  144. package/dist/chunk-LJQOEGQ2.js +116 -0
  145. package/dist/chunk-LJQOEGQ2.js.map +1 -0
  146. package/dist/chunk-LKRNUSKZ.js +149 -0
  147. package/dist/chunk-LKRNUSKZ.js.map +1 -0
  148. package/dist/chunk-LLL7QQ52.js +76 -0
  149. package/dist/chunk-LLL7QQ52.js.map +1 -0
  150. package/dist/chunk-LQ4B5X4Y.js +56 -0
  151. package/dist/chunk-LQ4B5X4Y.js.map +1 -0
  152. package/dist/chunk-M3FSLEHQ.js +76 -0
  153. package/dist/chunk-M3FSLEHQ.js.map +1 -0
  154. package/dist/chunk-M5G3O6H6.js +57 -0
  155. package/dist/chunk-M5G3O6H6.js.map +1 -0
  156. package/dist/chunk-M6JIC5PU.js +81 -0
  157. package/dist/chunk-M6JIC5PU.js.map +1 -0
  158. package/dist/chunk-N2HJ3SLS.js +186 -0
  159. package/dist/chunk-N2HJ3SLS.js.map +1 -0
  160. package/dist/chunk-NGZWBFTP.js +45 -0
  161. package/dist/chunk-NGZWBFTP.js.map +1 -0
  162. package/dist/chunk-OAKCXT35.js +34 -0
  163. package/dist/chunk-OAKCXT35.js.map +1 -0
  164. package/dist/chunk-OSD3U3HT.js +54 -0
  165. package/dist/chunk-OSD3U3HT.js.map +1 -0
  166. package/dist/chunk-OUXESQ2R.js +42 -0
  167. package/dist/chunk-OUXESQ2R.js.map +1 -0
  168. package/dist/chunk-OY2LJHMJ.js +43 -0
  169. package/dist/chunk-OY2LJHMJ.js.map +1 -0
  170. package/dist/chunk-OYEZR4CN.js +221 -0
  171. package/dist/chunk-OYEZR4CN.js.map +1 -0
  172. package/dist/chunk-P57HUMAE.js +66 -0
  173. package/dist/chunk-P57HUMAE.js.map +1 -0
  174. package/dist/chunk-P6Y2PI6L.js +82 -0
  175. package/dist/chunk-P6Y2PI6L.js.map +1 -0
  176. package/dist/chunk-PA7TDXUQ.js +51 -0
  177. package/dist/chunk-PA7TDXUQ.js.map +1 -0
  178. package/dist/chunk-PPBGGNPV.js +112 -0
  179. package/dist/chunk-PPBGGNPV.js.map +1 -0
  180. package/dist/chunk-PRH4HKND.js +48 -0
  181. package/dist/chunk-PRH4HKND.js.map +1 -0
  182. package/dist/chunk-PSPAZJUQ.js +32 -0
  183. package/dist/chunk-PSPAZJUQ.js.map +1 -0
  184. package/dist/chunk-Q5G5CGZ2.js +170 -0
  185. package/dist/chunk-Q5G5CGZ2.js.map +1 -0
  186. package/dist/chunk-QDAF3LP7.js +89 -0
  187. package/dist/chunk-QDAF3LP7.js.map +1 -0
  188. package/dist/chunk-QGVIGNJ3.js +37 -0
  189. package/dist/chunk-QGVIGNJ3.js.map +1 -0
  190. package/dist/chunk-QNUITYSY.js +68 -0
  191. package/dist/chunk-QNUITYSY.js.map +1 -0
  192. package/dist/chunk-QSWVN3RT.js +116 -0
  193. package/dist/chunk-QSWVN3RT.js.map +1 -0
  194. package/dist/chunk-QTLQZ7OJ.js +110 -0
  195. package/dist/chunk-QTLQZ7OJ.js.map +1 -0
  196. package/dist/chunk-QYAMLIG2.js +84 -0
  197. package/dist/chunk-QYAMLIG2.js.map +1 -0
  198. package/dist/chunk-REILH4XF.js +128 -0
  199. package/dist/chunk-REILH4XF.js.map +1 -0
  200. package/dist/chunk-S6SSK6QX.js +80 -0
  201. package/dist/chunk-S6SSK6QX.js.map +1 -0
  202. package/dist/chunk-SA7ED3PN.js +68 -0
  203. package/dist/chunk-SA7ED3PN.js.map +1 -0
  204. package/dist/chunk-SIJOEM4N.js +55 -0
  205. package/dist/chunk-SIJOEM4N.js.map +1 -0
  206. package/dist/chunk-SLOKAAH2.js +70 -0
  207. package/dist/chunk-SLOKAAH2.js.map +1 -0
  208. package/dist/chunk-TR6NPSMX.js +85 -0
  209. package/dist/chunk-TR6NPSMX.js.map +1 -0
  210. package/dist/chunk-TSZ5DEAT.js +106 -0
  211. package/dist/chunk-TSZ5DEAT.js.map +1 -0
  212. package/dist/chunk-TUNVF45W.js +127 -0
  213. package/dist/chunk-TUNVF45W.js.map +1 -0
  214. package/dist/chunk-TXOBNSQ5.js +63 -0
  215. package/dist/chunk-TXOBNSQ5.js.map +1 -0
  216. package/dist/chunk-U44DRLMM.js +88 -0
  217. package/dist/chunk-U44DRLMM.js.map +1 -0
  218. package/dist/chunk-U4THNRV5.js +114 -0
  219. package/dist/chunk-U4THNRV5.js.map +1 -0
  220. package/dist/chunk-UAZOFC4W.js +72 -0
  221. package/dist/chunk-UAZOFC4W.js.map +1 -0
  222. package/dist/chunk-UGKI466V.js +12 -0
  223. package/dist/chunk-UGKI466V.js.map +1 -0
  224. package/dist/chunk-VM4RMQQN.js +11 -0
  225. package/dist/chunk-VM4RMQQN.js.map +1 -0
  226. package/dist/chunk-VQ37VLAS.js +54 -0
  227. package/dist/chunk-VQ37VLAS.js.map +1 -0
  228. package/dist/chunk-VT7VSYH5.js +73 -0
  229. package/dist/chunk-VT7VSYH5.js.map +1 -0
  230. package/dist/chunk-VTIRUCLZ.js +57 -0
  231. package/dist/chunk-VTIRUCLZ.js.map +1 -0
  232. package/dist/chunk-VVBAEYKI.js +202 -0
  233. package/dist/chunk-VVBAEYKI.js.map +1 -0
  234. package/dist/chunk-WHFIQUCC.js +120 -0
  235. package/dist/chunk-WHFIQUCC.js.map +1 -0
  236. package/dist/chunk-WPSESV5Z.js +74 -0
  237. package/dist/chunk-WPSESV5Z.js.map +1 -0
  238. package/dist/chunk-WXEXCHEN.js +51 -0
  239. package/dist/chunk-WXEXCHEN.js.map +1 -0
  240. package/dist/chunk-X2DDPD3D.js +113 -0
  241. package/dist/chunk-X2DDPD3D.js.map +1 -0
  242. package/dist/chunk-X7VIMKLD.js +127 -0
  243. package/dist/chunk-X7VIMKLD.js.map +1 -0
  244. package/dist/chunk-XJ3EG6XY.js +30 -0
  245. package/dist/chunk-XJ3EG6XY.js.map +1 -0
  246. package/dist/chunk-XOT5HWSF.js +23 -0
  247. package/dist/chunk-XOT5HWSF.js.map +1 -0
  248. package/dist/chunk-Y72IP43U.js +117 -0
  249. package/dist/chunk-Y72IP43U.js.map +1 -0
  250. package/dist/chunk-YD6FLXBV.js +61 -0
  251. package/dist/chunk-YD6FLXBV.js.map +1 -0
  252. package/dist/chunk-YEQQGYYO.js +1022 -0
  253. package/dist/chunk-YEQQGYYO.js.map +1 -0
  254. package/dist/chunk-YYW6AEIT.js +46 -0
  255. package/dist/chunk-YYW6AEIT.js.map +1 -0
  256. package/dist/chunk-ZEVGXKRU.js +104 -0
  257. package/dist/chunk-ZEVGXKRU.js.map +1 -0
  258. package/dist/chunk-ZKSMMLDP.js +74 -0
  259. package/dist/chunk-ZKSMMLDP.js.map +1 -0
  260. package/dist/chunk-ZU6IM6PK.js +101 -0
  261. package/dist/chunk-ZU6IM6PK.js.map +1 -0
  262. package/dist/chunk-ZUS5KZGO.js +714 -0
  263. package/dist/chunk-ZUS5KZGO.js.map +1 -0
  264. package/dist/chunk-ZVS2GOT2.js +58 -0
  265. package/dist/chunk-ZVS2GOT2.js.map +1 -0
  266. package/dist/chunk-ZXPDS6DH.js +3 -0
  267. package/dist/chunk-ZXPDS6DH.js.map +1 -0
  268. package/dist/chunk-ZZQQJX5Z.js +173 -0
  269. package/dist/chunk-ZZQQJX5Z.js.map +1 -0
  270. package/dist/components.css +2 -0
  271. package/dist/composites/account-menu/index.js +6 -0
  272. package/dist/composites/account-menu/index.js.map +1 -0
  273. package/dist/composites/agent-composer/index.js +7 -0
  274. package/dist/composites/agent-composer/index.js.map +1 -0
  275. package/dist/composites/agent-editor/index.js +10 -0
  276. package/dist/composites/agent-editor/index.js.map +1 -0
  277. package/dist/composites/agent-stream/index.js +12 -0
  278. package/dist/composites/agent-stream/index.js.map +1 -0
  279. package/dist/composites/agent-timeline/index.js +5 -0
  280. package/dist/composites/agent-timeline/index.js.map +1 -0
  281. package/dist/composites/approval-card/index.js +5 -0
  282. package/dist/composites/approval-card/index.js.map +1 -0
  283. package/dist/composites/chat-composer/index.js +6 -0
  284. package/dist/composites/chat-composer/index.js.map +1 -0
  285. package/dist/composites/chat-message/index.js +6 -0
  286. package/dist/composites/chat-message/index.js.map +1 -0
  287. package/dist/composites/code-block/index.js +5 -0
  288. package/dist/composites/code-block/index.js.map +1 -0
  289. package/dist/composites/command-palette/index.js +5 -0
  290. package/dist/composites/command-palette/index.js.map +1 -0
  291. package/dist/composites/confirm-dialog/index.js +7 -0
  292. package/dist/composites/confirm-dialog/index.js.map +1 -0
  293. package/dist/composites/cron-jobs-list/index.js +5 -0
  294. package/dist/composites/cron-jobs-list/index.js.map +1 -0
  295. package/dist/composites/data-table/index.js +10 -0
  296. package/dist/composites/data-table/index.js.map +1 -0
  297. package/dist/composites/deployment-row/index.js +5 -0
  298. package/dist/composites/deployment-row/index.js.map +1 -0
  299. package/dist/composites/domain-config/index.js +7 -0
  300. package/dist/composites/domain-config/index.js.map +1 -0
  301. package/dist/composites/env-var-editor/index.js +7 -0
  302. package/dist/composites/env-var-editor/index.js.map +1 -0
  303. package/dist/composites/mcp-server-list/index.js +5 -0
  304. package/dist/composites/mcp-server-list/index.js.map +1 -0
  305. package/dist/composites/page-shell/index.js +7 -0
  306. package/dist/composites/page-shell/index.js.map +1 -0
  307. package/dist/composites/permission-modal/index.js +6 -0
  308. package/dist/composites/permission-modal/index.js.map +1 -0
  309. package/dist/composites/preview-env-card/index.js +6 -0
  310. package/dist/composites/preview-env-card/index.js.map +1 -0
  311. package/dist/composites/preview-panel/index.js +5 -0
  312. package/dist/composites/preview-panel/index.js.map +1 -0
  313. package/dist/composites/project-card/index.js +6 -0
  314. package/dist/composites/project-card/index.js.map +1 -0
  315. package/dist/composites/rollback-ui/index.js +6 -0
  316. package/dist/composites/rollback-ui/index.js.map +1 -0
  317. package/dist/composites/rule-editor/index.js +11 -0
  318. package/dist/composites/rule-editor/index.js.map +1 -0
  319. package/dist/composites/skill-editor/index.js +11 -0
  320. package/dist/composites/skill-editor/index.js.map +1 -0
  321. package/dist/composites/skills-list/index.js +5 -0
  322. package/dist/composites/skills-list/index.js.map +1 -0
  323. package/dist/composites/stability-bundle-viewer/index.js +4 -0
  324. package/dist/composites/stability-bundle-viewer/index.js.map +1 -0
  325. package/dist/composites/task-header/index.js +5 -0
  326. package/dist/composites/task-header/index.js.map +1 -0
  327. package/dist/composites/usage-meter/index.js +5 -0
  328. package/dist/composites/usage-meter/index.js.map +1 -0
  329. package/dist/fonts/LICENSE-GEIST.txt +92 -0
  330. package/dist/fonts/geist-400.woff2 +0 -0
  331. package/dist/fonts/geist-500.woff2 +0 -0
  332. package/dist/fonts/geist-600.woff2 +0 -0
  333. package/dist/fonts/geist-mono-400.woff2 +0 -0
  334. package/dist/fonts/geist-mono-500.woff2 +0 -0
  335. package/dist/fonts/geist-mono-600.woff2 +0 -0
  336. package/dist/fonts-cdn.css +28 -0
  337. package/dist/fonts.css +75 -0
  338. package/dist/index.d.ts +4621 -0
  339. package/dist/index.js +1338 -0
  340. package/dist/index.js.map +1 -0
  341. package/dist/plugin-D5xmXqYb.d.ts +172 -0
  342. package/dist/preset-v3-legacy.d.ts +35 -0
  343. package/dist/preset-v3-legacy.js +159 -0
  344. package/dist/preset-v3-legacy.js.map +1 -0
  345. package/dist/preset.css +27 -0
  346. package/dist/primitives/action-bar/index.js +4 -0
  347. package/dist/primitives/action-bar/index.js.map +1 -0
  348. package/dist/primitives/agent-error-card/index.js +5 -0
  349. package/dist/primitives/agent-error-card/index.js.map +1 -0
  350. package/dist/primitives/agent-event/index.js +4 -0
  351. package/dist/primitives/agent-event/index.js.map +1 -0
  352. package/dist/primitives/agent-handoff/index.js +4 -0
  353. package/dist/primitives/agent-handoff/index.js.map +1 -0
  354. package/dist/primitives/agent-profile/index.js +4 -0
  355. package/dist/primitives/agent-profile/index.js.map +1 -0
  356. package/dist/primitives/agent-starting-state/index.js +5 -0
  357. package/dist/primitives/agent-starting-state/index.js.map +1 -0
  358. package/dist/primitives/agent-streaming/index.js +5 -0
  359. package/dist/primitives/agent-streaming/index.js.map +1 -0
  360. package/dist/primitives/alert/index.js +4 -0
  361. package/dist/primitives/alert/index.js.map +1 -0
  362. package/dist/primitives/artifact-preview/index.js +4 -0
  363. package/dist/primitives/artifact-preview/index.js.map +1 -0
  364. package/dist/primitives/attachment-chip/index.js +4 -0
  365. package/dist/primitives/attachment-chip/index.js.map +1 -0
  366. package/dist/primitives/audit-log-entry/index.js +4 -0
  367. package/dist/primitives/audit-log-entry/index.js.map +1 -0
  368. package/dist/primitives/auto-compact-notice/index.js +5 -0
  369. package/dist/primitives/auto-compact-notice/index.js.map +1 -0
  370. package/dist/primitives/avatar/index.js +4 -0
  371. package/dist/primitives/avatar/index.js.map +1 -0
  372. package/dist/primitives/badge/index.js +4 -0
  373. package/dist/primitives/badge/index.js.map +1 -0
  374. package/dist/primitives/branch-indicator/index.js +4 -0
  375. package/dist/primitives/branch-indicator/index.js.map +1 -0
  376. package/dist/primitives/browser-controls/index.js +4 -0
  377. package/dist/primitives/browser-controls/index.js.map +1 -0
  378. package/dist/primitives/build-log-stream/index.js +5 -0
  379. package/dist/primitives/build-log-stream/index.js.map +1 -0
  380. package/dist/primitives/button/index.js +4 -0
  381. package/dist/primitives/button/index.js.map +1 -0
  382. package/dist/primitives/capability-indicator/index.js +4 -0
  383. package/dist/primitives/capability-indicator/index.js.map +1 -0
  384. package/dist/primitives/card/index.js +4 -0
  385. package/dist/primitives/card/index.js.map +1 -0
  386. package/dist/primitives/channel-card/index.js +4 -0
  387. package/dist/primitives/channel-card/index.js.map +1 -0
  388. package/dist/primitives/chat-thread/index.js +5 -0
  389. package/dist/primitives/chat-thread/index.js.map +1 -0
  390. package/dist/primitives/checkbox/index.js +4 -0
  391. package/dist/primitives/checkbox/index.js.map +1 -0
  392. package/dist/primitives/context-card/index.js +4 -0
  393. package/dist/primitives/context-card/index.js.map +1 -0
  394. package/dist/primitives/context-window-bar/index.js +4 -0
  395. package/dist/primitives/context-window-bar/index.js.map +1 -0
  396. package/dist/primitives/copy-button/index.js +4 -0
  397. package/dist/primitives/copy-button/index.js.map +1 -0
  398. package/dist/primitives/cost-meter/index.js +4 -0
  399. package/dist/primitives/cost-meter/index.js.map +1 -0
  400. package/dist/primitives/created-files-card/index.js +4 -0
  401. package/dist/primitives/created-files-card/index.js.map +1 -0
  402. package/dist/primitives/cron-job-card/index.js +4 -0
  403. package/dist/primitives/cron-job-card/index.js.map +1 -0
  404. package/dist/primitives/danger-zone/index.js +4 -0
  405. package/dist/primitives/danger-zone/index.js.map +1 -0
  406. package/dist/primitives/dialog/index.js +4 -0
  407. package/dist/primitives/dialog/index.js.map +1 -0
  408. package/dist/primitives/diff-viewer/index.js +4 -0
  409. package/dist/primitives/diff-viewer/index.js.map +1 -0
  410. package/dist/primitives/dropdown-menu/index.js +4 -0
  411. package/dist/primitives/dropdown-menu/index.js.map +1 -0
  412. package/dist/primitives/empty-state/index.js +4 -0
  413. package/dist/primitives/empty-state/index.js.map +1 -0
  414. package/dist/primitives/export-chat-dialog/index.js +4 -0
  415. package/dist/primitives/export-chat-dialog/index.js.map +1 -0
  416. package/dist/primitives/folder-context-card/index.js +4 -0
  417. package/dist/primitives/folder-context-card/index.js.map +1 -0
  418. package/dist/primitives/folder-selector/index.js +4 -0
  419. package/dist/primitives/folder-selector/index.js.map +1 -0
  420. package/dist/primitives/form-field/index.js +4 -0
  421. package/dist/primitives/form-field/index.js.map +1 -0
  422. package/dist/primitives/gateway-status-indicator/index.js +4 -0
  423. package/dist/primitives/gateway-status-indicator/index.js.map +1 -0
  424. package/dist/primitives/hook-config/index.js +4 -0
  425. package/dist/primitives/hook-config/index.js.map +1 -0
  426. package/dist/primitives/hook-event-log/index.js +4 -0
  427. package/dist/primitives/hook-event-log/index.js.map +1 -0
  428. package/dist/primitives/input/index.js +4 -0
  429. package/dist/primitives/input/index.js.map +1 -0
  430. package/dist/primitives/intent-selector/index.js +4 -0
  431. package/dist/primitives/intent-selector/index.js.map +1 -0
  432. package/dist/primitives/label/index.js +4 -0
  433. package/dist/primitives/label/index.js.map +1 -0
  434. package/dist/primitives/lane-board/index.js +4 -0
  435. package/dist/primitives/lane-board/index.js.map +1 -0
  436. package/dist/primitives/login-split/index.js +4 -0
  437. package/dist/primitives/login-split/index.js.map +1 -0
  438. package/dist/primitives/mcp-server-card/index.js +4 -0
  439. package/dist/primitives/mcp-server-card/index.js.map +1 -0
  440. package/dist/primitives/memory-editor/index.js +4 -0
  441. package/dist/primitives/memory-editor/index.js.map +1 -0
  442. package/dist/primitives/mention-menu/index.js +4 -0
  443. package/dist/primitives/mention-menu/index.js.map +1 -0
  444. package/dist/primitives/metrics-panel/index.js +4 -0
  445. package/dist/primitives/metrics-panel/index.js.map +1 -0
  446. package/dist/primitives/model-card/index.js +4 -0
  447. package/dist/primitives/model-card/index.js.map +1 -0
  448. package/dist/primitives/model-selector/index.js +4 -0
  449. package/dist/primitives/model-selector/index.js.map +1 -0
  450. package/dist/primitives/pagination/index.js +4 -0
  451. package/dist/primitives/pagination/index.js.map +1 -0
  452. package/dist/primitives/permission-matrix/index.js +4 -0
  453. package/dist/primitives/permission-matrix/index.js.map +1 -0
  454. package/dist/primitives/pin-input/index.js +4 -0
  455. package/dist/primitives/pin-input/index.js.map +1 -0
  456. package/dist/primitives/plan-badge/index.js +4 -0
  457. package/dist/primitives/plan-badge/index.js.map +1 -0
  458. package/dist/primitives/progress/index.js +4 -0
  459. package/dist/primitives/progress/index.js.map +1 -0
  460. package/dist/primitives/progress-checklist/index.js +4 -0
  461. package/dist/primitives/progress-checklist/index.js.map +1 -0
  462. package/dist/primitives/project-switcher/index.js +4 -0
  463. package/dist/primitives/project-switcher/index.js.map +1 -0
  464. package/dist/primitives/quick-action-chips/index.js +4 -0
  465. package/dist/primitives/quick-action-chips/index.js.map +1 -0
  466. package/dist/primitives/radio-group/index.js +4 -0
  467. package/dist/primitives/radio-group/index.js.map +1 -0
  468. package/dist/primitives/recent-folders-list/index.js +4 -0
  469. package/dist/primitives/recent-folders-list/index.js.map +1 -0
  470. package/dist/primitives/rule-card/index.js +4 -0
  471. package/dist/primitives/rule-card/index.js.map +1 -0
  472. package/dist/primitives/run-stats/index.js +4 -0
  473. package/dist/primitives/run-stats/index.js.map +1 -0
  474. package/dist/primitives/run-status-pill/index.js +4 -0
  475. package/dist/primitives/run-status-pill/index.js.map +1 -0
  476. package/dist/primitives/running-tasks-panel/index.js +4 -0
  477. package/dist/primitives/running-tasks-panel/index.js.map +1 -0
  478. package/dist/primitives/scroll-area/index.js +4 -0
  479. package/dist/primitives/scroll-area/index.js.map +1 -0
  480. package/dist/primitives/select/index.js +4 -0
  481. package/dist/primitives/select/index.js.map +1 -0
  482. package/dist/primitives/session-list-item/index.js +4 -0
  483. package/dist/primitives/session-list-item/index.js.map +1 -0
  484. package/dist/primitives/session-timeline/index.js +4 -0
  485. package/dist/primitives/session-timeline/index.js.map +1 -0
  486. package/dist/primitives/sheet/index.js +4 -0
  487. package/dist/primitives/sheet/index.js.map +1 -0
  488. package/dist/primitives/sidebar/index.js +4 -0
  489. package/dist/primitives/sidebar/index.js.map +1 -0
  490. package/dist/primitives/skeleton/index.js +5 -0
  491. package/dist/primitives/skeleton/index.js.map +1 -0
  492. package/dist/primitives/skill-card/index.js +4 -0
  493. package/dist/primitives/skill-card/index.js.map +1 -0
  494. package/dist/primitives/social-auth-row/index.js +4 -0
  495. package/dist/primitives/social-auth-row/index.js.map +1 -0
  496. package/dist/primitives/stat-tile/index.js +4 -0
  497. package/dist/primitives/stat-tile/index.js.map +1 -0
  498. package/dist/primitives/status-dot/index.js +4 -0
  499. package/dist/primitives/status-dot/index.js.map +1 -0
  500. package/dist/primitives/steps-rail/index.js +4 -0
  501. package/dist/primitives/steps-rail/index.js.map +1 -0
  502. package/dist/primitives/sub-agent-dispatch/index.js +4 -0
  503. package/dist/primitives/sub-agent-dispatch/index.js.map +1 -0
  504. package/dist/primitives/switch/index.js +4 -0
  505. package/dist/primitives/switch/index.js.map +1 -0
  506. package/dist/primitives/system-prompt-editor/index.js +4 -0
  507. package/dist/primitives/system-prompt-editor/index.js.map +1 -0
  508. package/dist/primitives/table/index.js +4 -0
  509. package/dist/primitives/table/index.js.map +1 -0
  510. package/dist/primitives/tabs/index.js +4 -0
  511. package/dist/primitives/tabs/index.js.map +1 -0
  512. package/dist/primitives/task-plan/index.js +4 -0
  513. package/dist/primitives/task-plan/index.js.map +1 -0
  514. package/dist/primitives/terminal-panel/index.js +5 -0
  515. package/dist/primitives/terminal-panel/index.js.map +1 -0
  516. package/dist/primitives/textarea/index.js +4 -0
  517. package/dist/primitives/textarea/index.js.map +1 -0
  518. package/dist/primitives/thinking-level-selector/index.js +4 -0
  519. package/dist/primitives/thinking-level-selector/index.js.map +1 -0
  520. package/dist/primitives/timestamp/index.js +4 -0
  521. package/dist/primitives/timestamp/index.js.map +1 -0
  522. package/dist/primitives/toast/index.js +4 -0
  523. package/dist/primitives/toast/index.js.map +1 -0
  524. package/dist/primitives/token-usage-chart/index.js +4 -0
  525. package/dist/primitives/token-usage-chart/index.js.map +1 -0
  526. package/dist/primitives/tool-call/index.js +4 -0
  527. package/dist/primitives/tool-call/index.js.map +1 -0
  528. package/dist/primitives/tool-call-card/index.js +4 -0
  529. package/dist/primitives/tool-call-card/index.js.map +1 -0
  530. package/dist/primitives/tool-result/index.js +4 -0
  531. package/dist/primitives/tool-result/index.js.map +1 -0
  532. package/dist/primitives/tools-list/index.js +4 -0
  533. package/dist/primitives/tools-list/index.js.map +1 -0
  534. package/dist/primitives/tooltip/index.js +4 -0
  535. package/dist/primitives/tooltip/index.js.map +1 -0
  536. package/dist/primitives/topnav/index.js +4 -0
  537. package/dist/primitives/topnav/index.js.map +1 -0
  538. package/dist/primitives/update-banner/index.js +4 -0
  539. package/dist/primitives/update-banner/index.js.map +1 -0
  540. package/dist/slide/index.d.ts +212 -0
  541. package/dist/slide/index.js +3 -0
  542. package/dist/slide/index.js.map +1 -0
  543. package/dist/slide/plugins/emoji/index.d.ts +29 -0
  544. package/dist/slide/plugins/emoji/index.js +157 -0
  545. package/dist/slide/plugins/emoji/index.js.map +1 -0
  546. package/dist/slide/plugins/math/index.d.ts +13 -0
  547. package/dist/slide/plugins/math/index.js +145 -0
  548. package/dist/slide/plugins/math/index.js.map +1 -0
  549. package/dist/slide/plugins/mermaid/index.d.ts +55 -0
  550. package/dist/slide/plugins/mermaid/index.js +218 -0
  551. package/dist/slide/plugins/mermaid/index.js.map +1 -0
  552. package/dist/slide/plugins/shiki/index.d.ts +18 -0
  553. package/dist/slide/plugins/shiki/index.js +87 -0
  554. package/dist/slide/plugins/shiki/index.js.map +1 -0
  555. package/dist/slide/themes/default.css +256 -0
  556. package/dist/slide/themes/layouts.css +143 -0
  557. package/dist/slide/themes/violet-forge.css +256 -0
  558. package/dist/slide-deck/index.css +52 -0
  559. package/dist/slide-deck/index.css.map +1 -0
  560. package/dist/slide-deck/index.d.ts +377 -0
  561. package/dist/slide-deck/index.js +1111 -0
  562. package/dist/slide-deck/index.js.map +1 -0
  563. package/dist/styles-v3-legacy.css +88 -0
  564. package/dist/styles.css +137 -0
  565. package/dist/tokens-v4.css +187 -0
  566. package/dist/tokens.css +230 -0
  567. package/dist/vite-plugin.d.ts +29 -0
  568. package/dist/vite-plugin.js +76 -0
  569. package/dist/vite-plugin.js.map +1 -0
  570. package/dist/whiteboard/index.d.ts +258 -0
  571. package/dist/whiteboard/index.js +738 -0
  572. package/dist/whiteboard/index.js.map +1 -0
  573. package/llms.txt +273 -0
  574. package/package.json +800 -0
  575. package/registry/index.json +856 -0
  576. package/registry/r/account-menu.json +24 -0
  577. package/registry/r/action-bar.json +22 -0
  578. package/registry/r/agent-composer.json +22 -0
  579. package/registry/r/agent-editor.json +27 -0
  580. package/registry/r/agent-error-card.json +22 -0
  581. package/registry/r/agent-event.json +24 -0
  582. package/registry/r/agent-handoff.json +22 -0
  583. package/registry/r/agent-profile.json +23 -0
  584. package/registry/r/agent-starting-state.json +22 -0
  585. package/registry/r/agent-stream.json +27 -0
  586. package/registry/r/agent-streaming.json +22 -0
  587. package/registry/r/agent-timeline.json +22 -0
  588. package/registry/r/agent-types.json +15 -0
  589. package/registry/r/alert.json +22 -0
  590. package/registry/r/approval-card.json +25 -0
  591. package/registry/r/artifact-preview.json +22 -0
  592. package/registry/r/attachment-chip.json +24 -0
  593. package/registry/r/audit-log-entry.json +23 -0
  594. package/registry/r/auto-compact-notice.json +22 -0
  595. package/registry/r/avatar.json +23 -0
  596. package/registry/r/badge.json +22 -0
  597. package/registry/r/browser-controls.json +22 -0
  598. package/registry/r/build-log-stream.json +19 -0
  599. package/registry/r/button.json +23 -0
  600. package/registry/r/capability-indicator.json +23 -0
  601. package/registry/r/card.json +22 -0
  602. package/registry/r/chat-composer.json +23 -0
  603. package/registry/r/chat-message.json +129 -0
  604. package/registry/r/chat-thread.json +20 -0
  605. package/registry/r/chat-types.json +15 -0
  606. package/registry/r/checkbox.json +24 -0
  607. package/registry/r/cn.json +19 -0
  608. package/registry/r/code-block.json +21 -0
  609. package/registry/r/command-palette.json +25 -0
  610. package/registry/r/confirm-dialog.json +25 -0
  611. package/registry/r/context-card.json +23 -0
  612. package/registry/r/context-window-bar.json +20 -0
  613. package/registry/r/copy-button.json +22 -0
  614. package/registry/r/cost-meter.json +22 -0
  615. package/registry/r/created-files-card.json +23 -0
  616. package/registry/r/cron-job-card.json +22 -0
  617. package/registry/r/cron-jobs-list.json +23 -0
  618. package/registry/r/danger-zone.json +20 -0
  619. package/registry/r/data-table.json +27 -0
  620. package/registry/r/deployment-row.json +23 -0
  621. package/registry/r/dialog.json +23 -0
  622. package/registry/r/diff-viewer.json +20 -0
  623. package/registry/r/domain-config.json +25 -0
  624. package/registry/r/dropdown-menu.json +23 -0
  625. package/registry/r/empty-state.json +20 -0
  626. package/registry/r/env-var-editor.json +25 -0
  627. package/registry/r/folder-context-card.json +23 -0
  628. package/registry/r/folder-selector.json +22 -0
  629. package/registry/r/form-field.json +23 -0
  630. package/registry/r/hook-config.json +22 -0
  631. package/registry/r/hook-event-log.json +22 -0
  632. package/registry/r/input.json +22 -0
  633. package/registry/r/intent-selector.json +24 -0
  634. package/registry/r/label.json +22 -0
  635. package/registry/r/lane-board.json +20 -0
  636. package/registry/r/live-region-context.json +16 -0
  637. package/registry/r/login-split.json +20 -0
  638. package/registry/r/mcp-server-card.json +22 -0
  639. package/registry/r/mcp-server-list.json +23 -0
  640. package/registry/r/memory-editor.json +23 -0
  641. package/registry/r/mention-menu.json +23 -0
  642. package/registry/r/metrics-panel.json +22 -0
  643. package/registry/r/mode-types.json +15 -0
  644. package/registry/r/model-card.json +23 -0
  645. package/registry/r/model-selector.json +23 -0
  646. package/registry/r/page-shell.json +25 -0
  647. package/registry/r/pagination.json +22 -0
  648. package/registry/r/permission-matrix.json +22 -0
  649. package/registry/r/permission-modal.json +24 -0
  650. package/registry/r/permission-types.json +15 -0
  651. package/registry/r/pin-input.json +20 -0
  652. package/registry/r/plan-badge.json +20 -0
  653. package/registry/r/preview-env-card.json +25 -0
  654. package/registry/r/preview-panel.json +21 -0
  655. package/registry/r/progress-checklist.json +23 -0
  656. package/registry/r/progress.json +20 -0
  657. package/registry/r/project-card.json +25 -0
  658. package/registry/r/project-switcher.json +22 -0
  659. package/registry/r/quick-action-chips.json +21 -0
  660. package/registry/r/radio-group.json +23 -0
  661. package/registry/r/recent-folders-list.json +22 -0
  662. package/registry/r/rollback-ui.json +24 -0
  663. package/registry/r/rule-card.json +23 -0
  664. package/registry/r/rule-editor.json +28 -0
  665. package/registry/r/rule-types.json +18 -0
  666. package/registry/r/run-stats.json +22 -0
  667. package/registry/r/running-tasks-panel.json +22 -0
  668. package/registry/r/safe-href.json +16 -0
  669. package/registry/r/scroll-area.json +22 -0
  670. package/registry/r/select.json +24 -0
  671. package/registry/r/session-list-item.json +20 -0
  672. package/registry/r/session-timeline.json +22 -0
  673. package/registry/r/sheet.json +24 -0
  674. package/registry/r/sidebar.json +19 -0
  675. package/registry/r/skeleton.json +19 -0
  676. package/registry/r/skill-card.json +24 -0
  677. package/registry/r/skill-editor.json +28 -0
  678. package/registry/r/skills-list.json +23 -0
  679. package/registry/r/slide-deck.json +130 -0
  680. package/registry/r/slide-plugin-emoji.json +28 -0
  681. package/registry/r/slide-plugin-math.json +24 -0
  682. package/registry/r/slide-plugin-mermaid.json +23 -0
  683. package/registry/r/slide-plugin-shiki.json +23 -0
  684. package/registry/r/slide.json +123 -0
  685. package/registry/r/social-auth-row.json +21 -0
  686. package/registry/r/stat-tile.json +22 -0
  687. package/registry/r/status-dot.json +20 -0
  688. package/registry/r/steps-rail.json +20 -0
  689. package/registry/r/sub-agent-dispatch.json +22 -0
  690. package/registry/r/switch.json +23 -0
  691. package/registry/r/system-prompt-editor.json +22 -0
  692. package/registry/r/table.json +22 -0
  693. package/registry/r/tabs.json +22 -0
  694. package/registry/r/tailwind-preset.json +19 -0
  695. package/registry/r/task-header.json +24 -0
  696. package/registry/r/task-plan.json +22 -0
  697. package/registry/r/task-types.json +15 -0
  698. package/registry/r/terminal-panel.json +22 -0
  699. package/registry/r/textarea.json +22 -0
  700. package/registry/r/theme-provider.json +59 -0
  701. package/registry/r/theme-script.json +18 -0
  702. package/registry/r/theo-ui-provider.json +20 -0
  703. package/registry/r/timestamp.json +20 -0
  704. package/registry/r/toast.json +30 -0
  705. package/registry/r/token-usage-chart.json +20 -0
  706. package/registry/r/tokens.json +21 -0
  707. package/registry/r/tool-call-card.json +23 -0
  708. package/registry/r/tool-call.json +22 -0
  709. package/registry/r/tool-result.json +20 -0
  710. package/registry/r/tools-list.json +23 -0
  711. package/registry/r/tooltip.json +22 -0
  712. package/registry/r/topnav.json +22 -0
  713. package/registry/r/types.json +15 -0
  714. package/registry/r/usage-meter.json +21 -0
  715. package/registry/r/whiteboard.json +101 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/primitives/agent-event/agent-event.tsx"],"names":[],"mappings":"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","file":"chunk-E4IRSSHO.js","sourcesContent":["import {\n AlertTriangle,\n CheckCircle2,\n ChevronRight,\n CircleDot,\n Edit3,\n FilePlus,\n FileSearch,\n Hammer,\n Loader2,\n ShieldCheck,\n Terminal,\n Wrench,\n} from \"lucide-react\";\nimport { forwardRef, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { IconComponent } from \"../../../lib/types.js\";\nimport type {\n AgentEvent as AgentEventModel,\n AgentEventStatus,\n AgentEventType,\n} from \"../../../types/agent.js\";\n\nconst typeIcon: Record<AgentEventType, IconComponent> = {\n command: Terminal,\n file_read: FileSearch,\n file_write: FilePlus,\n edit: Edit3,\n lint: ShieldCheck,\n typecheck: ShieldCheck,\n build: Hammer,\n tool: Wrench,\n};\n\nconst statusIcon: Record<AgentEventStatus, IconComponent> = {\n pending: CircleDot,\n running: Loader2,\n success: CheckCircle2,\n failed: AlertTriangle,\n};\n\nconst statusColor: Record<AgentEventStatus, string> = {\n pending: \"text-muted-foreground\",\n running: \"text-primary\",\n success: \"text-success\",\n failed: \"text-destructive\",\n};\n\ninterface AgentEventProps extends HTMLAttributes<HTMLDivElement> {\n event: AgentEventModel;\n /**\n * If true, clicking the row toggles `event.detail` visibility.\n */\n collapsible?: boolean;\n /**\n * Force the collapsible state (for controlled scenarios).\n */\n defaultOpen?: boolean;\n}\n\n/**\n * AgentEvent — single event row in the agent timeline.\n *\n * Composition: type icon + label + path + diff stats + status icon + (optional) chevron.\n * Running events show a spinner via motion-safe:animate-spin (respects\n * `prefers-reduced-motion`); failed events flash red.\n *\n * When `collapsible` is true and `event.detail` is provided, the row renders as\n * a native `<button>` for correct keyboard and screen-reader semantics.\n */\nconst AgentEvent = forwardRef<HTMLDivElement, AgentEventProps>(\n ({ className, event, collapsible, defaultOpen, ...props }, ref) => {\n const [open, setOpen] = useState(defaultOpen ?? false);\n const TypeIcon = typeIcon[event.type];\n const StatusIcon = statusIcon[event.status];\n const isExpandable = !!(collapsible && event.detail !== undefined);\n\n const handleToggle = () => {\n if (isExpandable) setOpen((v) => !v);\n };\n\n const headerContent: ReactNode = (\n <>\n <span className=\"grid size-7 place-items-center rounded-md bg-muted text-muted-foreground\">\n <TypeIcon className=\"size-3.5\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"flex flex-wrap items-baseline gap-x-2 gap-y-0.5\">\n <span className=\"truncate font-medium text-body-sm text-foreground\">{event.label}</span>\n {event.path ? (\n <span className=\"truncate font-mono text-code-sm text-muted-foreground\">\n {event.path}\n </span>\n ) : null}\n {event.diff ? (\n <span className=\"font-mono text-code-sm\">\n <span className=\"text-success\">+{event.diff.added}</span>{\" \"}\n <span className=\"text-destructive\">-{event.diff.removed}</span>\n </span>\n ) : null}\n </p>\n {event.timestamp ? (\n <p className=\"font-mono text-label text-muted-foreground\">{event.timestamp}</p>\n ) : null}\n </div>\n <div className=\"flex items-center gap-1.5\">\n <StatusIcon\n className={cn(\n \"size-4\",\n statusColor[event.status],\n event.status === \"running\" && \"motion-safe:animate-spin\",\n )}\n aria-label={event.status}\n />\n {isExpandable ? (\n <ChevronRight\n className={cn(\n \"size-4 text-muted-foreground transition-transform\",\n open && \"rotate-90\",\n )}\n aria-hidden=\"true\"\n />\n ) : null}\n </div>\n </>\n );\n\n return (\n <div\n ref={ref}\n className={cn(\n \"rounded-md border border-transparent\",\n isExpandable && \"hover:border-border/40 hover:bg-muted/40\",\n className,\n )}\n {...props}\n >\n {isExpandable ? (\n <button\n type=\"button\"\n onClick={handleToggle}\n aria-expanded={open}\n className={cn(\n \"grid w-full grid-cols-[auto_1fr_auto] items-center gap-3 px-3 py-2 text-left\",\n \"cursor-pointer rounded-md\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n >\n {headerContent}\n </button>\n ) : (\n <div className=\"grid grid-cols-[auto_1fr_auto] items-center gap-3 px-3 py-2\">\n {headerContent}\n </div>\n )}\n {isExpandable && open ? (\n <div className=\"border-border/40 border-t bg-muted/20 px-3 py-2 font-mono text-code-sm text-muted-foreground\">\n {event.detail}\n </div>\n ) : null}\n </div>\n );\n },\n);\nAgentEvent.displayName = \"AgentEvent\";\n\nexport { AgentEvent };\n"]}
@@ -0,0 +1,104 @@
1
+ import { cn } from './chunk-EWDN56AS.js';
2
+ import { Coins, TrendingUp, TrendingDown } from 'lucide-react';
3
+ import { forwardRef } from 'react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ var formatUsd = (n) => n >= 100 ? `$${n.toFixed(0)}` : n >= 10 ? `$${n.toFixed(1)}` : `$${n.toFixed(2)}`;
7
+ var CostMeter = forwardRef(
8
+ ({ className, cost, budget, title = "Spend", delta, compact, ...props }, ref) => {
9
+ if (compact) {
10
+ return /* @__PURE__ */ jsxs(
11
+ "div",
12
+ {
13
+ ref,
14
+ className: cn(
15
+ "inline-flex items-center gap-1.5 rounded-full border border-border/60 bg-card px-2.5 py-1",
16
+ "font-mono text-label",
17
+ className
18
+ ),
19
+ ...props,
20
+ children: [
21
+ /* @__PURE__ */ jsx(Coins, { className: "size-3 text-primary", "aria-hidden": "true" }),
22
+ /* @__PURE__ */ jsx("span", { className: "text-foreground tabular-nums", children: formatUsd(cost) }),
23
+ budget ? /* @__PURE__ */ jsxs("span", { className: "text-muted-foreground", children: [
24
+ "/ ",
25
+ formatUsd(budget)
26
+ ] }) : null
27
+ ]
28
+ }
29
+ );
30
+ }
31
+ const ratio = budget ? Math.max(0, Math.min(1, cost / budget)) : 0;
32
+ const percent = Math.round(ratio * 100);
33
+ const overBudget = budget !== void 0 && cost > budget;
34
+ return /* @__PURE__ */ jsxs(
35
+ "div",
36
+ {
37
+ ref,
38
+ className: cn("grid gap-2 rounded-xl border bg-card p-4", className),
39
+ ...props,
40
+ children: [
41
+ /* @__PURE__ */ jsxs("header", { className: "flex items-baseline justify-between", children: [
42
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-label-caps text-muted-foreground uppercase tracking-wider", children: title }),
43
+ delta ? /* @__PURE__ */ jsxs(
44
+ "span",
45
+ {
46
+ className: cn(
47
+ "inline-flex items-center gap-1 font-mono text-body-sm tabular-nums",
48
+ delta.value >= 0 ? "text-warning" : "text-success"
49
+ ),
50
+ children: [
51
+ delta.value >= 0 ? /* @__PURE__ */ jsx(TrendingUp, { className: "size-3", "aria-hidden": "true" }) : /* @__PURE__ */ jsx(TrendingDown, { className: "size-3", "aria-hidden": "true" }),
52
+ delta.value >= 0 ? "+" : "",
53
+ formatUsd(Math.abs(delta.value)),
54
+ " ",
55
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: delta.period })
56
+ ]
57
+ }
58
+ ) : null
59
+ ] }),
60
+ /* @__PURE__ */ jsxs("div", { className: "flex items-baseline gap-1.5", children: [
61
+ /* @__PURE__ */ jsx("span", { className: "font-bold font-display text-display-md text-foreground tabular-nums leading-none", children: formatUsd(cost) }),
62
+ budget !== void 0 ? /* @__PURE__ */ jsxs("span", { className: "font-mono text-body-sm text-muted-foreground", children: [
63
+ "of ",
64
+ formatUsd(budget)
65
+ ] }) : null
66
+ ] }),
67
+ budget !== void 0 ? /* @__PURE__ */ jsxs("div", { className: "grid gap-1", children: [
68
+ /* @__PURE__ */ jsx(
69
+ "div",
70
+ {
71
+ className: "h-1.5 w-full overflow-hidden rounded-full bg-muted",
72
+ role: "progressbar",
73
+ tabIndex: -1,
74
+ "aria-valuenow": percent,
75
+ "aria-valuemin": 0,
76
+ "aria-valuemax": 100,
77
+ children: /* @__PURE__ */ jsx(
78
+ "div",
79
+ {
80
+ className: cn(
81
+ "h-full rounded-full transition-[width,background-color]",
82
+ overBudget ? "bg-destructive" : ratio > 0.75 ? "bg-warning" : "bg-primary"
83
+ ),
84
+ style: { width: `${Math.min(100, percent)}%` }
85
+ }
86
+ )
87
+ }
88
+ ),
89
+ /* @__PURE__ */ jsxs("span", { className: "font-mono text-label text-muted-foreground tabular-nums", children: [
90
+ percent,
91
+ "% of budget ",
92
+ overBudget ? "\xB7 over!" : "used"
93
+ ] })
94
+ ] }) : null
95
+ ]
96
+ }
97
+ );
98
+ }
99
+ );
100
+ CostMeter.displayName = "CostMeter";
101
+
102
+ export { CostMeter };
103
+ //# sourceMappingURL=chunk-E67WQXBV.js.map
104
+ //# sourceMappingURL=chunk-E67WQXBV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/primitives/cost-meter/cost-meter.tsx"],"names":[],"mappings":"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","file":"chunk-E67WQXBV.js","sourcesContent":["import { Coins, TrendingDown, TrendingUp } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\ninterface CostMeterProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Current cost in USD. */\n cost: number;\n /** Optional monthly budget; renders progress bar when present. */\n budget?: number;\n /** Optional title (e.g. \"This session\", \"Monthly\"). */\n title?: ReactNode;\n /** Optional delta vs previous period. */\n delta?: { value: number; period: string };\n /** Compact mode — single-line summary. */\n compact?: boolean;\n}\n\nconst formatUsd = (n: number) =>\n n >= 100 ? `$${n.toFixed(0)}` : n >= 10 ? `$${n.toFixed(1)}` : `$${n.toFixed(2)}`;\n\n/**\n * CostMeter — gauge for token spend. Two visuals:\n * - card: title + big number + optional progress bar + optional delta.\n * - compact: chip \"Coins $4.20\" for nav bars.\n */\nconst CostMeter = forwardRef<HTMLDivElement, CostMeterProps>(\n ({ className, cost, budget, title = \"Spend\", delta, compact, ...props }, ref) => {\n if (compact) {\n return (\n <div\n ref={ref}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full border border-border/60 bg-card px-2.5 py-1\",\n \"font-mono text-label\",\n className,\n )}\n {...props}\n >\n <Coins className=\"size-3 text-primary\" aria-hidden=\"true\" />\n <span className=\"text-foreground tabular-nums\">{formatUsd(cost)}</span>\n {budget ? <span className=\"text-muted-foreground\">/ {formatUsd(budget)}</span> : null}\n </div>\n );\n }\n\n const ratio = budget ? Math.max(0, Math.min(1, cost / budget)) : 0;\n const percent = Math.round(ratio * 100);\n const overBudget = budget !== undefined && cost > budget;\n\n return (\n <div\n ref={ref}\n className={cn(\"grid gap-2 rounded-xl border bg-card p-4\", className)}\n {...props}\n >\n <header className=\"flex items-baseline justify-between\">\n <span className=\"font-mono text-label-caps text-muted-foreground uppercase tracking-wider\">\n {title}\n </span>\n {delta ? (\n <span\n className={cn(\n \"inline-flex items-center gap-1 font-mono text-body-sm tabular-nums\",\n delta.value >= 0 ? \"text-warning\" : \"text-success\",\n )}\n >\n {delta.value >= 0 ? (\n <TrendingUp className=\"size-3\" aria-hidden=\"true\" />\n ) : (\n <TrendingDown className=\"size-3\" aria-hidden=\"true\" />\n )}\n {delta.value >= 0 ? \"+\" : \"\"}\n {formatUsd(Math.abs(delta.value))}{\" \"}\n <span className=\"text-muted-foreground\">{delta.period}</span>\n </span>\n ) : null}\n </header>\n <div className=\"flex items-baseline gap-1.5\">\n <span className=\"font-bold font-display text-display-md text-foreground tabular-nums leading-none\">\n {formatUsd(cost)}\n </span>\n {budget !== undefined ? (\n <span className=\"font-mono text-body-sm text-muted-foreground\">\n of {formatUsd(budget)}\n </span>\n ) : null}\n </div>\n {budget !== undefined ? (\n <div className=\"grid gap-1\">\n <div\n className=\"h-1.5 w-full overflow-hidden rounded-full bg-muted\"\n role=\"progressbar\"\n tabIndex={-1}\n aria-valuenow={percent}\n aria-valuemin={0}\n aria-valuemax={100}\n >\n <div\n className={cn(\n \"h-full rounded-full transition-[width,background-color]\",\n overBudget ? \"bg-destructive\" : ratio > 0.75 ? \"bg-warning\" : \"bg-primary\",\n )}\n style={{ width: `${Math.min(100, percent)}%` }}\n />\n </div>\n <span className=\"font-mono text-label text-muted-foreground tabular-nums\">\n {percent}% of budget {overBudget ? \"· over!\" : \"used\"}\n </span>\n </div>\n ) : null}\n </div>\n );\n },\n);\nCostMeter.displayName = \"CostMeter\";\n\nexport { CostMeter };\n"]}
@@ -0,0 +1,128 @@
1
+ import { cn } from './chunk-EWDN56AS.js';
2
+ import * as LabelPrimitive from '@radix-ui/react-label';
3
+ import { AlertCircle } from 'lucide-react';
4
+ import { createContext, forwardRef, useId, Children, isValidElement, cloneElement, useContext } from 'react';
5
+ import { jsx, jsxs } from 'react/jsx-runtime';
6
+
7
+ var FormFieldContext = createContext(null);
8
+ function useFormField() {
9
+ const ctx = useContext(FormFieldContext);
10
+ if (!ctx) throw new Error("FormField subcomponents must be inside <FormField>.");
11
+ return ctx;
12
+ }
13
+ var rootGapBySize = {
14
+ sm: "gap-1",
15
+ md: "gap-1.5",
16
+ lg: "gap-2"
17
+ };
18
+ var FormFieldRoot = forwardRef(
19
+ ({ className, id: idProp, invalid, size = "md", ...props }, ref) => {
20
+ const auto = useId();
21
+ const fieldId = idProp ?? `field-${auto}`;
22
+ const ctx = {
23
+ fieldId,
24
+ hintId: `${fieldId}-hint`,
25
+ errorId: `${fieldId}-error`,
26
+ hasError: !!invalid,
27
+ size
28
+ };
29
+ return /* @__PURE__ */ jsx(FormFieldContext.Provider, { value: ctx, children: /* @__PURE__ */ jsx("div", { ref, className: cn("grid", rootGapBySize[size], className), ...props }) });
30
+ }
31
+ );
32
+ FormFieldRoot.displayName = "FormField";
33
+ var labelFontBySize = {
34
+ sm: "text-label-caps",
35
+ md: "text-body-sm",
36
+ lg: "text-body-md"
37
+ };
38
+ var hintFontBySize = {
39
+ sm: "text-label-caps",
40
+ md: "text-body-sm",
41
+ lg: "text-body-md"
42
+ };
43
+ var FormFieldLabel = forwardRef(
44
+ ({ className, required, children, ...props }, ref) => {
45
+ const { fieldId, size } = useFormField();
46
+ return /* @__PURE__ */ jsxs(
47
+ LabelPrimitive.Root,
48
+ {
49
+ ref,
50
+ htmlFor: fieldId,
51
+ className: cn(
52
+ "inline-flex items-center gap-1 font-medium font-sans text-foreground",
53
+ labelFontBySize[size],
54
+ "peer-disabled:cursor-not-allowed peer-disabled:opacity-60",
55
+ className
56
+ ),
57
+ ...props,
58
+ children: [
59
+ children,
60
+ required ? /* @__PURE__ */ jsx("span", { className: "text-destructive", "aria-hidden": "true", children: "*" }) : null
61
+ ]
62
+ }
63
+ );
64
+ }
65
+ );
66
+ FormFieldLabel.displayName = "FormField.Label";
67
+ var FormFieldControl = forwardRef(
68
+ ({ children, ...props }, ref) => {
69
+ const { fieldId, hintId, errorId, hasError } = useFormField();
70
+ const described = hasError ? errorId : hintId;
71
+ const only = Children.only(children);
72
+ const cloned = isValidElement(only) ? cloneElement(only, {
73
+ id: fieldId,
74
+ "aria-describedby": described,
75
+ "aria-invalid": hasError || void 0
76
+ }) : only;
77
+ return /* @__PURE__ */ jsx("div", { ref, ...props, children: cloned });
78
+ }
79
+ );
80
+ FormFieldControl.displayName = "FormField.Control";
81
+ var FormFieldHint = forwardRef(
82
+ ({ className, children, ...props }, ref) => {
83
+ const { hintId, hasError, size } = useFormField();
84
+ if (hasError) return null;
85
+ return /* @__PURE__ */ jsx(
86
+ "p",
87
+ {
88
+ ref,
89
+ id: hintId,
90
+ className: cn("text-muted-foreground", hintFontBySize[size], className),
91
+ ...props,
92
+ children
93
+ }
94
+ );
95
+ }
96
+ );
97
+ FormFieldHint.displayName = "FormField.Hint";
98
+ var FormFieldError = forwardRef(
99
+ ({ className, children, ...props }, ref) => {
100
+ const { errorId, hasError, size } = useFormField();
101
+ if (!hasError) return null;
102
+ return /* @__PURE__ */ jsxs(
103
+ "p",
104
+ {
105
+ ref,
106
+ id: errorId,
107
+ role: "alert",
108
+ className: cn("flex items-center gap-1 text-destructive", hintFontBySize[size], className),
109
+ ...props,
110
+ children: [
111
+ /* @__PURE__ */ jsx(AlertCircle, { className: "size-3.5 shrink-0", "aria-hidden": "true" }),
112
+ children
113
+ ]
114
+ }
115
+ );
116
+ }
117
+ );
118
+ FormFieldError.displayName = "FormField.Error";
119
+ var FormField = /* @__PURE__ */ Object.assign(FormFieldRoot, {
120
+ Label: FormFieldLabel,
121
+ Control: FormFieldControl,
122
+ Hint: FormFieldHint,
123
+ Error: FormFieldError
124
+ });
125
+
126
+ export { FormField };
127
+ //# sourceMappingURL=chunk-EG6IHP3H.js.map
128
+ //# sourceMappingURL=chunk-EG6IHP3H.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/primitives/form-field/form-field.tsx"],"names":[],"mappings":"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","file":"chunk-EG6IHP3H.js","sourcesContent":["import * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { AlertCircle } from \"lucide-react\";\nimport {\n Children,\n cloneElement,\n createContext,\n forwardRef,\n isValidElement,\n useContext,\n useId,\n} from \"react\";\nimport type {\n ComponentPropsWithoutRef,\n ElementRef,\n HTMLAttributes,\n ReactElement,\n ReactNode,\n} from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\n/**\n * FormField — composition wrapper for accessible form rows.\n *\n * Provides context with a generated `id`, so children (Label, Input, Hint,\n * Error) wire themselves via `htmlFor` / `id` / `aria-describedby` without\n * the consumer having to thread IDs manually.\n *\n * Composition:\n * <FormField>\n * <FormField.Label required>Email</FormField.Label>\n * <FormField.Control>\n * <Input type=\"email\" placeholder=\"…\" />\n * </FormField.Control>\n * <FormField.Hint>We never share your email.</FormField.Hint>\n * <FormField.Error>{error}</FormField.Error>\n * </FormField>\n *\n * Errors take precedence over hints (only one of them shows at once).\n */\n\ntype FormFieldSize = \"sm\" | \"md\" | \"lg\";\n\ninterface FormFieldContextValue {\n fieldId: string;\n hintId: string;\n errorId: string;\n hasError: boolean;\n size: FormFieldSize;\n}\n\nconst FormFieldContext = createContext<FormFieldContextValue | null>(null);\n\nfunction useFormField(): FormFieldContextValue {\n const ctx = useContext(FormFieldContext);\n if (!ctx) throw new Error(\"FormField subcomponents must be inside <FormField>.\");\n return ctx;\n}\n\ninterface FormFieldProps extends HTMLAttributes<HTMLDivElement> {\n /** Optional explicit id override. */\n id?: string;\n /** Marks the field as invalid; switches Hint → Error and toggles aria. */\n invalid?: boolean;\n /**\n * Size scale propagated to Label / Hint / Error subparts via Context.\n * Default `md` preserves prior behavior. Subparts do NOT accept a `size`\n * prop of their own — use `className` for granular tweaks (EC-8).\n */\n size?: FormFieldSize;\n}\n\nconst rootGapBySize: Record<FormFieldSize, string> = {\n sm: \"gap-1\",\n md: \"gap-1.5\",\n lg: \"gap-2\",\n};\n\nconst FormFieldRoot = forwardRef<HTMLDivElement, FormFieldProps>(\n ({ className, id: idProp, invalid, size = \"md\", ...props }, ref) => {\n const auto = useId();\n const fieldId = idProp ?? `field-${auto}`;\n const ctx: FormFieldContextValue = {\n fieldId,\n hintId: `${fieldId}-hint`,\n errorId: `${fieldId}-error`,\n hasError: !!invalid,\n size,\n };\n return (\n <FormFieldContext.Provider value={ctx}>\n <div ref={ref} className={cn(\"grid\", rootGapBySize[size], className)} {...props} />\n </FormFieldContext.Provider>\n );\n },\n);\nFormFieldRoot.displayName = \"FormField\";\n\nconst labelFontBySize: Record<FormFieldSize, string> = {\n sm: \"text-label-caps\",\n md: \"text-body-sm\",\n lg: \"text-body-md\",\n};\n\nconst hintFontBySize: Record<FormFieldSize, string> = {\n sm: \"text-label-caps\",\n md: \"text-body-sm\",\n lg: \"text-body-md\",\n};\n\ninterface FormFieldLabelProps extends ComponentPropsWithoutRef<typeof LabelPrimitive.Root> {\n required?: boolean;\n}\n\n// Inlined label markup (was importing `<Label>` from sibling primitive).\n// BLOCKER-001 / D2: form-field stays in primitives/ but cannot cross-import.\n// Uses the same Radix LabelPrimitive primitive that the standalone `<Label>`\n// uses, with identical Tailwind tokens — visual parity is preserved.\nconst FormFieldLabel = forwardRef<ElementRef<typeof LabelPrimitive.Root>, FormFieldLabelProps>(\n ({ className, required, children, ...props }, ref) => {\n const { fieldId, size } = useFormField();\n return (\n <LabelPrimitive.Root\n ref={ref}\n htmlFor={fieldId}\n className={cn(\n \"inline-flex items-center gap-1 font-medium font-sans text-foreground\",\n labelFontBySize[size],\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-60\",\n className,\n )}\n {...props}\n >\n {children}\n {required ? (\n <span className=\"text-destructive\" aria-hidden=\"true\">\n *\n </span>\n ) : null}\n </LabelPrimitive.Root>\n );\n },\n);\nFormFieldLabel.displayName = \"FormField.Label\";\n\nconst FormFieldControl = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ children, ...props }, ref) => {\n const { fieldId, hintId, errorId, hasError } = useFormField();\n const described = hasError ? errorId : hintId;\n // Children.only enforces exactly one child element (the form control) so we\n // can safely clone it with the wiring props (id + aria-describedby + aria-invalid).\n // The previous implementation spread the element object directly which relied\n // on React's internal `$$typeof` invariant and silently dropped `ref` — the\n // cloneElement path preserves both `ref` and `key`.\n const only = Children.only(children) as ReactElement;\n const cloned = isValidElement(only)\n ? cloneElement(only, {\n id: fieldId,\n \"aria-describedby\": described,\n \"aria-invalid\": hasError || undefined,\n } as Partial<typeof only.props>)\n : only;\n return (\n <div ref={ref} {...props}>\n {cloned}\n </div>\n );\n },\n);\nFormFieldControl.displayName = \"FormField.Control\";\n\nconst FormFieldHint = forwardRef<HTMLParagraphElement, HTMLAttributes<HTMLParagraphElement>>(\n ({ className, children, ...props }, ref) => {\n const { hintId, hasError, size } = useFormField();\n if (hasError) return null;\n return (\n <p\n ref={ref}\n id={hintId}\n className={cn(\"text-muted-foreground\", hintFontBySize[size], className)}\n {...props}\n >\n {children}\n </p>\n );\n },\n);\nFormFieldHint.displayName = \"FormField.Hint\";\n\nconst FormFieldError = forwardRef<HTMLParagraphElement, HTMLAttributes<HTMLParagraphElement>>(\n ({ className, children, ...props }, ref) => {\n const { errorId, hasError, size } = useFormField();\n if (!hasError) return null;\n return (\n <p\n ref={ref}\n id={errorId}\n role=\"alert\"\n className={cn(\"flex items-center gap-1 text-destructive\", hintFontBySize[size], className)}\n {...props}\n >\n <AlertCircle className=\"size-3.5 shrink-0\" aria-hidden=\"true\" />\n {children as ReactNode}\n </p>\n );\n },\n);\nFormFieldError.displayName = \"FormField.Error\";\n\nconst FormField = /*#__PURE__*/ Object.assign(FormFieldRoot, {\n Label: FormFieldLabel,\n Control: FormFieldControl,\n Hint: FormFieldHint,\n Error: FormFieldError,\n});\n\nexport { FormField };\n"]}
@@ -0,0 +1,82 @@
1
+ import { cn } from './chunk-EWDN56AS.js';
2
+ import { ChevronRight, X, Check, Loader2 } from 'lucide-react';
3
+ import { useState } from 'react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ var STATUS_ICON = {
7
+ running: /* @__PURE__ */ jsx(Loader2, { className: "size-3.5 animate-spin text-primary", "aria-hidden": "true" }),
8
+ success: /* @__PURE__ */ jsx(Check, { className: "size-3.5 text-success", "aria-hidden": "true" }),
9
+ failed: /* @__PURE__ */ jsx(X, { className: "size-3.5 text-destructive", "aria-hidden": "true" }),
10
+ queued: /* @__PURE__ */ jsx("span", { className: "size-2 rounded-full bg-warning", "aria-hidden": "true" }),
11
+ skipped: /* @__PURE__ */ jsx("span", { className: "size-2 rounded-full bg-muted-foreground", "aria-hidden": "true" })
12
+ };
13
+ var STATUS_LABEL = {
14
+ running: "Running",
15
+ success: "Completed",
16
+ failed: "Failed",
17
+ queued: "Queued",
18
+ skipped: "Skipped"
19
+ };
20
+ function ToolCallCard({
21
+ className,
22
+ tool,
23
+ icon: Icon,
24
+ target,
25
+ status,
26
+ output,
27
+ defaultExpanded = false,
28
+ timestamp,
29
+ ...props
30
+ }) {
31
+ const [open, setOpen] = useState(defaultExpanded);
32
+ const expandable = !!output;
33
+ return /* @__PURE__ */ jsxs(
34
+ "article",
35
+ {
36
+ className: cn(
37
+ "overflow-hidden rounded-lg border border-border/40 bg-card/40 text-card-foreground",
38
+ className
39
+ ),
40
+ ...props,
41
+ children: [
42
+ /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-2 px-3 py-2"), children: [
43
+ expandable ? /* @__PURE__ */ jsx(
44
+ "button",
45
+ {
46
+ type: "button",
47
+ onClick: () => setOpen((v) => !v),
48
+ "aria-expanded": open,
49
+ "aria-label": open ? `Collapse ${tool} details` : `Expand ${tool} details`,
50
+ className: "-m-1 inline-flex size-6 shrink-0 items-center justify-center rounded-md p-1 text-muted-foreground hover:bg-muted/30 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
51
+ children: /* @__PURE__ */ jsx(
52
+ ChevronRight,
53
+ {
54
+ className: cn("size-3.5 transition-transform duration-base", open && "rotate-90"),
55
+ "aria-hidden": "true"
56
+ }
57
+ )
58
+ }
59
+ ) : null,
60
+ Icon ? /* @__PURE__ */ jsx(Icon, { className: "size-4 shrink-0 text-muted-foreground", "aria-hidden": "true" }) : null,
61
+ /* @__PURE__ */ jsx("span", { className: "shrink-0 font-medium font-mono text-code-sm text-foreground", children: tool }),
62
+ target ? /* @__PURE__ */ jsx("span", { className: "truncate font-mono text-code-sm text-muted-foreground", children: target }) : null,
63
+ /* @__PURE__ */ jsx(
64
+ "span",
65
+ {
66
+ role: "img",
67
+ "aria-label": STATUS_LABEL[status],
68
+ className: "ml-auto inline-flex shrink-0 items-center gap-1.5",
69
+ children: STATUS_ICON[status]
70
+ }
71
+ ),
72
+ timestamp ? /* @__PURE__ */ jsx("span", { className: "shrink-0 font-mono text-label text-muted-foreground tabular-nums", children: timestamp }) : null
73
+ ] }),
74
+ expandable && open ? /* @__PURE__ */ jsx("div", { className: "border-border/40 border-t bg-muted/20 px-3 py-2 font-mono text-code-sm", children: output }) : null
75
+ ]
76
+ }
77
+ );
78
+ }
79
+
80
+ export { ToolCallCard };
81
+ //# sourceMappingURL=chunk-EO7LOXG2.js.map
82
+ //# sourceMappingURL=chunk-EO7LOXG2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/primitives/tool-call-card/tool-call-card.tsx"],"names":[],"mappings":"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","file":"chunk-EO7LOXG2.js","sourcesContent":["import { Check, ChevronRight, Loader2, X } from \"lucide-react\";\nimport { useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { IconComponent } from \"../../../lib/types.js\";\n\n/**\n * ToolCallCard — single agent tool invocation rendered inside the stream.\n *\n * Visual: row with tool icon + tool name + target/command (mono) + status +\n * optional chevron. Expandable: when `output` is provided the row becomes a\n * `<details>` whose body renders the stdout/stderr/result block.\n *\n * Distinct from `AgentEvent` in the existing AgentTimeline by being a\n * stand-alone card that lives inside an AgentStream alongside chat messages.\n */\n\nexport type ToolCallStatus = \"running\" | \"success\" | \"failed\" | \"queued\" | \"skipped\";\n\nconst STATUS_ICON: Record<ToolCallStatus, ReactNode> = {\n running: <Loader2 className=\"size-3.5 animate-spin text-primary\" aria-hidden=\"true\" />,\n success: <Check className=\"size-3.5 text-success\" aria-hidden=\"true\" />,\n failed: <X className=\"size-3.5 text-destructive\" aria-hidden=\"true\" />,\n queued: <span className=\"size-2 rounded-full bg-warning\" aria-hidden=\"true\" />,\n skipped: <span className=\"size-2 rounded-full bg-muted-foreground\" aria-hidden=\"true\" />,\n};\n\nconst STATUS_LABEL: Record<ToolCallStatus, string> = {\n running: \"Running\",\n success: \"Completed\",\n failed: \"Failed\",\n queued: \"Queued\",\n skipped: \"Skipped\",\n};\n\ninterface ToolCallCardProps extends HTMLAttributes<HTMLElement> {\n /** Tool name (matches Theo Code / Claude Code tool registry: Bash, Edit, Read, …). */\n tool: ReactNode;\n /** Optional icon for the tool. */\n icon?: IconComponent;\n /** Target / command shown in monospace next to the tool name. */\n target?: ReactNode;\n status: ToolCallStatus;\n /** Optional stdout/stderr/result body. When present, the card becomes expandable. */\n output?: ReactNode;\n /** Default expanded state. Default: false (collapsed). */\n defaultExpanded?: boolean;\n /** Timestamp shown on the right. */\n timestamp?: ReactNode;\n}\n\nexport function ToolCallCard({\n className,\n tool,\n icon: Icon,\n target,\n status,\n output,\n defaultExpanded = false,\n timestamp,\n ...props\n}: ToolCallCardProps) {\n const [open, setOpen] = useState(defaultExpanded);\n const expandable = !!output;\n\n return (\n <article\n className={cn(\n \"overflow-hidden rounded-lg border border-border/40 bg-card/40 text-card-foreground\",\n className,\n )}\n {...props}\n >\n {/* T5.4: <header role=\"button\"> previously failed axe's\n * aria-prohibited-attr + semantic-landmark guidance. Replaced by\n * <div> for the layout container and a separate <button> for the\n * expand affordance (when expandable). Status icon span now carries\n * role=\"img\" to make aria-label valid. */}\n <div className={cn(\"flex items-center gap-2 px-3 py-2\")}>\n {expandable ? (\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n aria-expanded={open}\n aria-label={open ? `Collapse ${tool} details` : `Expand ${tool} details`}\n className=\"-m-1 inline-flex size-6 shrink-0 items-center justify-center rounded-md p-1 text-muted-foreground hover:bg-muted/30 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <ChevronRight\n className={cn(\"size-3.5 transition-transform duration-base\", open && \"rotate-90\")}\n aria-hidden=\"true\"\n />\n </button>\n ) : null}\n {Icon ? (\n <Icon className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n ) : null}\n <span className=\"shrink-0 font-medium font-mono text-code-sm text-foreground\">{tool}</span>\n {target ? (\n <span className=\"truncate font-mono text-code-sm text-muted-foreground\">{target}</span>\n ) : null}\n <span\n role=\"img\"\n aria-label={STATUS_LABEL[status]}\n className=\"ml-auto inline-flex shrink-0 items-center gap-1.5\"\n >\n {STATUS_ICON[status]}\n </span>\n {timestamp ? (\n <span className=\"shrink-0 font-mono text-label text-muted-foreground tabular-nums\">\n {timestamp}\n </span>\n ) : null}\n </div>\n {expandable && open ? (\n <div className=\"border-border/40 border-t bg-muted/20 px-3 py-2 font-mono text-code-sm\">\n {output}\n </div>\n ) : null}\n </article>\n );\n}\n"]}
@@ -0,0 +1,24 @@
1
+ import { clsx } from 'clsx';
2
+ import { extendTailwindMerge } from 'tailwind-merge';
3
+
4
+ // src/lib/cn.ts
5
+ var twMerge = extendTailwindMerge({
6
+ extend: {
7
+ classGroups: {
8
+ "font-size": [
9
+ { text: ["display-2xl", "display-xl", "display-lg", "display-md"] },
10
+ { text: ["headline", "title-lg", "title-md"] },
11
+ { text: ["body-lg", "body-md", "body-sm"] },
12
+ { text: ["label", "label-caps"] },
13
+ { text: ["code-md", "code-sm"] }
14
+ ]
15
+ }
16
+ }
17
+ });
18
+ function cn(...inputs) {
19
+ return twMerge(clsx(inputs));
20
+ }
21
+
22
+ export { cn };
23
+ //# sourceMappingURL=chunk-EWDN56AS.js.map
24
+ //# sourceMappingURL=chunk-EWDN56AS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/cn.ts"],"names":[],"mappings":";;;;AAcA,IAAM,UAAU,mBAAA,CAAoB;AAAA,EAClC,MAAA,EAAQ;AAAA,IACN,WAAA,EAAa;AAAA,MACX,WAAA,EAAa;AAAA,QACX,EAAE,IAAA,EAAM,CAAC,eAAe,YAAA,EAAc,YAAA,EAAc,YAAY,CAAA,EAAE;AAAA,QAClE,EAAE,IAAA,EAAM,CAAC,UAAA,EAAY,UAAA,EAAY,UAAU,CAAA,EAAE;AAAA,QAC7C,EAAE,IAAA,EAAM,CAAC,SAAA,EAAW,SAAA,EAAW,SAAS,CAAA,EAAE;AAAA,QAC1C,EAAE,IAAA,EAAM,CAAC,OAAA,EAAS,YAAY,CAAA,EAAE;AAAA,QAChC,EAAE,IAAA,EAAM,CAAC,SAAA,EAAW,SAAS,CAAA;AAAE;AACjC;AACF;AAEJ,CAAC,CAAA;AAMM,SAAS,MAAM,MAAA,EAA8B;AAClD,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B","file":"chunk-EWDN56AS.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\n/**\n * Custom tailwind-merge instance taught about the Violet Forge typescale.\n *\n * Vanilla `tailwind-merge` groups every `text-*` class together — so\n * `text-label` (a font-size from the typescale) and `text-accent`\n * (a foreground color) clash and the last wins. With cva variants that\n * keep size + color on independent dimensions, this collapsed one of\n * them. Extending the `font-size` group with the typescale tokens\n * declared in `src/styles/tailwind-preset.ts` keeps size + color\n * independent during merge.\n */\nconst twMerge = extendTailwindMerge({\n extend: {\n classGroups: {\n \"font-size\": [\n { text: [\"display-2xl\", \"display-xl\", \"display-lg\", \"display-md\"] },\n { text: [\"headline\", \"title-lg\", \"title-md\"] },\n { text: [\"body-lg\", \"body-md\", \"body-sm\"] },\n { text: [\"label\", \"label-caps\"] },\n { text: [\"code-md\", \"code-sm\"] },\n ],\n },\n },\n});\n\n/**\n * Merge Tailwind classes with conflict resolution.\n * Standard utility across all @theokit/ui components.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n"]}
@@ -0,0 +1,141 @@
1
+ import { Button } from './chunk-5VOSCJKQ.js';
2
+ import { cn } from './chunk-EWDN56AS.js';
3
+ import { Paperclip, Mic, Square, Send } from 'lucide-react';
4
+ import { forwardRef } from 'react';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ var defaultPlaceholder = {
8
+ chat: "How can I help you today?",
9
+ code: "Type / for commands",
10
+ infra: "Ask about deploys, metrics, env, or rollback\u2026"
11
+ };
12
+ var defaultTextareaLabel = {
13
+ chat: "Chat message",
14
+ code: "Code prompt",
15
+ infra: "Infra command"
16
+ };
17
+ var ChatComposer = forwardRef(
18
+ ({
19
+ className,
20
+ mode = "chat",
21
+ value,
22
+ onValueChange,
23
+ onSubmit,
24
+ running = false,
25
+ onStop,
26
+ contextSlot,
27
+ attachmentsSlot,
28
+ leadingActions,
29
+ trailingActions,
30
+ onAttach,
31
+ onVoiceInput,
32
+ textareaLabel,
33
+ placeholder,
34
+ textareaProps,
35
+ ...props
36
+ }, ref) => {
37
+ const handleSubmit = (e) => {
38
+ e.preventDefault();
39
+ if (running) return;
40
+ if (!value.trim()) return;
41
+ onSubmit?.(value);
42
+ };
43
+ const onKeyDown = (e) => {
44
+ if (e.key === "Enter" && !e.shiftKey) {
45
+ e.preventDefault();
46
+ if (running) return;
47
+ if (!value.trim()) return;
48
+ onSubmit?.(value);
49
+ }
50
+ };
51
+ const isCode = mode === "code";
52
+ return /* @__PURE__ */ jsxs(
53
+ "form",
54
+ {
55
+ ref,
56
+ onSubmit: handleSubmit,
57
+ className: cn(
58
+ "rounded-2xl border bg-card text-card-foreground transition-shadow",
59
+ "focus-within:border-primary/60 focus-within:shadow-glow",
60
+ isCode && "rounded-xl shadow-sm",
61
+ className
62
+ ),
63
+ ...props,
64
+ children: [
65
+ contextSlot ? /* @__PURE__ */ jsx("div", { className: "border-border/40 border-b px-3 pt-3", children: contextSlot }) : null,
66
+ attachmentsSlot ? /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2 px-4 pt-3", children: attachmentsSlot }) : null,
67
+ /* @__PURE__ */ jsx(
68
+ "textarea",
69
+ {
70
+ value,
71
+ onChange: (e) => onValueChange(e.target.value),
72
+ onKeyDown,
73
+ placeholder: placeholder ?? defaultPlaceholder[mode],
74
+ "aria-label": textareaLabel ?? defaultTextareaLabel[mode],
75
+ rows: isCode ? 1 : 2,
76
+ ...textareaProps,
77
+ className: cn(
78
+ "w-full resize-none bg-transparent px-4 py-3",
79
+ "placeholder:text-muted-foreground",
80
+ "focus:outline-none",
81
+ isCode ? "font-mono text-code-md" : "min-h-[3.5rem] font-sans text-body-md",
82
+ textareaProps?.className
83
+ )
84
+ }
85
+ ),
86
+ /* @__PURE__ */ jsxs(
87
+ "div",
88
+ {
89
+ className: cn(
90
+ "flex items-center justify-between gap-2 border-border/40 border-t px-3 py-2"
91
+ ),
92
+ children: [
93
+ /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1", children: leadingActions !== void 0 ? leadingActions : onAttach ? /* @__PURE__ */ jsx(
94
+ Button,
95
+ {
96
+ size: "icon",
97
+ variant: "ghost",
98
+ type: "button",
99
+ onClick: onAttach,
100
+ "aria-label": "Attach file",
101
+ children: /* @__PURE__ */ jsx(Paperclip, {})
102
+ }
103
+ ) : null }),
104
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
105
+ trailingActions,
106
+ onVoiceInput ? /* @__PURE__ */ jsx(
107
+ Button,
108
+ {
109
+ size: "icon",
110
+ variant: "ghost",
111
+ type: "button",
112
+ onClick: onVoiceInput,
113
+ "aria-label": "Voice input",
114
+ children: /* @__PURE__ */ jsx(Mic, {})
115
+ }
116
+ ) : null,
117
+ running ? /* @__PURE__ */ jsx(
118
+ Button,
119
+ {
120
+ type: "button",
121
+ onClick: onStop,
122
+ size: "icon",
123
+ variant: "destructive",
124
+ "aria-label": "Stop generation",
125
+ children: /* @__PURE__ */ jsx(Square, {})
126
+ }
127
+ ) : /* @__PURE__ */ jsx(Button, { type: "submit", size: "icon", disabled: !value.trim(), "aria-label": "Send message", children: /* @__PURE__ */ jsx(Send, {}) })
128
+ ] })
129
+ ]
130
+ }
131
+ )
132
+ ]
133
+ }
134
+ );
135
+ }
136
+ );
137
+ ChatComposer.displayName = "ChatComposer";
138
+
139
+ export { ChatComposer };
140
+ //# sourceMappingURL=chunk-F5P5P2SC.js.map
141
+ //# sourceMappingURL=chunk-F5P5P2SC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/composites/chat-composer/chat-composer.tsx"],"names":[],"mappings":"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","file":"chunk-F5P5P2SC.js","sourcesContent":["import { Mic, Paperclip, Send, Square } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type {\n FormEvent,\n HTMLAttributes,\n KeyboardEvent,\n ReactNode,\n TextareaHTMLAttributes,\n} from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { Button } from \"../../primitives/button/index.js\";\n\nexport type ComposerMode = \"chat\" | \"code\" | \"infra\";\n\ninterface ChatComposerProps extends Omit<HTMLAttributes<HTMLFormElement>, \"onSubmit\"> {\n mode?: ComposerMode;\n value: string;\n onValueChange: (next: string) => void;\n onSubmit?: (value: string) => void;\n /**\n * If true, the composer is in \"agent running\" state — Send becomes a Stop button.\n */\n running?: boolean;\n onStop?: () => void;\n /**\n * Slot above the textarea — used for the folder selector in Infra mode.\n */\n contextSlot?: ReactNode;\n /**\n * Slot above the textarea for attachments / chips.\n */\n attachmentsSlot?: ReactNode;\n /**\n * Slot on the bottom-left of the action row (e.g. custom toggles).\n * Overrides the default attach button entirely when provided.\n */\n leadingActions?: ReactNode;\n /**\n * Slot on the bottom-right (e.g. model selector). Send/stop is appended after this.\n */\n trailingActions?: ReactNode;\n /**\n * Optional attach-file callback. If omitted (and `leadingActions` is also\n * omitted), no attach button is rendered. This avoids fake affordances per\n * Quality Gate §7.\n */\n onAttach?: () => void;\n /**\n * Optional voice-input callback. If omitted, no mic button is rendered.\n * Same rationale as `onAttach`.\n */\n onVoiceInput?: () => void;\n /**\n * Accessible label for the textarea. Falls back to a mode-aware default.\n */\n textareaLabel?: string;\n /**\n * Textarea placeholder. Defaults change by mode.\n */\n placeholder?: string;\n /**\n * Extra textarea props (rows, maxLength…).\n */\n textareaProps?: Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, \"value\" | \"onChange\">;\n}\n\nconst defaultPlaceholder: Record<ComposerMode, string> = {\n chat: \"How can I help you today?\",\n code: \"Type / for commands\",\n infra: \"Ask about deploys, metrics, env, or rollback…\",\n};\n\nconst defaultTextareaLabel: Record<ComposerMode, string> = {\n chat: \"Chat message\",\n code: \"Code prompt\",\n infra: \"Infra command\",\n};\n\n/**\n * ChatComposer — message input area, shared by Chat / Code / Infra modes.\n *\n * Visual:\n * - chat / infra → soft card with violet ring on focus, generous padding\n * - code → compact dense form with mono font, slash prefix hint\n *\n * Stateless: caller controls `value` + handles `onSubmit`. Submit fires on Enter\n * (without Shift). Shift+Enter inserts a newline.\n *\n * Optional affordances (mic, attach) are opt-in via `onVoiceInput` / `onAttach`\n * — Quality Gate §7 forbids rendering fake controls without behavior.\n */\nconst ChatComposer = forwardRef<HTMLFormElement, ChatComposerProps>(\n (\n {\n className,\n mode = \"chat\",\n value,\n onValueChange,\n onSubmit,\n running = false,\n onStop,\n contextSlot,\n attachmentsSlot,\n leadingActions,\n trailingActions,\n onAttach,\n onVoiceInput,\n textareaLabel,\n placeholder,\n textareaProps,\n ...props\n },\n ref,\n ) => {\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault();\n if (running) return;\n if (!value.trim()) return;\n onSubmit?.(value);\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n if (running) return;\n if (!value.trim()) return;\n onSubmit?.(value);\n }\n };\n\n const isCode = mode === \"code\";\n\n return (\n <form\n ref={ref}\n onSubmit={handleSubmit}\n className={cn(\n \"rounded-2xl border bg-card text-card-foreground transition-shadow\",\n \"focus-within:border-primary/60 focus-within:shadow-glow\",\n isCode && \"rounded-xl shadow-sm\",\n className,\n )}\n {...props}\n >\n {contextSlot ? (\n <div className=\"border-border/40 border-b px-3 pt-3\">{contextSlot}</div>\n ) : null}\n\n {attachmentsSlot ? (\n <div className=\"flex flex-wrap gap-2 px-4 pt-3\">{attachmentsSlot}</div>\n ) : null}\n\n <textarea\n value={value}\n onChange={(e) => onValueChange(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder={placeholder ?? defaultPlaceholder[mode]}\n aria-label={textareaLabel ?? defaultTextareaLabel[mode]}\n rows={isCode ? 1 : 2}\n {...textareaProps}\n className={cn(\n \"w-full resize-none bg-transparent px-4 py-3\",\n \"placeholder:text-muted-foreground\",\n \"focus:outline-none\",\n isCode ? \"font-mono text-code-md\" : \"min-h-[3.5rem] font-sans text-body-md\",\n textareaProps?.className,\n )}\n />\n\n <div\n className={cn(\n \"flex items-center justify-between gap-2 border-border/40 border-t px-3 py-2\",\n )}\n >\n <div className=\"flex items-center gap-1\">\n {leadingActions !== undefined ? (\n leadingActions\n ) : onAttach ? (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n type=\"button\"\n onClick={onAttach}\n aria-label=\"Attach file\"\n >\n <Paperclip />\n </Button>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\n {trailingActions}\n {onVoiceInput ? (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n type=\"button\"\n onClick={onVoiceInput}\n aria-label=\"Voice input\"\n >\n <Mic />\n </Button>\n ) : null}\n {running ? (\n <Button\n type=\"button\"\n onClick={onStop}\n size=\"icon\"\n variant=\"destructive\"\n aria-label=\"Stop generation\"\n >\n <Square />\n </Button>\n ) : (\n <Button type=\"submit\" size=\"icon\" disabled={!value.trim()} aria-label=\"Send message\">\n <Send />\n </Button>\n )}\n </div>\n </div>\n </form>\n );\n },\n);\nChatComposer.displayName = \"ChatComposer\";\n\nexport { ChatComposer };\n"]}