@usetheo/ui 0.9.0-next.0 → 0.11.0-next.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 (502) hide show
  1. package/CHANGELOG.md +215 -0
  2. package/README.md +22 -21
  3. package/dist/chunk-2UJROWAG.js +106 -0
  4. package/dist/chunk-2UJROWAG.js.map +1 -0
  5. package/dist/chunk-2XPWOUEH.js +68 -0
  6. package/dist/chunk-2XPWOUEH.js.map +1 -0
  7. package/dist/chunk-3GHLNCM3.js +42 -0
  8. package/dist/chunk-3GHLNCM3.js.map +1 -0
  9. package/dist/chunk-3HOXC25T.js +48 -0
  10. package/dist/chunk-3HOXC25T.js.map +1 -0
  11. package/dist/chunk-3QGO5SB3.js +46 -0
  12. package/dist/chunk-3QGO5SB3.js.map +1 -0
  13. package/dist/chunk-47QJVWW2.js +85 -0
  14. package/dist/chunk-47QJVWW2.js.map +1 -0
  15. package/dist/chunk-4L63UW3I.js +35 -0
  16. package/dist/chunk-4L63UW3I.js.map +1 -0
  17. package/dist/chunk-4UUSJJFZ.js +25 -0
  18. package/dist/chunk-4UUSJJFZ.js.map +1 -0
  19. package/dist/chunk-4ZBZBRG5.js +127 -0
  20. package/dist/chunk-4ZBZBRG5.js.map +1 -0
  21. package/dist/chunk-57NXT3OX.js +92 -0
  22. package/dist/chunk-57NXT3OX.js.map +1 -0
  23. package/dist/chunk-5FF5EUZP.js +44 -0
  24. package/dist/chunk-5FF5EUZP.js.map +1 -0
  25. package/dist/chunk-5UGQXB2P.js +714 -0
  26. package/dist/chunk-5UGQXB2P.js.map +1 -0
  27. package/dist/chunk-62FT22CI.js +85 -0
  28. package/dist/chunk-62FT22CI.js.map +1 -0
  29. package/dist/chunk-673R3GSK.js +19 -0
  30. package/dist/chunk-673R3GSK.js.map +1 -0
  31. package/dist/chunk-6VINZJBV.js +128 -0
  32. package/dist/chunk-6VINZJBV.js.map +1 -0
  33. package/dist/chunk-74NZ5U3E.js +145 -0
  34. package/dist/chunk-74NZ5U3E.js.map +1 -0
  35. package/dist/chunk-755NWSNW.js +36 -0
  36. package/dist/chunk-755NWSNW.js.map +1 -0
  37. package/dist/chunk-7GLBWWMW.js +70 -0
  38. package/dist/chunk-7GLBWWMW.js.map +1 -0
  39. package/dist/chunk-7RXYW5VM.js +88 -0
  40. package/dist/chunk-7RXYW5VM.js.map +1 -0
  41. package/dist/chunk-AC4MGCXI.js +92 -0
  42. package/dist/chunk-AC4MGCXI.js.map +1 -0
  43. package/dist/chunk-AEVSVDT6.js +67 -0
  44. package/dist/chunk-AEVSVDT6.js.map +1 -0
  45. package/dist/chunk-AODIMN2N.js +68 -0
  46. package/dist/chunk-AODIMN2N.js.map +1 -0
  47. package/dist/chunk-ATHOPBCA.js +61 -0
  48. package/dist/chunk-ATHOPBCA.js.map +1 -0
  49. package/dist/chunk-AXKBNRZW.js +173 -0
  50. package/dist/chunk-AXKBNRZW.js.map +1 -0
  51. package/dist/chunk-B75MEYNR.js +106 -0
  52. package/dist/chunk-B75MEYNR.js.map +1 -0
  53. package/dist/chunk-BGKA6DI6.js +34 -0
  54. package/dist/chunk-BGKA6DI6.js.map +1 -0
  55. package/dist/chunk-BNQAJGEN.js +88 -0
  56. package/dist/chunk-BNQAJGEN.js.map +1 -0
  57. package/dist/chunk-BP2SETUC.js +101 -0
  58. package/dist/chunk-BP2SETUC.js.map +1 -0
  59. package/dist/chunk-BPUQWMBD.js +79 -0
  60. package/dist/chunk-BPUQWMBD.js.map +1 -0
  61. package/dist/chunk-BVDASR3Y.js +74 -0
  62. package/dist/chunk-BVDASR3Y.js.map +1 -0
  63. package/dist/chunk-BX7A5GUV.js +78 -0
  64. package/dist/chunk-BX7A5GUV.js.map +1 -0
  65. package/dist/chunk-CDA6RYOX.js +115 -0
  66. package/dist/chunk-CDA6RYOX.js.map +1 -0
  67. package/dist/chunk-CG7O3A42.js +80 -0
  68. package/dist/chunk-CG7O3A42.js.map +1 -0
  69. package/dist/chunk-CIYGNPKT.js +76 -0
  70. package/dist/chunk-CIYGNPKT.js.map +1 -0
  71. package/dist/chunk-CKXY4FTV.js +59 -0
  72. package/dist/chunk-CKXY4FTV.js.map +1 -0
  73. package/dist/chunk-CVOKZITR.js +82 -0
  74. package/dist/chunk-CVOKZITR.js.map +1 -0
  75. package/dist/chunk-CWFMFKDI.js +82 -0
  76. package/dist/chunk-CWFMFKDI.js.map +1 -0
  77. package/dist/chunk-CWVKSV7S.js +124 -0
  78. package/dist/chunk-CWVKSV7S.js.map +1 -0
  79. package/dist/chunk-CYOLRWOX.js +63 -0
  80. package/dist/chunk-CYOLRWOX.js.map +1 -0
  81. package/dist/chunk-D23LRJT6.js +116 -0
  82. package/dist/chunk-D23LRJT6.js.map +1 -0
  83. package/dist/chunk-DFADMEJK.js +127 -0
  84. package/dist/chunk-DFADMEJK.js.map +1 -0
  85. package/dist/chunk-DKQAHZG2.js +83 -0
  86. package/dist/chunk-DKQAHZG2.js.map +1 -0
  87. package/dist/chunk-E5A7HN6H.js +32 -0
  88. package/dist/chunk-E5A7HN6H.js.map +1 -0
  89. package/dist/chunk-EI63GTN7.js +57 -0
  90. package/dist/chunk-EI63GTN7.js.map +1 -0
  91. package/dist/chunk-EP25QJ4N.js +146 -0
  92. package/dist/chunk-EP25QJ4N.js.map +1 -0
  93. package/dist/chunk-ET44426Q.js +80 -0
  94. package/dist/chunk-ET44426Q.js.map +1 -0
  95. package/dist/chunk-ETEIDY34.js +67 -0
  96. package/dist/chunk-ETEIDY34.js.map +1 -0
  97. package/dist/chunk-EU55O4P7.js +76 -0
  98. package/dist/chunk-EU55O4P7.js.map +1 -0
  99. package/dist/chunk-F436537E.js +104 -0
  100. package/dist/chunk-F436537E.js.map +1 -0
  101. package/dist/chunk-FLBTGNQI.js +86 -0
  102. package/dist/chunk-FLBTGNQI.js.map +1 -0
  103. package/dist/chunk-FUT45NFW.js +46 -0
  104. package/dist/chunk-FUT45NFW.js.map +1 -0
  105. package/dist/chunk-G3LWNTVZ.js +51 -0
  106. package/dist/chunk-G3LWNTVZ.js.map +1 -0
  107. package/dist/chunk-GBJB5WLT.js +58 -0
  108. package/dist/chunk-GBJB5WLT.js.map +1 -0
  109. package/dist/chunk-GIEPEFRX.js +110 -0
  110. package/dist/chunk-GIEPEFRX.js.map +1 -0
  111. package/dist/chunk-GSO7MISR.js +58 -0
  112. package/dist/chunk-GSO7MISR.js.map +1 -0
  113. package/dist/chunk-GUQFYUIC.js +61 -0
  114. package/dist/chunk-GUQFYUIC.js.map +1 -0
  115. package/dist/chunk-H3VJMFJQ.js +35 -0
  116. package/dist/chunk-H3VJMFJQ.js.map +1 -0
  117. package/dist/chunk-HG4WEERE.js +26 -0
  118. package/dist/chunk-HG4WEERE.js.map +1 -0
  119. package/dist/chunk-HGPBGLNP.js +51 -0
  120. package/dist/chunk-HGPBGLNP.js.map +1 -0
  121. package/dist/chunk-HQFTW7SF.js +141 -0
  122. package/dist/chunk-HQFTW7SF.js.map +1 -0
  123. package/dist/chunk-I7WYM63C.js +170 -0
  124. package/dist/chunk-I7WYM63C.js.map +1 -0
  125. package/dist/chunk-IPEYGWA7.js +186 -0
  126. package/dist/chunk-IPEYGWA7.js.map +1 -0
  127. package/dist/chunk-IWSLOBYG.js +199 -0
  128. package/dist/chunk-IWSLOBYG.js.map +1 -0
  129. package/dist/chunk-JQXLPVWP.js +74 -0
  130. package/dist/chunk-JQXLPVWP.js.map +1 -0
  131. package/dist/chunk-K5ARID4S.js +26 -0
  132. package/dist/chunk-K5ARID4S.js.map +1 -0
  133. package/dist/chunk-K6RTLPIJ.js +41 -0
  134. package/dist/chunk-K6RTLPIJ.js.map +1 -0
  135. package/dist/chunk-KQNKKV2C.js +56 -0
  136. package/dist/chunk-KQNKKV2C.js.map +1 -0
  137. package/dist/chunk-KRN4NE4U.js +155 -0
  138. package/dist/chunk-KRN4NE4U.js.map +1 -0
  139. package/dist/chunk-L2BI762I.js +82 -0
  140. package/dist/chunk-L2BI762I.js.map +1 -0
  141. package/dist/chunk-LEEH63B2.js +56 -0
  142. package/dist/chunk-LEEH63B2.js.map +1 -0
  143. package/dist/chunk-LHRWVM3G.js +42 -0
  144. package/dist/chunk-LHRWVM3G.js.map +1 -0
  145. package/dist/chunk-LIGWMGXM.js +117 -0
  146. package/dist/chunk-LIGWMGXM.js.map +1 -0
  147. package/dist/chunk-LKYSX3QF.js +104 -0
  148. package/dist/chunk-LKYSX3QF.js.map +1 -0
  149. package/dist/chunk-MCIFB6VS.js +54 -0
  150. package/dist/chunk-MCIFB6VS.js.map +1 -0
  151. package/dist/chunk-MI5CXMZU.js +171 -0
  152. package/dist/chunk-MI5CXMZU.js.map +1 -0
  153. package/dist/chunk-NQZYY4LR.js +84 -0
  154. package/dist/chunk-NQZYY4LR.js.map +1 -0
  155. package/dist/chunk-O23LKHUR.js +66 -0
  156. package/dist/chunk-O23LKHUR.js.map +1 -0
  157. package/dist/chunk-PASI2U2R.js +23 -0
  158. package/dist/chunk-PASI2U2R.js.map +1 -0
  159. package/dist/chunk-PPH5NTHV.js +34 -0
  160. package/dist/chunk-PPH5NTHV.js.map +1 -0
  161. package/dist/chunk-PR6OZF6D.js +28 -0
  162. package/dist/chunk-PR6OZF6D.js.map +1 -0
  163. package/dist/chunk-PWXOXPFT.js +142 -0
  164. package/dist/chunk-PWXOXPFT.js.map +1 -0
  165. package/dist/chunk-QB6BNHO3.js +112 -0
  166. package/dist/chunk-QB6BNHO3.js.map +1 -0
  167. package/dist/chunk-QJGGTIUN.js +110 -0
  168. package/dist/chunk-QJGGTIUN.js.map +1 -0
  169. package/dist/chunk-QSOIJ6J3.js +91 -0
  170. package/dist/chunk-QSOIJ6J3.js.map +1 -0
  171. package/dist/chunk-R2PAGRDP.js +152 -0
  172. package/dist/chunk-R2PAGRDP.js.map +1 -0
  173. package/dist/chunk-R63ZKLQM.js +45 -0
  174. package/dist/chunk-R63ZKLQM.js.map +1 -0
  175. package/dist/chunk-RTYYJPPE.js +77 -0
  176. package/dist/chunk-RTYYJPPE.js.map +1 -0
  177. package/dist/chunk-RVOBP7PO.js +116 -0
  178. package/dist/chunk-RVOBP7PO.js.map +1 -0
  179. package/dist/chunk-SF6R5VMQ.js +97 -0
  180. package/dist/chunk-SF6R5VMQ.js.map +1 -0
  181. package/dist/chunk-SP4CP5HY.js +57 -0
  182. package/dist/chunk-SP4CP5HY.js.map +1 -0
  183. package/dist/chunk-SWJ4EUOI.js +30 -0
  184. package/dist/chunk-SWJ4EUOI.js.map +1 -0
  185. package/dist/chunk-TK24HQJJ.js +128 -0
  186. package/dist/chunk-TK24HQJJ.js.map +1 -0
  187. package/dist/chunk-TNBJ36XJ.js +156 -0
  188. package/dist/chunk-TNBJ36XJ.js.map +1 -0
  189. package/dist/chunk-TO3UAT6O.js +221 -0
  190. package/dist/chunk-TO3UAT6O.js.map +1 -0
  191. package/dist/chunk-UAYOOTRR.js +77 -0
  192. package/dist/chunk-UAYOOTRR.js.map +1 -0
  193. package/dist/chunk-UDTAMHXW.js +55 -0
  194. package/dist/chunk-UDTAMHXW.js.map +1 -0
  195. package/dist/chunk-UGKI466V.js +12 -0
  196. package/dist/chunk-UGKI466V.js.map +1 -0
  197. package/dist/chunk-UOXU7NDY.js +120 -0
  198. package/dist/chunk-UOXU7NDY.js.map +1 -0
  199. package/dist/chunk-V7OOTVK3.js +106 -0
  200. package/dist/chunk-V7OOTVK3.js.map +1 -0
  201. package/dist/chunk-VI5M7KJ2.js +1022 -0
  202. package/dist/chunk-VI5M7KJ2.js.map +1 -0
  203. package/dist/chunk-VM4RMQQN.js +11 -0
  204. package/dist/chunk-VM4RMQQN.js.map +1 -0
  205. package/dist/chunk-VMMATOPE.js +64 -0
  206. package/dist/chunk-VMMATOPE.js.map +1 -0
  207. package/dist/chunk-W2PVSIW3.js +89 -0
  208. package/dist/chunk-W2PVSIW3.js.map +1 -0
  209. package/dist/chunk-W3DUDZDU.js +88 -0
  210. package/dist/chunk-W3DUDZDU.js.map +1 -0
  211. package/dist/chunk-WKEUU2FU.js +114 -0
  212. package/dist/chunk-WKEUU2FU.js.map +1 -0
  213. package/dist/chunk-WKLW7RC6.js +28 -0
  214. package/dist/chunk-WKLW7RC6.js.map +1 -0
  215. package/dist/chunk-WSJGZNUH.js +111 -0
  216. package/dist/chunk-WSJGZNUH.js.map +1 -0
  217. package/dist/chunk-WVPDQMC2.js +144 -0
  218. package/dist/chunk-WVPDQMC2.js.map +1 -0
  219. package/dist/chunk-WWNH5ENT.js +43 -0
  220. package/dist/chunk-WWNH5ENT.js.map +1 -0
  221. package/dist/chunk-X5L62PXY.js +112 -0
  222. package/dist/chunk-X5L62PXY.js.map +1 -0
  223. package/dist/chunk-XGCV5E6W.js +133 -0
  224. package/dist/chunk-XGCV5E6W.js.map +1 -0
  225. package/dist/chunk-XRKIEL5M.js +72 -0
  226. package/dist/chunk-XRKIEL5M.js.map +1 -0
  227. package/dist/chunk-XUJYEADU.js +80 -0
  228. package/dist/chunk-XUJYEADU.js.map +1 -0
  229. package/dist/chunk-XVYNSIQC.js +116 -0
  230. package/dist/chunk-XVYNSIQC.js.map +1 -0
  231. package/dist/chunk-XWTISHXO.js +54 -0
  232. package/dist/chunk-XWTISHXO.js.map +1 -0
  233. package/dist/chunk-YOGHS4UU.js +202 -0
  234. package/dist/chunk-YOGHS4UU.js.map +1 -0
  235. package/dist/chunk-YRSKXEOD.js +135 -0
  236. package/dist/chunk-YRSKXEOD.js.map +1 -0
  237. package/dist/chunk-ZALLCR7X.js +108 -0
  238. package/dist/chunk-ZALLCR7X.js.map +1 -0
  239. package/dist/chunk-ZDAOHMCW.js +46 -0
  240. package/dist/chunk-ZDAOHMCW.js.map +1 -0
  241. package/dist/chunk-ZESICCKK.js +37 -0
  242. package/dist/chunk-ZESICCKK.js.map +1 -0
  243. package/dist/chunk-ZIKFOD6N.js +87 -0
  244. package/dist/chunk-ZIKFOD6N.js.map +1 -0
  245. package/dist/chunk-ZJRWCQEN.js +76 -0
  246. package/dist/chunk-ZJRWCQEN.js.map +1 -0
  247. package/dist/chunk-ZSRJCIWF.js +24 -0
  248. package/dist/chunk-ZSRJCIWF.js.map +1 -0
  249. package/dist/chunk-ZXPDS6DH.js +3 -0
  250. package/dist/chunk-ZXPDS6DH.js.map +1 -0
  251. package/dist/components.css +1 -1
  252. package/dist/composites/account-menu/index.js +6 -0
  253. package/dist/composites/account-menu/index.js.map +1 -0
  254. package/dist/composites/agent-composer/index.js +7 -0
  255. package/dist/composites/agent-composer/index.js.map +1 -0
  256. package/dist/composites/agent-editor/index.js +10 -0
  257. package/dist/composites/agent-editor/index.js.map +1 -0
  258. package/dist/composites/agent-stream/index.js +12 -0
  259. package/dist/composites/agent-stream/index.js.map +1 -0
  260. package/dist/composites/agent-timeline/index.js +5 -0
  261. package/dist/composites/agent-timeline/index.js.map +1 -0
  262. package/dist/composites/approval-card/index.js +5 -0
  263. package/dist/composites/approval-card/index.js.map +1 -0
  264. package/dist/composites/chat-composer/index.js +6 -0
  265. package/dist/composites/chat-composer/index.js.map +1 -0
  266. package/dist/composites/chat-message/index.js +6 -0
  267. package/dist/composites/chat-message/index.js.map +1 -0
  268. package/dist/composites/code-block/index.js +5 -0
  269. package/dist/composites/code-block/index.js.map +1 -0
  270. package/dist/composites/command-palette/index.js +5 -0
  271. package/dist/composites/command-palette/index.js.map +1 -0
  272. package/dist/composites/confirm-dialog/index.js +7 -0
  273. package/dist/composites/confirm-dialog/index.js.map +1 -0
  274. package/dist/composites/cron-jobs-list/index.js +5 -0
  275. package/dist/composites/cron-jobs-list/index.js.map +1 -0
  276. package/dist/composites/data-table/index.js +10 -0
  277. package/dist/composites/data-table/index.js.map +1 -0
  278. package/dist/composites/deployment-row/index.js +5 -0
  279. package/dist/composites/deployment-row/index.js.map +1 -0
  280. package/dist/composites/domain-config/index.js +7 -0
  281. package/dist/composites/domain-config/index.js.map +1 -0
  282. package/dist/composites/env-var-editor/index.js +7 -0
  283. package/dist/composites/env-var-editor/index.js.map +1 -0
  284. package/dist/composites/mcp-server-list/index.js +5 -0
  285. package/dist/composites/mcp-server-list/index.js.map +1 -0
  286. package/dist/composites/page-shell/index.js +7 -0
  287. package/dist/composites/page-shell/index.js.map +1 -0
  288. package/dist/composites/permission-modal/index.js +6 -0
  289. package/dist/composites/permission-modal/index.js.map +1 -0
  290. package/dist/composites/preview-env-card/index.js +6 -0
  291. package/dist/composites/preview-env-card/index.js.map +1 -0
  292. package/dist/composites/preview-panel/index.js +5 -0
  293. package/dist/composites/preview-panel/index.js.map +1 -0
  294. package/dist/composites/project-card/index.js +6 -0
  295. package/dist/composites/project-card/index.js.map +1 -0
  296. package/dist/composites/rollback-ui/index.js +6 -0
  297. package/dist/composites/rollback-ui/index.js.map +1 -0
  298. package/dist/composites/rule-editor/index.js +11 -0
  299. package/dist/composites/rule-editor/index.js.map +1 -0
  300. package/dist/composites/skill-editor/index.js +11 -0
  301. package/dist/composites/skill-editor/index.js.map +1 -0
  302. package/dist/composites/skills-list/index.js +5 -0
  303. package/dist/composites/skills-list/index.js.map +1 -0
  304. package/dist/composites/task-header/index.js +5 -0
  305. package/dist/composites/task-header/index.js.map +1 -0
  306. package/dist/composites/usage-meter/index.js +5 -0
  307. package/dist/composites/usage-meter/index.js.map +1 -0
  308. package/dist/index.d.ts +281 -12
  309. package/dist/index.js +129 -9487
  310. package/dist/index.js.map +1 -1
  311. package/dist/primitives/action-bar/index.js +4 -0
  312. package/dist/primitives/action-bar/index.js.map +1 -0
  313. package/dist/primitives/agent-error-card/index.js +5 -0
  314. package/dist/primitives/agent-error-card/index.js.map +1 -0
  315. package/dist/primitives/agent-event/index.js +4 -0
  316. package/dist/primitives/agent-event/index.js.map +1 -0
  317. package/dist/primitives/agent-handoff/index.js +4 -0
  318. package/dist/primitives/agent-handoff/index.js.map +1 -0
  319. package/dist/primitives/agent-profile/index.js +4 -0
  320. package/dist/primitives/agent-profile/index.js.map +1 -0
  321. package/dist/primitives/agent-starting-state/index.js +5 -0
  322. package/dist/primitives/agent-starting-state/index.js.map +1 -0
  323. package/dist/primitives/agent-streaming/index.js +5 -0
  324. package/dist/primitives/agent-streaming/index.js.map +1 -0
  325. package/dist/primitives/alert/index.js +4 -0
  326. package/dist/primitives/alert/index.js.map +1 -0
  327. package/dist/primitives/artifact-preview/index.js +4 -0
  328. package/dist/primitives/artifact-preview/index.js.map +1 -0
  329. package/dist/primitives/attachment-chip/index.js +4 -0
  330. package/dist/primitives/attachment-chip/index.js.map +1 -0
  331. package/dist/primitives/audit-log-entry/index.js +4 -0
  332. package/dist/primitives/audit-log-entry/index.js.map +1 -0
  333. package/dist/primitives/auto-compact-notice/index.js +5 -0
  334. package/dist/primitives/auto-compact-notice/index.js.map +1 -0
  335. package/dist/primitives/avatar/index.js +4 -0
  336. package/dist/primitives/avatar/index.js.map +1 -0
  337. package/dist/primitives/badge/index.js +4 -0
  338. package/dist/primitives/badge/index.js.map +1 -0
  339. package/dist/primitives/browser-controls/index.js +4 -0
  340. package/dist/primitives/browser-controls/index.js.map +1 -0
  341. package/dist/primitives/build-log-stream/index.js +5 -0
  342. package/dist/primitives/build-log-stream/index.js.map +1 -0
  343. package/dist/primitives/button/index.js +4 -0
  344. package/dist/primitives/button/index.js.map +1 -0
  345. package/dist/primitives/capability-indicator/index.js +4 -0
  346. package/dist/primitives/capability-indicator/index.js.map +1 -0
  347. package/dist/primitives/card/index.js +4 -0
  348. package/dist/primitives/card/index.js.map +1 -0
  349. package/dist/primitives/chat-thread/index.js +5 -0
  350. package/dist/primitives/chat-thread/index.js.map +1 -0
  351. package/dist/primitives/checkbox/index.js +4 -0
  352. package/dist/primitives/checkbox/index.js.map +1 -0
  353. package/dist/primitives/context-card/index.js +4 -0
  354. package/dist/primitives/context-card/index.js.map +1 -0
  355. package/dist/primitives/context-window-bar/index.js +4 -0
  356. package/dist/primitives/context-window-bar/index.js.map +1 -0
  357. package/dist/primitives/copy-button/index.js +4 -0
  358. package/dist/primitives/copy-button/index.js.map +1 -0
  359. package/dist/primitives/cost-meter/index.js +4 -0
  360. package/dist/primitives/cost-meter/index.js.map +1 -0
  361. package/dist/primitives/created-files-card/index.js +4 -0
  362. package/dist/primitives/created-files-card/index.js.map +1 -0
  363. package/dist/primitives/cron-job-card/index.js +4 -0
  364. package/dist/primitives/cron-job-card/index.js.map +1 -0
  365. package/dist/primitives/danger-zone/index.js +4 -0
  366. package/dist/primitives/danger-zone/index.js.map +1 -0
  367. package/dist/primitives/dialog/index.js +4 -0
  368. package/dist/primitives/dialog/index.js.map +1 -0
  369. package/dist/primitives/diff-viewer/index.js +4 -0
  370. package/dist/primitives/diff-viewer/index.js.map +1 -0
  371. package/dist/primitives/dropdown-menu/index.js +4 -0
  372. package/dist/primitives/dropdown-menu/index.js.map +1 -0
  373. package/dist/primitives/empty-state/index.js +4 -0
  374. package/dist/primitives/empty-state/index.js.map +1 -0
  375. package/dist/primitives/folder-context-card/index.js +4 -0
  376. package/dist/primitives/folder-context-card/index.js.map +1 -0
  377. package/dist/primitives/folder-selector/index.js +4 -0
  378. package/dist/primitives/folder-selector/index.js.map +1 -0
  379. package/dist/primitives/form-field/index.js +4 -0
  380. package/dist/primitives/form-field/index.js.map +1 -0
  381. package/dist/primitives/hook-config/index.js +4 -0
  382. package/dist/primitives/hook-config/index.js.map +1 -0
  383. package/dist/primitives/hook-event-log/index.js +4 -0
  384. package/dist/primitives/hook-event-log/index.js.map +1 -0
  385. package/dist/primitives/input/index.js +4 -0
  386. package/dist/primitives/input/index.js.map +1 -0
  387. package/dist/primitives/intent-selector/index.js +4 -0
  388. package/dist/primitives/intent-selector/index.js.map +1 -0
  389. package/dist/primitives/label/index.js +4 -0
  390. package/dist/primitives/label/index.js.map +1 -0
  391. package/dist/primitives/lane-board/index.js +4 -0
  392. package/dist/primitives/lane-board/index.js.map +1 -0
  393. package/dist/primitives/login-split/index.js +4 -0
  394. package/dist/primitives/login-split/index.js.map +1 -0
  395. package/dist/primitives/mcp-server-card/index.js +4 -0
  396. package/dist/primitives/mcp-server-card/index.js.map +1 -0
  397. package/dist/primitives/memory-editor/index.js +4 -0
  398. package/dist/primitives/memory-editor/index.js.map +1 -0
  399. package/dist/primitives/mention-menu/index.js +4 -0
  400. package/dist/primitives/mention-menu/index.js.map +1 -0
  401. package/dist/primitives/metrics-panel/index.js +4 -0
  402. package/dist/primitives/metrics-panel/index.js.map +1 -0
  403. package/dist/primitives/model-card/index.js +4 -0
  404. package/dist/primitives/model-card/index.js.map +1 -0
  405. package/dist/primitives/model-selector/index.js +4 -0
  406. package/dist/primitives/model-selector/index.js.map +1 -0
  407. package/dist/primitives/pagination/index.js +4 -0
  408. package/dist/primitives/pagination/index.js.map +1 -0
  409. package/dist/primitives/permission-matrix/index.js +4 -0
  410. package/dist/primitives/permission-matrix/index.js.map +1 -0
  411. package/dist/primitives/pin-input/index.js +4 -0
  412. package/dist/primitives/pin-input/index.js.map +1 -0
  413. package/dist/primitives/plan-badge/index.js +4 -0
  414. package/dist/primitives/plan-badge/index.js.map +1 -0
  415. package/dist/primitives/progress/index.js +4 -0
  416. package/dist/primitives/progress/index.js.map +1 -0
  417. package/dist/primitives/progress-checklist/index.js +4 -0
  418. package/dist/primitives/progress-checklist/index.js.map +1 -0
  419. package/dist/primitives/project-switcher/index.js +4 -0
  420. package/dist/primitives/project-switcher/index.js.map +1 -0
  421. package/dist/primitives/quick-action-chips/index.js +4 -0
  422. package/dist/primitives/quick-action-chips/index.js.map +1 -0
  423. package/dist/primitives/radio-group/index.js +4 -0
  424. package/dist/primitives/radio-group/index.js.map +1 -0
  425. package/dist/primitives/recent-folders-list/index.js +4 -0
  426. package/dist/primitives/recent-folders-list/index.js.map +1 -0
  427. package/dist/primitives/rule-card/index.js +4 -0
  428. package/dist/primitives/rule-card/index.js.map +1 -0
  429. package/dist/primitives/run-stats/index.js +4 -0
  430. package/dist/primitives/run-stats/index.js.map +1 -0
  431. package/dist/primitives/running-tasks-panel/index.js +4 -0
  432. package/dist/primitives/running-tasks-panel/index.js.map +1 -0
  433. package/dist/primitives/scroll-area/index.js +4 -0
  434. package/dist/primitives/scroll-area/index.js.map +1 -0
  435. package/dist/primitives/select/index.js +4 -0
  436. package/dist/primitives/select/index.js.map +1 -0
  437. package/dist/primitives/session-list-item/index.js +4 -0
  438. package/dist/primitives/session-list-item/index.js.map +1 -0
  439. package/dist/primitives/session-timeline/index.js +4 -0
  440. package/dist/primitives/session-timeline/index.js.map +1 -0
  441. package/dist/primitives/sheet/index.js +4 -0
  442. package/dist/primitives/sheet/index.js.map +1 -0
  443. package/dist/primitives/sidebar/index.js +4 -0
  444. package/dist/primitives/sidebar/index.js.map +1 -0
  445. package/dist/primitives/skeleton/index.js +5 -0
  446. package/dist/primitives/skeleton/index.js.map +1 -0
  447. package/dist/primitives/skill-card/index.js +4 -0
  448. package/dist/primitives/skill-card/index.js.map +1 -0
  449. package/dist/primitives/social-auth-row/index.js +4 -0
  450. package/dist/primitives/social-auth-row/index.js.map +1 -0
  451. package/dist/primitives/stat-tile/index.js +4 -0
  452. package/dist/primitives/stat-tile/index.js.map +1 -0
  453. package/dist/primitives/status-dot/index.js +4 -0
  454. package/dist/primitives/status-dot/index.js.map +1 -0
  455. package/dist/primitives/steps-rail/index.js +4 -0
  456. package/dist/primitives/steps-rail/index.js.map +1 -0
  457. package/dist/primitives/sub-agent-dispatch/index.js +4 -0
  458. package/dist/primitives/sub-agent-dispatch/index.js.map +1 -0
  459. package/dist/primitives/switch/index.js +4 -0
  460. package/dist/primitives/switch/index.js.map +1 -0
  461. package/dist/primitives/system-prompt-editor/index.js +4 -0
  462. package/dist/primitives/system-prompt-editor/index.js.map +1 -0
  463. package/dist/primitives/table/index.js +4 -0
  464. package/dist/primitives/table/index.js.map +1 -0
  465. package/dist/primitives/tabs/index.js +4 -0
  466. package/dist/primitives/tabs/index.js.map +1 -0
  467. package/dist/primitives/task-plan/index.js +4 -0
  468. package/dist/primitives/task-plan/index.js.map +1 -0
  469. package/dist/primitives/terminal-panel/index.js +5 -0
  470. package/dist/primitives/terminal-panel/index.js.map +1 -0
  471. package/dist/primitives/textarea/index.js +4 -0
  472. package/dist/primitives/textarea/index.js.map +1 -0
  473. package/dist/primitives/timestamp/index.js +4 -0
  474. package/dist/primitives/timestamp/index.js.map +1 -0
  475. package/dist/primitives/toast/index.js +4 -0
  476. package/dist/primitives/toast/index.js.map +1 -0
  477. package/dist/primitives/token-usage-chart/index.js +4 -0
  478. package/dist/primitives/token-usage-chart/index.js.map +1 -0
  479. package/dist/primitives/tool-call/index.js +4 -0
  480. package/dist/primitives/tool-call/index.js.map +1 -0
  481. package/dist/primitives/tool-call-card/index.js +4 -0
  482. package/dist/primitives/tool-call-card/index.js.map +1 -0
  483. package/dist/primitives/tool-result/index.js +4 -0
  484. package/dist/primitives/tool-result/index.js.map +1 -0
  485. package/dist/primitives/tools-list/index.js +4 -0
  486. package/dist/primitives/tools-list/index.js.map +1 -0
  487. package/dist/primitives/tooltip/index.js +4 -0
  488. package/dist/primitives/tooltip/index.js.map +1 -0
  489. package/dist/primitives/topnav/index.js +4 -0
  490. package/dist/primitives/topnav/index.js.map +1 -0
  491. package/dist/slide/index.js +1 -712
  492. package/dist/slide/index.js.map +1 -1
  493. package/dist/slide-deck/index.js +2 -688
  494. package/dist/slide-deck/index.js.map +1 -1
  495. package/llms.txt +8 -6
  496. package/package.json +177 -157
  497. package/registry/index.json +30 -0
  498. package/registry/r/action-bar.json +22 -0
  499. package/registry/r/data-table.json +27 -0
  500. package/registry/r/dropdown-menu.json +23 -0
  501. package/registry/r/page-shell.json +25 -0
  502. package/registry/r/pin-input.json +20 -0
@@ -0,0 +1,173 @@
1
+ import { cn } from './chunk-ZSRJCIWF.js';
2
+ import { forwardRef, useMemo } from 'react';
3
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
+
5
+ function binPoints(points, maxBars) {
6
+ if (points.length <= maxBars) return points;
7
+ const binSize = Math.ceil(points.length / maxBars);
8
+ const out = [];
9
+ for (let i = 0; i < points.length; i += binSize) {
10
+ const slice = points.slice(i, i + binSize);
11
+ if (slice.length === 0) continue;
12
+ const first = slice[0]?.label ?? "";
13
+ const last = slice[slice.length - 1]?.label ?? first;
14
+ out.push({
15
+ label: slice.length === 1 ? first : `${first}\u2026${last}`,
16
+ input: slice.reduce((a, p) => a + p.input, 0),
17
+ output: slice.reduce((a, p) => a + p.output, 0)
18
+ });
19
+ }
20
+ return out;
21
+ }
22
+ var formatTokens = (n) => {
23
+ if (n >= 1e6) return `${(n / 1e6).toFixed(1)}M`;
24
+ if (n >= 1e3) return `${(n / 1e3).toFixed(1)}k`;
25
+ return `${n}`;
26
+ };
27
+ var TokenUsageChart = forwardRef(
28
+ ({
29
+ className,
30
+ points,
31
+ title = "Token usage",
32
+ height = 160,
33
+ showLegend = true,
34
+ maxBars = 60,
35
+ ...props
36
+ }, ref) => {
37
+ const series = useMemo(() => binPoints(points, maxBars), [points, maxBars]);
38
+ const max = Math.max(1, ...series.map((p) => p.input + p.output));
39
+ const barCount = series.length;
40
+ const barWidth = 100 / Math.max(1, barCount);
41
+ const gap = Math.min(2, barWidth * 0.2);
42
+ const innerWidth = barWidth - gap;
43
+ const total = series.reduce((acc, p) => acc + p.input + p.output, 0);
44
+ return /* @__PURE__ */ jsxs(
45
+ "section",
46
+ {
47
+ ref,
48
+ className: cn("rounded-xl border bg-card p-4", className),
49
+ "aria-label": "Token usage over time",
50
+ ...props,
51
+ children: [
52
+ /* @__PURE__ */ jsxs("header", { className: "flex items-baseline justify-between gap-3", children: [
53
+ title ? /* @__PURE__ */ jsx("h3", { className: "font-display text-title-md tracking-tight", children: title }) : /* @__PURE__ */ jsx("span", {}),
54
+ /* @__PURE__ */ jsxs("span", { className: "font-mono text-label text-muted-foreground tabular-nums", children: [
55
+ "total \xB7 ",
56
+ formatTokens(total)
57
+ ] })
58
+ ] }),
59
+ /* @__PURE__ */ jsxs("div", { className: "mt-3 grid grid-cols-[auto_1fr] gap-2", children: [
60
+ /* @__PURE__ */ jsxs(
61
+ "div",
62
+ {
63
+ className: "grid font-mono text-label text-muted-foreground",
64
+ style: { height, gridTemplateRows: "1fr 1fr 1fr" },
65
+ "aria-hidden": "true",
66
+ children: [
67
+ /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: formatTokens(max) }),
68
+ /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: formatTokens(max / 2) }),
69
+ /* @__PURE__ */ jsx("span", { className: "self-end tabular-nums", children: "0" })
70
+ ]
71
+ }
72
+ ),
73
+ /* @__PURE__ */ jsxs(
74
+ "svg",
75
+ {
76
+ viewBox: "0 0 100 100",
77
+ preserveAspectRatio: "none",
78
+ className: "w-full",
79
+ style: { height },
80
+ role: "img",
81
+ "aria-label": `Token usage across ${barCount} periods`,
82
+ children: [
83
+ [25, 50, 75].map((y) => /* @__PURE__ */ jsx(
84
+ "line",
85
+ {
86
+ x1: 0,
87
+ y1: y,
88
+ x2: 100,
89
+ y2: y,
90
+ stroke: "hsl(var(--border) / 0.4)",
91
+ strokeWidth: 0.2
92
+ },
93
+ y
94
+ )),
95
+ series.map((p, idx) => {
96
+ const totalH = (p.input + p.output) / max * 100;
97
+ const inputH = p.input / max * 100;
98
+ const outputH = p.output / max * 100;
99
+ const x = idx * barWidth + gap / 2;
100
+ return /* @__PURE__ */ jsxs("g", { children: [
101
+ /* @__PURE__ */ jsx("title", { children: `${p.label} \u2014 input ${formatTokens(p.input)} \xB7 output ${formatTokens(p.output)}` }),
102
+ /* @__PURE__ */ jsx(
103
+ "rect",
104
+ {
105
+ x,
106
+ y: 100 - totalH,
107
+ width: innerWidth,
108
+ height: outputH,
109
+ fill: "hsl(var(--primary))",
110
+ opacity: 0.85
111
+ }
112
+ ),
113
+ /* @__PURE__ */ jsx(
114
+ "rect",
115
+ {
116
+ x,
117
+ y: 100 - inputH,
118
+ width: innerWidth,
119
+ height: inputH,
120
+ fill: "hsl(var(--accent))",
121
+ opacity: 0.85
122
+ }
123
+ )
124
+ ] }, p.label);
125
+ })
126
+ ]
127
+ }
128
+ )
129
+ ] }),
130
+ /* @__PURE__ */ jsxs(
131
+ "div",
132
+ {
133
+ className: "mt-1 grid grid-cols-[auto_1fr] gap-2 font-mono text-label text-muted-foreground",
134
+ "aria-hidden": "true",
135
+ children: [
136
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true" }),
137
+ /* @__PURE__ */ jsx("div", { className: "grid", style: { gridTemplateColumns: `repeat(${barCount}, 1fr)` }, children: series.map((p) => /* @__PURE__ */ jsx("span", { className: "truncate text-center", children: p.label }, p.label)) })
138
+ ]
139
+ }
140
+ ),
141
+ /* @__PURE__ */ jsxs("table", { className: "sr-only", children: [
142
+ /* @__PURE__ */ jsx("caption", { children: "Token usage by period \u2014 input vs output" }),
143
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
144
+ /* @__PURE__ */ jsx("th", { scope: "col", children: "Period" }),
145
+ /* @__PURE__ */ jsx("th", { scope: "col", children: "Input tokens" }),
146
+ /* @__PURE__ */ jsx("th", { scope: "col", children: "Output tokens" })
147
+ ] }) }),
148
+ /* @__PURE__ */ jsx("tbody", { children: series.map((p) => /* @__PURE__ */ jsxs("tr", { children: [
149
+ /* @__PURE__ */ jsx("td", { children: p.label }),
150
+ /* @__PURE__ */ jsx("td", { children: p.input }),
151
+ /* @__PURE__ */ jsx("td", { children: p.output })
152
+ ] }, `a11y-${p.label}`)) })
153
+ ] }),
154
+ showLegend ? /* @__PURE__ */ jsxs("footer", { className: "mt-3 flex items-center gap-4 font-mono text-label text-muted-foreground", children: [
155
+ /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5", children: [
156
+ /* @__PURE__ */ jsx("span", { className: "size-2 rounded-sm bg-accent", "aria-hidden": "true" }),
157
+ "Input"
158
+ ] }),
159
+ /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5", children: [
160
+ /* @__PURE__ */ jsx("span", { className: "size-2 rounded-sm bg-primary", "aria-hidden": "true" }),
161
+ "Output"
162
+ ] })
163
+ ] }) : null
164
+ ]
165
+ }
166
+ );
167
+ }
168
+ );
169
+ TokenUsageChart.displayName = "TokenUsageChart";
170
+
171
+ export { TokenUsageChart };
172
+ //# sourceMappingURL=chunk-AXKBNRZW.js.map
173
+ //# sourceMappingURL=chunk-AXKBNRZW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/primitives/token-usage-chart/token-usage-chart.tsx"],"names":[],"mappings":"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","file":"chunk-AXKBNRZW.js","sourcesContent":["import { forwardRef, useMemo } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nexport interface TokenUsagePoint {\n /** ISO date or friendly label for the x-axis tooltip. */\n label: string;\n /** Input tokens for this period (e.g. day). */\n input: number;\n /** Output tokens for this period. */\n output: number;\n}\n\ninterface TokenUsageChartProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n points: TokenUsagePoint[];\n /** Title above the chart. */\n title?: ReactNode;\n /** Chart height in px. Default 160. */\n height?: number;\n /** Show legend below the chart. Default true. */\n showLegend?: boolean;\n /**\n * Maximum number of bars to render. When `points.length` exceeds this, the\n * series is binned (summed in equal-width windows) so the chart stays\n * legible and SVG node count stays bounded. Default 60.\n */\n maxBars?: number;\n}\n\nfunction binPoints(points: TokenUsagePoint[], maxBars: number): TokenUsagePoint[] {\n if (points.length <= maxBars) return points;\n const binSize = Math.ceil(points.length / maxBars);\n const out: TokenUsagePoint[] = [];\n for (let i = 0; i < points.length; i += binSize) {\n const slice = points.slice(i, i + binSize);\n if (slice.length === 0) continue;\n const first = slice[0]?.label ?? \"\";\n const last = slice[slice.length - 1]?.label ?? first;\n out.push({\n label: slice.length === 1 ? first : `${first}…${last}`,\n input: slice.reduce((a, p) => a + p.input, 0),\n output: slice.reduce((a, p) => a + p.output, 0),\n });\n }\n return out;\n}\n\nconst formatTokens = (n: number) => {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}k`;\n return `${n}`;\n};\n\n/**\n * TokenUsageChart — stacked-bar chart of input vs output tokens over time.\n *\n * Pure SVG, no chart lib. Width is fluid; bars adjust to viewBox. Hover any\n * bar to see the breakdown in the tooltip slot below.\n */\nconst TokenUsageChart = forwardRef<HTMLDivElement, TokenUsageChartProps>(\n (\n {\n className,\n points,\n title = \"Token usage\",\n height = 160,\n showLegend = true,\n maxBars = 60,\n ...props\n },\n ref,\n ) => {\n const series = useMemo(() => binPoints(points, maxBars), [points, maxBars]);\n const max = Math.max(1, ...series.map((p) => p.input + p.output));\n const barCount = series.length;\n const barWidth = 100 / Math.max(1, barCount);\n const gap = Math.min(2, barWidth * 0.2);\n const innerWidth = barWidth - gap;\n\n const total = series.reduce((acc, p) => acc + p.input + p.output, 0);\n\n return (\n <section\n ref={ref}\n className={cn(\"rounded-xl border bg-card p-4\", className)}\n aria-label=\"Token usage over time\"\n {...props}\n >\n <header className=\"flex items-baseline justify-between gap-3\">\n {title ? (\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n ) : (\n <span />\n )}\n <span className=\"font-mono text-label text-muted-foreground tabular-nums\">\n total · {formatTokens(total)}\n </span>\n </header>\n <div className=\"mt-3 grid grid-cols-[auto_1fr] gap-2\">\n {/* Y-axis ticks */}\n <div\n className=\"grid font-mono text-label text-muted-foreground\"\n style={{ height, gridTemplateRows: \"1fr 1fr 1fr\" }}\n aria-hidden=\"true\"\n >\n <span className=\"tabular-nums\">{formatTokens(max)}</span>\n <span className=\"tabular-nums\">{formatTokens(max / 2)}</span>\n <span className=\"self-end tabular-nums\">0</span>\n </div>\n {/* Chart */}\n <svg\n viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"none\"\n className=\"w-full\"\n style={{ height }}\n role=\"img\"\n aria-label={`Token usage across ${barCount} periods`}\n >\n {/* gridlines */}\n {[25, 50, 75].map((y) => (\n <line\n key={y}\n x1={0}\n y1={y}\n x2={100}\n y2={y}\n stroke=\"hsl(var(--border) / 0.4)\"\n strokeWidth={0.2}\n />\n ))}\n {series.map((p, idx) => {\n const totalH = ((p.input + p.output) / max) * 100;\n const inputH = (p.input / max) * 100;\n const outputH = (p.output / max) * 100;\n const x = idx * barWidth + gap / 2;\n return (\n <g key={p.label}>\n <title>{`${p.label} — input ${formatTokens(p.input)} · output ${formatTokens(p.output)}`}</title>\n {/* output (top, primary tone) */}\n <rect\n x={x}\n y={100 - totalH}\n width={innerWidth}\n height={outputH}\n fill=\"hsl(var(--primary))\"\n opacity={0.85}\n />\n {/* input (bottom, accent tone) */}\n <rect\n x={x}\n y={100 - inputH}\n width={innerWidth}\n height={inputH}\n fill=\"hsl(var(--accent))\"\n opacity={0.85}\n />\n </g>\n );\n })}\n </svg>\n </div>\n {/* x-axis labels — aligned with the chart column of the parent grid */}\n <div\n className=\"mt-1 grid grid-cols-[auto_1fr] gap-2 font-mono text-label text-muted-foreground\"\n aria-hidden=\"true\"\n >\n <span aria-hidden=\"true\" />\n <div className=\"grid\" style={{ gridTemplateColumns: `repeat(${barCount}, 1fr)` }}>\n {series.map((p) => (\n <span key={p.label} className=\"truncate text-center\">\n {p.label}\n </span>\n ))}\n </div>\n </div>\n {/* Screen-reader fallback: the SVG is decorative-ish for AT users.\n * `<title>` per bar is unreliably exposed across NVDA/VoiceOver/JAWS,\n * so we ship an `sr-only` table with the same data. Sighted users\n * never see this; AT users can navigate the values cell-by-cell.\n * Reference: WCAG 1.1.1 (Non-text content). */}\n <table className=\"sr-only\">\n <caption>Token usage by period — input vs output</caption>\n <thead>\n <tr>\n <th scope=\"col\">Period</th>\n <th scope=\"col\">Input tokens</th>\n <th scope=\"col\">Output tokens</th>\n </tr>\n </thead>\n <tbody>\n {series.map((p) => (\n <tr key={`a11y-${p.label}`}>\n <td>{p.label}</td>\n <td>{p.input}</td>\n <td>{p.output}</td>\n </tr>\n ))}\n </tbody>\n </table>\n {showLegend ? (\n <footer className=\"mt-3 flex items-center gap-4 font-mono text-label text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"size-2 rounded-sm bg-accent\" aria-hidden=\"true\" />\n Input\n </span>\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"size-2 rounded-sm bg-primary\" aria-hidden=\"true\" />\n Output\n </span>\n </footer>\n ) : null}\n </section>\n );\n },\n);\nTokenUsageChart.displayName = \"TokenUsageChart\";\n\nexport { TokenUsageChart };\n"]}
@@ -0,0 +1,106 @@
1
+ import { MCPServerCard } from './chunk-QB6BNHO3.js';
2
+ import { cn } from './chunk-ZSRJCIWF.js';
3
+ import { Plus } from 'lucide-react';
4
+ import { forwardRef, useState, useMemo } from 'react';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ var STATUS_ORDER = ["connected", "starting", "degraded", "disconnected"];
8
+ var MCPServerList = forwardRef(
9
+ ({ className, servers, title = "MCP servers", onAdd, onRestart, onDisconnect, ...props }, ref) => {
10
+ const [filter, setFilter] = useState(null);
11
+ const counts = useMemo(() => {
12
+ const result = {
13
+ connected: 0,
14
+ starting: 0,
15
+ degraded: 0,
16
+ disconnected: 0
17
+ };
18
+ for (const s of servers) result[s.status]++;
19
+ return result;
20
+ }, [servers]);
21
+ const filtered = useMemo(
22
+ () => filter ? servers.filter((s) => s.status === filter) : servers,
23
+ [servers, filter]
24
+ );
25
+ return /* @__PURE__ */ jsxs(
26
+ "section",
27
+ {
28
+ ref,
29
+ className: cn("grid gap-3", className),
30
+ "aria-label": "MCP servers",
31
+ ...props,
32
+ children: [
33
+ /* @__PURE__ */ jsxs("header", { className: "flex flex-wrap items-center justify-between gap-3", children: [
34
+ title ? /* @__PURE__ */ jsx("h3", { className: "font-display text-title-md tracking-tight", children: title }) : /* @__PURE__ */ jsx("span", {}),
35
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
36
+ /* @__PURE__ */ jsxs("div", { className: "inline-flex rounded-lg border border-border/60 bg-muted p-0.5", children: [
37
+ /* @__PURE__ */ jsxs(
38
+ "button",
39
+ {
40
+ type: "button",
41
+ onClick: () => setFilter(null),
42
+ "aria-pressed": filter === null,
43
+ className: cn(
44
+ "rounded-md px-2.5 py-1 font-mono text-label",
45
+ filter === null ? "bg-card text-foreground shadow-sm" : "text-muted-foreground"
46
+ ),
47
+ children: [
48
+ "All \xB7 ",
49
+ servers.length
50
+ ]
51
+ }
52
+ ),
53
+ STATUS_ORDER.map((status) => /* @__PURE__ */ jsxs(
54
+ "button",
55
+ {
56
+ type: "button",
57
+ onClick: () => setFilter(status),
58
+ "aria-pressed": filter === status,
59
+ disabled: counts[status] === 0,
60
+ className: cn(
61
+ "rounded-md px-2.5 py-1 font-mono text-label uppercase",
62
+ filter === status ? "bg-card text-foreground shadow-sm" : "text-muted-foreground",
63
+ "disabled:opacity-40"
64
+ ),
65
+ children: [
66
+ status,
67
+ " \xB7 ",
68
+ counts[status]
69
+ ]
70
+ },
71
+ status
72
+ ))
73
+ ] }),
74
+ onAdd ? /* @__PURE__ */ jsxs(
75
+ "button",
76
+ {
77
+ type: "button",
78
+ onClick: onAdd,
79
+ className: "inline-flex items-center gap-1 rounded-md bg-primary px-2.5 py-1 font-sans text-label text-primary-foreground hover:shadow-glow focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
80
+ children: [
81
+ /* @__PURE__ */ jsx(Plus, { className: "size-3.5" }),
82
+ " Add server"
83
+ ]
84
+ }
85
+ ) : null
86
+ ] })
87
+ ] }),
88
+ filtered.length === 0 ? /* @__PURE__ */ jsx("p", { className: "rounded-xl border border-border/60 border-dashed bg-muted/30 px-4 py-8 text-center font-sans text-body-sm text-muted-foreground", children: "No servers in this state." }) : /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 gap-3 md:grid-cols-2", children: filtered.map((server) => /* @__PURE__ */ jsx(
89
+ MCPServerCard,
90
+ {
91
+ server,
92
+ ...onRestart ? { onRestart } : {},
93
+ ...onDisconnect ? { onDisconnect } : {}
94
+ },
95
+ server.id
96
+ )) })
97
+ ]
98
+ }
99
+ );
100
+ }
101
+ );
102
+ MCPServerList.displayName = "MCPServerList";
103
+
104
+ export { MCPServerList };
105
+ //# sourceMappingURL=chunk-B75MEYNR.js.map
106
+ //# sourceMappingURL=chunk-B75MEYNR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/composites/mcp-server-list/mcp-server-list.tsx"],"names":[],"mappings":"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","file":"chunk-B75MEYNR.js","sourcesContent":["import { Plus } from \"lucide-react\";\nimport { forwardRef, useMemo, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport {\n type MCPServer,\n MCPServerCard,\n type MCPServerStatus,\n} from \"../../primitives/mcp-server-card/index.js\";\n\ninterface MCPServerListProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n servers: MCPServer[];\n title?: ReactNode;\n onAdd?: () => void;\n onRestart?: (id: string) => void;\n onDisconnect?: (id: string) => void;\n}\n\nconst STATUS_ORDER: MCPServerStatus[] = [\"connected\", \"starting\", \"degraded\", \"disconnected\"];\n\n/**\n * MCPServerList — grouped MCP server inventory with status filter chips.\n * Surfaces degraded/disconnected servers prominently so the user can act.\n */\nconst MCPServerList = forwardRef<HTMLDivElement, MCPServerListProps>(\n (\n { className, servers, title = \"MCP servers\", onAdd, onRestart, onDisconnect, ...props },\n ref,\n ) => {\n const [filter, setFilter] = useState<MCPServerStatus | null>(null);\n\n const counts = useMemo(() => {\n const result: Record<MCPServerStatus, number> = {\n connected: 0,\n starting: 0,\n degraded: 0,\n disconnected: 0,\n };\n for (const s of servers) result[s.status]++;\n return result;\n }, [servers]);\n\n const filtered = useMemo(\n () => (filter ? servers.filter((s) => s.status === filter) : servers),\n [servers, filter],\n );\n\n return (\n <section\n ref={ref}\n className={cn(\"grid gap-3\", className)}\n aria-label=\"MCP servers\"\n {...props}\n >\n <header className=\"flex flex-wrap items-center justify-between gap-3\">\n {title ? (\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n ) : (\n <span />\n )}\n <div className=\"flex items-center gap-2\">\n <div className=\"inline-flex rounded-lg border border-border/60 bg-muted p-0.5\">\n <button\n type=\"button\"\n onClick={() => setFilter(null)}\n aria-pressed={filter === null}\n className={cn(\n \"rounded-md px-2.5 py-1 font-mono text-label\",\n filter === null ? \"bg-card text-foreground shadow-sm\" : \"text-muted-foreground\",\n )}\n >\n All · {servers.length}\n </button>\n {STATUS_ORDER.map((status) => (\n <button\n key={status}\n type=\"button\"\n onClick={() => setFilter(status)}\n aria-pressed={filter === status}\n disabled={counts[status] === 0}\n className={cn(\n \"rounded-md px-2.5 py-1 font-mono text-label uppercase\",\n filter === status\n ? \"bg-card text-foreground shadow-sm\"\n : \"text-muted-foreground\",\n \"disabled:opacity-40\",\n )}\n >\n {status} · {counts[status]}\n </button>\n ))}\n </div>\n {onAdd ? (\n <button\n type=\"button\"\n onClick={onAdd}\n className=\"inline-flex items-center gap-1 rounded-md bg-primary px-2.5 py-1 font-sans text-label text-primary-foreground hover:shadow-glow focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Plus className=\"size-3.5\" /> Add server\n </button>\n ) : null}\n </div>\n </header>\n\n {filtered.length === 0 ? (\n <p className=\"rounded-xl border border-border/60 border-dashed bg-muted/30 px-4 py-8 text-center font-sans text-body-sm text-muted-foreground\">\n No servers in this state.\n </p>\n ) : (\n <div className=\"grid grid-cols-1 gap-3 md:grid-cols-2\">\n {filtered.map((server) => (\n <MCPServerCard\n key={server.id}\n server={server}\n {...(onRestart ? { onRestart } : {})}\n {...(onDisconnect ? { onDisconnect } : {})}\n />\n ))}\n </div>\n )}\n </section>\n );\n },\n);\nMCPServerList.displayName = \"MCPServerList\";\n\nexport { MCPServerList };\n"]}
@@ -0,0 +1,34 @@
1
+ import { BrowserControls } from './chunk-VMMATOPE.js';
2
+ import { cn } from './chunk-ZSRJCIWF.js';
3
+ import { forwardRef } from 'react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ var PreviewPanel = forwardRef(
7
+ ({ className, url, onUrlChange, onBack, onForward, onReload, content, logsSlot, ...props }, ref) => /* @__PURE__ */ jsxs(
8
+ "section",
9
+ {
10
+ ref,
11
+ className: cn("flex h-full flex-col overflow-hidden rounded-xl border bg-card", className),
12
+ ...props,
13
+ children: [
14
+ /* @__PURE__ */ jsx(
15
+ BrowserControls,
16
+ {
17
+ url,
18
+ ...onUrlChange ? { onUrlChange } : {},
19
+ ...onBack ? { onBack } : {},
20
+ ...onForward ? { onForward } : {},
21
+ ...onReload ? { onReload } : {}
22
+ }
23
+ ),
24
+ /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-hidden bg-background", children: content }),
25
+ logsSlot ? /* @__PURE__ */ jsx("div", { className: "max-h-48 overflow-auto border-border/40 border-t bg-card", children: logsSlot }) : null
26
+ ]
27
+ }
28
+ )
29
+ );
30
+ PreviewPanel.displayName = "PreviewPanel";
31
+
32
+ export { PreviewPanel };
33
+ //# sourceMappingURL=chunk-BGKA6DI6.js.map
34
+ //# sourceMappingURL=chunk-BGKA6DI6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/composites/preview-panel/preview-panel.tsx"],"names":[],"mappings":";;;;;AA2BA,IAAM,YAAA,GAAe,UAAA;AAAA,EACnB,CACE,EAAE,SAAA,EAAW,GAAA,EAAK,WAAA,EAAa,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,GAAG,KAAA,IAClF,GAAA,qBAEA,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA,CAAG,gEAAA,EAAkE,SAAS,CAAA;AAAA,MACxF,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACC,GAAI,WAAA,GAAc,EAAE,WAAA,KAAgB,EAAC;AAAA,YACrC,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW,EAAC;AAAA,YAC3B,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,YACjC,GAAI,QAAA,GAAW,EAAE,QAAA,KAAa;AAAC;AAAA,SAClC;AAAA,wBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EAAwC,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,QAC9D,2BACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0DAAA,EAA4D,oBAAS,CAAA,GAClF;AAAA;AAAA;AAAA;AAGV;AACA,YAAA,CAAa,WAAA,GAAc,cAAA","file":"chunk-BGKA6DI6.js","sourcesContent":["import { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { BrowserControls } from \"../../primitives/browser-controls/index.js\";\n\ninterface PreviewPanelProps extends Omit<HTMLAttributes<HTMLElement>, \"content\"> {\n url: string;\n onUrlChange?: (next: string) => void;\n onBack?: () => void;\n onForward?: () => void;\n onReload?: () => void;\n /**\n * Region rendered as the preview body. Typically an <iframe>.\n */\n content: ReactNode;\n /**\n * Optional logs section rendered below the preview (e.g. dev server output).\n */\n logsSlot?: ReactNode;\n}\n\n/**\n * PreviewPanel — browser preview with controls + integrated logs slot.\n *\n * The Code workspace shows live dev-server URL + HMR logs side-by-side; this\n * panel keeps both in a single card so the user doesn't switch contexts.\n */\nconst PreviewPanel = forwardRef<HTMLElement, PreviewPanelProps>(\n (\n { className, url, onUrlChange, onBack, onForward, onReload, content, logsSlot, ...props },\n ref,\n ) => (\n <section\n ref={ref}\n className={cn(\"flex h-full flex-col overflow-hidden rounded-xl border bg-card\", className)}\n {...props}\n >\n <BrowserControls\n url={url}\n {...(onUrlChange ? { onUrlChange } : {})}\n {...(onBack ? { onBack } : {})}\n {...(onForward ? { onForward } : {})}\n {...(onReload ? { onReload } : {})}\n />\n <div className=\"flex-1 overflow-hidden bg-background\">{content}</div>\n {logsSlot ? (\n <div className=\"max-h-48 overflow-auto border-border/40 border-t bg-card\">{logsSlot}</div>\n ) : null}\n </section>\n ),\n);\nPreviewPanel.displayName = \"PreviewPanel\";\n\nexport { PreviewPanel };\n"]}
@@ -0,0 +1,88 @@
1
+ import { cn } from './chunk-ZSRJCIWF.js';
2
+ import { Sparkles, RotateCcw } from 'lucide-react';
3
+ import { forwardRef, useState } from 'react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ var SystemPromptEditor = forwardRef(
7
+ ({
8
+ className,
9
+ defaultPrompt,
10
+ override,
11
+ onOverrideChange,
12
+ tokenEstimate,
13
+ title = "System prompt",
14
+ ...props
15
+ }, ref) => {
16
+ const usingOverride = override.length > 0;
17
+ const [showDefault, setShowDefault] = useState(false);
18
+ return /* @__PURE__ */ jsxs("section", { ref, className: cn("rounded-xl border bg-card", className), ...props, children: [
19
+ /* @__PURE__ */ jsxs("header", { className: "flex items-center justify-between gap-3 border-border/40 border-b px-4 py-3", children: [
20
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
21
+ /* @__PURE__ */ jsx(Sparkles, { className: "size-4 text-primary", "aria-hidden": "true" }),
22
+ /* @__PURE__ */ jsx("h3", { className: "font-display text-title-md tracking-tight", children: title }),
23
+ /* @__PURE__ */ jsx(
24
+ "span",
25
+ {
26
+ className: cn(
27
+ "inline-flex items-center rounded-full border px-2 py-0.5 font-mono text-label uppercase tracking-wider",
28
+ usingOverride ? "border-primary/40 bg-primary/10 text-primary" : "border-border/40 bg-muted text-muted-foreground"
29
+ ),
30
+ children: usingOverride ? "Override active" : "Vendor default"
31
+ }
32
+ )
33
+ ] }),
34
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
35
+ tokenEstimate !== void 0 ? /* @__PURE__ */ jsxs("span", { className: "font-mono text-label text-muted-foreground tabular-nums", children: [
36
+ "~",
37
+ tokenEstimate.toLocaleString(),
38
+ " tokens"
39
+ ] }) : null,
40
+ /* @__PURE__ */ jsxs(
41
+ "button",
42
+ {
43
+ type: "button",
44
+ onClick: () => setShowDefault((v) => !v),
45
+ className: "rounded-md px-2 py-1 font-mono text-label text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
46
+ children: [
47
+ showDefault ? "Hide" : "Show",
48
+ " default"
49
+ ]
50
+ }
51
+ ),
52
+ usingOverride ? /* @__PURE__ */ jsxs(
53
+ "button",
54
+ {
55
+ type: "button",
56
+ onClick: () => onOverrideChange(""),
57
+ className: "inline-flex items-center gap-1 rounded-md px-2 py-1 font-mono text-label text-muted-foreground hover:bg-muted hover:text-destructive focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
58
+ children: [
59
+ /* @__PURE__ */ jsx(RotateCcw, { className: "size-3" }),
60
+ " Reset"
61
+ ]
62
+ }
63
+ ) : null
64
+ ] })
65
+ ] }),
66
+ showDefault ? /* @__PURE__ */ jsx("pre", { className: "max-h-48 overflow-auto border-border/40 border-b bg-muted/40 px-4 py-3 font-mono text-code-sm text-muted-foreground", children: defaultPrompt }) : null,
67
+ /* @__PURE__ */ jsx(
68
+ "textarea",
69
+ {
70
+ value: override,
71
+ onChange: (e) => onOverrideChange(e.target.value),
72
+ placeholder: usingOverride ? "" : "Leave empty to use the vendor default. Type here to override.",
73
+ rows: 8,
74
+ className: cn(
75
+ "w-full resize-y bg-transparent px-4 py-3 font-mono text-code-md text-foreground",
76
+ "placeholder:text-muted-foreground",
77
+ "focus:outline-none"
78
+ )
79
+ }
80
+ )
81
+ ] });
82
+ }
83
+ );
84
+ SystemPromptEditor.displayName = "SystemPromptEditor";
85
+
86
+ export { SystemPromptEditor };
87
+ //# sourceMappingURL=chunk-BNQAJGEN.js.map
88
+ //# sourceMappingURL=chunk-BNQAJGEN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/primitives/system-prompt-editor/system-prompt-editor.tsx"],"names":[],"mappings":"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","file":"chunk-BNQAJGEN.js","sourcesContent":["import { RotateCcw, Sparkles } from \"lucide-react\";\nimport { forwardRef, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\ninterface SystemPromptEditorProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Vendor / default system prompt (read-only). */\n defaultPrompt: string;\n /** Current override; pass empty string for \"use default\". */\n override: string;\n onOverrideChange: (next: string) => void;\n /** Approximate token count for the active prompt. */\n tokenEstimate?: number;\n title?: ReactNode;\n}\n\n/**\n * SystemPromptEditor — surface the agent's system prompt with a clear\n * \"vendor default\" vs \"user override\" toggle.\n *\n * Behavior:\n * - When override is empty, the textarea shows the default (greyed out,\n * editable starts blank).\n * - When user types, override takes effect.\n * - \"Reset to default\" wipes the override.\n *\n * Critical for transparency: a user must be able to see and edit the prompt.\n */\nconst SystemPromptEditor = forwardRef<HTMLDivElement, SystemPromptEditorProps>(\n (\n {\n className,\n defaultPrompt,\n override,\n onOverrideChange,\n tokenEstimate,\n title = \"System prompt\",\n ...props\n },\n ref,\n ) => {\n const usingOverride = override.length > 0;\n const [showDefault, setShowDefault] = useState(false);\n\n return (\n <section ref={ref} className={cn(\"rounded-xl border bg-card\", className)} {...props}>\n <header className=\"flex items-center justify-between gap-3 border-border/40 border-b px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n <Sparkles className=\"size-4 text-primary\" aria-hidden=\"true\" />\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n <span\n className={cn(\n \"inline-flex items-center rounded-full border px-2 py-0.5 font-mono text-label uppercase tracking-wider\",\n usingOverride\n ? \"border-primary/40 bg-primary/10 text-primary\"\n : \"border-border/40 bg-muted text-muted-foreground\",\n )}\n >\n {usingOverride ? \"Override active\" : \"Vendor default\"}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n {tokenEstimate !== undefined ? (\n <span className=\"font-mono text-label text-muted-foreground tabular-nums\">\n ~{tokenEstimate.toLocaleString()} tokens\n </span>\n ) : null}\n <button\n type=\"button\"\n onClick={() => setShowDefault((v) => !v)}\n className=\"rounded-md px-2 py-1 font-mono text-label text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {showDefault ? \"Hide\" : \"Show\"} default\n </button>\n {usingOverride ? (\n <button\n type=\"button\"\n onClick={() => onOverrideChange(\"\")}\n className=\"inline-flex items-center gap-1 rounded-md px-2 py-1 font-mono text-label text-muted-foreground hover:bg-muted hover:text-destructive focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <RotateCcw className=\"size-3\" /> Reset\n </button>\n ) : null}\n </div>\n </header>\n\n {showDefault ? (\n <pre className=\"max-h-48 overflow-auto border-border/40 border-b bg-muted/40 px-4 py-3 font-mono text-code-sm text-muted-foreground\">\n {defaultPrompt}\n </pre>\n ) : null}\n\n <textarea\n value={override}\n onChange={(e) => onOverrideChange(e.target.value)}\n placeholder={\n usingOverride ? \"\" : \"Leave empty to use the vendor default. Type here to override.\"\n }\n rows={8}\n className={cn(\n \"w-full resize-y bg-transparent px-4 py-3 font-mono text-code-md text-foreground\",\n \"placeholder:text-muted-foreground\",\n \"focus:outline-none\",\n )}\n />\n </section>\n );\n },\n);\nSystemPromptEditor.displayName = \"SystemPromptEditor\";\n\nexport { SystemPromptEditor };\n"]}
@@ -0,0 +1,101 @@
1
+ import { Dialog } from './chunk-2UJROWAG.js';
2
+ import { cn } from './chunk-ZSRJCIWF.js';
3
+ import { Command } from 'cmdk';
4
+ import { Search, ChevronRight } from 'lucide-react';
5
+ import { useState, useMemo } from 'react';
6
+ import { jsx, jsxs } from 'react/jsx-runtime';
7
+
8
+ var defaultEmpty = "No results.";
9
+ function CommandPalette({
10
+ open,
11
+ onOpenChange,
12
+ items,
13
+ onSelect,
14
+ placeholder = "Type a command or search\u2026",
15
+ emptyMessage = defaultEmpty,
16
+ filter
17
+ }) {
18
+ const [search, setSearch] = useState("");
19
+ const groups = useMemo(() => {
20
+ const map = /* @__PURE__ */ new Map();
21
+ for (const item of items) {
22
+ const key = item.group ?? "";
23
+ if (!map.has(key)) map.set(key, []);
24
+ map.get(key)?.push(item);
25
+ }
26
+ return Array.from(map.entries());
27
+ }, [items]);
28
+ const handleSelect = (id) => {
29
+ onSelect(id);
30
+ onOpenChange(false);
31
+ setSearch("");
32
+ };
33
+ return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs(Dialog.Content, { className: "max-w-xl p-0", hideCloseButton: true, children: [
34
+ /* @__PURE__ */ jsx(Dialog.Title, { className: "sr-only", children: "Command palette" }),
35
+ /* @__PURE__ */ jsx(Dialog.Description, { className: "sr-only", children: "Type to search commands. Use arrow keys to navigate, Enter to select, Escape to close." }),
36
+ /* @__PURE__ */ jsxs(Command, { label: "Command palette", shouldFilter: true, ...filter ? { filter } : {}, children: [
37
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 border-border/40 border-b px-4 py-3", children: [
38
+ /* @__PURE__ */ jsx(Search, { className: "size-4 text-muted-foreground", "aria-hidden": "true" }),
39
+ /* @__PURE__ */ jsx(
40
+ Command.Input,
41
+ {
42
+ value: search,
43
+ onValueChange: setSearch,
44
+ placeholder,
45
+ className: cn(
46
+ "flex-1 bg-transparent",
47
+ "font-sans text-body-md text-foreground placeholder:text-muted-foreground",
48
+ "focus:outline-none"
49
+ )
50
+ }
51
+ ),
52
+ /* @__PURE__ */ jsx("span", { className: "rounded-md bg-muted px-1.5 py-0.5 font-mono text-label text-muted-foreground", children: "\u2318K" })
53
+ ] }),
54
+ /* @__PURE__ */ jsxs(Command.List, { className: "max-h-[420px] overflow-y-auto p-1", children: [
55
+ /* @__PURE__ */ jsx(Command.Empty, { className: "px-3 py-6 text-center text-body-sm text-muted-foreground", children: emptyMessage }),
56
+ groups.map(([groupName, list]) => /* @__PURE__ */ jsx(
57
+ Command.Group,
58
+ {
59
+ heading: groupName || void 0,
60
+ className: cn(
61
+ "[&_[cmdk-group-heading]]:px-3 [&_[cmdk-group-heading]]:pt-2 [&_[cmdk-group-heading]]:pb-1",
62
+ "[&_[cmdk-group-heading]]:font-sans [&_[cmdk-group-heading]]:text-label-caps",
63
+ "[&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-wider"
64
+ ),
65
+ children: list.map((item) => {
66
+ const Icon = item.icon;
67
+ const value = item.searchable ?? (typeof item.label === "string" ? item.label : item.id);
68
+ return /* @__PURE__ */ jsxs(
69
+ Command.Item,
70
+ {
71
+ value,
72
+ onSelect: () => handleSelect(item.id),
73
+ className: cn(
74
+ "flex w-full cursor-pointer items-center gap-3 rounded-md px-3 py-2 text-left",
75
+ "transition-colors hover:bg-muted",
76
+ "data-[selected=true]:bg-muted",
77
+ "focus-visible:outline-none"
78
+ ),
79
+ children: [
80
+ Icon ? /* @__PURE__ */ jsx(Icon, { className: "size-4 text-primary" }) : null,
81
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
82
+ /* @__PURE__ */ jsx("p", { className: "truncate text-body-sm text-foreground", children: item.label }),
83
+ item.hint ? /* @__PURE__ */ jsx("p", { className: "truncate font-mono text-label text-muted-foreground", children: item.hint }) : null
84
+ ] }),
85
+ /* @__PURE__ */ jsx(ChevronRight, { className: "size-3 text-muted-foreground", "aria-hidden": "true" })
86
+ ]
87
+ },
88
+ item.id
89
+ );
90
+ })
91
+ },
92
+ groupName || "default"
93
+ ))
94
+ ] })
95
+ ] })
96
+ ] }) });
97
+ }
98
+
99
+ export { CommandPalette };
100
+ //# sourceMappingURL=chunk-BP2SETUC.js.map
101
+ //# sourceMappingURL=chunk-BP2SETUC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/composites/command-palette/command-palette.tsx"],"names":["CommandPrimitive"],"mappings":"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","file":"chunk-BP2SETUC.js","sourcesContent":["import { Command as CommandPrimitive } from \"cmdk\";\nimport { ChevronRight, Search } from \"lucide-react\";\nimport { useMemo, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { IconComponent } from \"../../../lib/types.js\";\nimport { Dialog } from \"../../primitives/dialog/index.js\";\n\nexport interface CommandItem {\n id: string;\n label: ReactNode;\n /** Optional secondary line (path, hint, shortcut). */\n hint?: ReactNode;\n /** Optional group name. Items with the same group are visually grouped. */\n group?: string;\n /** Optional icon. */\n icon?: IconComponent;\n /** Optional searchable plain-text used by the cmdk ranker. Falls back to `label` when string. */\n searchable?: string;\n}\n\ninterface CommandPaletteProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n items: CommandItem[];\n onSelect: (id: string) => void;\n placeholder?: string;\n emptyMessage?: ReactNode;\n /**\n * Optional custom filter score (0 = no match, > 0 = match). Receives the\n * `value` (the item's searchable text) and the current `search` query.\n * Defaults to cmdk's built-in fuzzy ranker which prioritizes substring +\n * word-boundary + consecutive matches.\n */\n filter?: (value: string, search: string) => number;\n}\n\nconst defaultEmpty = \"No results.\";\n\n/**\n * CommandPalette — Cmd+K-style global launcher with full keyboard navigation.\n *\n * Built on `cmdk` (the de-facto shadcn pattern) + Theo Dialog. Provides\n * out-of-the-box: ArrowUp/ArrowDown navigation, Enter selection, Escape close,\n * Home/End, active-item highlight via `data-selected`, and fuzzy ranking.\n *\n * Stateless: caller owns `open` / `onOpenChange` / `items`. Selecting an item\n * fires `onSelect(id)` and closes the dialog.\n */\nfunction CommandPalette({\n open,\n onOpenChange,\n items,\n onSelect,\n placeholder = \"Type a command or search…\",\n emptyMessage = defaultEmpty,\n filter,\n}: CommandPaletteProps) {\n const [search, setSearch] = useState(\"\");\n\n const groups = useMemo(() => {\n const map = new Map<string, CommandItem[]>();\n for (const item of items) {\n const key = item.group ?? \"\";\n if (!map.has(key)) map.set(key, []);\n map.get(key)?.push(item);\n }\n return Array.from(map.entries());\n }, [items]);\n\n const handleSelect = (id: string) => {\n onSelect(id);\n onOpenChange(false);\n setSearch(\"\");\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <Dialog.Content className=\"max-w-xl p-0\" hideCloseButton>\n <Dialog.Title className=\"sr-only\">Command palette</Dialog.Title>\n <Dialog.Description className=\"sr-only\">\n Type to search commands. Use arrow keys to navigate, Enter to select, Escape to close.\n </Dialog.Description>\n <CommandPrimitive label=\"Command palette\" shouldFilter {...(filter ? { filter } : {})}>\n <div className=\"flex items-center gap-2 border-border/40 border-b px-4 py-3\">\n <Search className=\"size-4 text-muted-foreground\" aria-hidden=\"true\" />\n <CommandPrimitive.Input\n value={search}\n onValueChange={setSearch}\n placeholder={placeholder}\n className={cn(\n \"flex-1 bg-transparent\",\n \"font-sans text-body-md text-foreground placeholder:text-muted-foreground\",\n \"focus:outline-none\",\n )}\n />\n <span className=\"rounded-md bg-muted px-1.5 py-0.5 font-mono text-label text-muted-foreground\">\n ⌘K\n </span>\n </div>\n <CommandPrimitive.List className=\"max-h-[420px] overflow-y-auto p-1\">\n <CommandPrimitive.Empty className=\"px-3 py-6 text-center text-body-sm text-muted-foreground\">\n {emptyMessage}\n </CommandPrimitive.Empty>\n {groups.map(([groupName, list]) => (\n <CommandPrimitive.Group\n key={groupName || \"default\"}\n heading={groupName || undefined}\n className={cn(\n \"[&_[cmdk-group-heading]]:px-3 [&_[cmdk-group-heading]]:pt-2 [&_[cmdk-group-heading]]:pb-1\",\n \"[&_[cmdk-group-heading]]:font-sans [&_[cmdk-group-heading]]:text-label-caps\",\n \"[&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-wider\",\n )}\n >\n {list.map((item) => {\n const Icon = item.icon;\n const value =\n item.searchable ?? (typeof item.label === \"string\" ? item.label : item.id);\n return (\n <CommandPrimitive.Item\n key={item.id}\n value={value}\n onSelect={() => handleSelect(item.id)}\n className={cn(\n \"flex w-full cursor-pointer items-center gap-3 rounded-md px-3 py-2 text-left\",\n \"transition-colors hover:bg-muted\",\n \"data-[selected=true]:bg-muted\",\n \"focus-visible:outline-none\",\n )}\n >\n {Icon ? <Icon className=\"size-4 text-primary\" /> : null}\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-body-sm text-foreground\">{item.label}</p>\n {item.hint ? (\n <p className=\"truncate font-mono text-label text-muted-foreground\">\n {item.hint}\n </p>\n ) : null}\n </div>\n <ChevronRight className=\"size-3 text-muted-foreground\" aria-hidden=\"true\" />\n </CommandPrimitive.Item>\n );\n })}\n </CommandPrimitive.Group>\n ))}\n </CommandPrimitive.List>\n </CommandPrimitive>\n </Dialog.Content>\n </Dialog>\n );\n}\n\nexport { CommandPalette };\n"]}