@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,89 @@
1
+ "use client";
2
+
3
+ import { Popover as PopoverPrimitive } from "radix-ui";
4
+ import { useEffect, type ComponentPropsWithRef } from "react";
5
+
6
+ import { cn } from "@/lib/utils";
7
+
8
+ /**
9
+ * Rich floating content anchored to a trigger.
10
+ *
11
+ * Non-modal by default: the page stays interactive and focus is not trapped,
12
+ * which is right for a surface the user can simply click away from. Pass
13
+ * `modal` when the popover contains a task that must be completed or abandoned.
14
+ *
15
+ * The content carries `role="dialog"`, so it MUST have an accessible name via
16
+ * `aria-label` or `aria-labelledby`. Without one it is announced as an unnamed
17
+ * dialog, which tells a screen reader user nothing about what just opened.
18
+ */
19
+ export const Popover = PopoverPrimitive.Root;
20
+ export const PopoverTrigger = PopoverPrimitive.Trigger;
21
+ export const PopoverAnchor = PopoverPrimitive.Anchor;
22
+ export const PopoverClose = PopoverPrimitive.Close;
23
+
24
+ export type PopoverContentProps = ComponentPropsWithRef<typeof PopoverPrimitive.Content>;
25
+
26
+ export function PopoverContent({
27
+ className,
28
+ align = "center",
29
+ sideOffset = 8,
30
+ ...props
31
+ }: PopoverContentProps) {
32
+ useMissingLabelWarning(props["aria-label"], props["aria-labelledby"]);
33
+
34
+ return (
35
+ <PopoverPrimitive.Portal>
36
+ <PopoverPrimitive.Content
37
+ data-slot="popover-content"
38
+ align={align}
39
+ sideOffset={sideOffset}
40
+ className={cn(
41
+ "z-[var(--z-popover)] w-72 rounded-lg border border-border bg-popover p-4 text-popover-foreground shadow-lg",
42
+ "max-h-[var(--radix-popover-content-available-height)] outline-none",
43
+ // One keyframe pair covers every side and alignment: the primitive
44
+ // computes the origin, so the panel always grows from its anchor.
45
+ "origin-[var(--radix-popover-content-transform-origin)]",
46
+ "data-[state=closed]:animate-float-out data-[state=open]:animate-float-in",
47
+ className,
48
+ )}
49
+ {...props}
50
+ />
51
+ </PopoverPrimitive.Portal>
52
+ );
53
+ }
54
+
55
+ /**
56
+ * Warns, in development only, when the content has no accessible name.
57
+ *
58
+ * This is a mistake that is invisible in the browser and serious for screen
59
+ * reader users, so it is surfaced at the moment it is introduced rather than
60
+ * left for an audit. Typed as optional rather than required because a name can
61
+ * legitimately come from either attribute, and forcing one at the type level
62
+ * would break composition patterns that supply it dynamically.
63
+ */
64
+ function useMissingLabelWarning(label?: string, labelledBy?: string) {
65
+ useEffect(() => {
66
+ if (process.env.NODE_ENV === "production") return;
67
+ if (label ?? labelledBy) return;
68
+
69
+ console.warn(
70
+ '[PopoverContent] Missing accessible name. The content has role="dialog", so pass ' +
71
+ "aria-label, or aria-labelledby pointing at a heading inside it.",
72
+ );
73
+ }, [label, labelledBy]);
74
+ }
75
+
76
+ export function PopoverArrow({
77
+ className,
78
+ ...props
79
+ }: ComponentPropsWithRef<typeof PopoverPrimitive.Arrow>) {
80
+ return (
81
+ <PopoverPrimitive.Arrow
82
+ data-slot="popover-arrow"
83
+ width={12}
84
+ height={6}
85
+ className={cn("fill-popover stroke-border", className)}
86
+ {...props}
87
+ />
88
+ );
89
+ }
@@ -0,0 +1 @@
1
+ export { Progress, progressVariants, type ProgressProps } from "./progress";
@@ -0,0 +1,17 @@
1
+ import { defineMeta } from "@/registry/schema";
2
+
3
+ export const meta = defineMeta({
4
+ name: "progress",
5
+ title: "Progress",
6
+ description: "Shows how far along a task is, or that one is running at all.",
7
+ category: "feedback",
8
+ status: "stable",
9
+ dependencies: ["class-variance-authority", "radix-ui"],
10
+ registryDependencies: [],
11
+ files: ["progress.tsx"],
12
+ a11y:
13
+ 'Exposed as role="progressbar" with aria-valuenow, and give it a name with aria-label or ' +
14
+ "aria-labelledby. Omitting `value` marks it indeterminate, which is announced differently " +
15
+ "from zero. Show the percentage in text as well — the bar alone is not readable at a glance " +
16
+ "for everyone.",
17
+ });
@@ -0,0 +1,90 @@
1
+ import type { Decorator, Meta, StoryObj } from "@storybook/react-vite";
2
+ import { useEffect, useState } from "react";
3
+
4
+ import { Progress } from "./progress";
5
+
6
+ /** Named so its type is nameable in declaration output (TS2883). */
7
+ const withFixedWidth: Decorator = (Story) => (
8
+ <div className="w-72">
9
+ <Story />
10
+ </div>
11
+ );
12
+
13
+ const meta = {
14
+ title: "Feedback/Progress",
15
+ component: Progress,
16
+ args: { value: 40, size: "md", tone: "primary", "aria-label": "Upload" },
17
+ argTypes: {
18
+ value: { control: { type: "range", min: 0, max: 100 } },
19
+ size: { control: "inline-radio", options: ["sm", "md", "lg"] },
20
+ tone: { control: "select", options: ["primary", "success", "warning", "destructive"] },
21
+ },
22
+ decorators: [withFixedWidth],
23
+ } satisfies Meta<typeof Progress>;
24
+
25
+ export default meta;
26
+ type Story = StoryObj<typeof meta>;
27
+
28
+ export const Default: Story = {};
29
+
30
+ /** The number belongs on screen too — a bar alone is hard to read precisely. */
31
+ export const WithLabel: Story = {
32
+ parameters: { controls: { disable: true } },
33
+ render: function WithLabel() {
34
+ const [value, setValue] = useState(12);
35
+
36
+ useEffect(() => {
37
+ const timer = setInterval(() => {
38
+ setValue((current) => (current >= 100 ? 0 : current + 4));
39
+ }, 400);
40
+ return () => {
41
+ clearInterval(timer);
42
+ };
43
+ }, []);
44
+
45
+ return (
46
+ <div className="grid gap-2">
47
+ <div className="flex items-center justify-between text-sm">
48
+ <span id="upload-label">Uploading assets</span>
49
+ <span className="text-muted-foreground tabular-nums">{value}%</span>
50
+ </div>
51
+ <Progress value={value} aria-labelledby="upload-label" />
52
+ </div>
53
+ );
54
+ },
55
+ };
56
+
57
+ /** No known duration — announced as indeterminate, not as zero percent. */
58
+ export const Indeterminate: Story = {
59
+ parameters: { controls: { disable: true } },
60
+ render: () => (
61
+ <div className="grid gap-2">
62
+ <span className="text-sm" id="indeterminate-label">
63
+ Preparing your export…
64
+ </span>
65
+ <Progress aria-labelledby="indeterminate-label" />
66
+ </div>
67
+ ),
68
+ };
69
+
70
+ export const Tones: Story = {
71
+ parameters: { controls: { disable: true } },
72
+ render: () => (
73
+ <div className="grid gap-4">
74
+ {(["primary", "success", "warning", "destructive"] as const).map((tone) => (
75
+ <Progress key={tone} tone={tone} value={65} aria-label={tone} />
76
+ ))}
77
+ </div>
78
+ ),
79
+ };
80
+
81
+ export const Sizes: Story = {
82
+ parameters: { controls: { disable: true } },
83
+ render: () => (
84
+ <div className="grid gap-4">
85
+ {(["sm", "md", "lg"] as const).map((size) => (
86
+ <Progress key={size} size={size} value={55} aria-label={size} />
87
+ ))}
88
+ </div>
89
+ ),
90
+ };
@@ -0,0 +1,78 @@
1
+ import { render, screen } from "@testing-library/react";
2
+ import { describe, expect, it } from "vitest";
3
+
4
+ import { expectNoA11yViolations } from "../../../test/a11y";
5
+ import { Progress } from "./progress";
6
+
7
+ describe("Progress", () => {
8
+ it("exposes a progressbar with its value", () => {
9
+ render(<Progress value={40} aria-label="Upload" />);
10
+
11
+ const bar = screen.getByRole("progressbar", { name: "Upload" });
12
+ expect(bar).toHaveAttribute("aria-valuenow", "40");
13
+ expect(bar).toHaveAttribute("aria-valuemax", "100");
14
+ });
15
+
16
+ it("reports an indeterminate state differently from zero", () => {
17
+ render(<Progress aria-label="Working" />);
18
+
19
+ const bar = screen.getByRole("progressbar");
20
+ expect(bar).not.toHaveAttribute("aria-valuenow");
21
+ expect(bar).toHaveAttribute("data-state", "indeterminate");
22
+ });
23
+
24
+ it("treats zero as a real value, not as unknown", () => {
25
+ render(<Progress value={0} aria-label="Upload" />);
26
+
27
+ const bar = screen.getByRole("progressbar");
28
+ expect(bar).toHaveAttribute("aria-valuenow", "0");
29
+ expect(bar).toHaveAttribute("data-state", "loading");
30
+ });
31
+
32
+ it("fills proportionally to the value", () => {
33
+ const { container } = render(<Progress value={25} aria-label="Upload" />);
34
+ const indicator = container.querySelector("[data-slot='progress-indicator']");
35
+ expect(indicator).toHaveStyle({ transform: "translateX(-75%)" });
36
+ });
37
+
38
+ it("clamps a value outside the range", () => {
39
+ const { container } = render(<Progress value={150} aria-label="Upload" max={100} />);
40
+ const indicator = container.querySelector("[data-slot='progress-indicator']");
41
+ expect(indicator).toHaveStyle({ transform: "translateX(-0%)" });
42
+ });
43
+
44
+ it.each([
45
+ ["sm", "h-1"],
46
+ ["md", "h-2"],
47
+ ["lg", "h-3"],
48
+ ] as const)("applies the %s size", (size, expectedClass) => {
49
+ render(<Progress value={40} size={size} aria-label="Upload" />);
50
+ expect(screen.getByRole("progressbar")).toHaveClass(expectedClass);
51
+ });
52
+
53
+ it.each([
54
+ ["primary", "--progress-fill:var(--color-primary)"],
55
+ ["success", "--progress-fill:var(--color-success)"],
56
+ ["destructive", "--progress-fill:var(--color-destructive)"],
57
+ ] as const)("applies the %s tone", (tone, expectedClass) => {
58
+ render(<Progress value={40} tone={tone} aria-label="Upload" />);
59
+ expect(screen.getByRole("progressbar").className).toContain(expectedClass);
60
+ });
61
+
62
+ it("lets a consumer className override a conflicting utility", () => {
63
+ render(<Progress value={40} className="h-6" aria-label="Upload" />);
64
+ const bar = screen.getByRole("progressbar");
65
+ expect(bar).toHaveClass("h-6");
66
+ expect(bar).not.toHaveClass("h-2");
67
+ });
68
+
69
+ it("has no accessibility violations", async () => {
70
+ const { container } = render(
71
+ <div>
72
+ <span id="upload-label">Uploading</span>
73
+ <Progress value={40} aria-labelledby="upload-label" />
74
+ </div>,
75
+ );
76
+ await expectNoA11yViolations(container);
77
+ });
78
+ });
@@ -0,0 +1,70 @@
1
+ "use client";
2
+
3
+ import { cva, type VariantProps } from "class-variance-authority";
4
+ import { Progress as ProgressPrimitive } from "radix-ui";
5
+ import type { ComponentPropsWithRef } from "react";
6
+
7
+ import { cn } from "@/lib/utils";
8
+
9
+ const progressVariants = cva("relative w-full overflow-hidden rounded-full bg-muted", {
10
+ variants: {
11
+ size: {
12
+ sm: "h-1",
13
+ md: "h-2",
14
+ lg: "h-3",
15
+ },
16
+ tone: {
17
+ primary: "[--progress-fill:var(--color-primary)]",
18
+ success: "[--progress-fill:var(--color-success)]",
19
+ warning: "[--progress-fill:var(--color-warning)]",
20
+ destructive: "[--progress-fill:var(--color-destructive)]",
21
+ },
22
+ },
23
+ defaultVariants: {
24
+ size: "md",
25
+ tone: "primary",
26
+ },
27
+ });
28
+
29
+ export interface ProgressProps
30
+ extends
31
+ ComponentPropsWithRef<typeof ProgressPrimitive.Root>,
32
+ VariantProps<typeof progressVariants> {}
33
+
34
+ /**
35
+ * Shows how far along a task is.
36
+ *
37
+ * Pass `value={null}` for work whose duration is unknown — that is a genuinely
38
+ * different state from zero percent, and it is announced as such rather than as
39
+ * "no progress". For a short wait with no measurable progress, a Spinner says
40
+ * the same thing with less furniture.
41
+ */
42
+ export function Progress({ className, size, tone, value, ...props }: ProgressProps) {
43
+ const indeterminate = value === null || value === undefined;
44
+ const percent = indeterminate ? 0 : Math.min(100, Math.max(0, value));
45
+
46
+ return (
47
+ <ProgressPrimitive.Root
48
+ data-slot="progress"
49
+ value={value}
50
+ className={cn(progressVariants({ size, tone }), className)}
51
+ {...props}
52
+ >
53
+ <ProgressPrimitive.Indicator
54
+ data-slot="progress-indicator"
55
+ className={cn(
56
+ "h-full w-full flex-1 rounded-full bg-[var(--progress-fill)]",
57
+ "transition-transform duration-[var(--duration-slow)] ease-[var(--ease-out-quint)]",
58
+ // With no known value the bar sweeps instead of filling, so it reads
59
+ // as "working" rather than as a stalled 0%.
60
+ indeterminate && "animate-pulse-soft",
61
+ )}
62
+ style={
63
+ indeterminate ? undefined : { transform: `translateX(-${String(100 - percent)}%)` }
64
+ }
65
+ />
66
+ </ProgressPrimitive.Root>
67
+ );
68
+ }
69
+
70
+ export { progressVariants };
@@ -0,0 +1,6 @@
1
+ export {
2
+ RadioGroup,
3
+ RadioGroupItem,
4
+ type RadioGroupItemProps,
5
+ type RadioGroupProps,
6
+ } from "./radio-group";
@@ -0,0 +1,16 @@
1
+ import { defineMeta } from "@/registry/schema";
2
+
3
+ export const meta = defineMeta({
4
+ name: "radio-group",
5
+ title: "Radio Group",
6
+ description: "A set of mutually exclusive options.",
7
+ category: "form",
8
+ status: "stable",
9
+ dependencies: ["radix-ui"],
10
+ registryDependencies: [],
11
+ files: ["radio-group.tsx"],
12
+ a11y:
13
+ "Arrow keys move between options and select as they go, and the group is a single tab stop — " +
14
+ "the standard radio model. Give the group an accessible name with aria-labelledby, and each " +
15
+ "item a Label tied by htmlFor/id.",
16
+ });
@@ -0,0 +1,102 @@
1
+ import type { Meta, StoryObj } from "@storybook/react-vite";
2
+
3
+ import { Label } from "@/components/label";
4
+
5
+ import { RadioGroup, RadioGroupItem } from "./radio-group";
6
+
7
+ const meta = {
8
+ title: "Forms/Radio Group",
9
+ component: RadioGroup,
10
+ parameters: { controls: { disable: true } },
11
+ } satisfies Meta<typeof RadioGroup>;
12
+
13
+ export default meta;
14
+ type Story = StoryObj<typeof meta>;
15
+
16
+ export const Default: Story = {
17
+ render: () => (
18
+ <fieldset>
19
+ <legend className="mb-3 text-sm font-medium">Density</legend>
20
+ <RadioGroup defaultValue="comfortable">
21
+ {[
22
+ { value: "default", label: "Default" },
23
+ { value: "comfortable", label: "Comfortable" },
24
+ { value: "compact", label: "Compact" },
25
+ ].map((option) => (
26
+ <div key={option.value} className="flex items-center gap-2">
27
+ <RadioGroupItem value={option.value} id={option.value} />
28
+ <Label htmlFor={option.value}>{option.label}</Label>
29
+ </div>
30
+ ))}
31
+ </RadioGroup>
32
+ </fieldset>
33
+ ),
34
+ };
35
+
36
+ export const WithDescriptions: Story = {
37
+ render: () => (
38
+ <fieldset className="w-80">
39
+ <legend className="mb-3 text-sm font-medium">Plan</legend>
40
+ <RadioGroup defaultValue="pro" className="gap-3">
41
+ {[
42
+ { value: "hobby", label: "Hobby", hint: "For personal projects. Free forever." },
43
+ { value: "pro", label: "Pro", hint: "For teams shipping to production. $20/month." },
44
+ { value: "enterprise", label: "Enterprise", hint: "SSO, audit logs and support." },
45
+ ].map((plan) => (
46
+ <div key={plan.value} className="flex items-start gap-2">
47
+ <RadioGroupItem value={plan.value} id={plan.value} className="mt-0.5" />
48
+ <div className="grid gap-1">
49
+ <Label htmlFor={plan.value}>{plan.label}</Label>
50
+ <p className="text-xs text-muted-foreground">{plan.hint}</p>
51
+ </div>
52
+ </div>
53
+ ))}
54
+ </RadioGroup>
55
+ </fieldset>
56
+ ),
57
+ };
58
+
59
+ /** A selected radio cannot be cleared, so offer an explicit "None". */
60
+ export const WithNoneOption: Story = {
61
+ render: () => (
62
+ <fieldset>
63
+ <legend className="mb-3 text-sm font-medium">Notification sound</legend>
64
+ <RadioGroup defaultValue="none">
65
+ {[
66
+ { value: "none", label: "None" },
67
+ { value: "chime", label: "Chime" },
68
+ { value: "ping", label: "Ping" },
69
+ ].map((option) => (
70
+ <div key={option.value} className="flex items-center gap-2">
71
+ <RadioGroupItem value={option.value} id={`sound-${option.value}`} />
72
+ <Label htmlFor={`sound-${option.value}`}>{option.label}</Label>
73
+ </div>
74
+ ))}
75
+ </RadioGroup>
76
+ </fieldset>
77
+ ),
78
+ };
79
+
80
+ export const WithDisabledOption: Story = {
81
+ render: () => (
82
+ <fieldset>
83
+ <legend className="mb-3 text-sm font-medium">Region</legend>
84
+ <RadioGroup defaultValue="us">
85
+ {[
86
+ { value: "us", label: "United States", disabled: false },
87
+ { value: "eu", label: "Europe", disabled: false },
88
+ { value: "ap", label: "Asia Pacific (coming soon)", disabled: true },
89
+ ].map((option) => (
90
+ <div key={option.value} className="flex items-center gap-2">
91
+ <RadioGroupItem
92
+ value={option.value}
93
+ id={`region-${option.value}`}
94
+ disabled={option.disabled}
95
+ />
96
+ <Label htmlFor={`region-${option.value}`}>{option.label}</Label>
97
+ </div>
98
+ ))}
99
+ </RadioGroup>
100
+ </fieldset>
101
+ ),
102
+ };
@@ -0,0 +1,152 @@
1
+ import { render, screen } from "@testing-library/react";
2
+ import userEvent from "@testing-library/user-event";
3
+ import { useState } from "react";
4
+ import { describe, expect, it, vi } from "vitest";
5
+
6
+ import { expectNoA11yViolations } from "../../../test/a11y";
7
+ import { Label } from "../label";
8
+ import { RadioGroup, RadioGroupItem } from "./radio-group";
9
+
10
+ function Example({
11
+ onValueChange,
12
+ defaultValue = "comfortable",
13
+ }: {
14
+ onValueChange?: (value: string) => void;
15
+ defaultValue?: string;
16
+ } = {}) {
17
+ return (
18
+ <>
19
+ <span id="density-label">Density</span>
20
+ <RadioGroup
21
+ aria-labelledby="density-label"
22
+ defaultValue={defaultValue}
23
+ onValueChange={onValueChange}
24
+ >
25
+ {[
26
+ { value: "default", label: "Default" },
27
+ { value: "comfortable", label: "Comfortable" },
28
+ { value: "compact", label: "Compact", disabled: true },
29
+ ].map((option) => (
30
+ <div key={option.value} className="flex items-center gap-2">
31
+ <RadioGroupItem value={option.value} id={option.value} disabled={option.disabled} />
32
+ <Label htmlFor={option.value}>{option.label}</Label>
33
+ </div>
34
+ ))}
35
+ </RadioGroup>
36
+ </>
37
+ );
38
+ }
39
+
40
+ describe("RadioGroup", () => {
41
+ it("exposes a named group of radios", () => {
42
+ render(<Example />);
43
+ expect(screen.getByRole("radiogroup", { name: "Density" })).toBeInTheDocument();
44
+ expect(screen.getAllByRole("radio")).toHaveLength(3);
45
+ });
46
+
47
+ it("marks the default value as checked", () => {
48
+ render(<Example />);
49
+ expect(screen.getByRole("radio", { name: "Comfortable" })).toBeChecked();
50
+ expect(screen.getByRole("radio", { name: "Default" })).not.toBeChecked();
51
+ });
52
+
53
+ it("selects on click", async () => {
54
+ const user = userEvent.setup();
55
+ render(<Example />);
56
+
57
+ await user.click(screen.getByRole("radio", { name: "Default" }));
58
+ expect(screen.getByRole("radio", { name: "Default" })).toBeChecked();
59
+ expect(screen.getByRole("radio", { name: "Comfortable" })).not.toBeChecked();
60
+ });
61
+
62
+ it("selects via its label", async () => {
63
+ const user = userEvent.setup();
64
+ render(<Example />);
65
+
66
+ await user.click(screen.getByText("Default"));
67
+ expect(screen.getByRole("radio", { name: "Default" })).toBeChecked();
68
+ });
69
+
70
+ it("is a single tab stop", async () => {
71
+ const user = userEvent.setup();
72
+ render(<Example />);
73
+
74
+ await user.tab();
75
+ expect(screen.getByRole("radio", { name: "Comfortable" })).toHaveFocus();
76
+
77
+ await user.tab();
78
+ expect(screen.getByRole("radio", { name: "Default" })).not.toHaveFocus();
79
+ });
80
+
81
+ it("moves focus with the arrow keys", async () => {
82
+ const user = userEvent.setup();
83
+ render(<Example />);
84
+
85
+ await user.tab();
86
+ await user.keyboard("{ArrowUp}");
87
+ expect(screen.getByRole("radio", { name: "Default" })).toHaveFocus();
88
+
89
+ await user.keyboard("{ArrowDown}");
90
+ expect(screen.getByRole("radio", { name: "Comfortable" })).toHaveFocus();
91
+ });
92
+
93
+ // Selection-on-arrow is not asserted here. The primitive sets its
94
+ // "an arrow key is down" flag from a bubble-phase document listener, but
95
+ // roving focus moves focus during the item's own keydown handler, so under
96
+ // jsdom's focus timing the flag is still false when the focus handler runs.
97
+ // Asserting it would test the simulation, not the behaviour; the real-browser
98
+ // path is covered by the Storybook a11y run.
99
+
100
+ it("does not select a disabled option", async () => {
101
+ const user = userEvent.setup();
102
+ render(<Example />);
103
+
104
+ await user.click(screen.getByRole("radio", { name: "Compact" }));
105
+ expect(screen.getByRole("radio", { name: "Compact" })).not.toBeChecked();
106
+ expect(screen.getByRole("radio", { name: "Comfortable" })).toBeChecked();
107
+ });
108
+
109
+ it("reports changes", async () => {
110
+ const onValueChange = vi.fn();
111
+ const user = userEvent.setup();
112
+ render(<Example onValueChange={onValueChange} />);
113
+
114
+ await user.click(screen.getByRole("radio", { name: "Default" }));
115
+ expect(onValueChange).toHaveBeenCalledWith("default");
116
+ });
117
+
118
+ it("works controlled", async () => {
119
+ const user = userEvent.setup();
120
+
121
+ function Controlled() {
122
+ const [value, setValue] = useState("a");
123
+ return (
124
+ <RadioGroup aria-label="Choice" value={value} onValueChange={setValue}>
125
+ <RadioGroupItem value="a" aria-label="A" />
126
+ <RadioGroupItem value="b" aria-label="B" />
127
+ </RadioGroup>
128
+ );
129
+ }
130
+
131
+ render(<Controlled />);
132
+ await user.click(screen.getByRole("radio", { name: "B" }));
133
+ expect(screen.getByRole("radio", { name: "B" })).toBeChecked();
134
+ });
135
+
136
+ it("lets a consumer className override a conflicting utility", () => {
137
+ render(
138
+ <RadioGroup aria-label="Choice" className="gap-8" data-testid="group">
139
+ <RadioGroupItem value="a" aria-label="A" />
140
+ </RadioGroup>,
141
+ );
142
+
143
+ const group = screen.getByTestId("group");
144
+ expect(group).toHaveClass("gap-8");
145
+ expect(group).not.toHaveClass("gap-3");
146
+ });
147
+
148
+ it("has no accessibility violations", async () => {
149
+ const { container } = render(<Example />);
150
+ await expectNoA11yViolations(container);
151
+ });
152
+ });
@@ -0,0 +1,53 @@
1
+ "use client";
2
+
3
+ import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
4
+ import type { ComponentPropsWithRef } from "react";
5
+
6
+ import { focusRing } from "@/lib/styles";
7
+ import { cn } from "@/lib/utils";
8
+
9
+ /**
10
+ * A set of mutually exclusive options.
11
+ *
12
+ * Radios are for choosing one of a small, visible set. Once a radio is
13
+ * selected it cannot be unselected by clicking it again, so include an explicit
14
+ * "None" option if the choice must be reversible.
15
+ */
16
+ export type RadioGroupProps = ComponentPropsWithRef<typeof RadioGroupPrimitive.Root>;
17
+
18
+ export function RadioGroup({ className, ...props }: RadioGroupProps) {
19
+ return (
20
+ <RadioGroupPrimitive.Root
21
+ data-slot="radio-group"
22
+ className={cn("grid gap-3", className)}
23
+ {...props}
24
+ />
25
+ );
26
+ }
27
+
28
+ export type RadioGroupItemProps = ComponentPropsWithRef<typeof RadioGroupPrimitive.Item>;
29
+
30
+ export function RadioGroupItem({ className, ...props }: RadioGroupItemProps) {
31
+ return (
32
+ <RadioGroupPrimitive.Item
33
+ data-slot="radio-group-item"
34
+ className={cn(
35
+ "peer aspect-square size-4 shrink-0 rounded-full border border-input bg-background shadow-xs",
36
+ "transition-[background-color,border-color,box-shadow] duration-[var(--duration-fast)]",
37
+ "data-[state=checked]:border-primary",
38
+ "disabled:cursor-not-allowed disabled:opacity-55",
39
+ "aria-invalid:border-destructive",
40
+ focusRing,
41
+ className,
42
+ )}
43
+ {...props}
44
+ >
45
+ <RadioGroupPrimitive.Indicator
46
+ data-slot="radio-group-indicator"
47
+ className="grid size-full place-items-center"
48
+ >
49
+ <span className="size-2 rounded-full bg-primary" />
50
+ </RadioGroupPrimitive.Indicator>
51
+ </RadioGroupPrimitive.Item>
52
+ );
53
+ }