@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,221 @@
1
+ "use client";
2
+
3
+ import { Label as LabelPrimitive, Slot } from "radix-ui";
4
+ import {
5
+ createContext,
6
+ useCallback,
7
+ useContext,
8
+ useEffect,
9
+ useId,
10
+ useMemo,
11
+ useState,
12
+ type ComponentPropsWithRef,
13
+ type ReactNode,
14
+ } from "react";
15
+
16
+ import { cn } from "@/lib/utils";
17
+
18
+ /**
19
+ * Accessible wiring for form fields.
20
+ *
21
+ * Deliberately **not** bound to a form library. What is actually hard about a
22
+ * form field is the ARIA plumbing — generating an id, pointing the label at the
23
+ * control, assembling `aria-describedby` from the description and the error,
24
+ * and flipping `aria-invalid` — and that plumbing is identical whether the
25
+ * state comes from `useState`, React Hook Form, Formik or a server action.
26
+ *
27
+ * Binding to one library would make everyone else install it to get the
28
+ * plumbing, and would make the source you own harder to change. Pass `error`
29
+ * from whatever holds your state:
30
+ *
31
+ * <FormField name="email" error={errors.email?.message}>
32
+ * <FormLabel>Email</FormLabel>
33
+ * <FormControl>
34
+ * <Input {...register("email")} />
35
+ * </FormControl>
36
+ * <FormDescription>We will never share it.</FormDescription>
37
+ * <FormMessage />
38
+ * </FormField>
39
+ */
40
+
41
+ interface FormFieldContextValue {
42
+ id: string;
43
+ name: string | undefined;
44
+ descriptionId: string;
45
+ messageId: string;
46
+ error: ReactNode;
47
+ hasDescription: boolean;
48
+ registerDescription: (present: boolean) => void;
49
+ }
50
+
51
+ const FormFieldContext = createContext<FormFieldContextValue | null>(null);
52
+
53
+ function useFormField(component: string): FormFieldContextValue {
54
+ const context = useContext(FormFieldContext);
55
+ if (!context) {
56
+ throw new Error(`${component} must be rendered inside <FormField>.`);
57
+ }
58
+ return context;
59
+ }
60
+
61
+ export type FormProps = ComponentPropsWithRef<"form">;
62
+
63
+ /**
64
+ * A form element.
65
+ *
66
+ * `noValidate` is on by default: when the form renders its own messages, the
67
+ * browser's validation bubbles compete with them, appear in a different visual
68
+ * language, and cannot be styled. Pass `noValidate={false}` to opt back in.
69
+ */
70
+ export function Form({ className, noValidate = true, ...props }: FormProps) {
71
+ return (
72
+ <form
73
+ data-slot="form"
74
+ noValidate={noValidate}
75
+ className={cn("grid gap-6", className)}
76
+ {...props}
77
+ />
78
+ );
79
+ }
80
+
81
+ export interface FormFieldProps extends ComponentPropsWithRef<"div"> {
82
+ /** Field name, mirrored onto the wrapper for form-library integration. */
83
+ name?: string;
84
+ /** Present when the field is invalid. Its content is rendered by FormMessage. */
85
+ error?: ReactNode;
86
+ }
87
+
88
+ export function FormField({ className, name, error, ...props }: FormFieldProps) {
89
+ const uid = useId();
90
+ // Description presence is tracked rather than assumed: aria-describedby must
91
+ // not name an element that was never rendered. axe flags a dangling reference,
92
+ // and a screen reader announces nothing for it.
93
+ const [hasDescription, setHasDescription] = useState(false);
94
+
95
+ const registerDescription = useCallback((present: boolean) => {
96
+ setHasDescription(present);
97
+ }, []);
98
+
99
+ const value = useMemo<FormFieldContextValue>(
100
+ () => ({
101
+ id: `${uid}-control`,
102
+ name,
103
+ descriptionId: `${uid}-description`,
104
+ messageId: `${uid}-message`,
105
+ error,
106
+ hasDescription,
107
+ registerDescription,
108
+ }),
109
+ [uid, name, error, hasDescription, registerDescription],
110
+ );
111
+
112
+ return (
113
+ <FormFieldContext.Provider value={value}>
114
+ <div
115
+ data-slot="form-field"
116
+ data-name={name}
117
+ data-invalid={error ? true : undefined}
118
+ className={cn("grid gap-2", className)}
119
+ {...props}
120
+ />
121
+ </FormFieldContext.Provider>
122
+ );
123
+ }
124
+
125
+ export type FormLabelProps = ComponentPropsWithRef<typeof LabelPrimitive.Root>;
126
+
127
+ export function FormLabel({ className, ...props }: FormLabelProps) {
128
+ const { id, error } = useFormField("FormLabel");
129
+
130
+ return (
131
+ <LabelPrimitive.Root
132
+ data-slot="form-label"
133
+ data-invalid={error ? true : undefined}
134
+ htmlFor={id}
135
+ className={cn(
136
+ "flex items-center gap-2 text-sm leading-none font-medium select-none",
137
+ "peer-disabled:cursor-not-allowed peer-disabled:opacity-55",
138
+ error && "text-destructive",
139
+ className,
140
+ )}
141
+ {...props}
142
+ />
143
+ );
144
+ }
145
+
146
+ export type FormControlProps = ComponentPropsWithRef<typeof Slot.Root>;
147
+
148
+ /**
149
+ * Injects the field's id and ARIA attributes into its single child.
150
+ *
151
+ * Takes the control as a child rather than rendering one, so it works with any
152
+ * input: our Input, a native select, a third-party editor.
153
+ */
154
+ export function FormControl(props: FormControlProps) {
155
+ const { id, error, messageId, descriptionId, hasDescription } = useFormField("FormControl");
156
+
157
+ const describedBy =
158
+ [hasDescription ? descriptionId : null, error ? messageId : null]
159
+ .filter(Boolean)
160
+ .join(" ") || undefined;
161
+
162
+ return (
163
+ <Slot.Root
164
+ data-slot="form-control"
165
+ id={id}
166
+ aria-describedby={describedBy}
167
+ aria-invalid={error ? true : undefined}
168
+ {...props}
169
+ />
170
+ );
171
+ }
172
+
173
+ export function FormDescription({ className, ...props }: ComponentPropsWithRef<"p">) {
174
+ const { descriptionId, registerDescription } = useFormField("FormDescription");
175
+
176
+ useEffect(() => {
177
+ registerDescription(true);
178
+ return () => {
179
+ registerDescription(false);
180
+ };
181
+ }, [registerDescription]);
182
+
183
+ return (
184
+ <p
185
+ data-slot="form-description"
186
+ id={descriptionId}
187
+ className={cn("text-xs text-muted-foreground", className)}
188
+ {...props}
189
+ />
190
+ );
191
+ }
192
+
193
+ export type FormMessageProps = ComponentPropsWithRef<"p">;
194
+
195
+ /**
196
+ * Renders the field's error.
197
+ *
198
+ * Renders nothing when there is no error and no children, so the layout does
199
+ * not reserve space for a message that may never appear. It is a polite live
200
+ * region: a validation message that arrives after the user has moved on should
201
+ * be announced, but should not interrupt what is being read.
202
+ */
203
+ export function FormMessage({ className, children, ...props }: FormMessageProps) {
204
+ const { messageId, error } = useFormField("FormMessage");
205
+ const content = children ?? error;
206
+
207
+ if (!content) return null;
208
+
209
+ return (
210
+ <p
211
+ data-slot="form-message"
212
+ id={messageId}
213
+ role="status"
214
+ aria-live="polite"
215
+ className={cn("text-xs font-medium text-destructive", className)}
216
+ {...props}
217
+ >
218
+ {content}
219
+ </p>
220
+ );
221
+ }
@@ -0,0 +1,13 @@
1
+ export {
2
+ Form,
3
+ FormControl,
4
+ FormDescription,
5
+ FormField,
6
+ FormLabel,
7
+ FormMessage,
8
+ type FormControlProps,
9
+ type FormFieldProps,
10
+ type FormLabelProps,
11
+ type FormMessageProps,
12
+ type FormProps,
13
+ } from "./form";
@@ -0,0 +1,17 @@
1
+ import { defineMeta } from "@/registry/schema";
2
+
3
+ export const meta = defineMeta({
4
+ name: "form",
5
+ title: "Form",
6
+ description: "Accessible field wiring that works with any form library, or none.",
7
+ category: "form",
8
+ status: "stable",
9
+ dependencies: ["radix-ui"],
10
+ registryDependencies: [],
11
+ files: ["form.tsx"],
12
+ a11y:
13
+ "FormField generates the id, points the Label at the control, and assembles aria-describedby " +
14
+ "from whichever of the description and error are actually present — a dangling reference " +
15
+ "announces nothing and is flagged by axe. aria-invalid follows the error. FormMessage is a " +
16
+ "polite live region, so a late validation message is announced without interrupting.",
17
+ });
@@ -0,0 +1 @@
1
+ export { Input, inputVariants, type InputProps } from "./input";
@@ -0,0 +1,84 @@
1
+ import type { Decorator, Meta, StoryObj } from "@storybook/react-vite";
2
+
3
+ import { Label } from "@/components/label";
4
+
5
+ import { Input } from "./input";
6
+
7
+ /** Named so its type is nameable in declaration output (TS2883). */
8
+ const withFixedWidth: Decorator = (Story) => (
9
+ <div className="w-72">
10
+ <Story />
11
+ </div>
12
+ );
13
+
14
+ const meta = {
15
+ title: "Forms/Input",
16
+ component: Input,
17
+ args: {
18
+ placeholder: "acme-inc",
19
+ inputSize: "md",
20
+ },
21
+ argTypes: {
22
+ inputSize: { control: "select", options: ["sm", "md", "lg"] },
23
+ disabled: { control: "boolean" },
24
+ type: { control: "select", options: ["text", "email", "password", "number", "search"] },
25
+ },
26
+ decorators: [withFixedWidth],
27
+ } satisfies Meta<typeof Input>;
28
+
29
+ export default meta;
30
+ type Story = StoryObj<typeof meta>;
31
+
32
+ export const Default: Story = {
33
+ render: (args) => (
34
+ <div className="grid gap-2">
35
+ <Label htmlFor="project">Project name</Label>
36
+ <Input id="project" {...args} />
37
+ </div>
38
+ ),
39
+ };
40
+
41
+ export const Sizes: Story = {
42
+ parameters: { controls: { disable: true } },
43
+ render: () => (
44
+ <div className="grid gap-3">
45
+ <Input inputSize="sm" placeholder="Small" aria-label="Small" />
46
+ <Input inputSize="md" placeholder="Medium" aria-label="Medium" />
47
+ <Input inputSize="lg" placeholder="Large" aria-label="Large" />
48
+ </div>
49
+ ),
50
+ };
51
+
52
+ export const Invalid: Story = {
53
+ render: () => (
54
+ <div className="grid gap-2">
55
+ <Label htmlFor="email">Email</Label>
56
+ <Input
57
+ id="email"
58
+ type="email"
59
+ defaultValue="not-an-email"
60
+ aria-invalid
61
+ aria-describedby="email-error"
62
+ />
63
+ <p id="email-error" className="text-xs text-destructive">
64
+ Enter a valid email address.
65
+ </p>
66
+ </div>
67
+ ),
68
+ };
69
+
70
+ export const Disabled: Story = {
71
+ args: { disabled: true, value: "Read only" },
72
+ };
73
+
74
+ export const Types: Story = {
75
+ parameters: { controls: { disable: true } },
76
+ render: () => (
77
+ <div className="grid gap-3">
78
+ <Input type="email" placeholder="you@example.com" aria-label="Email" />
79
+ <Input type="password" placeholder="••••••••" aria-label="Password" />
80
+ <Input type="number" placeholder="42" aria-label="Quantity" />
81
+ <Input type="search" placeholder="Search…" aria-label="Search" />
82
+ </div>
83
+ ),
84
+ };
@@ -0,0 +1,108 @@
1
+ import { render, screen } from "@testing-library/react";
2
+ import userEvent from "@testing-library/user-event";
3
+ import { createRef, useState } from "react";
4
+ import { describe, expect, it, vi } from "vitest";
5
+
6
+ import { expectNoA11yViolations } from "../../../test/a11y";
7
+ import { Input } from "./input";
8
+
9
+ describe("Input", () => {
10
+ it("renders a text input by default", () => {
11
+ render(<Input aria-label="Name" />);
12
+ expect(screen.getByRole("textbox", { name: "Name" })).toHaveAttribute("type", "text");
13
+ });
14
+
15
+ it("honours an explicit type", () => {
16
+ render(<Input type="email" aria-label="Email" />);
17
+ expect(screen.getByRole("textbox")).toHaveAttribute("type", "email");
18
+ });
19
+
20
+ it.each([
21
+ ["sm", "h-8"],
22
+ ["md", "h-9"],
23
+ ["lg", "h-10"],
24
+ ] as const)("applies the %s size", (inputSize, expectedClass) => {
25
+ render(<Input inputSize={inputSize} aria-label="Name" />);
26
+ expect(screen.getByRole("textbox")).toHaveClass(expectedClass);
27
+ });
28
+
29
+ it("does not shadow the native size attribute", () => {
30
+ render(<Input size={5} aria-label="Name" />);
31
+ expect(screen.getByRole("textbox")).toHaveAttribute("size", "5");
32
+ });
33
+
34
+ it("lets a consumer className override a conflicting utility", () => {
35
+ render(<Input className="h-16" aria-label="Name" />);
36
+ const input = screen.getByRole("textbox");
37
+ expect(input).toHaveClass("h-16");
38
+ expect(input).not.toHaveClass("h-9");
39
+ });
40
+
41
+ it("forwards a ref", () => {
42
+ const ref = createRef<HTMLInputElement>();
43
+ render(<Input ref={ref} aria-label="Name" />);
44
+ expect(ref.current).toBeInstanceOf(HTMLInputElement);
45
+ });
46
+
47
+ it("works uncontrolled", async () => {
48
+ const user = userEvent.setup();
49
+ render(<Input defaultValue="ab" aria-label="Name" />);
50
+
51
+ const input = screen.getByRole<HTMLInputElement>("textbox");
52
+ await user.type(input, "cd");
53
+ expect(input.value).toBe("abcd");
54
+ });
55
+
56
+ it("works controlled", async () => {
57
+ const user = userEvent.setup();
58
+
59
+ function Controlled() {
60
+ const [value, setValue] = useState("");
61
+ return (
62
+ <Input
63
+ value={value}
64
+ onChange={(event) => setValue(event.target.value)}
65
+ aria-label="Name"
66
+ />
67
+ );
68
+ }
69
+
70
+ render(<Controlled />);
71
+ const input = screen.getByRole<HTMLInputElement>("textbox");
72
+ await user.type(input, "hello");
73
+ expect(input.value).toBe("hello");
74
+ });
75
+
76
+ it("does not accept input while disabled", async () => {
77
+ const onChange = vi.fn();
78
+ const user = userEvent.setup();
79
+ render(<Input disabled onChange={onChange} aria-label="Name" />);
80
+
81
+ const input = screen.getByRole("textbox");
82
+ expect(input).toBeDisabled();
83
+ await user.type(input, "x");
84
+ expect(onChange).not.toHaveBeenCalled();
85
+ });
86
+
87
+ it("exposes the invalid state through aria-invalid", () => {
88
+ render(<Input aria-invalid aria-label="Name" />);
89
+ expect(screen.getByRole("textbox")).toHaveAttribute("aria-invalid", "true");
90
+ });
91
+
92
+ it("is reachable by keyboard", async () => {
93
+ const user = userEvent.setup();
94
+ render(<Input aria-label="Name" />);
95
+ await user.tab();
96
+ expect(screen.getByRole("textbox")).toHaveFocus();
97
+ });
98
+
99
+ it("has no accessibility violations", async () => {
100
+ const { container } = render(
101
+ <>
102
+ <label htmlFor="field">Name</label>
103
+ <Input id="field" />
104
+ </>,
105
+ );
106
+ await expectNoA11yViolations(container);
107
+ });
108
+ });
@@ -0,0 +1,51 @@
1
+ import { cva, type VariantProps } from "class-variance-authority";
2
+ import type { ComponentPropsWithRef } from "react";
3
+
4
+ import { focusRingInset, invalidStyles } from "@/lib/styles";
5
+ import { cn } from "@/lib/utils";
6
+
7
+ const inputVariants = cva(
8
+ cn(
9
+ "flex w-full min-w-0 rounded-md border border-input bg-background text-foreground shadow-xs",
10
+ "transition-[border-color,box-shadow] duration-[var(--duration-fast)] ease-[var(--ease-out-quint)]",
11
+ "placeholder:text-muted-foreground",
12
+ "file:mr-3 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground",
13
+ "focus-visible:border-ring",
14
+ "disabled:cursor-not-allowed disabled:opacity-55",
15
+ focusRingInset,
16
+ invalidStyles,
17
+ ),
18
+ {
19
+ variants: {
20
+ inputSize: {
21
+ sm: "h-8 px-2.5 text-sm",
22
+ md: "h-9 px-3 text-sm",
23
+ lg: "h-10 px-3.5 text-base",
24
+ },
25
+ },
26
+ defaultVariants: {
27
+ inputSize: "md",
28
+ },
29
+ },
30
+ );
31
+
32
+ export interface InputProps
33
+ extends ComponentPropsWithRef<"input">, VariantProps<typeof inputVariants> {}
34
+
35
+ /**
36
+ * Single-line text field.
37
+ *
38
+ * The visual size prop is named `inputSize` rather than `size` because `size`
39
+ * is a native `<input>` attribute with unrelated semantics (a character-count
40
+ * width hint). Naming it apart keeps both available instead of shadowing one.
41
+ *
42
+ * Error styling is driven by the native `aria-invalid` attribute rather than a
43
+ * bespoke prop, so form libraries wire it up without an adapter.
44
+ */
45
+ export function Input({ className, inputSize, type = "text", ...props }: InputProps) {
46
+ return (
47
+ <input type={type} className={cn(inputVariants({ inputSize }), className)} {...props} />
48
+ );
49
+ }
50
+
51
+ export { inputVariants };
@@ -0,0 +1,15 @@
1
+ import { defineMeta } from "@/registry/schema";
2
+
3
+ export const meta = defineMeta({
4
+ name: "input",
5
+ title: "Input",
6
+ description: "A single-line text field with size variants and native validation styling.",
7
+ category: "form",
8
+ status: "stable",
9
+ dependencies: ["class-variance-authority"],
10
+ registryDependencies: [],
11
+ files: ["input.tsx"],
12
+ a11y:
13
+ "Always pair with a Label via htmlFor/id. Error state is driven by aria-invalid so " +
14
+ "assistive technology and styling stay in sync; describe the error with aria-describedby.",
15
+ });
@@ -0,0 +1 @@
1
+ export { Label, type LabelProps } from "./label";
@@ -0,0 +1,51 @@
1
+ import type { Meta, StoryObj } from "@storybook/react-vite";
2
+
3
+ import { Input } from "@/components/input";
4
+
5
+ import { Label } from "./label";
6
+
7
+ const meta = {
8
+ title: "Forms/Label",
9
+ component: Label,
10
+ args: { children: "Project name" },
11
+ } satisfies Meta<typeof Label>;
12
+
13
+ export default meta;
14
+ type Story = StoryObj<typeof meta>;
15
+
16
+ export const Default: Story = {
17
+ render: (args) => (
18
+ <div className="grid w-72 gap-2">
19
+ <Label htmlFor="project" {...args} />
20
+ <Input id="project" placeholder="acme-inc" />
21
+ </div>
22
+ ),
23
+ };
24
+
25
+ export const Required: Story = {
26
+ parameters: { controls: { disable: true } },
27
+ render: () => (
28
+ <div className="grid w-72 gap-2">
29
+ <Label htmlFor="email">
30
+ Email
31
+ <span aria-hidden="true" className="text-destructive">
32
+ *
33
+ </span>
34
+ </Label>
35
+ <Input id="email" type="email" required placeholder="you@example.com" />
36
+ </div>
37
+ ),
38
+ };
39
+
40
+ /** A label dims alongside the control it describes. */
41
+ export const WithDisabledControl: Story = {
42
+ parameters: { controls: { disable: true } },
43
+ render: () => (
44
+ <div className="grid w-72 gap-2">
45
+ <Input id="locked" disabled placeholder="Locked" className="peer order-2" />
46
+ <Label htmlFor="locked" className="order-1">
47
+ Workspace slug
48
+ </Label>
49
+ </div>
50
+ ),
51
+ };
@@ -0,0 +1,55 @@
1
+ import { render, screen } from "@testing-library/react";
2
+ import userEvent from "@testing-library/user-event";
3
+ import { describe, expect, it } from "vitest";
4
+
5
+ import { expectNoA11yViolations } from "../../../test/a11y";
6
+ import { Label } from "./label";
7
+
8
+ describe("Label", () => {
9
+ it("renders its text", () => {
10
+ render(<Label htmlFor="name">Full name</Label>);
11
+ expect(screen.getByText("Full name")).toBeInTheDocument();
12
+ });
13
+
14
+ it("associates itself with a control via htmlFor", () => {
15
+ render(
16
+ <>
17
+ <Label htmlFor="name">Full name</Label>
18
+ <input id="name" />
19
+ </>,
20
+ );
21
+ expect(screen.getByLabelText("Full name")).toBeInTheDocument();
22
+ });
23
+
24
+ it("moves focus to its control when clicked", async () => {
25
+ const user = userEvent.setup();
26
+ render(
27
+ <>
28
+ <Label htmlFor="name">Full name</Label>
29
+ <input id="name" />
30
+ </>,
31
+ );
32
+
33
+ await user.click(screen.getByText("Full name"));
34
+ expect(screen.getByLabelText("Full name")).toHaveFocus();
35
+ });
36
+
37
+ it("merges a consumer className", () => {
38
+ render(
39
+ <Label htmlFor="name" className="text-destructive">
40
+ Full name
41
+ </Label>,
42
+ );
43
+ expect(screen.getByText("Full name")).toHaveClass("text-destructive", "font-medium");
44
+ });
45
+
46
+ it("has no accessibility violations", async () => {
47
+ const { container } = render(
48
+ <>
49
+ <Label htmlFor="name">Full name</Label>
50
+ <input id="name" />
51
+ </>,
52
+ );
53
+ await expectNoA11yViolations(container);
54
+ });
55
+ });
@@ -0,0 +1,26 @@
1
+ import { Label as LabelPrimitive } from "radix-ui";
2
+ import type { ComponentPropsWithRef } from "react";
3
+
4
+ import { cn } from "@/lib/utils";
5
+
6
+ export type LabelProps = ComponentPropsWithRef<typeof LabelPrimitive.Root>;
7
+
8
+ /**
9
+ * Caption for a form control.
10
+ *
11
+ * Built on the Radix primitive so clicking the label focuses its control even
12
+ * when the control is a composite widget rather than a native input.
13
+ */
14
+ export function Label({ className, ...props }: LabelProps) {
15
+ return (
16
+ <LabelPrimitive.Root
17
+ className={cn(
18
+ "flex items-center gap-2 text-sm leading-none font-medium select-none",
19
+ "peer-disabled:cursor-not-allowed peer-disabled:opacity-55",
20
+ "group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-55",
21
+ className,
22
+ )}
23
+ {...props}
24
+ />
25
+ );
26
+ }
@@ -0,0 +1,15 @@
1
+ import { defineMeta } from "@/registry/schema";
2
+
3
+ export const meta = defineMeta({
4
+ name: "label",
5
+ title: "Label",
6
+ description: "An accessible caption that associates text with a form control.",
7
+ category: "form",
8
+ status: "stable",
9
+ dependencies: ["radix-ui"],
10
+ registryDependencies: [],
11
+ files: ["label.tsx"],
12
+ a11y:
13
+ "Set htmlFor to the id of the control it labels. Clicking the label moves focus to that " +
14
+ "control, including composite widgets that are not native inputs.",
15
+ });
@@ -0,0 +1,10 @@
1
+ export {
2
+ Pagination,
3
+ PaginationContent,
4
+ PaginationEllipsis,
5
+ PaginationItem,
6
+ PaginationLink,
7
+ PaginationNext,
8
+ PaginationPrevious,
9
+ type PaginationLinkProps,
10
+ } from "./pagination";