@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,72 @@
1
+ import { cn } from './chunk-EWDN56AS.js';
2
+ import { Minus, TrendingDown, TrendingUp, ArrowUpRight } from 'lucide-react';
3
+ import { forwardRef } from 'react';
4
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
5
+
6
+ var TREND = {
7
+ up: { icon: TrendingUp, color: "text-success" },
8
+ down: { icon: TrendingDown, color: "text-destructive" },
9
+ flat: { icon: Minus, color: "text-muted-foreground" }
10
+ };
11
+ var StatTile = forwardRef(
12
+ ({ className, value, label, icon: Icon, delta, onClick, children: _children, ...props }, ref) => {
13
+ const isInteractive = onClick !== void 0;
14
+ const TrendIcon = delta !== void 0 ? TREND[delta.trend].icon : null;
15
+ const trendColor = delta !== void 0 ? TREND[delta.trend].color : "";
16
+ const inner = /* @__PURE__ */ jsxs(Fragment, { children: [
17
+ (Icon !== void 0 || isInteractive) && /* @__PURE__ */ jsxs("div", { className: "mb-3 flex items-center justify-between", children: [
18
+ Icon !== void 0 ? /* @__PURE__ */ jsx("div", { className: "flex size-8 items-center justify-center rounded-lg border border-border/40 bg-muted/40", children: /* @__PURE__ */ jsx(Icon, { "aria-hidden": "true", className: "size-4 text-muted-foreground" }) }) : /* @__PURE__ */ jsx("div", {}),
19
+ isInteractive ? /* @__PURE__ */ jsx(
20
+ ArrowUpRight,
21
+ {
22
+ "aria-hidden": "true",
23
+ className: "size-3.5 text-muted-foreground transition-colors group-hover:text-foreground"
24
+ }
25
+ ) : null
26
+ ] }),
27
+ /* @__PURE__ */ jsx("div", { className: "whitespace-nowrap font-bold font-display text-display-md text-foreground tabular-nums leading-none tracking-tight", children: value }),
28
+ /* @__PURE__ */ jsx("div", { className: "mt-1 font-sans text-body-sm text-muted-foreground", children: label }),
29
+ delta !== void 0 && TrendIcon !== null ? /* @__PURE__ */ jsxs(
30
+ "div",
31
+ {
32
+ className: cn("mt-2 inline-flex items-center gap-1 font-mono text-label", trendColor),
33
+ children: [
34
+ /* @__PURE__ */ jsx(TrendIcon, { "aria-hidden": "true", className: "size-3" }),
35
+ /* @__PURE__ */ jsx("span", { children: delta.value })
36
+ ]
37
+ }
38
+ ) : null
39
+ ] });
40
+ if (isInteractive) {
41
+ return /* @__PURE__ */ jsx(
42
+ "button",
43
+ {
44
+ ref,
45
+ type: "button",
46
+ onClick,
47
+ className: cn(
48
+ "group block w-full rounded-xl border border-border/40 bg-card p-5 text-left",
49
+ "cursor-pointer transition-colors hover:border-primary/30",
50
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
51
+ className
52
+ ),
53
+ ...props,
54
+ children: inner
55
+ }
56
+ );
57
+ }
58
+ return /* @__PURE__ */ jsx(
59
+ "div",
60
+ {
61
+ ref,
62
+ className: cn("rounded-xl border border-border/40 bg-card p-5", className),
63
+ children: inner
64
+ }
65
+ );
66
+ }
67
+ );
68
+ StatTile.displayName = "StatTile";
69
+
70
+ export { StatTile };
71
+ //# sourceMappingURL=chunk-UAZOFC4W.js.map
72
+ //# sourceMappingURL=chunk-UAZOFC4W.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/primitives/stat-tile/stat-tile.tsx"],"names":[],"mappings":"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","file":"chunk-UAZOFC4W.js","sourcesContent":["import { ArrowUpRight, Minus, TrendingDown, TrendingUp } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { ButtonHTMLAttributes, ElementType, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\n/**\n * StatTile — big number + label + optional delta + optional icon.\n *\n * Dual mode based on `onClick`:\n * - With onClick → renders as `<button>` with hover state + trailing\n * ArrowUpRight chevron (navigation affordance).\n * - Without onClick → renders as static `<div>`.\n *\n * Delta trend drives icon + color: up=success/TrendingUp, down=destructive/\n * TrendingDown, flat=muted/Minus. Big value uses font-display + tabular-nums.\n *\n * @example\n * <StatTile value=\"42\" label=\"Projects\" />\n * <StatTile value=\"$1,234\" label=\"MRR\" icon={DollarSign}\n * delta={{ value: \"+12%\", trend: \"up\" }} onClick={openBilling} />\n */\nexport interface StatTileProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"type\" | \"value\"> {\n value: ReactNode;\n label: ReactNode;\n icon?: ElementType;\n delta?: { value: ReactNode; trend: \"up\" | \"down\" | \"flat\" };\n}\n\nconst TREND: Record<\"up\" | \"down\" | \"flat\", { icon: ElementType; color: string }> = {\n up: { icon: TrendingUp, color: \"text-success\" },\n down: { icon: TrendingDown, color: \"text-destructive\" },\n flat: { icon: Minus, color: \"text-muted-foreground\" },\n};\n\nconst StatTile = forwardRef<HTMLElement, StatTileProps>(\n ({ className, value, label, icon: Icon, delta, onClick, children: _children, ...props }, ref) => {\n const isInteractive = onClick !== undefined;\n const TrendIcon = delta !== undefined ? TREND[delta.trend].icon : null;\n const trendColor = delta !== undefined ? TREND[delta.trend].color : \"\";\n\n const inner = (\n <>\n {(Icon !== undefined || isInteractive) && (\n <div className=\"mb-3 flex items-center justify-between\">\n {Icon !== undefined ? (\n <div className=\"flex size-8 items-center justify-center rounded-lg border border-border/40 bg-muted/40\">\n <Icon aria-hidden=\"true\" className=\"size-4 text-muted-foreground\" />\n </div>\n ) : (\n <div />\n )}\n {isInteractive ? (\n <ArrowUpRight\n aria-hidden=\"true\"\n className=\"size-3.5 text-muted-foreground transition-colors group-hover:text-foreground\"\n />\n ) : null}\n </div>\n )}\n <div className=\"whitespace-nowrap font-bold font-display text-display-md text-foreground tabular-nums leading-none tracking-tight\">\n {value}\n </div>\n <div className=\"mt-1 font-sans text-body-sm text-muted-foreground\">{label}</div>\n {delta !== undefined && TrendIcon !== null ? (\n <div\n className={cn(\"mt-2 inline-flex items-center gap-1 font-mono text-label\", trendColor)}\n >\n <TrendIcon aria-hidden=\"true\" className=\"size-3\" />\n <span>{delta.value}</span>\n </div>\n ) : null}\n </>\n );\n\n if (isInteractive) {\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"group block w-full rounded-xl border border-border/40 bg-card p-5 text-left\",\n \"cursor-pointer transition-colors hover:border-primary/30\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n className,\n )}\n {...props}\n >\n {inner}\n </button>\n );\n }\n\n return (\n <div\n ref={ref as React.Ref<HTMLDivElement>}\n className={cn(\"rounded-xl border border-border/40 bg-card p-5\", className)}\n >\n {inner}\n </div>\n );\n },\n);\nStatTile.displayName = \"StatTile\";\n\nexport { StatTile };\n"]}
@@ -0,0 +1,12 @@
1
+ import { createContext, useContext } from 'react';
2
+
3
+ // src/lib/live-region-context.tsx
4
+ var LiveRegionContext = createContext(false);
5
+ var LiveRegionProvider = LiveRegionContext.Provider;
6
+ function useInLiveRegion() {
7
+ return useContext(LiveRegionContext);
8
+ }
9
+
10
+ export { LiveRegionProvider, useInLiveRegion };
11
+ //# sourceMappingURL=chunk-UGKI466V.js.map
12
+ //# sourceMappingURL=chunk-UGKI466V.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/live-region-context.tsx"],"names":[],"mappings":";;;AA8CA,IAAM,iBAAA,GAAoB,cAAuB,KAAK,CAAA;AAE/C,IAAM,qBAAqB,iBAAA,CAAkB;AAE7C,SAAS,eAAA,GAA2B;AACzC,EAAA,OAAO,WAAW,iBAAiB,CAAA;AACrC","file":"chunk-UGKI466V.js","sourcesContent":["import { createContext, useContext } from \"react\";\n\n/**\n * LiveRegionContext — coordinates `aria-live` declarations across nested\n * components so screen readers don't announce content twice.\n *\n * T4.1 (MF-4, edge-case review). Problem: a container component that\n * declares `role=\"log\" aria-live=\"polite\"` (e.g. `ChatThread`,\n * `AgentStream`) may render a child component that ALSO declares its own\n * `role=\"status\" aria-live=\"polite\"` (e.g. `AgentStreaming`,\n * `AgentErrorCard`). NVDA/JAWS/VoiceOver treat each live region as an\n * independent announcement source, so updates to the child trigger TWO\n * announcements — once from the inner status, once because the outer\n * log observes the DOM mutation. Result: stutter on every streaming\n * token, every new toast, every skeleton mount inside a log.\n *\n * Solution: container components wrap their content with\n * `<LiveRegionProvider value={true}>`. Child components call\n * `useInLiveRegion()` and omit their own `aria-live` / `role` when the\n * context is true. The outer region remains the single announcement\n * source.\n *\n * Default is `false` so standalone components (e.g., a single\n * `AgentStreaming` placed directly in a page) keep their original\n * announcement semantics with zero migration cost.\n *\n * @example\n * // Container declares the live region\n * <LiveRegionProvider value={true}>\n * <div role=\"log\" aria-live=\"polite\">\n * {children}\n * </div>\n * </LiveRegionProvider>\n *\n * // Child reads context to decide its own ARIA attrs\n * const inLiveRegion = useInLiveRegion();\n * return (\n * <div\n * role={inLiveRegion ? undefined : \"status\"}\n * aria-live={inLiveRegion ? undefined : \"polite\"}\n * >\n * ...\n * </div>\n * );\n */\n\nconst LiveRegionContext = createContext<boolean>(false);\n\nexport const LiveRegionProvider = LiveRegionContext.Provider;\n\nexport function useInLiveRegion(): boolean {\n return useContext(LiveRegionContext);\n}\n"]}
@@ -0,0 +1,11 @@
1
+ // src/types/mode.ts
2
+ var ALL_MODES = ["chat", "code", "infra"];
3
+ var MODE_LABEL = {
4
+ chat: "Chat",
5
+ code: "Code",
6
+ infra: "Infra"
7
+ };
8
+
9
+ export { ALL_MODES, MODE_LABEL };
10
+ //# sourceMappingURL=chunk-VM4RMQQN.js.map
11
+ //# sourceMappingURL=chunk-VM4RMQQN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/mode.ts"],"names":[],"mappings":";AAcO,IAAM,SAAA,GAAiC,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO;AAG/D,IAAM,UAAA,GAAmC;AAAA,EAC9C,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO;AACT","file":"chunk-VM4RMQQN.js","sourcesContent":["/**\n * Mode — top-level density / domain the agent session is operating in.\n *\n * `chat` — conversational Q&A, lean UI.\n * `code` — code agent: read/plan/edit/verify inside the repo.\n * `infra` — operate the deployed system: metrics, deploys, logs, rollback.\n *\n * Used everywhere resources can be scoped per-mode (Skills, Agents, Rules,\n * SystemPrompt overrides, Sessions, …). `modes?: Mode[]` on a resource means\n * \"only available in these modes\"; omitting `modes` means \"available\n * globally\".\n */\nexport type Mode = \"chat\" | \"code\" | \"infra\";\n\nexport const ALL_MODES: ReadonlyArray<Mode> = [\"chat\", \"code\", \"infra\"];\n\n/** Friendly label per mode — render in chips, headers, badges. */\nexport const MODE_LABEL: Record<Mode, string> = {\n chat: \"Chat\",\n code: \"Code\",\n infra: \"Infra\",\n};\n"]}
@@ -0,0 +1,54 @@
1
+ import { cn } from './chunk-EWDN56AS.js';
2
+ import { FileText, FileCode, FileSpreadsheet, FileImage, File, X } from 'lucide-react';
3
+ import { forwardRef } from 'react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ var typeIcon = {
7
+ image: FileImage,
8
+ spreadsheet: FileSpreadsheet,
9
+ code: FileCode,
10
+ text: FileText
11
+ };
12
+ var AttachmentChip = forwardRef(
13
+ ({ className, attachment, onRemove, ...props }, ref) => {
14
+ const Icon = (attachment.type ? typeIcon[attachment.type] : void 0) ?? File;
15
+ return /* @__PURE__ */ jsxs(
16
+ "div",
17
+ {
18
+ ref,
19
+ className: cn(
20
+ "inline-flex max-w-[18rem] items-center gap-2 rounded-md border border-border/40 bg-muted/60 px-2 py-1",
21
+ "font-mono text-code-sm text-muted-foreground",
22
+ className
23
+ ),
24
+ ...props,
25
+ children: [
26
+ /* @__PURE__ */ jsx(Icon, { className: "size-3.5 shrink-0 text-primary", "aria-hidden": "true" }),
27
+ /* @__PURE__ */ jsx("span", { className: "truncate text-foreground", title: attachment.name, children: attachment.name }),
28
+ attachment.size ? /* @__PURE__ */ jsxs("span", { children: [
29
+ "\xB7 ",
30
+ attachment.size
31
+ ] }) : null,
32
+ onRemove ? /* @__PURE__ */ jsx(
33
+ "button",
34
+ {
35
+ type: "button",
36
+ onClick: () => onRemove(attachment.id),
37
+ "aria-label": `Remove ${attachment.name}`,
38
+ className: cn(
39
+ "ml-1 rounded-sm p-0.5 text-muted-foreground transition-colors hover:bg-muted hover:text-destructive",
40
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
41
+ ),
42
+ children: /* @__PURE__ */ jsx(X, { className: "size-3" })
43
+ }
44
+ ) : null
45
+ ]
46
+ }
47
+ );
48
+ }
49
+ );
50
+ AttachmentChip.displayName = "AttachmentChip";
51
+
52
+ export { AttachmentChip };
53
+ //# sourceMappingURL=chunk-VQ37VLAS.js.map
54
+ //# sourceMappingURL=chunk-VQ37VLAS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/primitives/attachment-chip/attachment-chip.tsx"],"names":[],"mappings":";;;;;AAOA,IAAM,QAAA,GAA0C;AAAA,EAC9C,KAAA,EAAO,SAAA;AAAA,EACP,WAAA,EAAa,eAAA;AAAA,EACb,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAaA,IAAM,cAAA,GAAiB,UAAA;AAAA,EACrB,CAAC,EAAE,SAAA,EAAW,UAAA,EAAY,UAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AACtD,IAAA,MAAM,QAAuB,UAAA,CAAW,IAAA,GAAO,SAAS,UAAA,CAAW,IAAI,IAAI,MAAA,KAAc,IAAA;AACzF,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,uGAAA;AAAA,UACA,8CAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EAAiC,aAAA,EAAY,MAAA,EAAO,CAAA;AAAA,0BACpE,GAAA,CAAC,UAAK,SAAA,EAAU,0BAAA,EAA2B,OAAO,UAAA,CAAW,IAAA,EAC1D,qBAAW,IAAA,EACd,CAAA;AAAA,UACC,UAAA,CAAW,IAAA,mBAAO,IAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,YAAA,OAAA;AAAA,YAAG,UAAA,CAAW;AAAA,WAAA,EAAK,CAAA,GAAU,IAAA;AAAA,UACrD,QAAA,mBACC,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,MAAM,QAAA,CAAS,UAAA,CAAW,EAAE,CAAA;AAAA,cACrC,YAAA,EAAY,CAAA,OAAA,EAAU,UAAA,CAAW,IAAI,CAAA,CAAA;AAAA,cACrC,SAAA,EAAW,EAAA;AAAA,gBACT,qGAAA;AAAA,gBACA;AAAA,eACF;AAAA,cAEA,QAAA,kBAAA,GAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,WACxB,GACE;AAAA;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,cAAA,CAAe,WAAA,GAAc,gBAAA","file":"chunk-VQ37VLAS.js","sourcesContent":["import { File, FileCode, FileImage, FileSpreadsheet, FileText, X } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { IconComponent } from \"../../../lib/types.js\";\nimport type { Attachment } from \"../../../types/chat.js\";\n\nconst typeIcon: Record<string, IconComponent> = {\n image: FileImage,\n spreadsheet: FileSpreadsheet,\n code: FileCode,\n text: FileText,\n};\n\ninterface AttachmentChipProps extends HTMLAttributes<HTMLDivElement> {\n attachment: Attachment;\n onRemove?: (id: string) => void;\n}\n\n/**\n * AttachmentChip — file pill shown in chat composer or message attachments row.\n *\n * Visual: rounded chip with type-icon + name + size + optional remove button.\n * Truncates the name with `text-ellipsis`; full name available via title.\n */\nconst AttachmentChip = forwardRef<HTMLDivElement, AttachmentChipProps>(\n ({ className, attachment, onRemove, ...props }, ref) => {\n const Icon: IconComponent = (attachment.type ? typeIcon[attachment.type] : undefined) ?? File;\n return (\n <div\n ref={ref}\n className={cn(\n \"inline-flex max-w-[18rem] items-center gap-2 rounded-md border border-border/40 bg-muted/60 px-2 py-1\",\n \"font-mono text-code-sm text-muted-foreground\",\n className,\n )}\n {...props}\n >\n <Icon className=\"size-3.5 shrink-0 text-primary\" aria-hidden=\"true\" />\n <span className=\"truncate text-foreground\" title={attachment.name}>\n {attachment.name}\n </span>\n {attachment.size ? <span>· {attachment.size}</span> : null}\n {onRemove ? (\n <button\n type=\"button\"\n onClick={() => onRemove(attachment.id)}\n aria-label={`Remove ${attachment.name}`}\n className={cn(\n \"ml-1 rounded-sm p-0.5 text-muted-foreground transition-colors hover:bg-muted hover:text-destructive\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n >\n <X className=\"size-3\" />\n </button>\n ) : null}\n </div>\n );\n },\n);\nAttachmentChip.displayName = \"AttachmentChip\";\n\nexport { AttachmentChip };\n"]}
@@ -0,0 +1,73 @@
1
+ import { cn } from './chunk-EWDN56AS.js';
2
+ import { PauseCircle, XCircle, AlertCircle, CheckCircle2, Loader2, Clock } from 'lucide-react';
3
+ import { forwardRef } from 'react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ var STATUS_META = {
7
+ queued: {
8
+ icon: Clock,
9
+ label: "Queued",
10
+ className: "border-border bg-muted text-muted-foreground"
11
+ },
12
+ in_progress: {
13
+ icon: Loader2,
14
+ label: "In progress",
15
+ className: "border-primary/40 bg-primary/10 text-primary",
16
+ spin: true
17
+ },
18
+ finished: {
19
+ icon: CheckCircle2,
20
+ label: "Done",
21
+ className: "border-emerald-500/40 bg-emerald-500/10 text-emerald-600 dark:text-emerald-400"
22
+ },
23
+ error: {
24
+ icon: AlertCircle,
25
+ label: "Error",
26
+ className: "border-destructive/40 bg-destructive/10 text-destructive"
27
+ },
28
+ cancelled: {
29
+ icon: XCircle,
30
+ label: "Cancelled",
31
+ className: "border-border bg-muted text-muted-foreground"
32
+ },
33
+ interrupted: {
34
+ icon: PauseCircle,
35
+ label: "Interrupted",
36
+ className: "border-amber-500/40 bg-amber-500/10 text-amber-600 dark:text-amber-400"
37
+ }
38
+ };
39
+ var RunStatusPill = forwardRef(
40
+ ({ status, detail, className, "data-testid": dataTestId, ...rest }, ref) => {
41
+ const meta = STATUS_META[status];
42
+ const Icon = meta.icon;
43
+ return /* @__PURE__ */ jsxs(
44
+ "span",
45
+ {
46
+ ref,
47
+ role: "status",
48
+ "aria-live": "polite",
49
+ className: cn(
50
+ "inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 font-medium text-xs",
51
+ meta.className,
52
+ className
53
+ ),
54
+ "data-testid": dataTestId ?? "run-status-pill",
55
+ "data-status": status,
56
+ ...rest,
57
+ children: [
58
+ /* @__PURE__ */ jsx(Icon, { className: cn("size-3", meta.spin && "animate-spin"), "aria-hidden": true }),
59
+ /* @__PURE__ */ jsx("span", { children: meta.label }),
60
+ detail !== void 0 && detail.length > 0 && /* @__PURE__ */ jsxs("span", { className: "text-muted-foreground", "data-testid": "run-status-detail", children: [
61
+ " \xB7 ",
62
+ detail
63
+ ] })
64
+ ]
65
+ }
66
+ );
67
+ }
68
+ );
69
+ RunStatusPill.displayName = "RunStatusPill";
70
+
71
+ export { RunStatusPill };
72
+ //# sourceMappingURL=chunk-VT7VSYH5.js.map
73
+ //# sourceMappingURL=chunk-VT7VSYH5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/primitives/run-status-pill/run-status-pill.tsx"],"names":[],"mappings":";;;;;AAwCA,IAAM,WAAA,GAA6C;AAAA,EACjD,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,SAAA,EAAW;AAAA,GACb;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,aAAA;AAAA,IACP,SAAA,EAAW,8CAAA;AAAA,IACX,IAAA,EAAM;AAAA,GACR;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,YAAA;AAAA,IACN,KAAA,EAAO,MAAA;AAAA,IACP,SAAA,EAAW;AAAA,GACb;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,SAAA,EAAW;AAAA,GACb;AAAA,EACA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,WAAA;AAAA,IACP,SAAA,EAAW;AAAA,GACb;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,WAAA;AAAA,IACN,KAAA,EAAO,aAAA;AAAA,IACP,SAAA,EAAW;AAAA;AAEf,CAAA;AAEO,IAAM,aAAA,GAAgB,UAAA;AAAA,EAC3B,CAAC,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,eAAe,UAAA,EAAY,GAAG,IAAA,EAAK,EAAG,GAAA,KAAQ;AAC1E,IAAA,MAAM,IAAA,GAAO,YAAY,MAAM,CAAA;AAC/B,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,uBACE,IAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QAEA,IAAA,EAAK,QAAA;AAAA,QACL,WAAA,EAAU,QAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACT,sFAAA;AAAA,UACA,IAAA,CAAK,SAAA;AAAA,UACL;AAAA,SACF;AAAA,QACA,eAAa,UAAA,IAAc,iBAAA;AAAA,QAC3B,aAAA,EAAa,MAAA;AAAA,QACZ,GAAG,IAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,WAAW,EAAA,CAAG,QAAA,EAAU,KAAK,IAAA,IAAQ,cAAc,CAAA,EAAG,aAAA,EAAW,IAAA,EAAC,CAAA;AAAA,0BACxE,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,UACjB,MAAA,KAAW,MAAA,IAAa,MAAA,CAAO,MAAA,GAAS,CAAA,yBACtC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,aAAA,EAAY,mBAAA,EACjD,QAAA,EAAA;AAAA,YAAA,QAAA;AAAA,YACA;AAAA,WAAA,EACH;AAAA;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AACA,aAAA,CAAc,WAAA,GAAc,eAAA","file":"chunk-VT7VSYH5.js","sourcesContent":["import {\n AlertCircle,\n CheckCircle2,\n Clock,\n Loader2,\n type LucideIcon,\n PauseCircle,\n XCircle,\n} from \"lucide-react\";\nimport { type HTMLAttributes, forwardRef } from \"react\";\n\nimport { cn } from \"../../../lib/cn.js\";\n\n/**\n * RunStatusPill — compact status indicator for Run/Task lifecycle states.\n * Mirrors OpenClaw's `Run status: In progress | Done | Interrupted` pill.\n * Closed enum mirrors SDK `Task` state (D362).\n */\n\nexport type RunStatus =\n | \"queued\"\n | \"in_progress\"\n | \"finished\"\n | \"error\"\n | \"cancelled\"\n | \"interrupted\";\n\nexport interface RunStatusPillProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"title\"> {\n status: RunStatus;\n detail?: string;\n \"data-testid\"?: string;\n}\n\ninterface StatusMeta {\n icon: LucideIcon;\n label: string;\n className: string;\n spin?: boolean;\n}\n\nconst STATUS_META: Record<RunStatus, StatusMeta> = {\n queued: {\n icon: Clock,\n label: \"Queued\",\n className: \"border-border bg-muted text-muted-foreground\",\n },\n in_progress: {\n icon: Loader2,\n label: \"In progress\",\n className: \"border-primary/40 bg-primary/10 text-primary\",\n spin: true,\n },\n finished: {\n icon: CheckCircle2,\n label: \"Done\",\n className: \"border-emerald-500/40 bg-emerald-500/10 text-emerald-600 dark:text-emerald-400\",\n },\n error: {\n icon: AlertCircle,\n label: \"Error\",\n className: \"border-destructive/40 bg-destructive/10 text-destructive\",\n },\n cancelled: {\n icon: XCircle,\n label: \"Cancelled\",\n className: \"border-border bg-muted text-muted-foreground\",\n },\n interrupted: {\n icon: PauseCircle,\n label: \"Interrupted\",\n className: \"border-amber-500/40 bg-amber-500/10 text-amber-600 dark:text-amber-400\",\n },\n};\n\nexport const RunStatusPill = forwardRef<HTMLSpanElement, RunStatusPillProps>(\n ({ status, detail, className, \"data-testid\": dataTestId, ...rest }, ref) => {\n const meta = STATUS_META[status];\n const Icon = meta.icon;\n return (\n <span\n ref={ref}\n // biome-ignore lint/a11y/useSemanticElements: inline status badge — <span role=\"status\"> keeps it phrasing-content compatible inside chat headers and table cells, where the implicit <output> placement would break layout\n role=\"status\"\n aria-live=\"polite\"\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 font-medium text-xs\",\n meta.className,\n className,\n )}\n data-testid={dataTestId ?? \"run-status-pill\"}\n data-status={status}\n {...rest}\n >\n <Icon className={cn(\"size-3\", meta.spin && \"animate-spin\")} aria-hidden />\n <span>{meta.label}</span>\n {detail !== undefined && detail.length > 0 && (\n <span className=\"text-muted-foreground\" data-testid=\"run-status-detail\">\n {\" · \"}\n {detail}\n </span>\n )}\n </span>\n );\n },\n);\nRunStatusPill.displayName = \"RunStatusPill\";\n"]}
@@ -0,0 +1,57 @@
1
+ import { cn } from './chunk-EWDN56AS.js';
2
+ import { Wrench, ChevronRight } from 'lucide-react';
3
+ import { forwardRef, useState } from 'react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ var ToolCall = forwardRef(
7
+ ({ className, name, summary, detail, defaultOpen, hideIcon, ...props }, ref) => {
8
+ const [open, setOpen] = useState(defaultOpen ?? false);
9
+ const expandable = detail !== void 0;
10
+ return /* @__PURE__ */ jsxs(
11
+ "div",
12
+ {
13
+ ref,
14
+ className: cn("rounded-md border border-border/40 bg-muted/30", className),
15
+ ...props,
16
+ children: [
17
+ /* @__PURE__ */ jsxs(
18
+ "button",
19
+ {
20
+ type: "button",
21
+ onClick: () => expandable && setOpen((v) => !v),
22
+ "aria-expanded": expandable ? open : void 0,
23
+ disabled: !expandable,
24
+ className: cn(
25
+ "flex w-full items-center gap-2 px-3 py-2 text-left",
26
+ "font-sans text-body-sm text-foreground",
27
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
28
+ expandable && "cursor-pointer hover:bg-muted/60"
29
+ ),
30
+ children: [
31
+ !hideIcon ? /* @__PURE__ */ jsx(Wrench, { className: "size-3.5 shrink-0 text-primary", "aria-hidden": "true" }) : null,
32
+ name ? /* @__PURE__ */ jsx("span", { className: "font-mono text-code-sm text-muted-foreground", children: name }) : null,
33
+ /* @__PURE__ */ jsx("span", { className: "flex-1 truncate", children: summary }),
34
+ expandable ? /* @__PURE__ */ jsx(
35
+ ChevronRight,
36
+ {
37
+ className: cn(
38
+ "size-3.5 text-muted-foreground transition-transform",
39
+ open && "rotate-90"
40
+ ),
41
+ "aria-hidden": "true"
42
+ }
43
+ ) : null
44
+ ]
45
+ }
46
+ ),
47
+ expandable && open ? /* @__PURE__ */ jsx("div", { className: "border-border/40 border-t bg-card px-3 py-2", children: detail }) : null
48
+ ]
49
+ }
50
+ );
51
+ }
52
+ );
53
+ ToolCall.displayName = "ToolCall";
54
+
55
+ export { ToolCall };
56
+ //# sourceMappingURL=chunk-VTIRUCLZ.js.map
57
+ //# sourceMappingURL=chunk-VTIRUCLZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/primitives/tool-call/tool-call.tsx"],"names":[],"mappings":";;;;;AAiCA,IAAM,QAAA,GAAW,UAAA;AAAA,EACf,CAAC,EAAE,SAAA,EAAW,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,WAAA,EAAa,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC9E,IAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,QAAA,CAAS,eAAe,KAAK,CAAA;AACrD,IAAA,MAAM,aAAa,MAAA,KAAW,MAAA;AAC9B,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA,CAAG,gDAAA,EAAkD,SAAS,CAAA;AAAA,QACxE,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,IAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAS,MAAM,UAAA,IAAc,QAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,cAC9C,eAAA,EAAe,aAAa,IAAA,GAAO,MAAA;AAAA,cACnC,UAAU,CAAC,UAAA;AAAA,cACX,SAAA,EAAW,EAAA;AAAA,gBACT,oDAAA;AAAA,gBACA,wCAAA;AAAA,gBACA,0IAAA;AAAA,gBACA,UAAA,IAAc;AAAA,eAChB;AAAA,cAEC,QAAA,EAAA;AAAA,gBAAA,CAAC,2BACA,GAAA,CAAC,MAAA,EAAA,EAAO,WAAU,gCAAA,EAAiC,aAAA,EAAY,QAAO,CAAA,GACpE,IAAA;AAAA,gBACH,uBACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8CAAA,EAAgD,gBAAK,CAAA,GACnE,IAAA;AAAA,gCACJ,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAmB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,gBAC1C,UAAA,mBACC,GAAA;AAAA,kBAAC,YAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAW,EAAA;AAAA,sBACT,qDAAA;AAAA,sBACA,IAAA,IAAQ;AAAA,qBACV;AAAA,oBACA,aAAA,EAAY;AAAA;AAAA,iBACd,GACE;AAAA;AAAA;AAAA,WACN;AAAA,UACC,cAAc,IAAA,mBACb,GAAA,CAAC,SAAI,SAAA,EAAU,6CAAA,EAA+C,kBAAO,CAAA,GACnE;AAAA;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,QAAA,CAAS,WAAA,GAAc,UAAA","file":"chunk-VTIRUCLZ.js","sourcesContent":["import { ChevronRight, Wrench } from \"lucide-react\";\nimport { forwardRef, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\ninterface ToolCallProps extends HTMLAttributes<HTMLDivElement> {\n /** Tool name e.g. \"bash\", \"read_file\", \"edit_file\". */\n name?: string;\n /**\n * Summary label e.g. \"Ran 2 commands\", \"Read 18 files\".\n */\n summary: ReactNode;\n /**\n * Collapsible payload (e.g. command, stdout, file list).\n */\n detail?: ReactNode;\n defaultOpen?: boolean;\n /**\n * If true, hides the wrench icon (useful when grouping by name elsewhere).\n */\n hideIcon?: boolean;\n}\n\n/**\n * ToolCall — collapsible row representing an agent tool invocation.\n *\n * Visual: subtle muted container, wrench icon, summary in body text,\n * chevron rotates on expand. Pairs with `<ToolResult>` for the rendered output.\n *\n * Typical usage inside a ChatMessage assistant body:\n *\n * <ToolCall summary=\"Read 18 files\" detail={<ToolResult>{output}</ToolResult>} />\n */\nconst ToolCall = forwardRef<HTMLDivElement, ToolCallProps>(\n ({ className, name, summary, detail, defaultOpen, hideIcon, ...props }, ref) => {\n const [open, setOpen] = useState(defaultOpen ?? false);\n const expandable = detail !== undefined;\n return (\n <div\n ref={ref}\n className={cn(\"rounded-md border border-border/40 bg-muted/30\", className)}\n {...props}\n >\n <button\n type=\"button\"\n onClick={() => expandable && setOpen((v) => !v)}\n aria-expanded={expandable ? open : undefined}\n disabled={!expandable}\n className={cn(\n \"flex w-full items-center gap-2 px-3 py-2 text-left\",\n \"font-sans text-body-sm text-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n expandable && \"cursor-pointer hover:bg-muted/60\",\n )}\n >\n {!hideIcon ? (\n <Wrench className=\"size-3.5 shrink-0 text-primary\" aria-hidden=\"true\" />\n ) : null}\n {name ? (\n <span className=\"font-mono text-code-sm text-muted-foreground\">{name}</span>\n ) : null}\n <span className=\"flex-1 truncate\">{summary}</span>\n {expandable ? (\n <ChevronRight\n className={cn(\n \"size-3.5 text-muted-foreground transition-transform\",\n open && \"rotate-90\",\n )}\n aria-hidden=\"true\"\n />\n ) : null}\n </button>\n {expandable && open ? (\n <div className=\"border-border/40 border-t bg-card px-3 py-2\">{detail}</div>\n ) : null}\n </div>\n );\n },\n);\nToolCall.displayName = \"ToolCall\";\n\nexport { ToolCall };\n"]}
@@ -0,0 +1,202 @@
1
+ import { cn } from './chunk-EWDN56AS.js';
2
+ import { ChevronsLeft, ChevronLeft, ChevronRight, ChevronsRight } from 'lucide-react';
3
+ import { forwardRef } from 'react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ function computePageRange(currentPage, totalPages, siblingCount = 1) {
7
+ if (totalPages <= 1) return [];
8
+ const totalNumbers = siblingCount * 2 + 3;
9
+ const totalWithEdges = totalNumbers + 2;
10
+ if (totalPages <= totalWithEdges) {
11
+ return Array.from({ length: totalPages }, (_, i) => i + 1);
12
+ }
13
+ const leftSibling = Math.max(currentPage - siblingCount, 1);
14
+ const rightSibling = Math.min(currentPage + siblingCount, totalPages);
15
+ const showLeftEllipsis = leftSibling > 2;
16
+ const showRightEllipsis = rightSibling < totalPages - 1;
17
+ if (!showLeftEllipsis && showRightEllipsis) {
18
+ const leftRangeEnd = 1 + (siblingCount * 2 + 2);
19
+ const leftRange = Array.from({ length: leftRangeEnd }, (_, i) => i + 1);
20
+ return [...leftRange, "ellipsis-end", totalPages];
21
+ }
22
+ if (showLeftEllipsis && !showRightEllipsis) {
23
+ const rightStart = totalPages - (siblingCount * 2 + 2);
24
+ const rightRange = Array.from(
25
+ { length: totalPages - rightStart + 1 },
26
+ (_, i) => rightStart + i
27
+ );
28
+ return [1, "ellipsis-start", ...rightRange];
29
+ }
30
+ const middleRange = Array.from(
31
+ { length: rightSibling - leftSibling + 1 },
32
+ (_, i) => leftSibling + i
33
+ );
34
+ return [1, "ellipsis-start", ...middleRange, "ellipsis-end", totalPages];
35
+ }
36
+ var SIZE = {
37
+ sm: "size-7 text-label",
38
+ md: "size-8 text-body-sm"
39
+ };
40
+ var ICON_SIZE = {
41
+ sm: "size-3",
42
+ md: "size-3.5"
43
+ };
44
+ var Pagination = forwardRef(
45
+ ({
46
+ className,
47
+ currentPage,
48
+ totalPages,
49
+ onPageChange,
50
+ siblingCount = 1,
51
+ showJumpButtons = true,
52
+ size = "md",
53
+ ...props
54
+ }, ref) => {
55
+ if (totalPages <= 1) {
56
+ return null;
57
+ }
58
+ const range = computePageRange(currentPage, totalPages, siblingCount);
59
+ const prevDisabled = currentPage <= 1;
60
+ const nextDisabled = currentPage >= totalPages;
61
+ const sizeClass = SIZE[size];
62
+ const iconClass = ICON_SIZE[size];
63
+ const buttonBase = cn(
64
+ "inline-flex items-center justify-center rounded-md font-mono tabular-nums",
65
+ "transition-colors",
66
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
67
+ sizeClass
68
+ );
69
+ function go(page) {
70
+ const clamped = Math.max(1, Math.min(totalPages, page));
71
+ if (clamped !== currentPage) onPageChange(clamped);
72
+ }
73
+ function handleKeyDown(e) {
74
+ if (e.key === "ArrowLeft") {
75
+ e.preventDefault();
76
+ go(currentPage - 1);
77
+ } else if (e.key === "ArrowRight") {
78
+ e.preventDefault();
79
+ go(currentPage + 1);
80
+ } else if (e.key === "Home") {
81
+ e.preventDefault();
82
+ go(1);
83
+ } else if (e.key === "End") {
84
+ e.preventDefault();
85
+ go(totalPages);
86
+ }
87
+ }
88
+ return /* @__PURE__ */ jsxs(
89
+ "nav",
90
+ {
91
+ ref,
92
+ "aria-label": "Pagination",
93
+ onKeyDown: handleKeyDown,
94
+ className: cn("flex items-center gap-1", className),
95
+ ...props,
96
+ children: [
97
+ showJumpButtons ? /* @__PURE__ */ jsx(
98
+ "button",
99
+ {
100
+ type: "button",
101
+ onClick: () => go(1),
102
+ disabled: prevDisabled,
103
+ "aria-label": "Go to first page",
104
+ "aria-disabled": prevDisabled || void 0,
105
+ className: cn(
106
+ buttonBase,
107
+ "text-foreground hover:bg-muted",
108
+ prevDisabled && "cursor-not-allowed opacity-40 hover:bg-transparent"
109
+ ),
110
+ children: /* @__PURE__ */ jsx(ChevronsLeft, { "aria-hidden": "true", className: iconClass })
111
+ }
112
+ ) : null,
113
+ /* @__PURE__ */ jsx(
114
+ "button",
115
+ {
116
+ type: "button",
117
+ onClick: () => go(currentPage - 1),
118
+ disabled: prevDisabled,
119
+ "aria-label": "Go to previous page",
120
+ "aria-disabled": prevDisabled || void 0,
121
+ className: cn(
122
+ buttonBase,
123
+ "text-foreground hover:bg-muted",
124
+ prevDisabled && "cursor-not-allowed opacity-40 hover:bg-transparent"
125
+ ),
126
+ children: /* @__PURE__ */ jsx(ChevronLeft, { "aria-hidden": "true", className: iconClass })
127
+ }
128
+ ),
129
+ range.map((item) => {
130
+ if (item === "ellipsis-start" || item === "ellipsis-end") {
131
+ return /* @__PURE__ */ jsx(
132
+ "span",
133
+ {
134
+ "aria-hidden": "true",
135
+ className: cn(
136
+ "inline-flex items-center justify-center text-muted-foreground",
137
+ sizeClass
138
+ ),
139
+ children: "\u2026"
140
+ },
141
+ item
142
+ );
143
+ }
144
+ const isActive = item === currentPage;
145
+ return /* @__PURE__ */ jsx(
146
+ "button",
147
+ {
148
+ type: "button",
149
+ onClick: () => go(item),
150
+ "aria-label": `Go to page ${item}`,
151
+ "aria-current": isActive ? "page" : void 0,
152
+ className: cn(
153
+ buttonBase,
154
+ isActive ? "bg-primary text-primary-foreground hover:bg-primary" : "text-foreground hover:bg-muted"
155
+ ),
156
+ children: item
157
+ },
158
+ item
159
+ );
160
+ }),
161
+ /* @__PURE__ */ jsx(
162
+ "button",
163
+ {
164
+ type: "button",
165
+ onClick: () => go(currentPage + 1),
166
+ disabled: nextDisabled,
167
+ "aria-label": "Go to next page",
168
+ "aria-disabled": nextDisabled || void 0,
169
+ className: cn(
170
+ buttonBase,
171
+ "text-foreground hover:bg-muted",
172
+ nextDisabled && "cursor-not-allowed opacity-40 hover:bg-transparent"
173
+ ),
174
+ children: /* @__PURE__ */ jsx(ChevronRight, { "aria-hidden": "true", className: iconClass })
175
+ }
176
+ ),
177
+ showJumpButtons ? /* @__PURE__ */ jsx(
178
+ "button",
179
+ {
180
+ type: "button",
181
+ onClick: () => go(totalPages),
182
+ disabled: nextDisabled,
183
+ "aria-label": "Go to last page",
184
+ "aria-disabled": nextDisabled || void 0,
185
+ className: cn(
186
+ buttonBase,
187
+ "text-foreground hover:bg-muted",
188
+ nextDisabled && "cursor-not-allowed opacity-40 hover:bg-transparent"
189
+ ),
190
+ children: /* @__PURE__ */ jsx(ChevronsRight, { "aria-hidden": "true", className: iconClass })
191
+ }
192
+ ) : null
193
+ ]
194
+ }
195
+ );
196
+ }
197
+ );
198
+ Pagination.displayName = "Pagination";
199
+
200
+ export { Pagination, computePageRange };
201
+ //# sourceMappingURL=chunk-VVBAEYKI.js.map
202
+ //# sourceMappingURL=chunk-VVBAEYKI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/primitives/pagination/pagination.tsx"],"names":[],"mappings":"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","file":"chunk-VVBAEYKI.js","sourcesContent":["import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, KeyboardEvent } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\n/**\n * Pagination — accessible page-number navigation primitive.\n *\n * Renders a `<nav aria-label=\"Pagination\">` containing a button group:\n * `[<<] [<] 1 ... 5 6 [7] 8 9 ... 42 [>] [>>]`. The active page carries\n * `aria-current=\"page\"`. Keyboard navigation (ArrowLeft / ArrowRight /\n * Home / End) is wired on the nav. Ellipses are rendered as\n * non-interactive `<span>` elements with `aria-hidden`.\n *\n * Renders nothing when `totalPages <= 1` (the page is the whole list).\n *\n * `siblingCount` controls how many neighbors of the current page are\n * always visible (default 1 → \"5 6 [7] 8 9\"). `showJumpButtons`\n * toggles the first/last `<<` / `>>` buttons.\n *\n * Consumers control state (`currentPage`) and are responsible for any\n * URL routing — the buttons are `<button>`, not `<a>`.\n *\n * @example\n * <Pagination\n * currentPage={page}\n * totalPages={42}\n * onPageChange={setPage}\n * />\n */\nexport interface PaginationProps extends Omit<HTMLAttributes<HTMLElement>, \"onChange\"> {\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n /** Neighbors of current page that stay visible. Default 1. */\n siblingCount?: number;\n /** Render `<<` / `>>` first/last buttons. Default true. */\n showJumpButtons?: boolean;\n /** Size variant. Default md. */\n size?: \"sm\" | \"md\";\n}\n\n/**\n * Pure helper: compute the visible page-range with ellipses.\n * Exported for unit testing — most pagination bugs live here.\n */\nexport function computePageRange(\n currentPage: number,\n totalPages: number,\n siblingCount = 1,\n): Array<number | \"ellipsis-start\" | \"ellipsis-end\"> {\n if (totalPages <= 1) return [];\n\n // Always keep first + last + siblings around current.\n // Total \"core\" buttons: 1 + (siblingCount * 2 + 1) + 1 = siblingCount * 2 + 3.\n // Plus possibly 2 ellipsis placeholders → max visible = siblingCount * 2 + 5.\n const totalNumbers = siblingCount * 2 + 3;\n const totalWithEdges = totalNumbers + 2;\n\n if (totalPages <= totalWithEdges) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const leftSibling = Math.max(currentPage - siblingCount, 1);\n const rightSibling = Math.min(currentPage + siblingCount, totalPages);\n\n const showLeftEllipsis = leftSibling > 2;\n const showRightEllipsis = rightSibling < totalPages - 1;\n\n if (!showLeftEllipsis && showRightEllipsis) {\n const leftRangeEnd = 1 + (siblingCount * 2 + 2);\n const leftRange = Array.from({ length: leftRangeEnd }, (_, i) => i + 1);\n return [...leftRange, \"ellipsis-end\", totalPages];\n }\n\n if (showLeftEllipsis && !showRightEllipsis) {\n const rightStart = totalPages - (siblingCount * 2 + 2);\n const rightRange = Array.from(\n { length: totalPages - rightStart + 1 },\n (_, i) => rightStart + i,\n );\n return [1, \"ellipsis-start\", ...rightRange];\n }\n\n // Both sides need ellipsis.\n const middleRange = Array.from(\n { length: rightSibling - leftSibling + 1 },\n (_, i) => leftSibling + i,\n );\n return [1, \"ellipsis-start\", ...middleRange, \"ellipsis-end\", totalPages];\n}\n\nconst SIZE: Record<NonNullable<PaginationProps[\"size\"]>, string> = {\n sm: \"size-7 text-label\",\n md: \"size-8 text-body-sm\",\n};\n\nconst ICON_SIZE: Record<NonNullable<PaginationProps[\"size\"]>, string> = {\n sm: \"size-3\",\n md: \"size-3.5\",\n};\n\nconst Pagination = forwardRef<HTMLElement, PaginationProps>(\n (\n {\n className,\n currentPage,\n totalPages,\n onPageChange,\n siblingCount = 1,\n showJumpButtons = true,\n size = \"md\",\n ...props\n },\n ref,\n ) => {\n if (totalPages <= 1) {\n return null;\n }\n\n const range = computePageRange(currentPage, totalPages, siblingCount);\n const prevDisabled = currentPage <= 1;\n const nextDisabled = currentPage >= totalPages;\n const sizeClass = SIZE[size];\n const iconClass = ICON_SIZE[size];\n\n const buttonBase = cn(\n \"inline-flex items-center justify-center rounded-md font-mono tabular-nums\",\n \"transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n sizeClass,\n );\n\n function go(page: number) {\n const clamped = Math.max(1, Math.min(totalPages, page));\n if (clamped !== currentPage) onPageChange(clamped);\n }\n\n function handleKeyDown(e: KeyboardEvent<HTMLElement>) {\n if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n go(currentPage - 1);\n } else if (e.key === \"ArrowRight\") {\n e.preventDefault();\n go(currentPage + 1);\n } else if (e.key === \"Home\") {\n e.preventDefault();\n go(1);\n } else if (e.key === \"End\") {\n e.preventDefault();\n go(totalPages);\n }\n }\n\n return (\n <nav\n ref={ref}\n aria-label=\"Pagination\"\n onKeyDown={handleKeyDown}\n className={cn(\"flex items-center gap-1\", className)}\n {...props}\n >\n {showJumpButtons ? (\n <button\n type=\"button\"\n onClick={() => go(1)}\n disabled={prevDisabled}\n aria-label=\"Go to first page\"\n aria-disabled={prevDisabled || undefined}\n className={cn(\n buttonBase,\n \"text-foreground hover:bg-muted\",\n prevDisabled && \"cursor-not-allowed opacity-40 hover:bg-transparent\",\n )}\n >\n <ChevronsLeft aria-hidden=\"true\" className={iconClass} />\n </button>\n ) : null}\n <button\n type=\"button\"\n onClick={() => go(currentPage - 1)}\n disabled={prevDisabled}\n aria-label=\"Go to previous page\"\n aria-disabled={prevDisabled || undefined}\n className={cn(\n buttonBase,\n \"text-foreground hover:bg-muted\",\n prevDisabled && \"cursor-not-allowed opacity-40 hover:bg-transparent\",\n )}\n >\n <ChevronLeft aria-hidden=\"true\" className={iconClass} />\n </button>\n {range.map((item) => {\n if (item === \"ellipsis-start\" || item === \"ellipsis-end\") {\n return (\n <span\n key={item}\n aria-hidden=\"true\"\n className={cn(\n \"inline-flex items-center justify-center text-muted-foreground\",\n sizeClass,\n )}\n >\n …\n </span>\n );\n }\n const isActive = item === currentPage;\n return (\n <button\n key={item}\n type=\"button\"\n onClick={() => go(item)}\n aria-label={`Go to page ${item}`}\n aria-current={isActive ? \"page\" : undefined}\n className={cn(\n buttonBase,\n isActive\n ? \"bg-primary text-primary-foreground hover:bg-primary\"\n : \"text-foreground hover:bg-muted\",\n )}\n >\n {item}\n </button>\n );\n })}\n <button\n type=\"button\"\n onClick={() => go(currentPage + 1)}\n disabled={nextDisabled}\n aria-label=\"Go to next page\"\n aria-disabled={nextDisabled || undefined}\n className={cn(\n buttonBase,\n \"text-foreground hover:bg-muted\",\n nextDisabled && \"cursor-not-allowed opacity-40 hover:bg-transparent\",\n )}\n >\n <ChevronRight aria-hidden=\"true\" className={iconClass} />\n </button>\n {showJumpButtons ? (\n <button\n type=\"button\"\n onClick={() => go(totalPages)}\n disabled={nextDisabled}\n aria-label=\"Go to last page\"\n aria-disabled={nextDisabled || undefined}\n className={cn(\n buttonBase,\n \"text-foreground hover:bg-muted\",\n nextDisabled && \"cursor-not-allowed opacity-40 hover:bg-transparent\",\n )}\n >\n <ChevronsRight aria-hidden=\"true\" className={iconClass} />\n </button>\n ) : null}\n </nav>\n );\n },\n);\nPagination.displayName = \"Pagination\";\n\nexport { Pagination };\n"]}