@dowel-ui/react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (691) hide show
  1. package/LICENSE +21 -0
  2. package/dist/blocks/admin-users/meta.js +27 -0
  3. package/dist/blocks/admin-users/meta.js.map +1 -0
  4. package/dist/blocks/ai-chat/meta.js +30 -0
  5. package/dist/blocks/ai-chat/meta.js.map +1 -0
  6. package/dist/blocks/dashboard/meta.js +23 -0
  7. package/dist/blocks/dashboard/meta.js.map +1 -0
  8. package/dist/blocks/forgot-password/meta.js +24 -0
  9. package/dist/blocks/forgot-password/meta.js.map +1 -0
  10. package/dist/blocks/login/meta.js +26 -0
  11. package/dist/blocks/login/meta.js.map +1 -0
  12. package/dist/blocks/pricing/meta.js +24 -0
  13. package/dist/blocks/pricing/meta.js.map +1 -0
  14. package/dist/blocks/settings/meta.js +29 -0
  15. package/dist/blocks/settings/meta.js.map +1 -0
  16. package/dist/blocks/signup/meta.js +25 -0
  17. package/dist/blocks/signup/meta.js.map +1 -0
  18. package/dist/components/accordion/accordion.d.ts +19 -0
  19. package/dist/components/accordion/accordion.d.ts.map +1 -0
  20. package/dist/components/accordion/accordion.js +58 -0
  21. package/dist/components/accordion/accordion.js.map +1 -0
  22. package/dist/components/accordion/index.d.ts +2 -0
  23. package/dist/components/accordion/index.js +2 -0
  24. package/dist/components/accordion/meta.js +17 -0
  25. package/dist/components/accordion/meta.js.map +1 -0
  26. package/dist/components/activity-feed/activity-feed.d.ts +39 -0
  27. package/dist/components/activity-feed/activity-feed.d.ts.map +1 -0
  28. package/dist/components/activity-feed/activity-feed.js +77 -0
  29. package/dist/components/activity-feed/activity-feed.js.map +1 -0
  30. package/dist/components/activity-feed/index.d.ts +2 -0
  31. package/dist/components/activity-feed/index.js +2 -0
  32. package/dist/components/activity-feed/meta.js +17 -0
  33. package/dist/components/activity-feed/meta.js.map +1 -0
  34. package/dist/components/ai-agent-status/ai-agent-status.d.ts +30 -0
  35. package/dist/components/ai-agent-status/ai-agent-status.d.ts.map +1 -0
  36. package/dist/components/ai-agent-status/ai-agent-status.js +43 -0
  37. package/dist/components/ai-agent-status/ai-agent-status.js.map +1 -0
  38. package/dist/components/ai-agent-status/index.d.ts +2 -0
  39. package/dist/components/ai-agent-status/index.js +2 -0
  40. package/dist/components/ai-agent-status/meta.js +17 -0
  41. package/dist/components/ai-agent-status/meta.js.map +1 -0
  42. package/dist/components/ai-conversation/ai-conversation.d.ts +45 -0
  43. package/dist/components/ai-conversation/ai-conversation.d.ts.map +1 -0
  44. package/dist/components/ai-conversation/ai-conversation.js +138 -0
  45. package/dist/components/ai-conversation/ai-conversation.js.map +1 -0
  46. package/dist/components/ai-conversation/index.d.ts +2 -0
  47. package/dist/components/ai-conversation/index.js +2 -0
  48. package/dist/components/ai-conversation/meta.js +17 -0
  49. package/dist/components/ai-conversation/meta.js.map +1 -0
  50. package/dist/components/ai-message/ai-message.d.ts +56 -0
  51. package/dist/components/ai-message/ai-message.d.ts.map +1 -0
  52. package/dist/components/ai-message/ai-message.js +90 -0
  53. package/dist/components/ai-message/ai-message.js.map +1 -0
  54. package/dist/components/ai-message/index.d.ts +2 -0
  55. package/dist/components/ai-message/index.js +2 -0
  56. package/dist/components/ai-message/meta.js +17 -0
  57. package/dist/components/ai-message/meta.js.map +1 -0
  58. package/dist/components/ai-model-selector/ai-model-selector.d.ts +42 -0
  59. package/dist/components/ai-model-selector/ai-model-selector.d.ts.map +1 -0
  60. package/dist/components/ai-model-selector/ai-model-selector.js +48 -0
  61. package/dist/components/ai-model-selector/ai-model-selector.js.map +1 -0
  62. package/dist/components/ai-model-selector/index.d.ts +2 -0
  63. package/dist/components/ai-model-selector/index.js +2 -0
  64. package/dist/components/ai-model-selector/meta.js +17 -0
  65. package/dist/components/ai-model-selector/meta.js.map +1 -0
  66. package/dist/components/ai-prompt-input/ai-prompt-input.d.ts +61 -0
  67. package/dist/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -0
  68. package/dist/components/ai-prompt-input/ai-prompt-input.js +170 -0
  69. package/dist/components/ai-prompt-input/ai-prompt-input.js.map +1 -0
  70. package/dist/components/ai-prompt-input/index.d.ts +2 -0
  71. package/dist/components/ai-prompt-input/index.js +2 -0
  72. package/dist/components/ai-prompt-input/meta.js +17 -0
  73. package/dist/components/ai-prompt-input/meta.js.map +1 -0
  74. package/dist/components/ai-reasoning/ai-reasoning.d.ts +24 -0
  75. package/dist/components/ai-reasoning/ai-reasoning.d.ts.map +1 -0
  76. package/dist/components/ai-reasoning/ai-reasoning.js +64 -0
  77. package/dist/components/ai-reasoning/ai-reasoning.js.map +1 -0
  78. package/dist/components/ai-reasoning/index.d.ts +2 -0
  79. package/dist/components/ai-reasoning/index.js +2 -0
  80. package/dist/components/ai-reasoning/meta.js +17 -0
  81. package/dist/components/ai-reasoning/meta.js.map +1 -0
  82. package/dist/components/ai-response/ai-response.d.ts +36 -0
  83. package/dist/components/ai-response/ai-response.d.ts.map +1 -0
  84. package/dist/components/ai-response/ai-response.js +46 -0
  85. package/dist/components/ai-response/ai-response.js.map +1 -0
  86. package/dist/components/ai-response/index.d.ts +2 -0
  87. package/dist/components/ai-response/index.js +2 -0
  88. package/dist/components/ai-response/meta.js +17 -0
  89. package/dist/components/ai-response/meta.js.map +1 -0
  90. package/dist/components/ai-sources/ai-sources.d.ts +44 -0
  91. package/dist/components/ai-sources/ai-sources.d.ts.map +1 -0
  92. package/dist/components/ai-sources/ai-sources.js +112 -0
  93. package/dist/components/ai-sources/ai-sources.js.map +1 -0
  94. package/dist/components/ai-sources/index.d.ts +2 -0
  95. package/dist/components/ai-sources/index.js +2 -0
  96. package/dist/components/ai-sources/meta.js +17 -0
  97. package/dist/components/ai-sources/meta.js.map +1 -0
  98. package/dist/components/ai-token-usage/ai-token-usage.d.ts +34 -0
  99. package/dist/components/ai-token-usage/ai-token-usage.d.ts.map +1 -0
  100. package/dist/components/ai-token-usage/ai-token-usage.js +58 -0
  101. package/dist/components/ai-token-usage/ai-token-usage.js.map +1 -0
  102. package/dist/components/ai-token-usage/index.d.ts +2 -0
  103. package/dist/components/ai-token-usage/index.js +2 -0
  104. package/dist/components/ai-token-usage/meta.js +17 -0
  105. package/dist/components/ai-token-usage/meta.js.map +1 -0
  106. package/dist/components/ai-tool/ai-tool.d.ts +50 -0
  107. package/dist/components/ai-tool/ai-tool.d.ts.map +1 -0
  108. package/dist/components/ai-tool/ai-tool.js +129 -0
  109. package/dist/components/ai-tool/ai-tool.js.map +1 -0
  110. package/dist/components/ai-tool/index.d.ts +2 -0
  111. package/dist/components/ai-tool/index.js +2 -0
  112. package/dist/components/ai-tool/meta.js +17 -0
  113. package/dist/components/ai-tool/meta.js.map +1 -0
  114. package/dist/components/alert/alert.d.ts +32 -0
  115. package/dist/components/alert/alert.d.ts.map +1 -0
  116. package/dist/components/alert/alert.js +49 -0
  117. package/dist/components/alert/alert.js.map +1 -0
  118. package/dist/components/alert/index.d.ts +2 -0
  119. package/dist/components/alert/index.js +2 -0
  120. package/dist/components/alert/meta.js +17 -0
  121. package/dist/components/alert/meta.js.map +1 -0
  122. package/dist/components/avatar/avatar.d.ts +23 -0
  123. package/dist/components/avatar/avatar.d.ts.map +1 -0
  124. package/dist/components/avatar/avatar.js +44 -0
  125. package/dist/components/avatar/avatar.js.map +1 -0
  126. package/dist/components/avatar/index.d.ts +2 -0
  127. package/dist/components/avatar/index.js +2 -0
  128. package/dist/components/avatar/meta.js +17 -0
  129. package/dist/components/avatar/meta.js.map +1 -0
  130. package/dist/components/badge/badge.d.ts +20 -0
  131. package/dist/components/badge/badge.d.ts.map +1 -0
  132. package/dist/components/badge/badge.js +47 -0
  133. package/dist/components/badge/badge.js.map +1 -0
  134. package/dist/components/badge/index.d.ts +2 -0
  135. package/dist/components/badge/index.js +2 -0
  136. package/dist/components/badge/meta.js +17 -0
  137. package/dist/components/badge/meta.js.map +1 -0
  138. package/dist/components/button/button.d.ts +28 -0
  139. package/dist/components/button/button.d.ts.map +1 -0
  140. package/dist/components/button/button.js +77 -0
  141. package/dist/components/button/button.js.map +1 -0
  142. package/dist/components/button/index.d.ts +2 -0
  143. package/dist/components/button/index.js +2 -0
  144. package/dist/components/button/meta.js +17 -0
  145. package/dist/components/button/meta.js.map +1 -0
  146. package/dist/components/calendar/calendar.d.ts +16 -0
  147. package/dist/components/calendar/calendar.d.ts.map +1 -0
  148. package/dist/components/calendar/calendar.js +70 -0
  149. package/dist/components/calendar/calendar.js.map +1 -0
  150. package/dist/components/calendar/index.d.ts +2 -0
  151. package/dist/components/calendar/index.js +2 -0
  152. package/dist/components/calendar/meta.js +17 -0
  153. package/dist/components/calendar/meta.js.map +1 -0
  154. package/dist/components/card/card.d.ts +23 -0
  155. package/dist/components/card/card.d.ts.map +1 -0
  156. package/dist/components/card/card.js +53 -0
  157. package/dist/components/card/card.js.map +1 -0
  158. package/dist/components/card/index.d.ts +2 -0
  159. package/dist/components/card/index.js +2 -0
  160. package/dist/components/card/meta.js +17 -0
  161. package/dist/components/card/meta.js.map +1 -0
  162. package/dist/components/checkbox/checkbox.d.ts +15 -0
  163. package/dist/components/checkbox/checkbox.d.ts.map +1 -0
  164. package/dist/components/checkbox/checkbox.js +45 -0
  165. package/dist/components/checkbox/checkbox.js.map +1 -0
  166. package/dist/components/checkbox/index.d.ts +2 -0
  167. package/dist/components/checkbox/index.js +2 -0
  168. package/dist/components/checkbox/meta.js +17 -0
  169. package/dist/components/checkbox/meta.js.map +1 -0
  170. package/dist/components/code-block/code-block.d.ts +46 -0
  171. package/dist/components/code-block/code-block.d.ts.map +1 -0
  172. package/dist/components/code-block/code-block.js +110 -0
  173. package/dist/components/code-block/code-block.js.map +1 -0
  174. package/dist/components/code-block/index.d.ts +2 -0
  175. package/dist/components/code-block/index.js +2 -0
  176. package/dist/components/code-block/meta.js +17 -0
  177. package/dist/components/code-block/meta.js.map +1 -0
  178. package/dist/components/combobox/combobox.d.ts +59 -0
  179. package/dist/components/combobox/combobox.d.ts.map +1 -0
  180. package/dist/components/combobox/combobox.js +346 -0
  181. package/dist/components/combobox/combobox.js.map +1 -0
  182. package/dist/components/combobox/index.d.ts +2 -0
  183. package/dist/components/combobox/index.js +2 -0
  184. package/dist/components/combobox/meta.js +17 -0
  185. package/dist/components/combobox/meta.js.map +1 -0
  186. package/dist/components/command/command.d.ts +65 -0
  187. package/dist/components/command/command.d.ts.map +1 -0
  188. package/dist/components/command/command.js +330 -0
  189. package/dist/components/command/command.js.map +1 -0
  190. package/dist/components/command/index.d.ts +2 -0
  191. package/dist/components/command/index.js +2 -0
  192. package/dist/components/command/meta.js +17 -0
  193. package/dist/components/command/meta.js.map +1 -0
  194. package/dist/components/data-table/data-table.d.ts +91 -0
  195. package/dist/components/data-table/data-table.d.ts.map +1 -0
  196. package/dist/components/data-table/data-table.js +263 -0
  197. package/dist/components/data-table/data-table.js.map +1 -0
  198. package/dist/components/data-table/index.d.ts +2 -0
  199. package/dist/components/data-table/index.js +2 -0
  200. package/dist/components/data-table/meta.js +22 -0
  201. package/dist/components/data-table/meta.js.map +1 -0
  202. package/dist/components/date-picker/date-picker.d.ts +31 -0
  203. package/dist/components/date-picker/date-picker.d.ts.map +1 -0
  204. package/dist/components/date-picker/date-picker.js +123 -0
  205. package/dist/components/date-picker/date-picker.js.map +1 -0
  206. package/dist/components/date-picker/index.d.ts +2 -0
  207. package/dist/components/date-picker/index.js +2 -0
  208. package/dist/components/date-picker/meta.js +21 -0
  209. package/dist/components/date-picker/meta.js.map +1 -0
  210. package/dist/components/dialog/dialog.d.ts +30 -0
  211. package/dist/components/dialog/dialog.d.ts.map +1 -0
  212. package/dist/components/dialog/dialog.js +79 -0
  213. package/dist/components/dialog/dialog.js.map +1 -0
  214. package/dist/components/dialog/index.d.ts +2 -0
  215. package/dist/components/dialog/index.js +2 -0
  216. package/dist/components/dialog/meta.js +17 -0
  217. package/dist/components/dialog/meta.js.map +1 -0
  218. package/dist/components/drawer/drawer.d.ts +32 -0
  219. package/dist/components/drawer/drawer.d.ts.map +1 -0
  220. package/dist/components/drawer/drawer.js +153 -0
  221. package/dist/components/drawer/drawer.js.map +1 -0
  222. package/dist/components/drawer/index.d.ts +2 -0
  223. package/dist/components/drawer/index.js +2 -0
  224. package/dist/components/drawer/meta.js +17 -0
  225. package/dist/components/drawer/meta.js.map +1 -0
  226. package/dist/components/dropdown-menu/dropdown-menu.d.ts +43 -0
  227. package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +1 -0
  228. package/dist/components/dropdown-menu/dropdown-menu.js +130 -0
  229. package/dist/components/dropdown-menu/dropdown-menu.js.map +1 -0
  230. package/dist/components/dropdown-menu/index.d.ts +2 -0
  231. package/dist/components/dropdown-menu/index.js +2 -0
  232. package/dist/components/dropdown-menu/meta.js +17 -0
  233. package/dist/components/dropdown-menu/meta.js.map +1 -0
  234. package/dist/components/empty-state/empty-state.d.ts +24 -0
  235. package/dist/components/empty-state/empty-state.d.ts.map +1 -0
  236. package/dist/components/empty-state/empty-state.js +73 -0
  237. package/dist/components/empty-state/empty-state.js.map +1 -0
  238. package/dist/components/empty-state/index.d.ts +2 -0
  239. package/dist/components/empty-state/index.js +2 -0
  240. package/dist/components/empty-state/meta.js +17 -0
  241. package/dist/components/empty-state/meta.js.map +1 -0
  242. package/dist/components/form/form.d.ts +43 -0
  243. package/dist/components/form/form.d.ts.map +1 -0
  244. package/dist/components/form/form.js +127 -0
  245. package/dist/components/form/form.js.map +1 -0
  246. package/dist/components/form/index.d.ts +2 -0
  247. package/dist/components/form/index.js +2 -0
  248. package/dist/components/form/meta.js +17 -0
  249. package/dist/components/form/meta.js.map +1 -0
  250. package/dist/components/input/index.d.ts +2 -0
  251. package/dist/components/input/index.js +2 -0
  252. package/dist/components/input/input.d.ts +21 -0
  253. package/dist/components/input/input.d.ts.map +1 -0
  254. package/dist/components/input/input.js +34 -0
  255. package/dist/components/input/input.js.map +1 -0
  256. package/dist/components/input/meta.js +17 -0
  257. package/dist/components/input/meta.js.map +1 -0
  258. package/dist/components/label/index.d.ts +2 -0
  259. package/dist/components/label/index.js +2 -0
  260. package/dist/components/label/label.d.ts +14 -0
  261. package/dist/components/label/label.d.ts.map +1 -0
  262. package/dist/components/label/label.js +20 -0
  263. package/dist/components/label/label.js.map +1 -0
  264. package/dist/components/label/meta.js +17 -0
  265. package/dist/components/label/meta.js.map +1 -0
  266. package/dist/components/pagination/index.d.ts +2 -0
  267. package/dist/components/pagination/index.js +2 -0
  268. package/dist/components/pagination/meta.js +17 -0
  269. package/dist/components/pagination/meta.js.map +1 -0
  270. package/dist/components/pagination/pagination.d.ts +33 -0
  271. package/dist/components/pagination/pagination.d.ts.map +1 -0
  272. package/dist/components/pagination/pagination.js +143 -0
  273. package/dist/components/pagination/pagination.js.map +1 -0
  274. package/dist/components/popover/index.d.ts +2 -0
  275. package/dist/components/popover/index.js +2 -0
  276. package/dist/components/popover/meta.js +17 -0
  277. package/dist/components/popover/meta.js.map +1 -0
  278. package/dist/components/popover/popover.d.ts +24 -0
  279. package/dist/components/popover/popover.d.ts.map +1 -0
  280. package/dist/components/popover/popover.js +60 -0
  281. package/dist/components/popover/popover.js.map +1 -0
  282. package/dist/components/progress/index.d.ts +2 -0
  283. package/dist/components/progress/index.js +2 -0
  284. package/dist/components/progress/meta.js +17 -0
  285. package/dist/components/progress/meta.js.map +1 -0
  286. package/dist/components/progress/progress.d.ts +21 -0
  287. package/dist/components/progress/progress.d.ts.map +1 -0
  288. package/dist/components/progress/progress.js +55 -0
  289. package/dist/components/progress/progress.js.map +1 -0
  290. package/dist/components/radio-group/index.d.ts +2 -0
  291. package/dist/components/radio-group/index.js +2 -0
  292. package/dist/components/radio-group/meta.js +17 -0
  293. package/dist/components/radio-group/meta.js.map +1 -0
  294. package/dist/components/radio-group/radio-group.d.ts +17 -0
  295. package/dist/components/radio-group/radio-group.d.ts.map +1 -0
  296. package/dist/components/radio-group/radio-group.js +29 -0
  297. package/dist/components/radio-group/radio-group.js.map +1 -0
  298. package/dist/components/select/index.d.ts +2 -0
  299. package/dist/components/select/index.js +2 -0
  300. package/dist/components/select/meta.js +17 -0
  301. package/dist/components/select/meta.js.map +1 -0
  302. package/dist/components/select/select.d.ts +37 -0
  303. package/dist/components/select/select.d.ts.map +1 -0
  304. package/dist/components/select/select.js +128 -0
  305. package/dist/components/select/select.js.map +1 -0
  306. package/dist/components/separator/index.d.ts +2 -0
  307. package/dist/components/separator/index.js +2 -0
  308. package/dist/components/separator/meta.js +17 -0
  309. package/dist/components/separator/meta.js.map +1 -0
  310. package/dist/components/separator/separator.d.ts +15 -0
  311. package/dist/components/separator/separator.d.ts.map +1 -0
  312. package/dist/components/separator/separator.js +23 -0
  313. package/dist/components/separator/separator.js.map +1 -0
  314. package/dist/components/sheet/index.d.ts +2 -0
  315. package/dist/components/sheet/index.js +2 -0
  316. package/dist/components/sheet/meta.js +17 -0
  317. package/dist/components/sheet/meta.js.map +1 -0
  318. package/dist/components/sheet/sheet.d.ts +31 -0
  319. package/dist/components/sheet/sheet.d.ts.map +1 -0
  320. package/dist/components/sheet/sheet.js +90 -0
  321. package/dist/components/sheet/sheet.js.map +1 -0
  322. package/dist/components/skeleton/index.d.ts +2 -0
  323. package/dist/components/skeleton/index.js +2 -0
  324. package/dist/components/skeleton/meta.js +17 -0
  325. package/dist/components/skeleton/meta.js.map +1 -0
  326. package/dist/components/skeleton/skeleton.d.ts +20 -0
  327. package/dist/components/skeleton/skeleton.d.ts.map +1 -0
  328. package/dist/components/skeleton/skeleton.js +29 -0
  329. package/dist/components/skeleton/skeleton.js.map +1 -0
  330. package/dist/components/slider/index.d.ts +2 -0
  331. package/dist/components/slider/index.js +2 -0
  332. package/dist/components/slider/meta.js +17 -0
  333. package/dist/components/slider/meta.js.map +1 -0
  334. package/dist/components/slider/slider.d.ts +29 -0
  335. package/dist/components/slider/slider.d.ts.map +1 -0
  336. package/dist/components/slider/slider.js +61 -0
  337. package/dist/components/slider/slider.js.map +1 -0
  338. package/dist/components/spinner/index.d.ts +2 -0
  339. package/dist/components/spinner/index.js +2 -0
  340. package/dist/components/spinner/meta.js +17 -0
  341. package/dist/components/spinner/meta.js.map +1 -0
  342. package/dist/components/spinner/spinner.d.ts +21 -0
  343. package/dist/components/spinner/spinner.d.ts.map +1 -0
  344. package/dist/components/spinner/spinner.js +45 -0
  345. package/dist/components/spinner/spinner.js.map +1 -0
  346. package/dist/components/switch/index.d.ts +2 -0
  347. package/dist/components/switch/index.js +2 -0
  348. package/dist/components/switch/meta.js +17 -0
  349. package/dist/components/switch/meta.js.map +1 -0
  350. package/dist/components/switch/switch.d.ts +15 -0
  351. package/dist/components/switch/switch.d.ts.map +1 -0
  352. package/dist/components/switch/switch.js +21 -0
  353. package/dist/components/switch/switch.js.map +1 -0
  354. package/dist/components/table/index.d.ts +2 -0
  355. package/dist/components/table/index.js +2 -0
  356. package/dist/components/table/meta.js +17 -0
  357. package/dist/components/table/meta.js.map +1 -0
  358. package/dist/components/table/table.d.ts +41 -0
  359. package/dist/components/table/table.d.ts.map +1 -0
  360. package/dist/components/table/table.js +78 -0
  361. package/dist/components/table/table.js.map +1 -0
  362. package/dist/components/tabs/index.d.ts +2 -0
  363. package/dist/components/tabs/index.js +2 -0
  364. package/dist/components/tabs/meta.js +17 -0
  365. package/dist/components/tabs/meta.js.map +1 -0
  366. package/dist/components/tabs/tabs.d.ts +28 -0
  367. package/dist/components/tabs/tabs.d.ts.map +1 -0
  368. package/dist/components/tabs/tabs.js +58 -0
  369. package/dist/components/tabs/tabs.js.map +1 -0
  370. package/dist/components/toast/index.d.ts +3 -0
  371. package/dist/components/toast/index.js +3 -0
  372. package/dist/components/toast/meta.js +17 -0
  373. package/dist/components/toast/meta.js.map +1 -0
  374. package/dist/components/toast/toast-store.d.ts +84 -0
  375. package/dist/components/toast/toast-store.d.ts.map +1 -0
  376. package/dist/components/toast/toast-store.js +115 -0
  377. package/dist/components/toast/toast-store.js.map +1 -0
  378. package/dist/components/toast/toast.d.ts +39 -0
  379. package/dist/components/toast/toast.d.ts.map +1 -0
  380. package/dist/components/toast/toast.js +140 -0
  381. package/dist/components/toast/toast.js.map +1 -0
  382. package/dist/components/tooltip/index.d.ts +2 -0
  383. package/dist/components/tooltip/index.js +2 -0
  384. package/dist/components/tooltip/meta.js +17 -0
  385. package/dist/components/tooltip/meta.js.map +1 -0
  386. package/dist/components/tooltip/tooltip.d.ts +24 -0
  387. package/dist/components/tooltip/tooltip.d.ts.map +1 -0
  388. package/dist/components/tooltip/tooltip.js +38 -0
  389. package/dist/components/tooltip/tooltip.js.map +1 -0
  390. package/dist/index.d.ts +97 -0
  391. package/dist/index.js +51 -0
  392. package/dist/lib/styles.d.ts +21 -0
  393. package/dist/lib/styles.d.ts.map +1 -0
  394. package/dist/lib/styles.js +22 -0
  395. package/dist/lib/styles.js.map +1 -0
  396. package/dist/lib/utils.d.ts +11 -0
  397. package/dist/lib/utils.d.ts.map +1 -0
  398. package/dist/lib/utils.js +21 -0
  399. package/dist/lib/utils.js.map +1 -0
  400. package/dist/registry/blocks.d.ts +15 -0
  401. package/dist/registry/blocks.d.ts.map +1 -0
  402. package/dist/registry/blocks.js +32 -0
  403. package/dist/registry/blocks.js.map +1 -0
  404. package/dist/registry/components.d.ts +18 -0
  405. package/dist/registry/components.d.ts.map +1 -0
  406. package/dist/registry/components.js +112 -0
  407. package/dist/registry/components.js.map +1 -0
  408. package/dist/registry/schema.d.ts +44 -0
  409. package/dist/registry/schema.d.ts.map +1 -0
  410. package/dist/registry/schema.js +33 -0
  411. package/dist/registry/schema.js.map +1 -0
  412. package/package.json +74 -0
  413. package/src/blocks/admin-users/admin-users.stories.tsx +83 -0
  414. package/src/blocks/admin-users/admin-users.test.tsx +159 -0
  415. package/src/blocks/admin-users/admin-users.tsx +251 -0
  416. package/src/blocks/admin-users/index.ts +1 -0
  417. package/src/blocks/admin-users/meta.ts +27 -0
  418. package/src/blocks/ai-chat/ai-chat.stories.tsx +149 -0
  419. package/src/blocks/ai-chat/ai-chat.test.tsx +166 -0
  420. package/src/blocks/ai-chat/ai-chat.tsx +280 -0
  421. package/src/blocks/ai-chat/index.ts +7 -0
  422. package/src/blocks/ai-chat/meta.ts +32 -0
  423. package/src/blocks/dashboard/dashboard.stories.tsx +106 -0
  424. package/src/blocks/dashboard/dashboard.test.tsx +94 -0
  425. package/src/blocks/dashboard/dashboard.tsx +192 -0
  426. package/src/blocks/dashboard/index.ts +6 -0
  427. package/src/blocks/dashboard/meta.ts +18 -0
  428. package/src/blocks/forgot-password/forgot-password.stories.tsx +41 -0
  429. package/src/blocks/forgot-password/forgot-password.test.tsx +62 -0
  430. package/src/blocks/forgot-password/forgot-password.tsx +158 -0
  431. package/src/blocks/forgot-password/index.ts +1 -0
  432. package/src/blocks/forgot-password/meta.ts +18 -0
  433. package/src/blocks/login/index.ts +1 -0
  434. package/src/blocks/login/login.stories.tsx +46 -0
  435. package/src/blocks/login/login.test.tsx +100 -0
  436. package/src/blocks/login/login.tsx +178 -0
  437. package/src/blocks/login/meta.ts +18 -0
  438. package/src/blocks/pricing/index.ts +1 -0
  439. package/src/blocks/pricing/meta.ts +18 -0
  440. package/src/blocks/pricing/pricing.stories.tsx +62 -0
  441. package/src/blocks/pricing/pricing.test.tsx +101 -0
  442. package/src/blocks/pricing/pricing.tsx +176 -0
  443. package/src/blocks/settings/index.ts +6 -0
  444. package/src/blocks/settings/meta.ts +29 -0
  445. package/src/blocks/settings/settings.stories.tsx +94 -0
  446. package/src/blocks/settings/settings.test.tsx +167 -0
  447. package/src/blocks/settings/settings.tsx +317 -0
  448. package/src/blocks/signup/index.ts +1 -0
  449. package/src/blocks/signup/meta.ts +18 -0
  450. package/src/blocks/signup/signup.stories.tsx +27 -0
  451. package/src/blocks/signup/signup.test.tsx +97 -0
  452. package/src/blocks/signup/signup.tsx +240 -0
  453. package/src/components/accordion/accordion.stories.tsx +90 -0
  454. package/src/components/accordion/accordion.test.tsx +156 -0
  455. package/src/components/accordion/accordion.tsx +88 -0
  456. package/src/components/accordion/index.ts +9 -0
  457. package/src/components/accordion/meta.ts +16 -0
  458. package/src/components/activity-feed/activity-feed.stories.tsx +163 -0
  459. package/src/components/activity-feed/activity-feed.test.tsx +125 -0
  460. package/src/components/activity-feed/activity-feed.tsx +115 -0
  461. package/src/components/activity-feed/index.ts +12 -0
  462. package/src/components/activity-feed/meta.ts +17 -0
  463. package/src/components/ai-agent-status/ai-agent-status.stories.tsx +86 -0
  464. package/src/components/ai-agent-status/ai-agent-status.test.tsx +66 -0
  465. package/src/components/ai-agent-status/ai-agent-status.tsx +88 -0
  466. package/src/components/ai-agent-status/index.ts +6 -0
  467. package/src/components/ai-agent-status/meta.ts +17 -0
  468. package/src/components/ai-conversation/ai-conversation.stories.tsx +126 -0
  469. package/src/components/ai-conversation/ai-conversation.test.tsx +144 -0
  470. package/src/components/ai-conversation/ai-conversation.tsx +229 -0
  471. package/src/components/ai-conversation/index.ts +9 -0
  472. package/src/components/ai-conversation/meta.ts +20 -0
  473. package/src/components/ai-message/ai-message.stories.tsx +106 -0
  474. package/src/components/ai-message/ai-message.test.tsx +160 -0
  475. package/src/components/ai-message/ai-message.tsx +162 -0
  476. package/src/components/ai-message/index.ts +13 -0
  477. package/src/components/ai-message/meta.ts +17 -0
  478. package/src/components/ai-model-selector/ai-model-selector.stories.tsx +66 -0
  479. package/src/components/ai-model-selector/ai-model-selector.test.tsx +120 -0
  480. package/src/components/ai-model-selector/ai-model-selector.tsx +112 -0
  481. package/src/components/ai-model-selector/index.ts +1 -0
  482. package/src/components/ai-model-selector/meta.ts +17 -0
  483. package/src/components/ai-prompt-input/ai-prompt-input.stories.tsx +145 -0
  484. package/src/components/ai-prompt-input/ai-prompt-input.test.tsx +273 -0
  485. package/src/components/ai-prompt-input/ai-prompt-input.tsx +306 -0
  486. package/src/components/ai-prompt-input/index.ts +11 -0
  487. package/src/components/ai-prompt-input/meta.ts +18 -0
  488. package/src/components/ai-reasoning/ai-reasoning.stories.tsx +60 -0
  489. package/src/components/ai-reasoning/ai-reasoning.test.tsx +95 -0
  490. package/src/components/ai-reasoning/ai-reasoning.tsx +106 -0
  491. package/src/components/ai-reasoning/index.ts +7 -0
  492. package/src/components/ai-reasoning/meta.ts +17 -0
  493. package/src/components/ai-response/ai-response.stories.tsx +75 -0
  494. package/src/components/ai-response/ai-response.test.tsx +96 -0
  495. package/src/components/ai-response/ai-response.tsx +95 -0
  496. package/src/components/ai-response/index.ts +7 -0
  497. package/src/components/ai-response/meta.ts +17 -0
  498. package/src/components/ai-sources/ai-sources.stories.tsx +93 -0
  499. package/src/components/ai-sources/ai-sources.test.tsx +102 -0
  500. package/src/components/ai-sources/ai-sources.tsx +186 -0
  501. package/src/components/ai-sources/index.ts +11 -0
  502. package/src/components/ai-sources/meta.ts +17 -0
  503. package/src/components/ai-token-usage/ai-token-usage.stories.tsx +59 -0
  504. package/src/components/ai-token-usage/ai-token-usage.test.tsx +83 -0
  505. package/src/components/ai-token-usage/ai-token-usage.tsx +105 -0
  506. package/src/components/ai-token-usage/index.ts +6 -0
  507. package/src/components/ai-token-usage/meta.ts +16 -0
  508. package/src/components/ai-tool/ai-tool.stories.tsx +96 -0
  509. package/src/components/ai-tool/ai-tool.test.tsx +137 -0
  510. package/src/components/ai-tool/ai-tool.tsx +235 -0
  511. package/src/components/ai-tool/index.ts +13 -0
  512. package/src/components/ai-tool/meta.ts +17 -0
  513. package/src/components/alert/alert.stories.tsx +101 -0
  514. package/src/components/alert/alert.test.tsx +94 -0
  515. package/src/components/alert/alert.tsx +89 -0
  516. package/src/components/alert/index.ts +8 -0
  517. package/src/components/alert/meta.ts +16 -0
  518. package/src/components/avatar/avatar.stories.tsx +58 -0
  519. package/src/components/avatar/avatar.test.tsx +64 -0
  520. package/src/components/avatar/avatar.tsx +68 -0
  521. package/src/components/avatar/index.ts +9 -0
  522. package/src/components/avatar/meta.ts +15 -0
  523. package/src/components/badge/badge.stories.tsx +68 -0
  524. package/src/components/badge/badge.test.tsx +61 -0
  525. package/src/components/badge/badge.tsx +54 -0
  526. package/src/components/badge/index.ts +1 -0
  527. package/src/components/badge/meta.ts +15 -0
  528. package/src/components/button/button.stories.tsx +128 -0
  529. package/src/components/button/button.test.tsx +224 -0
  530. package/src/components/button/button.tsx +114 -0
  531. package/src/components/button/index.ts +1 -0
  532. package/src/components/button/meta.ts +16 -0
  533. package/src/components/calendar/calendar.stories.tsx +105 -0
  534. package/src/components/calendar/calendar.test.tsx +255 -0
  535. package/src/components/calendar/calendar.tsx +115 -0
  536. package/src/components/calendar/index.ts +1 -0
  537. package/src/components/calendar/meta.ts +17 -0
  538. package/src/components/card/card.stories.tsx +61 -0
  539. package/src/components/card/card.test.tsx +66 -0
  540. package/src/components/card/card.tsx +81 -0
  541. package/src/components/card/index.ts +9 -0
  542. package/src/components/card/meta.ts +16 -0
  543. package/src/components/checkbox/checkbox.stories.tsx +124 -0
  544. package/src/components/checkbox/checkbox.test.tsx +121 -0
  545. package/src/components/checkbox/checkbox.tsx +66 -0
  546. package/src/components/checkbox/index.ts +1 -0
  547. package/src/components/checkbox/meta.ts +16 -0
  548. package/src/components/code-block/code-block.stories.tsx +62 -0
  549. package/src/components/code-block/code-block.test.tsx +139 -0
  550. package/src/components/code-block/code-block.tsx +188 -0
  551. package/src/components/code-block/index.ts +1 -0
  552. package/src/components/code-block/meta.ts +17 -0
  553. package/src/components/combobox/combobox.stories.tsx +171 -0
  554. package/src/components/combobox/combobox.test.tsx +429 -0
  555. package/src/components/combobox/combobox.tsx +544 -0
  556. package/src/components/combobox/index.ts +15 -0
  557. package/src/components/combobox/meta.ts +17 -0
  558. package/src/components/command/command.stories.tsx +152 -0
  559. package/src/components/command/command.test.tsx +380 -0
  560. package/src/components/command/command.tsx +482 -0
  561. package/src/components/command/index.ts +17 -0
  562. package/src/components/command/meta.ts +18 -0
  563. package/src/components/data-table/data-table.stories.tsx +151 -0
  564. package/src/components/data-table/data-table.test.tsx +288 -0
  565. package/src/components/data-table/data-table.tsx +485 -0
  566. package/src/components/data-table/index.ts +13 -0
  567. package/src/components/data-table/meta.ts +19 -0
  568. package/src/components/date-picker/date-picker.stories.tsx +103 -0
  569. package/src/components/date-picker/date-picker.test.tsx +205 -0
  570. package/src/components/date-picker/date-picker.tsx +198 -0
  571. package/src/components/date-picker/index.ts +6 -0
  572. package/src/components/date-picker/meta.ts +18 -0
  573. package/src/components/dialog/dialog.stories.tsx +140 -0
  574. package/src/components/dialog/dialog.test.tsx +186 -0
  575. package/src/components/dialog/dialog.tsx +132 -0
  576. package/src/components/dialog/index.ts +16 -0
  577. package/src/components/dialog/meta.ts +16 -0
  578. package/src/components/drawer/drawer.stories.tsx +111 -0
  579. package/src/components/drawer/drawer.test.tsx +187 -0
  580. package/src/components/drawer/drawer.tsx +293 -0
  581. package/src/components/drawer/index.ts +16 -0
  582. package/src/components/drawer/meta.ts +16 -0
  583. package/src/components/dropdown-menu/dropdown-menu.stories.tsx +128 -0
  584. package/src/components/dropdown-menu/dropdown-menu.test.tsx +321 -0
  585. package/src/components/dropdown-menu/dropdown-menu.tsx +242 -0
  586. package/src/components/dropdown-menu/index.ts +21 -0
  587. package/src/components/dropdown-menu/meta.ts +17 -0
  588. package/src/components/empty-state/empty-state.stories.tsx +70 -0
  589. package/src/components/empty-state/empty-state.test.tsx +97 -0
  590. package/src/components/empty-state/empty-state.tsx +92 -0
  591. package/src/components/empty-state/index.ts +9 -0
  592. package/src/components/empty-state/meta.ts +16 -0
  593. package/src/components/form/form.stories.tsx +144 -0
  594. package/src/components/form/form.test.tsx +203 -0
  595. package/src/components/form/form.tsx +221 -0
  596. package/src/components/form/index.ts +13 -0
  597. package/src/components/form/meta.ts +17 -0
  598. package/src/components/input/index.ts +1 -0
  599. package/src/components/input/input.stories.tsx +84 -0
  600. package/src/components/input/input.test.tsx +108 -0
  601. package/src/components/input/input.tsx +51 -0
  602. package/src/components/input/meta.ts +15 -0
  603. package/src/components/label/index.ts +1 -0
  604. package/src/components/label/label.stories.tsx +51 -0
  605. package/src/components/label/label.test.tsx +55 -0
  606. package/src/components/label/label.tsx +26 -0
  607. package/src/components/label/meta.ts +15 -0
  608. package/src/components/pagination/index.ts +10 -0
  609. package/src/components/pagination/meta.ts +17 -0
  610. package/src/components/pagination/pagination.stories.tsx +129 -0
  611. package/src/components/pagination/pagination.test.tsx +119 -0
  612. package/src/components/pagination/pagination.tsx +142 -0
  613. package/src/components/popover/index.ts +9 -0
  614. package/src/components/popover/meta.ts +18 -0
  615. package/src/components/popover/popover.stories.tsx +84 -0
  616. package/src/components/popover/popover.test.tsx +163 -0
  617. package/src/components/popover/popover.tsx +89 -0
  618. package/src/components/progress/index.ts +1 -0
  619. package/src/components/progress/meta.ts +17 -0
  620. package/src/components/progress/progress.stories.tsx +90 -0
  621. package/src/components/progress/progress.test.tsx +78 -0
  622. package/src/components/progress/progress.tsx +70 -0
  623. package/src/components/radio-group/index.ts +6 -0
  624. package/src/components/radio-group/meta.ts +16 -0
  625. package/src/components/radio-group/radio-group.stories.tsx +102 -0
  626. package/src/components/radio-group/radio-group.test.tsx +152 -0
  627. package/src/components/radio-group/radio-group.tsx +53 -0
  628. package/src/components/select/index.ts +14 -0
  629. package/src/components/select/meta.ts +16 -0
  630. package/src/components/select/select.stories.tsx +137 -0
  631. package/src/components/select/select.test.tsx +209 -0
  632. package/src/components/select/select.tsx +222 -0
  633. package/src/components/separator/index.ts +1 -0
  634. package/src/components/separator/meta.ts +15 -0
  635. package/src/components/separator/separator.stories.tsx +42 -0
  636. package/src/components/separator/separator.test.tsx +46 -0
  637. package/src/components/separator/separator.tsx +33 -0
  638. package/src/components/sheet/index.ts +14 -0
  639. package/src/components/sheet/meta.ts +16 -0
  640. package/src/components/sheet/sheet.stories.tsx +107 -0
  641. package/src/components/sheet/sheet.test.tsx +152 -0
  642. package/src/components/sheet/sheet.tsx +160 -0
  643. package/src/components/skeleton/index.ts +1 -0
  644. package/src/components/skeleton/meta.ts +15 -0
  645. package/src/components/skeleton/skeleton.stories.tsx +46 -0
  646. package/src/components/skeleton/skeleton.test.tsx +57 -0
  647. package/src/components/skeleton/skeleton.tsx +28 -0
  648. package/src/components/slider/index.ts +1 -0
  649. package/src/components/slider/meta.ts +19 -0
  650. package/src/components/slider/slider.stories.tsx +87 -0
  651. package/src/components/slider/slider.test.tsx +148 -0
  652. package/src/components/slider/slider.tsx +135 -0
  653. package/src/components/spinner/index.ts +1 -0
  654. package/src/components/spinner/meta.ts +15 -0
  655. package/src/components/spinner/spinner.stories.tsx +47 -0
  656. package/src/components/spinner/spinner.test.tsx +41 -0
  657. package/src/components/spinner/spinner.tsx +68 -0
  658. package/src/components/switch/index.ts +1 -0
  659. package/src/components/switch/meta.ts +15 -0
  660. package/src/components/switch/switch.stories.tsx +70 -0
  661. package/src/components/switch/switch.test.tsx +101 -0
  662. package/src/components/switch/switch.tsx +42 -0
  663. package/src/components/table/index.ts +11 -0
  664. package/src/components/table/meta.ts +17 -0
  665. package/src/components/table/table.stories.tsx +131 -0
  666. package/src/components/table/table.test.tsx +153 -0
  667. package/src/components/table/table.tsx +138 -0
  668. package/src/components/tabs/index.ts +11 -0
  669. package/src/components/tabs/meta.ts +17 -0
  670. package/src/components/tabs/tabs.stories.tsx +139 -0
  671. package/src/components/tabs/tabs.test.tsx +148 -0
  672. package/src/components/tabs/tabs.tsx +106 -0
  673. package/src/components/toast/index.ts +24 -0
  674. package/src/components/toast/meta.ts +18 -0
  675. package/src/components/toast/toast-store.ts +181 -0
  676. package/src/components/toast/toast.stories.tsx +167 -0
  677. package/src/components/toast/toast.test.tsx +306 -0
  678. package/src/components/toast/toast.tsx +241 -0
  679. package/src/components/tooltip/index.ts +8 -0
  680. package/src/components/tooltip/meta.ts +17 -0
  681. package/src/components/tooltip/tooltip.stories.tsx +89 -0
  682. package/src/components/tooltip/tooltip.test.tsx +120 -0
  683. package/src/components/tooltip/tooltip.tsx +58 -0
  684. package/src/index.ts +50 -0
  685. package/src/lib/styles.ts +26 -0
  686. package/src/lib/utils.test.ts +32 -0
  687. package/src/lib/utils.ts +24 -0
  688. package/src/registry/blocks.ts +30 -0
  689. package/src/registry/components.ts +114 -0
  690. package/src/registry/meta.test.ts +234 -0
  691. package/src/registry/schema.ts +58 -0
@@ -0,0 +1,346 @@
1
+ "use client";
2
+ import { focusRing } from "../../lib/styles.js";
3
+ import { cn } from "../../lib/utils.js";
4
+ import { Popover } from "radix-ui";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { createContext, useCallback, useContext, useEffect, useId, useMemo, useRef, useState } from "react";
7
+ //#region src/components/combobox/combobox.tsx
8
+ /**
9
+ * A searchable single-select.
10
+ *
11
+ * Implements the ARIA combobox pattern directly on a popover rather than
12
+ * depending on a command-menu package: the input owns `role="combobox"`, the
13
+ * list owns `role="listbox"`, and the active option is tracked with
14
+ * `aria-activedescendant` so focus never leaves the input while typing.
15
+ *
16
+ * Navigation reads the rendered options from the DOM rather than a registry,
17
+ * which keeps the active option correct as filtering adds and removes items —
18
+ * a registry has to be kept in sync with what is actually on screen, and drifts.
19
+ *
20
+ * This version is single-select and flat. Multi-select and grouping can be
21
+ * added without changing this API.
22
+ */
23
+ /** Default match: case-insensitive substring over the value and any keywords. */
24
+ function defaultComboboxFilter(search, haystack) {
25
+ const needle = search.trim().toLowerCase();
26
+ if (!needle) return true;
27
+ return haystack.some((entry) => entry.toLowerCase().includes(needle));
28
+ }
29
+ const ComboboxContext = createContext(null);
30
+ function useCombobox(component) {
31
+ const context = useContext(ComboboxContext);
32
+ if (!context) throw new Error(`${component} must be rendered inside <Combobox>.`);
33
+ return context;
34
+ }
35
+ function Combobox({ value: valueProp, defaultValue, onValueChange, open: openProp, defaultOpen = false, onOpenChange, filter = defaultComboboxFilter, children }) {
36
+ const uid = useId();
37
+ const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);
38
+ const value = valueProp === void 0 ? uncontrolledValue : valueProp;
39
+ const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);
40
+ const open = openProp === void 0 ? uncontrolledOpen : openProp;
41
+ const [search, setSearch] = useState("");
42
+ const [activeValue, setActiveValue] = useState(void 0);
43
+ const listRef = useRef(null);
44
+ const visibleValues = useRef(/* @__PURE__ */ new Set());
45
+ const [visibleCount, setVisibleCount] = useState(0);
46
+ const registerVisible = useCallback((optionValue, visible) => {
47
+ const set = visibleValues.current;
48
+ const had = set.has(optionValue);
49
+ if (visible && !had) set.add(optionValue);
50
+ else if (!visible && had) set.delete(optionValue);
51
+ else return;
52
+ setVisibleCount(set.size);
53
+ }, []);
54
+ const setOpen = useCallback((next) => {
55
+ if (openProp === void 0) setUncontrolledOpen(next);
56
+ onOpenChange?.(next);
57
+ if (!next) {
58
+ setSearch("");
59
+ setActiveValue(void 0);
60
+ }
61
+ }, [openProp, onOpenChange]);
62
+ const select = useCallback((next) => {
63
+ if (valueProp === void 0) setUncontrolledValue(next);
64
+ onValueChange?.(next);
65
+ setOpen(false);
66
+ }, [
67
+ valueProp,
68
+ onValueChange,
69
+ setOpen
70
+ ]);
71
+ const context = useMemo(() => ({
72
+ open,
73
+ setOpen,
74
+ search,
75
+ setSearch,
76
+ value,
77
+ select,
78
+ activeValue,
79
+ setActiveValue,
80
+ filter,
81
+ listId: `${uid}-list`,
82
+ inputId: `${uid}-input`,
83
+ optionId: (optionValue) => `${uid}-option-${optionValue.replace(/\s+/g, "-").toLowerCase()}`,
84
+ listRef,
85
+ registerVisible,
86
+ visibleCount
87
+ }), [
88
+ open,
89
+ setOpen,
90
+ search,
91
+ value,
92
+ select,
93
+ activeValue,
94
+ filter,
95
+ uid,
96
+ registerVisible,
97
+ visibleCount
98
+ ]);
99
+ return /* @__PURE__ */ jsx(ComboboxContext.Provider, {
100
+ value: context,
101
+ children: /* @__PURE__ */ jsx(Popover.Root, {
102
+ open,
103
+ onOpenChange: setOpen,
104
+ children
105
+ })
106
+ });
107
+ }
108
+ function ComboboxTrigger({ className, placeholder = "Select…", children, ...props }) {
109
+ const { value, open } = useCombobox("ComboboxTrigger");
110
+ return /* @__PURE__ */ jsx(Popover.Trigger, {
111
+ asChild: true,
112
+ children: /* @__PURE__ */ jsxs("button", {
113
+ type: "button",
114
+ "data-slot": "combobox-trigger",
115
+ "aria-expanded": open,
116
+ className: cn("flex h-9 w-full items-center justify-between gap-2 rounded-md border border-input bg-background", "px-3 text-sm shadow-xs transition-[border-color,box-shadow] duration-[var(--duration-fast)]", "focus-visible:border-ring", "disabled:cursor-not-allowed disabled:opacity-55", "aria-invalid:border-destructive", focusRing, className),
117
+ ...props,
118
+ children: [/* @__PURE__ */ jsx("span", {
119
+ className: cn("truncate", !value && "text-muted-foreground"),
120
+ children: children ?? value ?? placeholder
121
+ }), /* @__PURE__ */ jsx("svg", {
122
+ viewBox: "0 0 24 24",
123
+ fill: "none",
124
+ "aria-hidden": "true",
125
+ className: "size-4 shrink-0 opacity-60",
126
+ children: /* @__PURE__ */ jsx("path", {
127
+ d: "m7 10 5 5 5-5",
128
+ stroke: "currentColor",
129
+ strokeWidth: "2",
130
+ strokeLinecap: "round",
131
+ strokeLinejoin: "round"
132
+ })
133
+ })]
134
+ })
135
+ });
136
+ }
137
+ function ComboboxContent({ className, align = "start", sideOffset = 6, label = "Search options", children, ...props }) {
138
+ return /* @__PURE__ */ jsx(Popover.Portal, { children: /* @__PURE__ */ jsx(Popover.Content, {
139
+ "data-slot": "combobox-content",
140
+ align,
141
+ sideOffset,
142
+ "aria-label": label,
143
+ onOpenAutoFocus: (event) => {
144
+ event.preventDefault();
145
+ },
146
+ className: cn("z-[var(--z-popover)] w-[var(--radix-popover-trigger-width)] min-w-48 overflow-hidden", "rounded-lg border border-border bg-popover p-0 text-popover-foreground shadow-lg", "origin-[var(--radix-popover-content-transform-origin)]", "data-[state=closed]:animate-float-out data-[state=open]:animate-float-in", className),
147
+ ...props,
148
+ children
149
+ }) });
150
+ }
151
+ /** Options currently rendered, in DOM order and excluding disabled ones. */
152
+ function visibleOptions(list) {
153
+ if (!list) return [];
154
+ return Array.from(list.querySelectorAll("[role=\"option\"]:not([data-disabled])"));
155
+ }
156
+ function ComboboxInput({ className, ...props }) {
157
+ const { search, setSearch, activeValue, setActiveValue, select, setOpen, listId, inputId, optionId, listRef } = useCombobox("ComboboxInput");
158
+ const inputRef = useRef(null);
159
+ useEffect(() => {
160
+ inputRef.current?.focus();
161
+ }, []);
162
+ const move = useCallback((delta) => {
163
+ const options = visibleOptions(listRef.current);
164
+ if (options.length === 0) return;
165
+ const currentIndex = options.findIndex((option) => option.dataset.value === activeValue);
166
+ let nextIndex;
167
+ if (delta === "first") nextIndex = 0;
168
+ else if (delta === "last") nextIndex = options.length - 1;
169
+ else if (currentIndex === -1) nextIndex = delta > 0 ? 0 : options.length - 1;
170
+ else nextIndex = (currentIndex + delta + options.length) % options.length;
171
+ const next = options[nextIndex];
172
+ if (!next) return;
173
+ setActiveValue(next.dataset.value);
174
+ next.scrollIntoView({ block: "nearest" });
175
+ }, [
176
+ activeValue,
177
+ listRef,
178
+ setActiveValue
179
+ ]);
180
+ function handleKeyDown(event) {
181
+ switch (event.key) {
182
+ case "ArrowDown":
183
+ event.preventDefault();
184
+ move(1);
185
+ break;
186
+ case "ArrowUp":
187
+ event.preventDefault();
188
+ move(-1);
189
+ break;
190
+ case "Home":
191
+ event.preventDefault();
192
+ move("first");
193
+ break;
194
+ case "End":
195
+ event.preventDefault();
196
+ move("last");
197
+ break;
198
+ case "Enter":
199
+ if (activeValue === void 0) return;
200
+ event.preventDefault();
201
+ select(activeValue);
202
+ break;
203
+ case "Escape":
204
+ event.preventDefault();
205
+ setOpen(false);
206
+ }
207
+ }
208
+ return /* @__PURE__ */ jsxs("div", {
209
+ className: "flex items-center gap-2 border-b border-border px-3",
210
+ children: [/* @__PURE__ */ jsxs("svg", {
211
+ viewBox: "0 0 24 24",
212
+ fill: "none",
213
+ "aria-hidden": "true",
214
+ className: "size-4 shrink-0 opacity-55",
215
+ children: [/* @__PURE__ */ jsx("circle", {
216
+ cx: "11",
217
+ cy: "11",
218
+ r: "7",
219
+ stroke: "currentColor",
220
+ strokeWidth: "2"
221
+ }), /* @__PURE__ */ jsx("path", {
222
+ d: "m20 20-3.5-3.5",
223
+ stroke: "currentColor",
224
+ strokeWidth: "2",
225
+ strokeLinecap: "round"
226
+ })]
227
+ }), /* @__PURE__ */ jsx("input", {
228
+ ref: inputRef,
229
+ id: inputId,
230
+ "data-slot": "combobox-input",
231
+ type: "text",
232
+ role: "combobox",
233
+ autoComplete: "off",
234
+ "aria-expanded": "true",
235
+ "aria-controls": listId,
236
+ "aria-autocomplete": "list",
237
+ "aria-activedescendant": activeValue ? optionId(activeValue) : void 0,
238
+ value: search,
239
+ onChange: (event) => {
240
+ setSearch(event.target.value);
241
+ setActiveValue(void 0);
242
+ },
243
+ onKeyDown: handleKeyDown,
244
+ className: cn("h-10 w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground", className),
245
+ ...props
246
+ })]
247
+ });
248
+ }
249
+ function ComboboxList({ className, ...props }) {
250
+ const { listId, listRef } = useCombobox("ComboboxList");
251
+ return /* @__PURE__ */ jsx("div", {
252
+ ref: listRef,
253
+ id: listId,
254
+ role: "listbox",
255
+ "data-slot": "combobox-list",
256
+ className: cn("max-h-64 overflow-y-auto overscroll-contain p-1", className),
257
+ ...props
258
+ });
259
+ }
260
+ function ComboboxItem({ className, value, keywords, disabled, children, ...props }) {
261
+ const { search, filter, value: selectedValue, activeValue, setActiveValue, select, optionId, registerVisible } = useCombobox("ComboboxItem");
262
+ const visible = filter(search, useMemo(() => [
263
+ value,
264
+ ...keywords ?? [],
265
+ typeof children === "string" ? children : ""
266
+ ], [
267
+ value,
268
+ keywords,
269
+ children
270
+ ]));
271
+ const selected = selectedValue === value;
272
+ const active = activeValue === value;
273
+ useEffect(() => {
274
+ registerVisible(value, visible && !disabled);
275
+ return () => {
276
+ registerVisible(value, false);
277
+ };
278
+ }, [
279
+ registerVisible,
280
+ value,
281
+ visible,
282
+ disabled
283
+ ]);
284
+ if (!visible) return null;
285
+ return /* @__PURE__ */ jsxs("div", {
286
+ id: optionId(value),
287
+ role: "option",
288
+ "data-slot": "combobox-item",
289
+ "data-value": value,
290
+ "data-active": active || void 0,
291
+ "data-disabled": disabled || void 0,
292
+ "aria-selected": selected,
293
+ "aria-disabled": disabled || void 0,
294
+ tabIndex: -1,
295
+ onPointerMove: () => {
296
+ if (!disabled) setActiveValue(value);
297
+ },
298
+ onMouseDown: (event) => {
299
+ event.preventDefault();
300
+ },
301
+ onClick: () => {
302
+ if (!disabled) select(value);
303
+ },
304
+ onKeyDown: (event) => {
305
+ if (disabled) return;
306
+ if (event.key === "Enter" || event.key === " ") {
307
+ event.preventDefault();
308
+ select(value);
309
+ }
310
+ },
311
+ className: cn("relative flex cursor-default items-center gap-2 rounded-md py-1.5 pr-8 pl-2 text-sm outline-none select-none", "transition-colors duration-[var(--duration-instant)]", "data-[active]:bg-accent data-[active]:text-accent-foreground", "data-[disabled]:pointer-events-none data-[disabled]:opacity-55", "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
312
+ ...props,
313
+ children: [children ?? value, selected ? /* @__PURE__ */ jsx("span", {
314
+ className: "absolute right-2 grid size-4 place-items-center",
315
+ children: /* @__PURE__ */ jsx("svg", {
316
+ viewBox: "0 0 24 24",
317
+ fill: "none",
318
+ "aria-hidden": "true",
319
+ className: "size-3.5",
320
+ children: /* @__PURE__ */ jsx("path", {
321
+ d: "m5 13 4 4L19 7",
322
+ stroke: "currentColor",
323
+ strokeWidth: "2.5",
324
+ strokeLinecap: "round",
325
+ strokeLinejoin: "round"
326
+ })
327
+ })
328
+ }) : null]
329
+ });
330
+ }
331
+ /** Shown only when the filter leaves nothing. */
332
+ function ComboboxEmpty({ className, children, ...props }) {
333
+ const { visibleCount } = useCombobox("ComboboxEmpty");
334
+ if (visibleCount > 0) return null;
335
+ return /* @__PURE__ */ jsx("div", {
336
+ "data-slot": "combobox-empty",
337
+ role: "presentation",
338
+ className: cn("px-3 py-6 text-center text-sm text-muted-foreground", className),
339
+ ...props,
340
+ children: children ?? "No results found."
341
+ });
342
+ }
343
+ //#endregion
344
+ export { Combobox, ComboboxContent, ComboboxEmpty, ComboboxInput, ComboboxItem, ComboboxList, ComboboxTrigger, defaultComboboxFilter };
345
+
346
+ //# sourceMappingURL=combobox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combobox.js","names":["PopoverPrimitive"],"sources":["../../../src/components/combobox/combobox.tsx"],"sourcesContent":["\"use client\";\n\nimport { Popover as PopoverPrimitive } from \"radix-ui\";\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithRef,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from \"react\";\n\nimport { focusRing } from \"@/lib/styles\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * A searchable single-select.\n *\n * Implements the ARIA combobox pattern directly on a popover rather than\n * depending on a command-menu package: the input owns `role=\"combobox\"`, the\n * list owns `role=\"listbox\"`, and the active option is tracked with\n * `aria-activedescendant` so focus never leaves the input while typing.\n *\n * Navigation reads the rendered options from the DOM rather than a registry,\n * which keeps the active option correct as filtering adds and removes items —\n * a registry has to be kept in sync with what is actually on screen, and drifts.\n *\n * This version is single-select and flat. Multi-select and grouping can be\n * added without changing this API.\n */\n\n/** Default match: case-insensitive substring over the value and any keywords. */\nexport function defaultComboboxFilter(search: string, haystack: string[]): boolean {\n const needle = search.trim().toLowerCase();\n if (!needle) return true;\n return haystack.some((entry) => entry.toLowerCase().includes(needle));\n}\n\ninterface ComboboxContextValue {\n open: boolean;\n setOpen: (open: boolean) => void;\n search: string;\n setSearch: (search: string) => void;\n value: string | undefined;\n select: (value: string) => void;\n activeValue: string | undefined;\n setActiveValue: (value: string | undefined) => void;\n filter: (search: string, haystack: string[]) => boolean;\n listId: string;\n inputId: string;\n optionId: (value: string) => string;\n listRef: React.RefObject<HTMLDivElement | null>;\n registerVisible: (value: string, visible: boolean) => void;\n visibleCount: number;\n}\n\nconst ComboboxContext = createContext<ComboboxContextValue | null>(null);\n\nfunction useCombobox(component: string): ComboboxContextValue {\n const context = useContext(ComboboxContext);\n if (!context) {\n throw new Error(`${component} must be rendered inside <Combobox>.`);\n }\n return context;\n}\n\nexport interface ComboboxProps {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Overrides how a search string is matched against an option. */\n filter?: (search: string, haystack: string[]) => boolean;\n children?: ReactNode;\n}\n\nexport function Combobox({\n value: valueProp,\n defaultValue,\n onValueChange,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n filter = defaultComboboxFilter,\n children,\n}: ComboboxProps) {\n const uid = useId();\n\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);\n const value = valueProp === undefined ? uncontrolledValue : valueProp;\n\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const open = openProp === undefined ? uncontrolledOpen : openProp;\n\n const [search, setSearch] = useState(\"\");\n const [activeValue, setActiveValue] = useState<string | undefined>(undefined);\n const listRef = useRef<HTMLDivElement | null>(null);\n\n // Counted rather than listed: the empty state only needs to know whether\n // anything survived the filter.\n const visibleValues = useRef(new Set<string>());\n const [visibleCount, setVisibleCount] = useState(0);\n\n const registerVisible = useCallback((optionValue: string, visible: boolean) => {\n const set = visibleValues.current;\n const had = set.has(optionValue);\n if (visible && !had) set.add(optionValue);\n else if (!visible && had) set.delete(optionValue);\n else return;\n setVisibleCount(set.size);\n }, []);\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (openProp === undefined) setUncontrolledOpen(next);\n onOpenChange?.(next);\n // Reopening should start from a clean search rather than resuming a\n // half-typed query the user has forgotten about.\n if (!next) {\n setSearch(\"\");\n setActiveValue(undefined);\n }\n },\n [openProp, onOpenChange],\n );\n\n const select = useCallback(\n (next: string) => {\n if (valueProp === undefined) setUncontrolledValue(next);\n onValueChange?.(next);\n setOpen(false);\n },\n [valueProp, onValueChange, setOpen],\n );\n\n const context = useMemo<ComboboxContextValue>(\n () => ({\n open,\n setOpen,\n search,\n setSearch,\n value,\n select,\n activeValue,\n setActiveValue,\n filter,\n listId: `${uid}-list`,\n inputId: `${uid}-input`,\n optionId: (optionValue: string) =>\n `${uid}-option-${optionValue.replace(/\\s+/g, \"-\").toLowerCase()}`,\n listRef,\n registerVisible,\n visibleCount,\n }),\n [\n open,\n setOpen,\n search,\n value,\n select,\n activeValue,\n filter,\n uid,\n registerVisible,\n visibleCount,\n ],\n );\n\n return (\n <ComboboxContext.Provider value={context}>\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n {children}\n </PopoverPrimitive.Root>\n </ComboboxContext.Provider>\n );\n}\n\nexport interface ComboboxTriggerProps extends ComponentPropsWithRef<\"button\"> {\n /** Shown when nothing is selected. */\n placeholder?: string;\n}\n\nexport function ComboboxTrigger({\n className,\n placeholder = \"Select…\",\n children,\n ...props\n}: ComboboxTriggerProps) {\n const { value, open } = useCombobox(\"ComboboxTrigger\");\n\n return (\n <PopoverPrimitive.Trigger asChild>\n <button\n type=\"button\"\n data-slot=\"combobox-trigger\"\n aria-expanded={open}\n className={cn(\n \"flex h-9 w-full items-center justify-between gap-2 rounded-md border border-input bg-background\",\n \"px-3 text-sm shadow-xs transition-[border-color,box-shadow] duration-[var(--duration-fast)]\",\n \"focus-visible:border-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-55\",\n \"aria-invalid:border-destructive\",\n focusRing,\n className,\n )}\n {...props}\n >\n <span className={cn(\"truncate\", !value && \"text-muted-foreground\")}>\n {children ?? value ?? placeholder}\n </span>\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n className=\"size-4 shrink-0 opacity-60\"\n >\n <path\n d=\"m7 10 5 5 5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n </PopoverPrimitive.Trigger>\n );\n}\n\nexport interface ComboboxContentProps extends ComponentPropsWithRef<\n typeof PopoverPrimitive.Content\n> {\n /** Names the popover, which carries role=\"dialog\". */\n label?: string;\n}\n\nexport function ComboboxContent({\n className,\n align = \"start\",\n sideOffset = 6,\n label = \"Search options\",\n children,\n ...props\n}: ComboboxContentProps) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"combobox-content\"\n align={align}\n sideOffset={sideOffset}\n aria-label={label}\n // Focus belongs in the search input, which the input claims on mount.\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n }}\n className={cn(\n \"z-[var(--z-popover)] w-[var(--radix-popover-trigger-width)] min-w-48 overflow-hidden\",\n \"rounded-lg border border-border bg-popover p-0 text-popover-foreground shadow-lg\",\n \"origin-[var(--radix-popover-content-transform-origin)]\",\n \"data-[state=closed]:animate-float-out data-[state=open]:animate-float-in\",\n className,\n )}\n {...props}\n >\n {children}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n );\n}\n\n/** Options currently rendered, in DOM order and excluding disabled ones. */\nfunction visibleOptions(list: HTMLElement | null): HTMLElement[] {\n if (!list) return [];\n return Array.from(list.querySelectorAll<HTMLElement>('[role=\"option\"]:not([data-disabled])'));\n}\n\nexport type ComboboxInputProps = Omit<ComponentPropsWithRef<\"input\">, \"value\" | \"onChange\">;\n\nexport function ComboboxInput({ className, ...props }: ComboboxInputProps) {\n const {\n search,\n setSearch,\n activeValue,\n setActiveValue,\n select,\n setOpen,\n listId,\n inputId,\n optionId,\n listRef,\n } = useCombobox(\"ComboboxInput\");\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n const move = useCallback(\n (delta: number | \"first\" | \"last\") => {\n const options = visibleOptions(listRef.current);\n if (options.length === 0) return;\n\n const currentIndex = options.findIndex((option) => option.dataset.value === activeValue);\n\n let nextIndex: number;\n if (delta === \"first\") nextIndex = 0;\n else if (delta === \"last\") nextIndex = options.length - 1;\n else if (currentIndex === -1) nextIndex = delta > 0 ? 0 : options.length - 1;\n // Wraps, so holding an arrow key never dead-ends at the edge of the list.\n else nextIndex = (currentIndex + delta + options.length) % options.length;\n\n const next = options[nextIndex];\n if (!next) return;\n setActiveValue(next.dataset.value);\n next.scrollIntoView({ block: \"nearest\" });\n },\n [activeValue, listRef, setActiveValue],\n );\n\n function handleKeyDown(event: ReactKeyboardEvent<HTMLInputElement>) {\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n move(1);\n break;\n case \"ArrowUp\":\n event.preventDefault();\n move(-1);\n break;\n case \"Home\":\n event.preventDefault();\n move(\"first\");\n break;\n case \"End\":\n event.preventDefault();\n move(\"last\");\n break;\n case \"Enter\": {\n if (activeValue === undefined) return;\n event.preventDefault();\n select(activeValue);\n break;\n }\n case \"Escape\":\n event.preventDefault();\n setOpen(false);\n break;\n default:\n break;\n }\n }\n\n return (\n <div className=\"flex items-center gap-2 border-b border-border px-3\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n className=\"size-4 shrink-0 opacity-55\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"m20 20-3.5-3.5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n <input\n ref={inputRef}\n id={inputId}\n data-slot=\"combobox-input\"\n type=\"text\"\n role=\"combobox\"\n autoComplete=\"off\"\n aria-expanded=\"true\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeValue ? optionId(activeValue) : undefined}\n value={search}\n onChange={(event) => {\n setSearch(event.target.value);\n // The previous active option may have just been filtered out.\n setActiveValue(undefined);\n }}\n onKeyDown={handleKeyDown}\n className={cn(\n \"h-10 w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground\",\n className,\n )}\n {...props}\n />\n </div>\n );\n}\n\nexport function ComboboxList({ className, ...props }: ComponentPropsWithRef<\"div\">) {\n const { listId, listRef } = useCombobox(\"ComboboxList\");\n\n return (\n <div\n ref={listRef}\n id={listId}\n role=\"listbox\"\n data-slot=\"combobox-list\"\n className={cn(\"max-h-64 overflow-y-auto overscroll-contain p-1\", className)}\n {...props}\n />\n );\n}\n\nexport interface ComboboxItemProps extends Omit<\n ComponentPropsWithRef<\"div\">,\n \"onSelect\" | \"children\"\n> {\n /** The value reported by onValueChange, and the primary search term. */\n value: string;\n /** Extra search terms that are not shown, such as synonyms or an id. */\n keywords?: string[];\n disabled?: boolean;\n children?: ReactNode;\n}\n\nexport function ComboboxItem({\n className,\n value,\n keywords,\n disabled,\n children,\n ...props\n}: ComboboxItemProps) {\n const {\n search,\n filter,\n value: selectedValue,\n activeValue,\n setActiveValue,\n select,\n optionId,\n registerVisible,\n } = useCombobox(\"ComboboxItem\");\n\n // A string child is the visible label, so it is searchable for free. Richer\n // children cannot be read purely, so those pass `keywords` instead.\n const haystack = useMemo(\n () => [value, ...(keywords ?? []), typeof children === \"string\" ? children : \"\"],\n [value, keywords, children],\n );\n\n const visible = filter(search, haystack);\n const selected = selectedValue === value;\n const active = activeValue === value;\n\n useEffect(() => {\n registerVisible(value, visible && !disabled);\n return () => {\n registerVisible(value, false);\n };\n }, [registerVisible, value, visible, disabled]);\n\n if (!visible) return null;\n\n return (\n <div\n id={optionId(value)}\n role=\"option\"\n data-slot=\"combobox-item\"\n data-value={value}\n data-active={active || undefined}\n data-disabled={disabled || undefined}\n aria-selected={selected}\n aria-disabled={disabled || undefined}\n // Programmatically focusable but out of the tab order: in an\n // aria-activedescendant listbox the input keeps real focus and options are\n // only virtually focused, so they must never become tab stops.\n tabIndex={-1}\n onPointerMove={() => {\n if (!disabled) setActiveValue(value);\n }}\n onMouseDown={(event) => {\n // Without this, pressing on an option blurs the search input, which\n // breaks aria-activedescendant and can dismiss the popover before the\n // click ever lands.\n event.preventDefault();\n }}\n onClick={() => {\n if (!disabled) select(value);\n }}\n onKeyDown={(event) => {\n // Reachable only if a consumer focuses an option directly; the normal\n // path is Enter on the input, handled by ComboboxInput.\n if (disabled) return;\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n select(value);\n }\n }}\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-md py-1.5 pr-8 pl-2 text-sm outline-none select-none\",\n \"transition-colors duration-[var(--duration-instant)]\",\n \"data-[active]:bg-accent data-[active]:text-accent-foreground\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-55\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n {children ?? value}\n {selected ? (\n <span className=\"absolute right-2 grid size-4 place-items-center\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" className=\"size-3.5\">\n <path\n d=\"m5 13 4 4L19 7\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n ) : null}\n </div>\n );\n}\n\n/** Shown only when the filter leaves nothing. */\nexport function ComboboxEmpty({ className, children, ...props }: ComponentPropsWithRef<\"div\">) {\n const { visibleCount } = useCombobox(\"ComboboxEmpty\");\n if (visibleCount > 0) return null;\n\n return (\n <div\n data-slot=\"combobox-empty\"\n role=\"presentation\"\n className={cn(\"px-3 py-6 text-center text-sm text-muted-foreground\", className)}\n {...props}\n >\n {children ?? \"No results found.\"}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Combobox, ComboboxContent, ComboboxContentProps, ComboboxEmpty, ComboboxInput, ComboboxInputProps, ComboboxItem, ComboboxItemProps, ComboboxList, ComboboxProps, ComboboxTrigger, ComboboxTriggerProps, defaultComboboxFilter } from "./combobox.js";
2
+ export { Combobox, ComboboxContent, type ComboboxContentProps, ComboboxEmpty, ComboboxInput, type ComboboxInputProps, ComboboxItem, type ComboboxItemProps, ComboboxList, type ComboboxProps, ComboboxTrigger, type ComboboxTriggerProps, defaultComboboxFilter };
@@ -0,0 +1,2 @@
1
+ import { Combobox, ComboboxContent, ComboboxEmpty, ComboboxInput, ComboboxItem, ComboboxList, ComboboxTrigger, defaultComboboxFilter } from "./combobox.js";
2
+ export { Combobox, ComboboxContent, ComboboxEmpty, ComboboxInput, ComboboxItem, ComboboxList, ComboboxTrigger, defaultComboboxFilter };
@@ -0,0 +1,17 @@
1
+ import { defineMeta } from "../../registry/schema.js";
2
+ //#region src/components/combobox/meta.ts
3
+ const meta = defineMeta({
4
+ name: "combobox",
5
+ title: "Combobox",
6
+ description: "A searchable single-select built on the ARIA combobox pattern.",
7
+ category: "form",
8
+ status: "stable",
9
+ dependencies: ["radix-ui"],
10
+ registryDependencies: [],
11
+ files: ["combobox.tsx"],
12
+ a11y: "The input owns role=\"combobox\" with aria-expanded, aria-controls and aria-autocomplete; the list owns role=\"listbox\" and each option role=\"option\" with aria-selected. Focus stays in the input while arrow keys move aria-activedescendant, so typing is never interrupted. Arrow navigation wraps, Home/End jump, Enter selects the active option and Escape closes."
13
+ });
14
+ //#endregion
15
+ export { meta };
16
+
17
+ //# sourceMappingURL=meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.js","names":[],"sources":["../../../src/components/combobox/meta.ts"],"sourcesContent":["import { defineMeta } from \"@/registry/schema\";\n\nexport const meta = defineMeta({\n name: \"combobox\",\n title: \"Combobox\",\n description: \"A searchable single-select built on the ARIA combobox pattern.\",\n category: \"form\",\n status: \"stable\",\n dependencies: [\"radix-ui\"],\n registryDependencies: [],\n files: [\"combobox.tsx\"],\n a11y:\n 'The input owns role=\"combobox\" with aria-expanded, aria-controls and aria-autocomplete; ' +\n 'the list owns role=\"listbox\" and each option role=\"option\" with aria-selected. Focus stays ' +\n \"in the input while arrow keys move aria-activedescendant, so typing is never interrupted. \" +\n \"Arrow navigation wraps, Home/End jump, Enter selects the active option and Escape closes.\",\n});\n"],"mappings":";;AAEA,MAAa,OAAO,WAAW;CAC7B,MAAM;CACN,OAAO;CACP,aAAa;CACb,UAAU;CACV,QAAQ;CACR,cAAc,CAAC,UAAU;CACzB,sBAAsB,CAAC;CACvB,OAAO,CAAC,cAAc;CACtB,MACE;AAIJ,CAAC"}
@@ -0,0 +1,65 @@
1
+ import { Dialog } from "../dialog/dialog.js";
2
+ import "../dialog/index.js";
3
+ import { ComponentPropsWithRef, ReactNode } from "react";
4
+ //#region src/components/command/command.d.ts
5
+ /**
6
+ * A searchable list of commands.
7
+ *
8
+ * Shares its navigation model with Combobox — the input owns `role="combobox"`,
9
+ * the list owns `role="listbox"`, and the active item is tracked with
10
+ * `aria-activedescendant` so focus never leaves the input. Ordering is read
11
+ * from the DOM rather than a registry, which stays correct as filtering adds
12
+ * and removes items.
13
+ *
14
+ * Unlike Combobox this has no selected value: items run actions. It also
15
+ * supports groups, and a group whose items have all been filtered out hides its
16
+ * own heading rather than leaving a label over nothing.
17
+ */
18
+ /** Default match: case-insensitive substring over the value and any keywords. */
19
+ declare function defaultCommandFilter(search: string, haystack: string[]): boolean;
20
+ interface CommandProps extends Omit<ComponentPropsWithRef<"div">, "onSelect"> {
21
+ /** Overrides how a search string is matched against an item. */
22
+ filter?: (search: string, haystack: string[]) => boolean;
23
+ /** Controls the search text. */
24
+ value?: string;
25
+ onValueChange?: (search: string) => void;
26
+ }
27
+ declare function Command({ className, filter, value, onValueChange, ...props }: CommandProps): import("react").JSX.Element;
28
+ type CommandInputProps = Omit<ComponentPropsWithRef<"input">, "value" | "onChange">;
29
+ declare function CommandInput({ className, ...props }: CommandInputProps): import("react").JSX.Element;
30
+ declare function CommandList({ className, ...props }: ComponentPropsWithRef<"div">): import("react").JSX.Element;
31
+ declare function CommandEmpty({ className, children, ...props }: ComponentPropsWithRef<"div">): import("react").JSX.Element | null;
32
+ interface CommandGroupProps extends ComponentPropsWithRef<"div"> {
33
+ heading?: ReactNode;
34
+ }
35
+ declare function CommandGroup({ className, heading, children, ...props }: CommandGroupProps): import("react").JSX.Element;
36
+ interface CommandItemProps extends Omit<ComponentPropsWithRef<"div">, "onSelect" | "children"> {
37
+ /** Identifies the item, and is the primary search term. */
38
+ value: string;
39
+ /** Extra search terms that are not shown. */
40
+ keywords?: string[];
41
+ disabled?: boolean;
42
+ onSelect?: (value: string) => void;
43
+ children?: ReactNode;
44
+ }
45
+ declare function CommandItem({ className, value, keywords, disabled, onSelect, children, ...props }: CommandItemProps): import("react").JSX.Element | null;
46
+ declare function CommandSeparator({ className, ...props }: ComponentPropsWithRef<"div">): import("react").JSX.Element;
47
+ /** Keyboard hint. Decorative — bind the shortcut for real at the app level. */
48
+ declare function CommandShortcut({ className, ...props }: ComponentPropsWithRef<"span">): import("react").JSX.Element;
49
+ interface CommandDialogProps extends ComponentPropsWithRef<typeof Dialog> {
50
+ /** Names the dialog for assistive technology. Visually hidden by default. */
51
+ title?: string;
52
+ description?: string;
53
+ className?: string;
54
+ }
55
+ /**
56
+ * The palette in a modal, for the ⌘K pattern.
57
+ *
58
+ * The title and description are rendered but visually hidden: a dialog needs an
59
+ * accessible name whether or not the design shows one, and leaving it out is
60
+ * the most common defect in hand-rolled command menus.
61
+ */
62
+ declare function CommandDialog({ title, description, children, className, ...props }: CommandDialogProps): import("react").JSX.Element;
63
+ //#endregion
64
+ export { Command, CommandDialog, CommandDialogProps, CommandEmpty, CommandGroup, CommandGroupProps, CommandInput, CommandInputProps, CommandItem, CommandItemProps, CommandList, CommandProps, CommandSeparator, CommandShortcut, defaultCommandFilter };
65
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","names":[],"sources":["../../../src/components/command/command.tsx"],"mappings":";;;;;;;;;;;;;;;;;;iBAwCgB,qBAAqB,gBAAgB;UAoDpC,qBAAqB,KAAK;;EAEzC,UAAU,gBAAgB;;EAE1B;EACA,iBAAiB;;iBAGH,UACd,WACA,QACA,OACA,kBACG,SACF,+BAAY,IAAA;KAsDH,oBAAoB,KAAK;iBAErB,eAAe,cAAc,SAAS,oCAAiB,IAAA;iBAwGvD,cAAc,cAAc,SAAS,+CAA4B,IAAA;iBAejE,eAAe,WAAW,aAAa,SAAS,+CAA4B,IAAA;UAgB3E,0BAA0B;EACzC,UAAU;;iBAGI,eAAe,WAAW,SAAS,aAAa,SAAS,oCAAiB,IAAA;UA8BzE,yBAAyB,KACxC;;EAIA;;EAEA;EACA;EACA,YAAY;EACZ,WAAW;;iBAGG,cACd,WACA,OACA,UACA,UACA,UACA,aACG,SACF,mCAAgB,IAAA;iBAuEH,mBAAmB,cAAc,SAAS,+CAA4B,IAAA;;iBAYtE,kBAAkB,cAAc,SAAS,gDAA6B,IAAA;UAWrE,2BAA2B,6BAA6B;;EAEvE;EACA;EACA;;;;;;;;;iBAUc,gBACd,OACA,aACA,UACA,cACG,SACF,qCAAkB,IAAA"}