@arolariu/components 0.4.2 → 1.0.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 (892) hide show
  1. package/{changelog.md → CHANGELOG.md} +36 -0
  2. package/CONTRIBUTING.md +344 -265
  3. package/DEBUGGING.md +185 -103
  4. package/EXAMPLES.md +470 -345
  5. package/{readme.md → README.md} +306 -203
  6. package/dist/components/ui/accordion.d.ts +157 -5
  7. package/dist/components/ui/accordion.d.ts.map +1 -1
  8. package/dist/components/ui/accordion.js +100 -22
  9. package/dist/components/ui/accordion.js.map +1 -1
  10. package/dist/components/ui/accordion.module.js +12 -0
  11. package/dist/components/ui/accordion.module.js.map +1 -0
  12. package/dist/components/ui/accordion_module.css +72 -0
  13. package/dist/components/ui/accordion_module.css.map +1 -0
  14. package/dist/components/ui/alert-dialog.d.ts +321 -18
  15. package/dist/components/ui/alert-dialog.d.ts.map +1 -1
  16. package/dist/components/ui/alert-dialog.js +145 -52
  17. package/dist/components/ui/alert-dialog.js.map +1 -1
  18. package/dist/components/ui/alert-dialog.module.js +13 -0
  19. package/dist/components/ui/alert-dialog.module.js.map +1 -0
  20. package/dist/components/ui/alert-dialog_module.css +89 -0
  21. package/dist/components/ui/alert-dialog_module.css.map +1 -0
  22. package/dist/components/ui/alert.d.ts +109 -6
  23. package/dist/components/ui/alert.d.ts.map +1 -1
  24. package/dist/components/ui/alert.js +12 -21
  25. package/dist/components/ui/alert.js.map +1 -1
  26. package/dist/components/ui/alert.module.js +11 -0
  27. package/dist/components/ui/alert.module.js.map +1 -0
  28. package/dist/components/ui/alert_module.css +59 -0
  29. package/dist/components/ui/alert_module.css.map +1 -0
  30. package/dist/components/ui/aspect-ratio.d.ts +24 -2
  31. package/dist/components/ui/aspect-ratio.d.ts.map +1 -1
  32. package/dist/components/ui/aspect-ratio.js +14 -3
  33. package/dist/components/ui/aspect-ratio.js.map +1 -1
  34. package/dist/components/ui/aspect-ratio.module.js +7 -0
  35. package/dist/components/ui/aspect-ratio.module.js.map +1 -0
  36. package/dist/components/ui/aspect-ratio_module.css +10 -0
  37. package/dist/components/ui/aspect-ratio_module.css.map +1 -0
  38. package/dist/components/ui/async-boundary.js +17 -0
  39. package/dist/components/ui/async-boundary.js.map +1 -0
  40. package/dist/components/ui/avatar.d.ts +97 -4
  41. package/dist/components/ui/avatar.d.ts.map +1 -1
  42. package/dist/components/ui/avatar.js +50 -21
  43. package/dist/components/ui/avatar.js.map +1 -1
  44. package/dist/components/ui/avatar.module.js +9 -0
  45. package/dist/components/ui/avatar.module.js.map +1 -0
  46. package/dist/components/ui/avatar_module.css +35 -0
  47. package/dist/components/ui/avatar_module.css.map +1 -0
  48. package/dist/components/ui/background-beams.d.ts +21 -3
  49. package/dist/components/ui/background-beams.d.ts.map +1 -1
  50. package/dist/components/ui/background-beams.js +22 -11
  51. package/dist/components/ui/background-beams.js.map +1 -1
  52. package/dist/components/ui/background-beams.module.js +8 -0
  53. package/dist/components/ui/background-beams.module.js.map +1 -0
  54. package/dist/components/ui/background-beams_module.css +22 -0
  55. package/dist/components/ui/background-beams_module.css.map +1 -0
  56. package/dist/components/ui/badge.d.ts +79 -6
  57. package/dist/components/ui/badge.d.ts.map +1 -1
  58. package/dist/components/ui/badge.js +19 -23
  59. package/dist/components/ui/badge.js.map +1 -1
  60. package/dist/components/ui/badge.module.js +11 -0
  61. package/dist/components/ui/badge.module.js.map +1 -0
  62. package/dist/components/ui/badge_module.css +63 -0
  63. package/dist/components/ui/badge_module.css.map +1 -0
  64. package/dist/components/ui/breadcrumb.d.ts +158 -13
  65. package/dist/components/ui/breadcrumb.d.ts.map +1 -1
  66. package/dist/components/ui/breadcrumb.js +39 -30
  67. package/dist/components/ui/breadcrumb.js.map +1 -1
  68. package/dist/components/ui/breadcrumb.module.js +14 -0
  69. package/dist/components/ui/breadcrumb.module.js.map +1 -0
  70. package/dist/components/ui/breadcrumb_module.css +90 -0
  71. package/dist/components/ui/breadcrumb_module.css.map +1 -0
  72. package/dist/components/ui/bubble-background.d.ts +38 -10
  73. package/dist/components/ui/bubble-background.d.ts.map +1 -1
  74. package/dist/components/ui/bubble-background.js +33 -35
  75. package/dist/components/ui/bubble-background.js.map +1 -1
  76. package/dist/components/ui/bubble-background.module.js +20 -0
  77. package/dist/components/ui/bubble-background.module.js.map +1 -0
  78. package/dist/components/ui/bubble-background_module.css +99 -0
  79. package/dist/components/ui/bubble-background_module.css.map +1 -0
  80. package/dist/components/ui/button-group.d.ts +88 -8
  81. package/dist/components/ui/button-group.d.ts.map +1 -1
  82. package/dist/components/ui/button-group.js +35 -32
  83. package/dist/components/ui/button-group.js.map +1 -1
  84. package/dist/components/ui/button-group.module.js +11 -0
  85. package/dist/components/ui/button-group.module.js.map +1 -0
  86. package/dist/components/ui/button-group_module.css +79 -0
  87. package/dist/components/ui/button-group_module.css.map +1 -0
  88. package/dist/components/ui/button.d.ts +82 -7
  89. package/dist/components/ui/button.d.ts.map +1 -1
  90. package/dist/components/ui/button.js +69 -34
  91. package/dist/components/ui/button.js.map +1 -1
  92. package/dist/components/ui/button.module.js +17 -0
  93. package/dist/components/ui/button.module.js.map +1 -0
  94. package/dist/components/ui/button_module.css +137 -0
  95. package/dist/components/ui/button_module.css.map +1 -0
  96. package/dist/components/ui/calendar.d.ts +39 -5
  97. package/dist/components/ui/calendar.d.ts.map +1 -1
  98. package/dist/components/ui/calendar.js +72 -61
  99. package/dist/components/ui/calendar.js.map +1 -1
  100. package/dist/components/ui/calendar.module.js +35 -0
  101. package/dist/components/ui/calendar.module.js.map +1 -0
  102. package/dist/components/ui/calendar_module.css +245 -0
  103. package/dist/components/ui/calendar_module.css.map +1 -0
  104. package/dist/components/ui/card-skeleton.js +41 -0
  105. package/dist/components/ui/card-skeleton.js.map +1 -0
  106. package/dist/components/ui/card-skeleton.module.js +15 -0
  107. package/dist/components/ui/card-skeleton.module.js.map +1 -0
  108. package/dist/components/ui/card-skeleton_module.css +54 -0
  109. package/dist/components/ui/card-skeleton_module.css.map +1 -0
  110. package/dist/components/ui/card.d.ts +162 -7
  111. package/dist/components/ui/card.d.ts.map +1 -1
  112. package/dist/components/ui/card.js +13 -13
  113. package/dist/components/ui/card.js.map +1 -1
  114. package/dist/components/ui/card.module.js +13 -0
  115. package/dist/components/ui/card.module.js.map +1 -0
  116. package/dist/components/ui/card_module.css +43 -0
  117. package/dist/components/ui/card_module.css.map +1 -0
  118. package/dist/components/ui/carousel.d.ts +127 -3
  119. package/dist/components/ui/carousel.d.ts.map +1 -1
  120. package/dist/components/ui/carousel.js +63 -36
  121. package/dist/components/ui/carousel.js.map +1 -1
  122. package/dist/components/ui/carousel.module.js +17 -0
  123. package/dist/components/ui/carousel.module.js.map +1 -0
  124. package/dist/components/ui/carousel_module.css +82 -0
  125. package/dist/components/ui/carousel_module.css.map +1 -0
  126. package/dist/components/ui/chart.d.ts +323 -13
  127. package/dist/components/ui/chart.d.ts.map +1 -1
  128. package/dist/components/ui/chart.js +158 -53
  129. package/dist/components/ui/chart.js.map +1 -1
  130. package/dist/components/ui/chart.module.js +27 -0
  131. package/dist/components/ui/chart.module.js.map +1 -0
  132. package/dist/components/ui/chart_module.css +159 -0
  133. package/dist/components/ui/chart_module.css.map +1 -0
  134. package/dist/components/ui/checkbox-group.d.ts +31 -0
  135. package/dist/components/ui/checkbox-group.d.ts.map +1 -0
  136. package/dist/components/ui/checkbox-group.js +25 -0
  137. package/dist/components/ui/checkbox-group.js.map +1 -0
  138. package/dist/components/ui/checkbox-group.module.js +7 -0
  139. package/dist/components/ui/checkbox-group.module.js.map +1 -0
  140. package/dist/components/ui/checkbox-group_module.css +11 -0
  141. package/dist/components/ui/checkbox-group_module.css.map +1 -0
  142. package/dist/components/ui/checkbox.d.ts +33 -2
  143. package/dist/components/ui/checkbox.d.ts.map +1 -1
  144. package/dist/components/ui/checkbox.js +37 -12
  145. package/dist/components/ui/checkbox.js.map +1 -1
  146. package/dist/components/ui/checkbox.module.js +8 -0
  147. package/dist/components/ui/checkbox.module.js.map +1 -0
  148. package/dist/components/ui/checkbox_module.css +45 -0
  149. package/dist/components/ui/checkbox_module.css.map +1 -0
  150. package/dist/components/ui/collapsible.d.ts +87 -3
  151. package/dist/components/ui/collapsible.d.ts.map +1 -1
  152. package/dist/components/ui/collapsible.js +46 -32
  153. package/dist/components/ui/collapsible.js.map +1 -1
  154. package/dist/components/ui/collapsible.module.js +8 -0
  155. package/dist/components/ui/collapsible.module.js.map +1 -0
  156. package/dist/components/ui/collapsible_module.css +26 -0
  157. package/dist/components/ui/collapsible_module.css.map +1 -0
  158. package/dist/components/ui/command.d.ts +284 -51
  159. package/dist/components/ui/command.d.ts.map +1 -1
  160. package/dist/components/ui/command.js +391 -50
  161. package/dist/components/ui/command.js.map +1 -1
  162. package/dist/components/ui/command.module.js +20 -0
  163. package/dist/components/ui/command.module.js.map +1 -0
  164. package/dist/components/ui/command_module.css +194 -0
  165. package/dist/components/ui/command_module.css.map +1 -0
  166. package/dist/components/ui/context-menu.d.ts +414 -21
  167. package/dist/components/ui/context-menu.d.ts.map +1 -1
  168. package/dist/components/ui/context-menu.js +190 -68
  169. package/dist/components/ui/context-menu.js.map +1 -1
  170. package/dist/components/ui/context-menu.module.js +19 -0
  171. package/dist/components/ui/context-menu.module.js.map +1 -0
  172. package/dist/components/ui/context-menu_module.css +114 -0
  173. package/dist/components/ui/context-menu_module.css.map +1 -0
  174. package/dist/components/ui/copy-button.d.ts +41 -0
  175. package/dist/components/ui/copy-button.d.ts.map +1 -0
  176. package/dist/components/ui/copy-button.js +51 -0
  177. package/dist/components/ui/copy-button.js.map +1 -0
  178. package/dist/components/ui/copy-button.module.js +8 -0
  179. package/dist/components/ui/copy-button.module.js.map +1 -0
  180. package/dist/components/ui/copy-button_module.css +37 -0
  181. package/dist/components/ui/copy-button_module.css.map +1 -0
  182. package/dist/components/ui/counting-number.d.ts +28 -2
  183. package/dist/components/ui/counting-number.d.ts.map +1 -1
  184. package/dist/components/ui/counting-number.js +31 -27
  185. package/dist/components/ui/counting-number.js.map +1 -1
  186. package/dist/components/ui/counting-number.module.js +7 -0
  187. package/dist/components/ui/counting-number.module.js.map +1 -0
  188. package/dist/components/ui/counting-number_module.css +7 -0
  189. package/dist/components/ui/counting-number_module.css.map +1 -0
  190. package/dist/components/ui/dialog.d.ts +287 -17
  191. package/dist/components/ui/dialog.d.ts.map +1 -1
  192. package/dist/components/ui/dialog.js +129 -52
  193. package/dist/components/ui/dialog.js.map +1 -1
  194. package/dist/components/ui/dialog.module.js +13 -0
  195. package/dist/components/ui/dialog.module.js.map +1 -0
  196. package/dist/components/ui/dialog_module.css +114 -0
  197. package/dist/components/ui/dialog_module.css.map +1 -0
  198. package/dist/components/ui/dot-background.d.ts +25 -35
  199. package/dist/components/ui/dot-background.d.ts.map +1 -1
  200. package/dist/components/ui/dot-background.js +31 -22
  201. package/dist/components/ui/dot-background.js.map +1 -1
  202. package/dist/components/ui/dot-background.module.js +8 -0
  203. package/dist/components/ui/dot-background.module.js.map +1 -0
  204. package/dist/components/ui/dot-background_module.css +15 -0
  205. package/dist/components/ui/dot-background_module.css.map +1 -0
  206. package/dist/components/ui/drawer.d.ts +287 -18
  207. package/dist/components/ui/drawer.d.ts.map +1 -1
  208. package/dist/components/ui/drawer.js +117 -40
  209. package/dist/components/ui/drawer.js.map +1 -1
  210. package/dist/components/ui/drawer.module.js +14 -0
  211. package/dist/components/ui/drawer.module.js.map +1 -0
  212. package/dist/components/ui/drawer_module.css +86 -0
  213. package/dist/components/ui/drawer_module.css.map +1 -0
  214. package/dist/components/ui/dropdown-menu.d.ts +414 -21
  215. package/dist/components/ui/dropdown-menu.d.ts.map +1 -1
  216. package/dist/components/ui/dropdown-menu.js +189 -68
  217. package/dist/components/ui/dropdown-menu.js.map +1 -1
  218. package/dist/components/ui/dropdown-menu.module.js +19 -0
  219. package/dist/components/ui/dropdown-menu.module.js.map +1 -0
  220. package/dist/components/ui/dropdown-menu_module.css +114 -0
  221. package/dist/components/ui/dropdown-menu_module.css.map +1 -0
  222. package/dist/components/ui/dropdrawer.d.ts +313 -17
  223. package/dist/components/ui/dropdrawer.d.ts.map +1 -1
  224. package/dist/components/ui/dropdrawer.js +423 -159
  225. package/dist/components/ui/dropdrawer.js.map +1 -1
  226. package/dist/components/ui/dropdrawer.module.js +43 -0
  227. package/dist/components/ui/dropdrawer.module.js.map +1 -0
  228. package/dist/components/ui/dropdrawer_module.css +307 -0
  229. package/dist/components/ui/dropdrawer_module.css.map +1 -0
  230. package/dist/components/ui/empty.d.ts +129 -10
  231. package/dist/components/ui/empty.d.ts.map +1 -1
  232. package/dist/components/ui/empty.js +32 -47
  233. package/dist/components/ui/empty.js.map +1 -1
  234. package/dist/components/ui/empty.module.js +13 -0
  235. package/dist/components/ui/empty.module.js.map +1 -0
  236. package/dist/components/ui/empty_module.css +85 -0
  237. package/dist/components/ui/empty_module.css.map +1 -0
  238. package/dist/components/ui/error-boundary.js +61 -0
  239. package/dist/components/ui/error-boundary.js.map +1 -0
  240. package/dist/components/ui/error-boundary.module.js +10 -0
  241. package/dist/components/ui/error-boundary.module.js.map +1 -0
  242. package/dist/components/ui/error-boundary_module.css +41 -0
  243. package/dist/components/ui/error-boundary_module.css.map +1 -0
  244. package/dist/components/ui/field.d.ts +225 -0
  245. package/dist/components/ui/field.d.ts.map +1 -0
  246. package/dist/components/ui/field.js +76 -86
  247. package/dist/components/ui/field.js.map +1 -1
  248. package/dist/components/ui/field.module.js +24 -0
  249. package/dist/components/ui/field.module.js.map +1 -0
  250. package/dist/components/ui/field_module.css +185 -0
  251. package/dist/components/ui/field_module.css.map +1 -0
  252. package/dist/components/ui/fireworks-background.d.ts +27 -3
  253. package/dist/components/ui/fireworks-background.d.ts.map +1 -1
  254. package/dist/components/ui/fireworks-background.js +36 -35
  255. package/dist/components/ui/fireworks-background.js.map +1 -1
  256. package/dist/components/ui/fireworks-background.module.js +8 -0
  257. package/dist/components/ui/fireworks-background.module.js.map +1 -0
  258. package/dist/components/ui/fireworks-background_module.css +17 -0
  259. package/dist/components/ui/fireworks-background_module.css.map +1 -0
  260. package/dist/components/ui/flip-button.d.ts +27 -3
  261. package/dist/components/ui/flip-button.d.ts.map +1 -1
  262. package/dist/components/ui/flip-button.js +27 -17
  263. package/dist/components/ui/flip-button.js.map +1 -1
  264. package/dist/components/ui/flip-button.module.js +11 -0
  265. package/dist/components/ui/flip-button.module.js.map +1 -0
  266. package/dist/components/ui/flip-button_module.css +47 -0
  267. package/dist/components/ui/flip-button_module.css.map +1 -0
  268. package/dist/components/ui/focus-scope.js +70 -0
  269. package/dist/components/ui/focus-scope.js.map +1 -0
  270. package/dist/components/ui/focus-scope.module.js +7 -0
  271. package/dist/components/ui/focus-scope.module.js.map +1 -0
  272. package/dist/components/ui/focus-scope_module.css +6 -0
  273. package/dist/components/ui/focus-scope_module.css.map +1 -0
  274. package/dist/components/ui/form-skeleton.js +32 -0
  275. package/dist/components/ui/form-skeleton.js.map +1 -0
  276. package/dist/components/ui/form-skeleton.module.js +11 -0
  277. package/dist/components/ui/form-skeleton.module.js.map +1 -0
  278. package/dist/components/ui/form-skeleton_module.css +30 -0
  279. package/dist/components/ui/form-skeleton_module.css.map +1 -0
  280. package/dist/components/ui/form.d.ts +143 -13
  281. package/dist/components/ui/form.d.ts.map +1 -1
  282. package/dist/components/ui/form.js +55 -21
  283. package/dist/components/ui/form.js.map +1 -1
  284. package/dist/components/ui/form.module.js +10 -0
  285. package/dist/components/ui/form.module.js.map +1 -0
  286. package/dist/components/ui/form_module.css +22 -0
  287. package/dist/components/ui/form_module.css.map +1 -0
  288. package/dist/components/ui/gradient-background.d.ts +21 -3
  289. package/dist/components/ui/gradient-background.d.ts.map +1 -1
  290. package/dist/components/ui/gradient-background.js +8 -4
  291. package/dist/components/ui/gradient-background.js.map +1 -1
  292. package/dist/components/ui/gradient-background.module.js +7 -0
  293. package/dist/components/ui/gradient-background.module.js.map +1 -0
  294. package/dist/components/ui/gradient-background_module.css +9 -0
  295. package/dist/components/ui/gradient-background_module.css.map +1 -0
  296. package/dist/components/ui/gradient-text.d.ts +23 -2
  297. package/dist/components/ui/gradient-text.d.ts.map +1 -1
  298. package/dist/components/ui/gradient-text.js +8 -6
  299. package/dist/components/ui/gradient-text.js.map +1 -1
  300. package/dist/components/ui/gradient-text.module.js +9 -0
  301. package/dist/components/ui/gradient-text.module.js.map +1 -0
  302. package/dist/components/ui/gradient-text_module.css +24 -0
  303. package/dist/components/ui/gradient-text_module.css.map +1 -0
  304. package/dist/components/ui/highlight-text.d.ts +24 -2
  305. package/dist/components/ui/highlight-text.d.ts.map +1 -1
  306. package/dist/components/ui/highlight-text.js +7 -10
  307. package/dist/components/ui/highlight-text.js.map +1 -1
  308. package/dist/components/ui/highlight-text.module.js +7 -0
  309. package/dist/components/ui/highlight-text.module.js.map +1 -0
  310. package/dist/components/ui/highlight-text_module.css +16 -0
  311. package/dist/components/ui/highlight-text_module.css.map +1 -0
  312. package/dist/components/ui/hole-background.d.ts +23 -2
  313. package/dist/components/ui/hole-background.d.ts.map +1 -1
  314. package/dist/components/ui/hole-background.js +155 -118
  315. package/dist/components/ui/hole-background.js.map +1 -1
  316. package/dist/components/ui/hole-background.module.js +10 -0
  317. package/dist/components/ui/hole-background.module.js.map +1 -0
  318. package/dist/components/ui/hole-background_module.css +85 -0
  319. package/dist/components/ui/hole-background_module.css.map +1 -0
  320. package/dist/components/ui/hover-card.d.ts +85 -4
  321. package/dist/components/ui/hover-card.d.ts.map +1 -1
  322. package/dist/components/ui/hover-card.js +52 -10
  323. package/dist/components/ui/hover-card.js.map +1 -1
  324. package/dist/components/ui/hover-card.module.js +8 -0
  325. package/dist/components/ui/hover-card.module.js.map +1 -0
  326. package/dist/components/ui/hover-card_module.css +23 -0
  327. package/dist/components/ui/hover-card_module.css.map +1 -0
  328. package/dist/components/ui/input-group.d.ts +132 -13
  329. package/dist/components/ui/input-group.d.ts.map +1 -1
  330. package/dist/components/ui/input-group.js +62 -66
  331. package/dist/components/ui/input-group.js.map +1 -1
  332. package/dist/components/ui/input-group.module.js +20 -0
  333. package/dist/components/ui/input-group.module.js.map +1 -0
  334. package/dist/components/ui/input-group_module.css +150 -0
  335. package/dist/components/ui/input-group_module.css.map +1 -0
  336. package/dist/components/ui/input-otp.d.ts +110 -30
  337. package/dist/components/ui/input-otp.d.ts.map +1 -1
  338. package/dist/components/ui/input-otp.js +24 -15
  339. package/dist/components/ui/input-otp.js.map +1 -1
  340. package/dist/components/ui/input-otp.module.js +17 -0
  341. package/dist/components/ui/input-otp.module.js.map +1 -0
  342. package/dist/components/ui/input-otp_module.css +89 -0
  343. package/dist/components/ui/input-otp_module.css.map +1 -0
  344. package/dist/components/ui/input.d.ts +31 -1
  345. package/dist/components/ui/input.d.ts.map +1 -1
  346. package/dist/components/ui/input.js +21 -8
  347. package/dist/components/ui/input.js.map +1 -1
  348. package/dist/components/ui/input.module.js +7 -0
  349. package/dist/components/ui/input.module.js.map +1 -0
  350. package/dist/components/ui/input_module.css +40 -0
  351. package/dist/components/ui/input_module.css.map +1 -0
  352. package/dist/components/ui/item.d.ts +221 -19
  353. package/dist/components/ui/item.d.ts.map +1 -1
  354. package/dist/components/ui/item.js +66 -90
  355. package/dist/components/ui/item.js.map +1 -1
  356. package/dist/components/ui/item.module.js +22 -0
  357. package/dist/components/ui/item.module.js.map +1 -0
  358. package/dist/components/ui/item_module.css +143 -0
  359. package/dist/components/ui/item_module.css.map +1 -0
  360. package/dist/components/ui/kbd.d.ts +43 -2
  361. package/dist/components/ui/kbd.d.ts.map +1 -1
  362. package/dist/components/ui/kbd.js +12 -12
  363. package/dist/components/ui/kbd.js.map +1 -1
  364. package/dist/components/ui/kbd.module.js +8 -0
  365. package/dist/components/ui/kbd.module.js.map +1 -0
  366. package/dist/components/ui/kbd_module.css +35 -0
  367. package/dist/components/ui/kbd_module.css.map +1 -0
  368. package/dist/components/ui/label.d.ts +30 -3
  369. package/dist/components/ui/label.d.ts.map +1 -1
  370. package/dist/components/ui/label.js +7 -8
  371. package/dist/components/ui/label.js.map +1 -1
  372. package/dist/components/ui/label.module.js +7 -0
  373. package/dist/components/ui/label.module.js.map +1 -0
  374. package/dist/components/ui/label_module.css +17 -0
  375. package/dist/components/ui/label_module.css.map +1 -0
  376. package/dist/components/ui/list-skeleton.js +35 -0
  377. package/dist/components/ui/list-skeleton.js.map +1 -0
  378. package/dist/components/ui/list-skeleton.module.js +12 -0
  379. package/dist/components/ui/list-skeleton.module.js.map +1 -0
  380. package/dist/components/ui/list-skeleton_module.css +39 -0
  381. package/dist/components/ui/list-skeleton_module.css.map +1 -0
  382. package/dist/components/ui/loading-overlay.js +21 -0
  383. package/dist/components/ui/loading-overlay.js.map +1 -0
  384. package/dist/components/ui/loading-overlay.module.js +9 -0
  385. package/dist/components/ui/loading-overlay.module.js.map +1 -0
  386. package/dist/components/ui/loading-overlay_module.css +22 -0
  387. package/dist/components/ui/loading-overlay_module.css.map +1 -0
  388. package/dist/components/ui/menubar.d.ts +422 -22
  389. package/dist/components/ui/menubar.d.ts.map +1 -1
  390. package/dist/components/ui/menubar.js +199 -100
  391. package/dist/components/ui/menubar.js.map +1 -1
  392. package/dist/components/ui/menubar.module.js +21 -0
  393. package/dist/components/ui/menubar.module.js.map +1 -0
  394. package/dist/components/ui/menubar_module.css +145 -0
  395. package/dist/components/ui/menubar_module.css.map +1 -0
  396. package/dist/components/ui/meter.d.ts +101 -0
  397. package/dist/components/ui/meter.d.ts.map +1 -0
  398. package/dist/components/ui/meter.js +71 -0
  399. package/dist/components/ui/meter.js.map +1 -0
  400. package/dist/components/ui/meter.module.js +10 -0
  401. package/dist/components/ui/meter.module.js.map +1 -0
  402. package/dist/components/ui/meter_module.css +31 -0
  403. package/dist/components/ui/meter_module.css.map +1 -0
  404. package/dist/components/ui/navigation-menu.d.ts +242 -11
  405. package/dist/components/ui/navigation-menu.d.ts.map +1 -1
  406. package/dist/components/ui/navigation-menu.js +135 -49
  407. package/dist/components/ui/navigation-menu.js.map +1 -1
  408. package/dist/components/ui/navigation-menu.module.js +18 -0
  409. package/dist/components/ui/navigation-menu.module.js.map +1 -0
  410. package/dist/components/ui/navigation-menu_module.css +112 -0
  411. package/dist/components/ui/navigation-menu_module.css.map +1 -0
  412. package/dist/components/ui/number-field.d.ts +144 -0
  413. package/dist/components/ui/number-field.d.ts.map +1 -0
  414. package/dist/components/ui/number-field.js +111 -0
  415. package/dist/components/ui/number-field.js.map +1 -0
  416. package/dist/components/ui/number-field.module.js +15 -0
  417. package/dist/components/ui/number-field.module.js.map +1 -0
  418. package/dist/components/ui/number-field_module.css +125 -0
  419. package/dist/components/ui/number-field_module.css.map +1 -0
  420. package/dist/components/ui/pagination.d.ts +150 -24
  421. package/dist/components/ui/pagination.d.ts.map +1 -1
  422. package/dist/components/ui/pagination.js +41 -38
  423. package/dist/components/ui/pagination.js.map +1 -1
  424. package/dist/components/ui/pagination.module.js +14 -0
  425. package/dist/components/ui/pagination.module.js.map +1 -0
  426. package/dist/components/ui/pagination_module.css +66 -0
  427. package/dist/components/ui/pagination_module.css.map +1 -0
  428. package/dist/components/ui/popover.d.ts +133 -5
  429. package/dist/components/ui/popover.d.ts.map +1 -1
  430. package/dist/components/ui/popover.js +68 -14
  431. package/dist/components/ui/popover.js.map +1 -1
  432. package/dist/components/ui/popover.module.js +9 -0
  433. package/dist/components/ui/popover.module.js.map +1 -0
  434. package/dist/components/ui/popover_module.css +28 -0
  435. package/dist/components/ui/popover_module.css.map +1 -0
  436. package/dist/components/ui/progress.d.ts +34 -2
  437. package/dist/components/ui/progress.d.ts.map +1 -1
  438. package/dist/components/ui/progress.js +22 -14
  439. package/dist/components/ui/progress.js.map +1 -1
  440. package/dist/components/ui/progress.module.js +8 -0
  441. package/dist/components/ui/progress.module.js.map +1 -0
  442. package/dist/components/ui/progress_module.css +20 -0
  443. package/dist/components/ui/progress_module.css.map +1 -0
  444. package/dist/components/ui/radio-group.d.ts +44 -3
  445. package/dist/components/ui/radio-group.d.ts.map +1 -1
  446. package/dist/components/ui/radio-group.js +38 -16
  447. package/dist/components/ui/radio-group.js.map +1 -1
  448. package/dist/components/ui/radio-group.module.js +10 -0
  449. package/dist/components/ui/radio-group.module.js.map +1 -0
  450. package/dist/components/ui/radio-group_module.css +44 -0
  451. package/dist/components/ui/radio-group_module.css.map +1 -0
  452. package/dist/components/ui/resizable.d.ts +79 -6
  453. package/dist/components/ui/resizable.d.ts.map +1 -1
  454. package/dist/components/ui/resizable.js +23 -13
  455. package/dist/components/ui/resizable.js.map +1 -1
  456. package/dist/components/ui/resizable.module.js +10 -0
  457. package/dist/components/ui/resizable.module.js.map +1 -0
  458. package/dist/components/ui/resizable_module.css +70 -0
  459. package/dist/components/ui/resizable_module.css.map +1 -0
  460. package/dist/components/ui/ripple-button.d.ts +23 -2
  461. package/dist/components/ui/ripple-button.d.ts.map +1 -1
  462. package/dist/components/ui/ripple-button.js +26 -11
  463. package/dist/components/ui/ripple-button.js.map +1 -1
  464. package/dist/components/ui/ripple-button.module.js +9 -0
  465. package/dist/components/ui/ripple-button.module.js.map +1 -0
  466. package/dist/components/ui/ripple-button_module.css +38 -0
  467. package/dist/components/ui/ripple-button_module.css.map +1 -0
  468. package/dist/components/ui/scratcher.d.ts +25 -2
  469. package/dist/components/ui/scratcher.d.ts.map +1 -1
  470. package/dist/components/ui/scratcher.js +85 -87
  471. package/dist/components/ui/scratcher.js.map +1 -1
  472. package/dist/components/ui/scratcher.module.js +8 -0
  473. package/dist/components/ui/scratcher.module.js.map +1 -0
  474. package/dist/components/ui/scratcher_module.css +13 -0
  475. package/dist/components/ui/scratcher_module.css.map +1 -0
  476. package/dist/components/ui/scroll-area.d.ts +46 -3
  477. package/dist/components/ui/scroll-area.d.ts.map +1 -1
  478. package/dist/components/ui/scroll-area.js +44 -19
  479. package/dist/components/ui/scroll-area.js.map +1 -1
  480. package/dist/components/ui/scroll-area.module.js +14 -0
  481. package/dist/components/ui/scroll-area.module.js.map +1 -0
  482. package/dist/components/ui/scroll-area_module.css +51 -0
  483. package/dist/components/ui/scroll-area_module.css.map +1 -0
  484. package/dist/components/ui/select.d.ts +269 -11
  485. package/dist/components/ui/select.d.ts.map +1 -1
  486. package/dist/components/ui/select.js +152 -67
  487. package/dist/components/ui/select.js.map +1 -1
  488. package/dist/components/ui/select.module.js +20 -0
  489. package/dist/components/ui/select.module.js.map +1 -0
  490. package/dist/components/ui/select_module.css +134 -0
  491. package/dist/components/ui/select_module.css.map +1 -0
  492. package/dist/components/ui/separator.d.ts +36 -2
  493. package/dist/components/ui/separator.d.ts.map +1 -1
  494. package/dist/components/ui/separator.js +20 -10
  495. package/dist/components/ui/separator.js.map +1 -1
  496. package/dist/components/ui/separator.module.js +9 -0
  497. package/dist/components/ui/separator.module.js.map +1 -0
  498. package/dist/components/ui/separator_module.css +17 -0
  499. package/dist/components/ui/separator_module.css.map +1 -0
  500. package/dist/components/ui/sheet.d.ts +297 -23
  501. package/dist/components/ui/sheet.d.ts.map +1 -1
  502. package/dist/components/ui/sheet.js +121 -63
  503. package/dist/components/ui/sheet.js.map +1 -1
  504. package/dist/components/ui/sheet.module.js +18 -0
  505. package/dist/components/ui/sheet.module.js.map +1 -0
  506. package/dist/components/ui/sheet_module.css +136 -0
  507. package/dist/components/ui/sheet_module.css.map +1 -0
  508. package/dist/components/ui/sidebar.d.ts +491 -23
  509. package/dist/components/ui/sidebar.d.ts.map +1 -1
  510. package/dist/components/ui/sidebar.js +214 -143
  511. package/dist/components/ui/sidebar.js.map +1 -1
  512. package/dist/components/ui/sidebar.module.js +50 -0
  513. package/dist/components/ui/sidebar.module.js.map +1 -0
  514. package/dist/components/ui/sidebar_module.css +569 -0
  515. package/dist/components/ui/sidebar_module.css.map +1 -0
  516. package/dist/components/ui/skeleton.d.ts +30 -1
  517. package/dist/components/ui/skeleton.d.ts.map +1 -1
  518. package/dist/components/ui/skeleton.js +7 -7
  519. package/dist/components/ui/skeleton.js.map +1 -1
  520. package/dist/components/ui/skeleton.module.js +8 -0
  521. package/dist/components/ui/skeleton.module.js.map +1 -0
  522. package/dist/components/ui/skeleton_module.css +18 -0
  523. package/dist/components/ui/skeleton_module.css.map +1 -0
  524. package/dist/components/ui/slider.d.ts +48 -2
  525. package/dist/components/ui/slider.d.ts.map +1 -1
  526. package/dist/components/ui/slider.js +44 -17
  527. package/dist/components/ui/slider.js.map +1 -1
  528. package/dist/components/ui/slider.module.js +11 -0
  529. package/dist/components/ui/slider.module.js.map +1 -0
  530. package/dist/components/ui/slider_module.css +55 -0
  531. package/dist/components/ui/slider_module.css.map +1 -0
  532. package/dist/components/ui/sonner.d.ts +137 -4
  533. package/dist/components/ui/sonner.d.ts.map +1 -1
  534. package/dist/components/ui/sonner.js +450 -18
  535. package/dist/components/ui/sonner.js.map +1 -1
  536. package/dist/components/ui/sonner.module.js +34 -0
  537. package/dist/components/ui/sonner.module.js.map +1 -0
  538. package/dist/components/ui/sonner_module.css +233 -0
  539. package/dist/components/ui/sonner_module.css.map +1 -0
  540. package/dist/components/ui/spinner.d.ts +20 -1
  541. package/dist/components/ui/spinner.d.ts.map +1 -1
  542. package/dist/components/ui/spinner.js +29 -11
  543. package/dist/components/ui/spinner.js.map +1 -1
  544. package/dist/components/ui/spinner.module.js +10 -0
  545. package/dist/components/ui/spinner.module.js.map +1 -0
  546. package/dist/components/ui/spinner_module.css +28 -0
  547. package/dist/components/ui/spinner_module.css.map +1 -0
  548. package/dist/components/ui/stepper.d.ts +48 -0
  549. package/dist/components/ui/stepper.d.ts.map +1 -0
  550. package/dist/components/ui/stepper.js +41 -0
  551. package/dist/components/ui/stepper.js.map +1 -0
  552. package/dist/components/ui/stepper.module.js +12 -0
  553. package/dist/components/ui/stepper.module.js.map +1 -0
  554. package/dist/components/ui/stepper_module.css +75 -0
  555. package/dist/components/ui/stepper_module.css.map +1 -0
  556. package/dist/components/ui/switch.d.ts +29 -2
  557. package/dist/components/ui/switch.d.ts.map +1 -1
  558. package/dist/components/ui/switch.js +21 -9
  559. package/dist/components/ui/switch.js.map +1 -1
  560. package/dist/components/ui/switch.module.js +8 -0
  561. package/dist/components/ui/switch.module.js.map +1 -0
  562. package/dist/components/ui/switch_module.css +45 -0
  563. package/dist/components/ui/switch_module.css.map +1 -0
  564. package/dist/components/ui/table-skeleton.js +34 -0
  565. package/dist/components/ui/table-skeleton.js.map +1 -0
  566. package/dist/components/ui/table-skeleton.module.js +11 -0
  567. package/dist/components/ui/table-skeleton.module.js.map +1 -0
  568. package/dist/components/ui/table-skeleton_module.css +32 -0
  569. package/dist/components/ui/table-skeleton_module.css.map +1 -0
  570. package/dist/components/ui/table.d.ts +170 -8
  571. package/dist/components/ui/table.d.ts.map +1 -1
  572. package/dist/components/ui/table.js +17 -17
  573. package/dist/components/ui/table.js.map +1 -1
  574. package/dist/components/ui/table.module.js +15 -0
  575. package/dist/components/ui/table.module.js.map +1 -0
  576. package/dist/components/ui/table_module.css +71 -0
  577. package/dist/components/ui/table_module.css.map +1 -0
  578. package/dist/components/ui/tabs.d.ts +114 -5
  579. package/dist/components/ui/tabs.d.ts.map +1 -1
  580. package/dist/components/ui/tabs.js +71 -20
  581. package/dist/components/ui/tabs.js.map +1 -1
  582. package/dist/components/ui/tabs.module.js +10 -0
  583. package/dist/components/ui/tabs.module.js.map +1 -0
  584. package/dist/components/ui/tabs_module.css +89 -0
  585. package/dist/components/ui/tabs_module.css.map +1 -0
  586. package/dist/components/ui/textarea.d.ts +24 -1
  587. package/dist/components/ui/textarea.d.ts.map +1 -1
  588. package/dist/components/ui/textarea.js +2 -2
  589. package/dist/components/ui/textarea.js.map +1 -1
  590. package/dist/components/ui/textarea.module.js +7 -0
  591. package/dist/components/ui/textarea.module.js.map +1 -0
  592. package/dist/components/ui/textarea_module.css +33 -0
  593. package/dist/components/ui/textarea_module.css.map +1 -0
  594. package/dist/components/ui/timeline.d.ts +111 -0
  595. package/dist/components/ui/timeline.d.ts.map +1 -0
  596. package/dist/components/ui/timeline.js +34 -0
  597. package/dist/components/ui/timeline.js.map +1 -0
  598. package/dist/components/ui/timeline.module.js +10 -0
  599. package/dist/components/ui/timeline.module.js.map +1 -0
  600. package/dist/components/ui/timeline_module.css +47 -0
  601. package/dist/components/ui/timeline_module.css.map +1 -0
  602. package/dist/components/ui/toggle-group.d.ts +81 -10
  603. package/dist/components/ui/toggle-group.d.ts.map +1 -1
  604. package/dist/components/ui/toggle-group.js +32 -23
  605. package/dist/components/ui/toggle-group.js.map +1 -1
  606. package/dist/components/ui/toggle-group.module.js +7 -0
  607. package/dist/components/ui/toggle-group.module.js.map +1 -0
  608. package/dist/components/ui/toggle-group_module.css +8 -0
  609. package/dist/components/ui/toggle-group_module.css.map +1 -0
  610. package/dist/components/ui/toggle.d.ts +60 -11
  611. package/dist/components/ui/toggle.d.ts.map +1 -1
  612. package/dist/components/ui/toggle.js +29 -29
  613. package/dist/components/ui/toggle.js.map +1 -1
  614. package/dist/components/ui/toggle.module.js +12 -0
  615. package/dist/components/ui/toggle.module.js.map +1 -0
  616. package/dist/components/ui/toggle_module.css +62 -0
  617. package/dist/components/ui/toggle_module.css.map +1 -0
  618. package/dist/components/ui/toolbar.d.ts +127 -0
  619. package/dist/components/ui/toolbar.d.ts.map +1 -0
  620. package/dist/components/ui/toolbar.js +85 -0
  621. package/dist/components/ui/toolbar.js.map +1 -0
  622. package/dist/components/ui/toolbar.module.js +12 -0
  623. package/dist/components/ui/toolbar.module.js.map +1 -0
  624. package/dist/components/ui/toolbar_module.css +115 -0
  625. package/dist/components/ui/toolbar_module.css.map +1 -0
  626. package/dist/components/ui/tooltip.d.ts +119 -5
  627. package/dist/components/ui/tooltip.d.ts.map +1 -1
  628. package/dist/components/ui/tooltip.js +48 -13
  629. package/dist/components/ui/tooltip.js.map +1 -1
  630. package/dist/components/ui/tooltip.module.js +9 -0
  631. package/dist/components/ui/tooltip.module.js.map +1 -0
  632. package/dist/components/ui/tooltip_module.css +35 -0
  633. package/dist/components/ui/tooltip_module.css.map +1 -0
  634. package/dist/components/ui/typewriter.d.ts +48 -13
  635. package/dist/components/ui/typewriter.d.ts.map +1 -1
  636. package/dist/components/ui/typewriter.js +46 -49
  637. package/dist/components/ui/typewriter.js.map +1 -1
  638. package/dist/components/ui/typewriter.module.js +16 -0
  639. package/dist/components/ui/typewriter.module.js.map +1 -0
  640. package/dist/components/ui/typewriter_module.css +102 -0
  641. package/dist/components/ui/typewriter_module.css.map +1 -0
  642. package/dist/components/ui/visually-hidden.d.ts +38 -0
  643. package/dist/components/ui/visually-hidden.d.ts.map +1 -0
  644. package/dist/components/ui/visually-hidden.js +13 -0
  645. package/dist/components/ui/visually-hidden.js.map +1 -0
  646. package/dist/components/ui/visually-hidden.module.js +7 -0
  647. package/dist/components/ui/visually-hidden.module.js.map +1 -0
  648. package/dist/components/ui/visually-hidden_module.css +14 -0
  649. package/dist/components/ui/visually-hidden_module.css.map +1 -0
  650. package/dist/hooks/useAnnounce.js +46 -0
  651. package/dist/hooks/useAnnounce.js.map +1 -0
  652. package/dist/hooks/useBreakpoint.d.ts +17 -0
  653. package/dist/hooks/useBreakpoint.d.ts.map +1 -0
  654. package/dist/hooks/useBreakpoint.js +16 -0
  655. package/dist/hooks/useBreakpoint.js.map +1 -0
  656. package/dist/hooks/useColorScheme.d.ts +14 -0
  657. package/dist/hooks/useColorScheme.d.ts.map +1 -0
  658. package/dist/hooks/useColorScheme.js +9 -0
  659. package/dist/hooks/useColorScheme.js.map +1 -0
  660. package/dist/hooks/useFocusManager.js +51 -0
  661. package/dist/hooks/useFocusManager.js.map +1 -0
  662. package/dist/hooks/useFocusVisible.d.ts +50 -0
  663. package/dist/hooks/useFocusVisible.d.ts.map +1 -0
  664. package/dist/hooks/useFocusVisible.js +35 -0
  665. package/dist/hooks/useFocusVisible.js.map +1 -0
  666. package/dist/hooks/useIsMobile.d.ts +5 -11
  667. package/dist/hooks/useIsMobile.d.ts.map +1 -1
  668. package/dist/hooks/useIsMobile.js +2 -13
  669. package/dist/hooks/useIsMobile.js.map +1 -1
  670. package/dist/hooks/useMediaQuery.d.ts +14 -0
  671. package/dist/hooks/useMediaQuery.d.ts.map +1 -0
  672. package/dist/hooks/useMediaQuery.js +20 -0
  673. package/dist/hooks/useMediaQuery.js.map +1 -0
  674. package/dist/hooks/usePrefersContrast.d.ts +19 -0
  675. package/dist/hooks/usePrefersContrast.d.ts.map +1 -0
  676. package/dist/hooks/usePrefersContrast.js +8 -0
  677. package/dist/hooks/usePrefersContrast.js.map +1 -0
  678. package/dist/hooks/useReducedMotion.d.ts +19 -0
  679. package/dist/hooks/useReducedMotion.d.ts.map +1 -0
  680. package/dist/hooks/useReducedMotion.js +2 -0
  681. package/dist/index.css +104 -5355
  682. package/dist/index.css.map +1 -1
  683. package/dist/index.d.ts +40 -8
  684. package/dist/index.d.ts.map +1 -1
  685. package/dist/index.js +89 -70
  686. package/dist/lib/color-conversion-utilities.d.ts +82 -0
  687. package/dist/lib/color-conversion-utilities.d.ts.map +1 -0
  688. package/dist/lib/color-conversion-utilities.js +94 -0
  689. package/dist/lib/color-conversion-utilities.js.map +1 -0
  690. package/dist/lib/utilities.d.ts +5 -4
  691. package/dist/lib/utilities.d.ts.map +1 -1
  692. package/dist/lib/utilities.js +1 -2
  693. package/dist/lib/utilities.js.map +1 -1
  694. package/dist/motion/Collapse.js +19 -0
  695. package/dist/motion/Collapse.js.map +1 -0
  696. package/dist/motion/Collapse.module.js +8 -0
  697. package/dist/motion/Collapse.module.js.map +1 -0
  698. package/dist/motion/Collapse_module.css +25 -0
  699. package/dist/motion/Collapse_module.css.map +1 -0
  700. package/dist/motion/Presence.js +14 -0
  701. package/dist/motion/Presence.js.map +1 -0
  702. package/dist/motion/index.js +5 -0
  703. package/dist/motion/presets.js +117 -0
  704. package/dist/motion/presets.js.map +1 -0
  705. package/dist/motion/tokens.js +41 -0
  706. package/dist/motion/tokens.js.map +1 -0
  707. package/package.json +159 -65
  708. package/src/components/ui/accordion.module.css +70 -0
  709. package/src/components/ui/accordion.tsx +278 -44
  710. package/src/components/ui/alert-dialog.module.css +87 -0
  711. package/src/components/ui/alert-dialog.tsx +474 -99
  712. package/src/components/ui/alert.module.css +57 -0
  713. package/src/components/ui/alert.tsx +136 -43
  714. package/src/components/ui/aspect-ratio.module.css +7 -0
  715. package/src/components/ui/aspect-ratio.tsx +38 -3
  716. package/src/components/ui/async-boundary.tsx +56 -0
  717. package/src/components/ui/avatar.module.css +31 -0
  718. package/src/components/ui/avatar.tsx +146 -36
  719. package/src/components/ui/background-beams.module.css +20 -0
  720. package/src/components/ui/background-beams.tsx +173 -134
  721. package/src/components/ui/badge.module.css +60 -0
  722. package/src/components/ui/badge.tsx +100 -32
  723. package/src/components/ui/breadcrumb.module.css +87 -0
  724. package/src/components/ui/breadcrumb.tsx +256 -74
  725. package/src/components/ui/bubble-background.module.css +97 -0
  726. package/src/components/ui/bubble-background.tsx +92 -52
  727. package/src/components/ui/button-group.module.css +76 -0
  728. package/src/components/ui/button-group.tsx +135 -46
  729. package/src/components/ui/button.module.css +138 -0
  730. package/src/components/ui/button.tsx +159 -41
  731. package/src/components/ui/calendar.module.css +250 -0
  732. package/src/components/ui/calendar.tsx +133 -103
  733. package/src/components/ui/card-skeleton.module.css +50 -0
  734. package/src/components/ui/card-skeleton.tsx +69 -0
  735. package/src/components/ui/card.module.css +41 -0
  736. package/src/components/ui/card.tsx +175 -22
  737. package/src/components/ui/carousel.module.css +80 -0
  738. package/src/components/ui/carousel.tsx +184 -43
  739. package/src/components/ui/chart.module.css +164 -0
  740. package/src/components/ui/chart.tsx +444 -102
  741. package/src/components/ui/checkbox-group.module.css +8 -0
  742. package/src/components/ui/checkbox-group.tsx +54 -0
  743. package/src/components/ui/checkbox.module.css +43 -0
  744. package/src/components/ui/checkbox.tsx +73 -19
  745. package/src/components/ui/collapsible.module.css +24 -0
  746. package/src/components/ui/collapsible.tsx +139 -3
  747. package/src/components/ui/command.module.css +193 -0
  748. package/src/components/ui/command.tsx +877 -113
  749. package/src/components/ui/context-menu.module.css +113 -0
  750. package/src/components/ui/context-menu.tsx +616 -157
  751. package/src/components/ui/copy-button.module.css +34 -0
  752. package/src/components/ui/copy-button.tsx +116 -0
  753. package/src/components/ui/counting-number.module.css +4 -0
  754. package/src/components/ui/counting-number.tsx +69 -31
  755. package/src/components/ui/dialog.module.css +113 -0
  756. package/src/components/ui/dialog.tsx +427 -81
  757. package/src/components/ui/dot-background.module.css +12 -0
  758. package/src/components/ui/dot-background.tsx +134 -126
  759. package/src/components/ui/drawer.module.css +85 -0
  760. package/src/components/ui/drawer.tsx +408 -80
  761. package/src/components/ui/dropdown-menu.module.css +113 -0
  762. package/src/components/ui/dropdown-menu.tsx +616 -159
  763. package/src/components/ui/dropdrawer.module.css +322 -0
  764. package/src/components/ui/dropdrawer.tsx +850 -398
  765. package/src/components/ui/empty.module.css +84 -0
  766. package/src/components/ui/empty.tsx +176 -52
  767. package/src/components/ui/error-boundary.module.css +36 -0
  768. package/src/components/ui/error-boundary.tsx +127 -0
  769. package/src/components/ui/field.module.css +179 -0
  770. package/src/components/ui/field.tsx +345 -139
  771. package/src/components/ui/fireworks-background.module.css +13 -0
  772. package/src/components/ui/fireworks-background.tsx +89 -51
  773. package/src/components/ui/flip-button.module.css +44 -0
  774. package/src/components/ui/flip-button.tsx +59 -28
  775. package/src/components/ui/focus-scope.module.css +3 -0
  776. package/src/components/ui/focus-scope.tsx +160 -0
  777. package/src/components/ui/form-skeleton.module.css +28 -0
  778. package/src/components/ui/form-skeleton.tsx +62 -0
  779. package/src/components/ui/form.module.css +20 -0
  780. package/src/components/ui/form.tsx +244 -33
  781. package/src/components/ui/gradient-background.module.css +6 -0
  782. package/src/components/ui/gradient-background.tsx +27 -5
  783. package/src/components/ui/gradient-text.module.css +23 -0
  784. package/src/components/ui/gradient-text.tsx +36 -9
  785. package/src/components/ui/highlight-text.module.css +14 -0
  786. package/src/components/ui/highlight-text.tsx +37 -15
  787. package/src/components/ui/hole-background.module.css +84 -0
  788. package/src/components/ui/hole-background.tsx +290 -162
  789. package/src/components/ui/hover-card.module.css +21 -0
  790. package/src/components/ui/hover-card.tsx +142 -21
  791. package/src/components/ui/input-group.module.css +148 -0
  792. package/src/components/ui/input-group.tsx +222 -98
  793. package/src/components/ui/input-otp.module.css +92 -0
  794. package/src/components/ui/input-otp.tsx +159 -33
  795. package/src/components/ui/input.module.css +37 -0
  796. package/src/components/ui/input.tsx +56 -14
  797. package/src/components/ui/item.module.css +143 -0
  798. package/src/components/ui/item.tsx +331 -104
  799. package/src/components/ui/kbd.module.css +31 -0
  800. package/src/components/ui/kbd.tsx +60 -17
  801. package/src/components/ui/label.module.css +13 -0
  802. package/src/components/ui/label.tsx +38 -14
  803. package/src/components/ui/list-skeleton.module.css +35 -0
  804. package/src/components/ui/list-skeleton.tsx +70 -0
  805. package/src/components/ui/loading-overlay.module.css +19 -0
  806. package/src/components/ui/loading-overlay.tsx +72 -0
  807. package/src/components/ui/menubar.module.css +144 -0
  808. package/src/components/ui/menubar.tsx +605 -192
  809. package/src/components/ui/meter.module.css +32 -0
  810. package/src/components/ui/meter.tsx +170 -0
  811. package/src/components/ui/navigation-menu.module.css +110 -0
  812. package/src/components/ui/navigation-menu.tsx +375 -101
  813. package/src/components/ui/number-field.module.css +126 -0
  814. package/src/components/ui/number-field.tsx +254 -0
  815. package/src/components/ui/pagination.module.css +64 -0
  816. package/src/components/ui/pagination.tsx +250 -72
  817. package/src/components/ui/popover.module.css +26 -0
  818. package/src/components/ui/popover.tsx +207 -25
  819. package/src/components/ui/progress.module.css +15 -0
  820. package/src/components/ui/progress.tsx +53 -16
  821. package/src/components/ui/radio-group.module.css +41 -0
  822. package/src/components/ui/radio-group.tsx +91 -34
  823. package/src/components/ui/resizable.module.css +67 -0
  824. package/src/components/ui/resizable.tsx +106 -26
  825. package/src/components/ui/ripple-button.module.css +35 -0
  826. package/src/components/ui/ripple-button.tsx +55 -21
  827. package/src/components/ui/scratcher.module.css +9 -0
  828. package/src/components/ui/scratcher.tsx +129 -99
  829. package/src/components/ui/scroll-area.module.css +47 -0
  830. package/src/components/ui/scroll-area.tsx +96 -34
  831. package/src/components/ui/select.module.css +131 -0
  832. package/src/components/ui/select.tsx +435 -124
  833. package/src/components/ui/separator.module.css +14 -0
  834. package/src/components/ui/separator.tsx +59 -18
  835. package/src/components/ui/sheet.module.css +138 -0
  836. package/src/components/ui/sheet.tsx +424 -95
  837. package/src/components/ui/sidebar.module.css +594 -0
  838. package/src/components/ui/sidebar.tsx +899 -425
  839. package/src/components/ui/skeleton.module.css +14 -0
  840. package/src/components/ui/skeleton.tsx +39 -9
  841. package/src/components/ui/slider.module.css +48 -0
  842. package/src/components/ui/slider.tsx +89 -16
  843. package/src/components/ui/sonner.module.css +246 -0
  844. package/src/components/ui/sonner.tsx +769 -25
  845. package/src/components/ui/spinner.module.css +25 -0
  846. package/src/components/ui/spinner.tsx +51 -12
  847. package/src/components/ui/stepper.module.css +72 -0
  848. package/src/components/ui/stepper.tsx +95 -0
  849. package/src/components/ui/switch.module.css +42 -0
  850. package/src/components/ui/switch.tsx +53 -20
  851. package/src/components/ui/table-skeleton.module.css +29 -0
  852. package/src/components/ui/table-skeleton.tsx +79 -0
  853. package/src/components/ui/table.module.css +66 -0
  854. package/src/components/ui/table.tsx +235 -61
  855. package/src/components/ui/tabs.module.css +89 -0
  856. package/src/components/ui/tabs.tsx +192 -45
  857. package/src/components/ui/textarea.module.css +30 -0
  858. package/src/components/ui/textarea.tsx +30 -10
  859. package/src/components/ui/timeline.module.css +43 -0
  860. package/src/components/ui/timeline.tsx +153 -0
  861. package/src/components/ui/toggle-group.module.css +5 -0
  862. package/src/components/ui/toggle-group.tsx +116 -35
  863. package/src/components/ui/toggle.module.css +57 -0
  864. package/src/components/ui/toggle.tsx +89 -33
  865. package/src/components/ui/toolbar.module.css +112 -0
  866. package/src/components/ui/toolbar.tsx +210 -0
  867. package/src/components/ui/tooltip.module.css +39 -0
  868. package/src/components/ui/tooltip.tsx +181 -24
  869. package/src/components/ui/typewriter.module.css +101 -0
  870. package/src/components/ui/typewriter.tsx +130 -128
  871. package/src/components/ui/visually-hidden.module.css +11 -0
  872. package/src/components/ui/visually-hidden.tsx +50 -0
  873. package/src/css-modules.d.ts +9 -0
  874. package/src/hooks/useAnnounce.tsx +73 -0
  875. package/src/hooks/useBreakpoint.tsx +41 -0
  876. package/src/hooks/useColorScheme.tsx +23 -0
  877. package/src/hooks/useFocusManager.tsx +89 -0
  878. package/src/hooks/useFocusVisible.tsx +88 -0
  879. package/src/hooks/useIsMobile.tsx +7 -28
  880. package/src/hooks/useMediaQuery.tsx +34 -0
  881. package/src/hooks/usePrefersContrast.tsx +24 -0
  882. package/src/hooks/useReducedMotion.tsx +20 -0
  883. package/src/index.css +127 -65
  884. package/src/index.ts +223 -16
  885. package/src/lib/color-conversion-utilities.ts +165 -0
  886. package/src/lib/utilities.ts +7 -6
  887. package/src/motion/Collapse.module.css +22 -0
  888. package/src/motion/Collapse.tsx +52 -0
  889. package/src/motion/Presence.tsx +44 -0
  890. package/src/motion/index.ts +13 -0
  891. package/src/motion/presets.ts +77 -0
  892. package/src/motion/tokens.ts +37 -0
@@ -1,21 +1,19 @@
1
1
  "use client";
2
2
 
3
- /* eslint-disable */
4
-
5
- import {Slot} from "@radix-ui/react-slot";
6
- import {VariantProps, cva} from "class-variance-authority";
7
3
  import {PanelLeft} from "lucide-react";
8
4
  import * as React from "react";
5
+ import {createPortal} from "react-dom";
9
6
 
10
7
  import {Button} from "@/components/ui/button";
11
8
  import {Input} from "@/components/ui/input";
12
9
  import {Separator} from "@/components/ui/separator";
13
- import {Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle} from "@/components/ui/sheet";
14
10
  import {Skeleton} from "@/components/ui/skeleton";
15
11
  import {Tooltip, TooltipContent, TooltipProvider, TooltipTrigger} from "@/components/ui/tooltip";
16
12
  import {useIsMobile} from "@/hooks/useIsMobile";
17
13
  import {cn} from "@/lib/utilities";
18
14
 
15
+ import styles from "./sidebar.module.css";
16
+
19
17
  const SIDEBAR_COOKIE_NAME = "sidebar_state";
20
18
  const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
21
19
  const SIDEBAR_WIDTH = "16rem";
@@ -23,6 +21,11 @@ const SIDEBAR_WIDTH_MOBILE = "18rem";
23
21
  const SIDEBAR_WIDTH_ICON = "3rem";
24
22
  const SIDEBAR_KEYBOARD_SHORTCUT = "b";
25
23
 
24
+ type SidebarDataAttributes = Record<`data-${string}`, string | boolean | undefined>;
25
+ type SidebarCloneableDivProps = React.ComponentProps<"div"> & SidebarDataAttributes & {ref?: React.Ref<HTMLDivElement>};
26
+ type SidebarCloneableButtonProps = React.ComponentProps<"button"> & SidebarDataAttributes & {ref?: React.Ref<HTMLButtonElement>};
27
+ type SidebarCloneableAnchorProps = React.ComponentProps<"a"> & SidebarDataAttributes & {ref?: React.Ref<HTMLAnchorElement>};
28
+
26
29
  type SidebarContextProps = {
27
30
  state: "expanded" | "collapsed";
28
31
  open: boolean;
@@ -35,8 +38,23 @@ type SidebarContextProps = {
35
38
 
36
39
  const SidebarContext = React.createContext<SidebarContextProps | null>(null);
37
40
 
38
- function useSidebar() {
41
+ /**
42
+ * Returns the active sidebar context and enforces provider usage.
43
+ *
44
+ * @remarks
45
+ * Must be called from within {@link SidebarProvider}. Exposes desktop and mobile
46
+ * open state along with the shared toggle helper used by sidebar primitives.
47
+ *
48
+ * @example
49
+ * ```tsx
50
+ * const {open, toggleSidebar} = useSidebar();
51
+ * ```
52
+ *
53
+ * @see {@link https://react.dev/reference/react/useContext | React useContext Docs}
54
+ */
55
+ function useSidebar(): SidebarContextProps {
39
56
  const context = React.useContext(SidebarContext);
57
+
40
58
  if (!context) {
41
59
  throw new Error("useSidebar must be used within a SidebarProvider.");
42
60
  }
@@ -44,183 +62,298 @@ function useSidebar() {
44
62
  return context;
45
63
  }
46
64
 
47
- const SidebarProvider = React.forwardRef<
48
- HTMLDivElement,
49
- React.ComponentProps<"div"> & {
50
- defaultOpen?: boolean;
51
- open?: boolean;
52
- onOpenChange?: (open: boolean) => void;
53
- }
54
- >(({defaultOpen = true, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props}, ref) => {
55
- const isMobile = useIsMobile();
56
- const [openMobile, setOpenMobile] = React.useState(false);
57
-
58
- // This is the internal state of the sidebar.
59
- // We use openProp and setOpenProp for control from outside the component.
60
- const [_open, _setOpen] = React.useState(defaultOpen);
61
- const open = openProp ?? _open;
62
- const setOpen = React.useCallback(
63
- (value: boolean | ((value: boolean) => boolean)) => {
64
- const openState = typeof value === "function" ? value(open) : value;
65
- if (setOpenProp) {
66
- setOpenProp(openState);
67
- } else {
68
- _setOpen(openState);
69
- }
65
+ /**
66
+ * Props for the sidebar provider.
67
+ */
68
+ interface SidebarProviderProps extends React.ComponentProps<"div"> {
69
+ /**
70
+ * Initial uncontrolled open state for desktop layouts.
71
+ * @default true
72
+ */
73
+ defaultOpen?: boolean;
74
+ /**
75
+ * Controlled open state for desktop layouts.
76
+ * @default undefined
77
+ */
78
+ open?: boolean;
79
+ /**
80
+ * Callback invoked when the desktop open state changes.
81
+ * @default undefined
82
+ */
83
+ onOpenChange?: (open: boolean) => void;
84
+ }
70
85
 
71
- // This sets the cookie to keep the sidebar state.
72
- document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
73
- },
74
- [setOpenProp, open],
75
- );
86
+ /**
87
+ * Provides shared sidebar state, keyboard shortcuts, and responsive behavior.
88
+ *
89
+ * @remarks
90
+ * - Renders a `<div>` element
91
+ * - Built on shared React context and tooltip primitives
92
+ * - Persists desktop collapse state to a cookie for cross-page continuity
93
+ *
94
+ * @example
95
+ * ```tsx
96
+ * <SidebarProvider>
97
+ * <Sidebar />
98
+ * </SidebarProvider>
99
+ * ```
100
+ *
101
+ * @see {@link https://react.dev/reference/react/useContext | React Context Docs}
102
+ */
103
+ const SidebarProvider = React.forwardRef<HTMLDivElement, SidebarProviderProps>(
104
+ ({defaultOpen = true, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props}, ref) => {
105
+ const isMobile = useIsMobile();
106
+ const [openMobile, setOpenMobile] = React.useState(false);
107
+ const [internalOpen, setInternalOpen] = React.useState(defaultOpen);
108
+ const open = openProp ?? internalOpen;
76
109
 
77
- // Helper to toggle the sidebar.
78
- const toggleSidebar = React.useCallback(() => {
79
- return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);
80
- }, [isMobile, setOpen, setOpenMobile]);
110
+ const setOpen = React.useCallback(
111
+ (value: boolean | ((value: boolean) => boolean)) => {
112
+ const nextValue = typeof value === "function" ? value(open) : value;
81
113
 
82
- // Adds a keyboard shortcut to toggle the sidebar.
83
- React.useEffect(() => {
84
- const handleKeyDown = (event: KeyboardEvent) => {
85
- if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
86
- event.preventDefault();
87
- toggleSidebar();
114
+ if (setOpenProp) {
115
+ setOpenProp(nextValue);
116
+ } else {
117
+ setInternalOpen(nextValue);
118
+ }
119
+
120
+ // eslint-disable-next-line unicorn/no-document-cookie -- persistent sidebar state matches V1 behavior
121
+ document.cookie = `${SIDEBAR_COOKIE_NAME}=${nextValue}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
122
+ },
123
+ [open, setOpenProp],
124
+ );
125
+
126
+ const toggleSidebar = React.useCallback(() => {
127
+ if (isMobile) {
128
+ setOpenMobile((currentOpen) => !currentOpen);
129
+ return;
88
130
  }
89
- };
90
131
 
91
- globalThis.window.addEventListener("keydown", handleKeyDown);
92
- return () => globalThis.window.removeEventListener("keydown", handleKeyDown);
93
- }, [toggleSidebar]);
94
-
95
- // We add a state so that we can do data-state="expanded" or "collapsed".
96
- // This makes it easier to style the sidebar with Tailwind classes.
97
- const state = open ? "expanded" : "collapsed";
98
-
99
- const contextValue = React.useMemo<SidebarContextProps>(
100
- () => ({
101
- state,
102
- open,
103
- setOpen,
104
- isMobile,
105
- openMobile,
106
- setOpenMobile,
107
- toggleSidebar,
108
- }),
109
- [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar],
110
- );
132
+ setOpen((currentOpen) => !currentOpen);
133
+ }, [isMobile, setOpen]);
111
134
 
112
- return (
113
- <SidebarContext.Provider value={contextValue}>
114
- <TooltipProvider delayDuration={0}>
135
+ React.useEffect(() => {
136
+ const handleKeyDown = (event: KeyboardEvent) => {
137
+ if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
138
+ event.preventDefault();
139
+ toggleSidebar();
140
+ }
141
+ };
142
+
143
+ globalThis.window.addEventListener("keydown", handleKeyDown);
144
+
145
+ return () => {
146
+ globalThis.window.removeEventListener("keydown", handleKeyDown);
147
+ };
148
+ }, [toggleSidebar]);
149
+
150
+ const state = open ? "expanded" : "collapsed";
151
+
152
+ const contextValue = React.useMemo<SidebarContextProps>(
153
+ () => ({
154
+ isMobile,
155
+ open,
156
+ openMobile,
157
+ setOpen,
158
+ setOpenMobile,
159
+ state,
160
+ toggleSidebar,
161
+ }),
162
+ [isMobile, open, openMobile, setOpen, state, toggleSidebar],
163
+ );
164
+
165
+ return (
166
+ <SidebarContext.Provider value={contextValue}>
167
+ <TooltipProvider>
168
+ <div
169
+ ref={ref}
170
+ style={
171
+ {
172
+ "--ac-sidebar-width": SIDEBAR_WIDTH,
173
+ "--ac-sidebar-width-icon": SIDEBAR_WIDTH_ICON,
174
+ ...style,
175
+ } as React.CSSProperties
176
+ }
177
+ className={cn(styles.wrapper, className)}
178
+ {...props}>
179
+ {children}
180
+ </div>
181
+ </TooltipProvider>
182
+ </SidebarContext.Provider>
183
+ );
184
+ },
185
+ );
186
+ SidebarProvider.displayName = "SidebarProvider";
187
+
188
+ /**
189
+ * Props for the root sidebar panel.
190
+ */
191
+ type SidebarProps = React.ComponentProps<"div"> & {
192
+ /**
193
+ * Edge of the screen where the sidebar is rendered.
194
+ * @default "left"
195
+ */
196
+ side?: "left" | "right";
197
+ /**
198
+ * Visual presentation style used for desktop rendering.
199
+ * @default "sidebar"
200
+ */
201
+ variant?: "sidebar" | "floating" | "inset";
202
+ /**
203
+ * Desktop collapse behavior for the sidebar.
204
+ * @default "offcanvas"
205
+ */
206
+ collapsible?: "offcanvas" | "icon" | "none";
207
+ };
208
+
209
+ /**
210
+ * Renders the responsive sidebar panel for desktop and mobile layouts.
211
+ *
212
+ * @remarks
213
+ * - Renders a `<div>` element on desktop and a dialog portal on mobile
214
+ * - Built on the shared sidebar context
215
+ *
216
+ * @example
217
+ * ```tsx
218
+ * <Sidebar>
219
+ * <SidebarContent />
220
+ * </Sidebar>
221
+ * ```
222
+ *
223
+ * @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/dialog_role | ARIA Dialog Role}
224
+ */
225
+ const Sidebar = React.forwardRef<HTMLDivElement, SidebarProps>(
226
+ ({side = "left", variant = "sidebar", collapsible = "offcanvas", className, children, ...props}, ref) => {
227
+ const {isMobile, openMobile, setOpenMobile, state} = useSidebar();
228
+
229
+ if (collapsible === "none") {
230
+ return (
115
231
  <div
116
- style={
117
- {
118
- "--sidebar-width": SIDEBAR_WIDTH,
119
- "--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
120
- ...style,
121
- } as React.CSSProperties
122
- }
123
- className={cn("group/sidebar-wrapper has-[[data-variant=inset]]:bg-sidebar flex min-h-svh w-full", className)}
124
232
  ref={ref}
233
+ className={cn(styles.staticSidebar, className)}
125
234
  {...props}>
126
235
  {children}
127
236
  </div>
128
- </TooltipProvider>
129
- </SidebarContext.Provider>
130
- );
131
- });
132
- SidebarProvider.displayName = "SidebarProvider";
237
+ );
238
+ }
133
239
 
134
- const Sidebar = React.forwardRef<
135
- HTMLDivElement,
136
- React.ComponentProps<"div"> & {
137
- side?: "left" | "right";
138
- variant?: "sidebar" | "floating" | "inset";
139
- collapsible?: "offcanvas" | "icon" | "none";
140
- }
141
- >(({side = "left", variant = "sidebar", collapsible = "offcanvas", className, children, ...props}, ref) => {
142
- const {isMobile, state, openMobile, setOpenMobile} = useSidebar();
240
+ if (isMobile) {
241
+ return (
242
+ <MobileSidebarPortal
243
+ className={className}
244
+ open={openMobile}
245
+ side={side}
246
+ onOpenChange={setOpenMobile}
247
+ {...props}>
248
+ {children}
249
+ </MobileSidebarPortal>
250
+ );
251
+ }
143
252
 
144
- if (collapsible === "none") {
145
253
  return (
146
254
  <div
147
- className={cn("bg-sidebar text-sidebar-foreground flex h-full w-[--sidebar-width] flex-col", className)}
148
255
  ref={ref}
149
- {...props}>
150
- {children}
256
+ className={styles.desktopRoot}
257
+ data-state={state}
258
+ data-collapsible={state === "collapsed" ? collapsible : ""}
259
+ data-variant={variant}
260
+ data-side={side}>
261
+ <div className={styles.gap} />
262
+ <div
263
+ className={cn(styles.panelWrap, className)}
264
+ {...props}>
265
+ <div
266
+ data-sidebar='sidebar'
267
+ className={styles.panel}>
268
+ {children}
269
+ </div>
270
+ </div>
151
271
  </div>
152
272
  );
153
- }
273
+ },
274
+ );
275
+ Sidebar.displayName = "Sidebar";
154
276
 
155
- if (isMobile) {
156
- return (
157
- <Sheet
158
- open={openMobile}
159
- onOpenChange={setOpenMobile}
160
- {...props}>
161
- <SheetContent
162
- data-sidebar='sidebar'
163
- data-mobile='true'
164
- className='bg-sidebar text-sidebar-foreground w-[--sidebar-width] p-0 [&>button]:hidden'
165
- style={
166
- {
167
- "--sidebar-width": SIDEBAR_WIDTH_MOBILE,
168
- } as React.CSSProperties
169
- }
170
- side={side}>
171
- <SheetHeader className='sr-only'>
172
- <SheetTitle>Sidebar</SheetTitle>
173
- <SheetDescription>Displays the mobile sidebar.</SheetDescription>
174
- </SheetHeader>
175
- <div className='flex h-full w-full flex-col'>{children}</div>
176
- </SheetContent>
177
- </Sheet>
178
- );
277
+ type MobileSidebarPortalProps = React.ComponentProps<"div"> & {
278
+ open: boolean;
279
+ side: "left" | "right";
280
+ onOpenChange: (open: boolean) => void;
281
+ };
282
+
283
+ function MobileSidebarPortal({
284
+ open,
285
+ side,
286
+ onOpenChange,
287
+ className,
288
+ children,
289
+ ...props
290
+ }: Readonly<MobileSidebarPortalProps>): React.ReactPortal | null {
291
+ React.useEffect(() => {
292
+ if (!open) {
293
+ return;
294
+ }
295
+
296
+ const previousOverflow = document.body.style.overflow;
297
+ const handleKeyDown = (event: KeyboardEvent) => {
298
+ if (event.key === "Escape") {
299
+ onOpenChange(false);
300
+ }
301
+ };
302
+
303
+ document.body.style.overflow = "hidden";
304
+ globalThis.window.addEventListener("keydown", handleKeyDown);
305
+
306
+ return () => {
307
+ document.body.style.overflow = previousOverflow;
308
+ globalThis.window.removeEventListener("keydown", handleKeyDown);
309
+ };
310
+ }, [onOpenChange, open]);
311
+
312
+ if (!open || typeof document === "undefined") {
313
+ return null;
179
314
  }
180
315
 
181
- return (
182
- <div
183
- ref={ref}
184
- className='group peer text-sidebar-foreground hidden md:block'
185
- data-state={state}
186
- data-collapsible={state === "collapsed" ? collapsible : ""}
187
- data-variant={variant}
188
- data-side={side}>
189
- {/* This is what handles the sidebar gap on desktop */}
190
- <div
191
- className={cn(
192
- "relative w-[--sidebar-width] bg-transparent transition-[width] duration-200 ease-linear",
193
- "group-data-[collapsible=offcanvas]:w-0",
194
- "group-data-[side=right]:rotate-180",
195
- variant === "floating" || variant === "inset"
196
- ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]"
197
- : "group-data-[collapsible=icon]:w-[--sidebar-width-icon]",
198
- )}
316
+ return createPortal(
317
+ <div className={styles.mobilePortal}>
318
+ <button
319
+ type='button'
320
+ aria-label='Close sidebar'
321
+ className={styles.mobileOverlay}
322
+ onClick={() => onOpenChange(false)}
199
323
  />
200
324
  <div
201
- className={cn(
202
- "fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width] transition-[left,right,width] duration-200 ease-linear md:flex",
203
- side === "left"
204
- ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]"
205
- : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
206
- // Adjust the padding for floating and inset variants.
207
- variant === "floating" || variant === "inset"
208
- ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]"
209
- : "group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l",
210
- className,
211
- )}
325
+ role='dialog'
326
+ aria-modal='true'
327
+ aria-label='Sidebar'
328
+ data-sidebar='sidebar'
329
+ className={cn(styles.mobilePanel, side === "right" ? styles.mobilePanelRight : styles.mobilePanelLeft, className)}
330
+ style={{"--ac-sidebar-width": SIDEBAR_WIDTH_MOBILE} as React.CSSProperties}
212
331
  {...props}>
213
- <div
214
- data-sidebar='sidebar'
215
- className='bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow'>
216
- {children}
332
+ <div className={styles.srOnly}>
333
+ <h2>Sidebar</h2>
334
+ <p>Displays the mobile sidebar.</p>
217
335
  </div>
336
+ <div className={styles.mobileContent}>{children}</div>
218
337
  </div>
219
- </div>
338
+ </div>,
339
+ document.body,
220
340
  );
221
- });
222
- Sidebar.displayName = "Sidebar";
341
+ }
223
342
 
343
+ /**
344
+ * Renders the primary button used to toggle the sidebar.
345
+ *
346
+ * @remarks
347
+ * - Renders the shared `Button` component
348
+ * - Built on the shared sidebar context
349
+ *
350
+ * @example
351
+ * ```tsx
352
+ * <SidebarTrigger />
353
+ * ```
354
+ *
355
+ * @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/button | HTML button element}
356
+ */
224
357
  const SidebarTrigger = React.forwardRef<React.ComponentRef<typeof Button>, React.ComponentProps<typeof Button>>(
225
358
  ({className, onClick, ...props}, ref) => {
226
359
  const {toggleSidebar} = useSidebar();
@@ -231,20 +364,34 @@ const SidebarTrigger = React.forwardRef<React.ComponentRef<typeof Button>, React
231
364
  data-sidebar='trigger'
232
365
  variant='ghost'
233
366
  size='icon'
234
- className={cn("h-7 w-7", className)}
367
+ className={cn(styles.trigger, className)}
235
368
  onClick={(event) => {
236
369
  onClick?.(event);
237
370
  toggleSidebar();
238
371
  }}
239
372
  {...props}>
240
- <PanelLeft />
241
- <span className='sr-only'>Toggle Sidebar</span>
373
+ <PanelLeft className={styles.triggerIcon} />
374
+ <span className={styles.srOnly}>Toggle Sidebar</span>
242
375
  </Button>
243
376
  );
244
377
  },
245
378
  );
246
379
  SidebarTrigger.displayName = "SidebarTrigger";
247
380
 
381
+ /**
382
+ * Renders a slim rail button used to toggle the sidebar collapsed state.
383
+ *
384
+ * @remarks
385
+ * - Renders a `<button>` element
386
+ * - Built on the shared sidebar context
387
+ *
388
+ * @example
389
+ * ```tsx
390
+ * <SidebarRail />
391
+ * ```
392
+ *
393
+ * @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/button | HTML button element}
394
+ */
248
395
  const SidebarRail = React.forwardRef<HTMLButtonElement, React.ComponentProps<"button">>(({className, ...props}, ref) => {
249
396
  const {toggleSidebar} = useSidebar();
250
397
 
@@ -254,359 +401,656 @@ const SidebarRail = React.forwardRef<HTMLButtonElement, React.ComponentProps<"bu
254
401
  data-sidebar='rail'
255
402
  aria-label='Toggle Sidebar'
256
403
  tabIndex={-1}
404
+ title='Toggle Sidebar'
257
405
  type='button'
406
+ className={cn(styles.rail, className)}
258
407
  onClick={toggleSidebar}
259
- title='Toggle Sidebar'
260
- className={cn(
261
- "hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex",
262
- "[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize",
263
- "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
264
- "group-data-[collapsible=offcanvas]:hover:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full",
265
- "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2",
266
- "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",
267
- className,
268
- )}
269
408
  {...props}
270
409
  />
271
410
  );
272
411
  });
273
412
  SidebarRail.displayName = "SidebarRail";
274
413
 
275
- const SidebarInset = React.forwardRef<HTMLDivElement, React.ComponentProps<"main">>(({className, ...props}, ref) => {
276
- return (
277
- <main
278
- ref={ref}
279
- className={cn(
280
- "relative flex w-full flex-1 flex-col bg-white dark:bg-neutral-950",
281
- "md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2",
282
- className,
283
- )}
284
- {...props}
285
- />
286
- );
287
- });
414
+ /**
415
+ * Renders the inset main content region adjacent to the sidebar.
416
+ *
417
+ * @remarks
418
+ * - Renders a `<main>` element
419
+ * - Built as a layout helper for inset sidebar variants
420
+ *
421
+ * @example
422
+ * ```tsx
423
+ * <SidebarInset>Main content</SidebarInset>
424
+ * ```
425
+ *
426
+ * @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/main | HTML main element}
427
+ */
428
+ const SidebarInset = React.forwardRef<HTMLDivElement, React.ComponentProps<"main">>(({className, ...props}, ref) => (
429
+ <main
430
+ ref={ref}
431
+ className={cn(styles.inset, className)}
432
+ {...props}
433
+ />
434
+ ));
288
435
  SidebarInset.displayName = "SidebarInset";
289
436
 
437
+ /**
438
+ * Renders a styled input inside sidebar layouts.
439
+ *
440
+ * @remarks
441
+ * - Renders the shared `Input` component
442
+ * - Built for sidebar search and filtering affordances
443
+ *
444
+ * @example
445
+ * ```tsx
446
+ * <SidebarInput placeholder='Search...' />
447
+ * ```
448
+ *
449
+ * @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/input | HTML input element}
450
+ */
290
451
  const SidebarInput = React.forwardRef<React.ComponentRef<typeof Input>, React.ComponentProps<typeof Input>>(
291
- ({className, ...props}, ref) => {
292
- return (
293
- <Input
294
- ref={ref}
295
- data-sidebar='input'
296
- className={cn(
297
- "focus-visible:ring-sidebar-ring h-8 w-full bg-white shadow-none focus-visible:ring-2 dark:bg-neutral-950",
298
- className,
299
- )}
300
- {...props}
301
- />
302
- );
303
- },
304
- );
305
- SidebarInput.displayName = "SidebarInput";
306
-
307
- const SidebarHeader = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({className, ...props}, ref) => {
308
- return (
309
- <div
452
+ ({className, ...props}, ref) => (
453
+ <Input
310
454
  ref={ref}
311
- data-sidebar='header'
312
- className={cn("flex flex-col gap-2 p-2", className)}
455
+ data-sidebar='input'
456
+ className={cn(styles.input, className)}
313
457
  {...props}
314
458
  />
315
- );
316
- });
459
+ ),
460
+ );
461
+ SidebarInput.displayName = "SidebarInput";
462
+
463
+ /**
464
+ * Renders the header region of the sidebar.
465
+ *
466
+ * @remarks
467
+ * - Renders a `<div>` element
468
+ * - Built as a layout helper for branding or primary controls
469
+ *
470
+ * @example
471
+ * ```tsx
472
+ * <SidebarHeader>Workspace</SidebarHeader>
473
+ * ```
474
+ *
475
+ * @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/div | HTML div element}
476
+ */
477
+ const SidebarHeader = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({className, ...props}, ref) => (
478
+ <div
479
+ ref={ref}
480
+ data-sidebar='header'
481
+ className={cn(styles.header, className)}
482
+ {...props}
483
+ />
484
+ ));
317
485
  SidebarHeader.displayName = "SidebarHeader";
318
486
 
319
- const SidebarFooter = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({className, ...props}, ref) => {
320
- return (
321
- <div
322
- ref={ref}
323
- data-sidebar='footer'
324
- className={cn("flex flex-col gap-2 p-2", className)}
325
- {...props}
326
- />
327
- );
328
- });
487
+ /**
488
+ * Renders the footer region of the sidebar.
489
+ *
490
+ * @remarks
491
+ * - Renders a `<div>` element
492
+ * - Built as a layout helper for actions or account controls
493
+ *
494
+ * @example
495
+ * ```tsx
496
+ * <SidebarFooter>Footer content</SidebarFooter>
497
+ * ```
498
+ *
499
+ * @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/div | HTML div element}
500
+ */
501
+ const SidebarFooter = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({className, ...props}, ref) => (
502
+ <div
503
+ ref={ref}
504
+ data-sidebar='footer'
505
+ className={cn(styles.footer, className)}
506
+ {...props}
507
+ />
508
+ ));
329
509
  SidebarFooter.displayName = "SidebarFooter";
330
510
 
511
+ /**
512
+ * Renders a separator between sidebar regions or menu groups.
513
+ *
514
+ * @remarks
515
+ * - Renders the shared `Separator` component
516
+ * - Built as a lightweight structural divider
517
+ *
518
+ * @example
519
+ * ```tsx
520
+ * <SidebarSeparator />
521
+ * ```
522
+ *
523
+ * @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/hr | HTML thematic break}
524
+ */
331
525
  const SidebarSeparator = React.forwardRef<React.ComponentRef<typeof Separator>, React.ComponentProps<typeof Separator>>(
332
- ({className, ...props}, ref) => {
333
- return (
334
- <Separator
335
- ref={ref}
336
- data-sidebar='separator'
337
- className={cn("bg-sidebar-border mx-2 w-auto", className)}
338
- {...props}
339
- />
340
- );
341
- },
342
- );
343
- SidebarSeparator.displayName = "SidebarSeparator";
344
-
345
- const SidebarContent = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({className, ...props}, ref) => {
346
- return (
347
- <div
526
+ ({className, ...props}, ref) => (
527
+ <Separator
348
528
  ref={ref}
349
- data-sidebar='content'
350
- className={cn("flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden", className)}
529
+ data-sidebar='separator'
530
+ className={cn(styles.separator, className)}
351
531
  {...props}
352
532
  />
353
- );
354
- });
533
+ ),
534
+ );
535
+ SidebarSeparator.displayName = "SidebarSeparator";
536
+
537
+ /**
538
+ * Renders the scrollable content region of the sidebar.
539
+ *
540
+ * @remarks
541
+ * - Renders a `<div>` element
542
+ * - Built as a layout helper for menu groups and custom content
543
+ *
544
+ * @example
545
+ * ```tsx
546
+ * <SidebarContent>
547
+ * <SidebarMenu />
548
+ * </SidebarContent>
549
+ * ```
550
+ *
551
+ * @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/div | HTML div element}
552
+ */
553
+ const SidebarContent = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({className, ...props}, ref) => (
554
+ <div
555
+ ref={ref}
556
+ data-sidebar='content'
557
+ className={cn(styles.content, className)}
558
+ {...props}
559
+ />
560
+ ));
355
561
  SidebarContent.displayName = "SidebarContent";
356
562
 
357
- const SidebarGroup = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({className, ...props}, ref) => {
358
- return (
359
- <div
360
- ref={ref}
361
- data-sidebar='group'
362
- className={cn("relative flex w-full min-w-0 flex-col p-2", className)}
363
- {...props}
364
- />
365
- );
366
- });
563
+ /**
564
+ * Renders a logical grouping container inside the sidebar.
565
+ *
566
+ * @remarks
567
+ * - Renders a `<div>` element
568
+ * - Built as a layout helper for related navigation sections
569
+ *
570
+ * @example
571
+ * ```tsx
572
+ * <SidebarGroup>
573
+ * <SidebarGroupLabel>Projects</SidebarGroupLabel>
574
+ * </SidebarGroup>
575
+ * ```
576
+ *
577
+ * @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/div | HTML div element}
578
+ */
579
+ const SidebarGroup = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({className, ...props}, ref) => (
580
+ <div
581
+ ref={ref}
582
+ data-sidebar='group'
583
+ className={cn(styles.group, className)}
584
+ {...props}
585
+ />
586
+ ));
367
587
  SidebarGroup.displayName = "SidebarGroup";
368
588
 
369
- const SidebarGroupLabel = React.forwardRef<HTMLDivElement, React.ComponentProps<"div"> & {asChild?: boolean}>(
370
- ({className, asChild = false, ...props}, ref) => {
371
- const Comp = asChild ? Slot : "div";
589
+ function cloneSidebarChild<TProps extends {className?: string}>(children: React.ReactNode, mergedProps: TProps): React.JSX.Element | null {
590
+ if (!React.isValidElement(children)) {
591
+ return null;
592
+ }
372
593
 
373
- return (
374
- <Comp
375
- ref={ref}
376
- data-sidebar='group-label'
377
- className={cn(
378
- "text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium transition-[margin,opacity] duration-200 ease-linear outline-none focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
379
- "group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
380
- className,
381
- )}
382
- {...props}
383
- />
384
- );
594
+ const child = children as React.ReactElement<TProps>;
595
+
596
+ // eslint-disable-next-line react-x/no-clone-element -- replaces Radix Slot while preserving asChild prop merging
597
+ return React.cloneElement(child, {
598
+ ...mergedProps,
599
+ className: cn(mergedProps.className, child.props.className),
600
+ });
601
+ }
602
+
603
+ /**
604
+ * Props for the sidebar group label.
605
+ */
606
+ interface SidebarGroupLabelProps extends React.ComponentProps<"div"> {
607
+ /**
608
+ * Whether to merge props into the single child element instead of rendering a wrapper `<div>`.
609
+ * @default false
610
+ */
611
+ asChild?: boolean;
612
+ }
613
+
614
+ /**
615
+ * Renders the heading label for a sidebar group.
616
+ *
617
+ * @remarks
618
+ * - Renders a `<div>` element by default
619
+ * - Supports `asChild` composition for custom markup
620
+ *
621
+ * @example
622
+ * ```tsx
623
+ * <SidebarGroupLabel>Projects</SidebarGroupLabel>
624
+ * ```
625
+ *
626
+ * @see {@link https://react.dev/reference/react/cloneElement | React cloneElement Docs}
627
+ */
628
+ const SidebarGroupLabel = React.forwardRef<HTMLDivElement, SidebarGroupLabelProps>(
629
+ ({className, asChild = false, children, ...props}, ref) => {
630
+ const mergedProps: SidebarCloneableDivProps = {
631
+ ...props,
632
+ children,
633
+ className: cn(styles.groupLabel, className),
634
+ "data-sidebar": "group-label",
635
+ ref,
636
+ };
637
+
638
+ if (asChild) {
639
+ const clonedChild = cloneSidebarChild(children, mergedProps);
640
+
641
+ if (clonedChild) {
642
+ return clonedChild;
643
+ }
644
+ }
645
+
646
+ return <div {...mergedProps} />;
385
647
  },
386
648
  );
387
649
  SidebarGroupLabel.displayName = "SidebarGroupLabel";
388
650
 
389
- const SidebarGroupAction = React.forwardRef<HTMLButtonElement, React.ComponentProps<"button"> & {asChild?: boolean}>(
390
- ({className, asChild = false, ...props}, ref) => {
391
- const Comp = asChild ? Slot : "button";
651
+ /**
652
+ * Props for the sidebar group action button.
653
+ */
654
+ interface SidebarGroupActionProps extends React.ComponentProps<"button"> {
655
+ /**
656
+ * Whether to merge props into the single child element instead of rendering a wrapper `<button>`.
657
+ * @default false
658
+ */
659
+ asChild?: boolean;
660
+ }
661
+
662
+ /**
663
+ * Renders a secondary action aligned with a sidebar group heading.
664
+ *
665
+ * @remarks
666
+ * - Renders a `<button>` element by default
667
+ * - Supports `asChild` composition for custom controls
668
+ *
669
+ * @example
670
+ * ```tsx
671
+ * <SidebarGroupAction aria-label='Add project'>+</SidebarGroupAction>
672
+ * ```
673
+ *
674
+ * @see {@link https://react.dev/reference/react/cloneElement | React cloneElement Docs}
675
+ */
676
+ const SidebarGroupAction = React.forwardRef<HTMLButtonElement, SidebarGroupActionProps>(
677
+ ({className, asChild = false, children, ...props}, ref) => {
678
+ const mergedProps: SidebarCloneableButtonProps = {
679
+ ...props,
680
+ children,
681
+ className: cn(styles.groupAction, className),
682
+ "data-sidebar": "group-action",
683
+ ref,
684
+ type: props.type ?? "button",
685
+ };
686
+
687
+ if (asChild) {
688
+ const clonedChild = cloneSidebarChild(children, mergedProps);
689
+
690
+ if (clonedChild) {
691
+ return clonedChild;
692
+ }
693
+ }
392
694
 
393
695
  return (
394
- <Comp
395
- ref={ref}
396
- data-sidebar='group-action'
397
- className={cn(
398
- "text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 transition-transform outline-none focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
399
- // Increases the hit area of the button on mobile.
400
- "after:absolute after:-inset-2 after:md:hidden",
401
- "group-data-[collapsible=icon]:hidden",
402
- className,
403
- )}
404
- {...props}
696
+ <button
697
+ type={props.type === "submit" ? "submit" : props.type === "reset" ? "reset" : "button"}
698
+ {...mergedProps}
405
699
  />
406
700
  );
407
701
  },
408
702
  );
409
703
  SidebarGroupAction.displayName = "SidebarGroupAction";
410
704
 
705
+ /**
706
+ * Renders the content container for a sidebar group.
707
+ *
708
+ * @remarks
709
+ * - Renders a `<div>` element
710
+ * - Built as a structural wrapper for nested menu items or custom content
711
+ *
712
+ * @example
713
+ * ```tsx
714
+ * <SidebarGroupContent>
715
+ * <SidebarMenu />
716
+ * </SidebarGroupContent>
717
+ * ```
718
+ *
719
+ * @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/div | HTML div element}
720
+ */
411
721
  const SidebarGroupContent = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({className, ...props}, ref) => (
412
722
  <div
413
723
  ref={ref}
414
724
  data-sidebar='group-content'
415
- className={cn("w-full text-sm", className)}
725
+ className={cn(styles.groupContent, className)}
416
726
  {...props}
417
727
  />
418
728
  ));
419
729
  SidebarGroupContent.displayName = "SidebarGroupContent";
420
730
 
731
+ /**
732
+ * Renders the root sidebar navigation list.
733
+ *
734
+ * @remarks
735
+ * - Renders a `<ul>` element
736
+ * - Built as the primary menu container for sidebar navigation
737
+ *
738
+ * @example
739
+ * ```tsx
740
+ * <SidebarMenu>
741
+ * <SidebarMenuItem />
742
+ * </SidebarMenu>
743
+ * ```
744
+ *
745
+ * @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/ul | HTML ul element}
746
+ */
421
747
  const SidebarMenu = React.forwardRef<HTMLUListElement, React.ComponentProps<"ul">>(({className, ...props}, ref) => (
422
748
  <ul
423
749
  ref={ref}
424
750
  data-sidebar='menu'
425
- className={cn("flex w-full min-w-0 flex-col gap-1", className)}
751
+ className={cn(styles.menu, className)}
426
752
  {...props}
427
753
  />
428
754
  ));
429
755
  SidebarMenu.displayName = "SidebarMenu";
430
756
 
757
+ /**
758
+ * Renders a single list item within the sidebar menu.
759
+ *
760
+ * @remarks
761
+ * - Renders an `<li>` element
762
+ * - Built as a structural wrapper for menu buttons and actions
763
+ *
764
+ * @example
765
+ * ```tsx
766
+ * <SidebarMenuItem>
767
+ * <SidebarMenuButton>Dashboard</SidebarMenuButton>
768
+ * </SidebarMenuItem>
769
+ * ```
770
+ *
771
+ * @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/li | HTML li element}
772
+ */
431
773
  const SidebarMenuItem = React.forwardRef<HTMLLIElement, React.ComponentProps<"li">>(({className, ...props}, ref) => (
432
774
  <li
433
775
  ref={ref}
434
776
  data-sidebar='menu-item'
435
- className={cn("group/menu-item relative", className)}
777
+ className={cn(styles.menuItem, className)}
436
778
  {...props}
437
779
  />
438
780
  ));
439
781
  SidebarMenuItem.displayName = "SidebarMenuItem";
440
782
 
441
- const sidebarMenuButtonVariants = cva(
442
- "peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
443
- {
444
- variants: {
445
- variant: {
446
- default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
447
- outline:
448
- "bg-white shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))] dark:bg-neutral-950",
449
- },
450
- size: {
451
- default: "h-8 text-sm",
452
- sm: "h-7 text-xs",
453
- lg: "h-12 text-sm group-data-[collapsible=icon]:!p-0",
454
- },
455
- },
456
- defaultVariants: {
457
- variant: "default",
458
- size: "default",
459
- },
460
- },
461
- );
783
+ const sidebarMenuButtonVariantStyles = {
784
+ default: styles.menuButtonDefault,
785
+ outline: styles.menuButtonOutline,
786
+ } as const;
462
787
 
463
- const SidebarMenuButton = React.forwardRef<
464
- HTMLButtonElement,
465
- React.ComponentProps<"button"> & {
466
- asChild?: boolean;
467
- isActive?: boolean;
468
- tooltip?: string | React.ComponentProps<typeof TooltipContent>;
469
- } & VariantProps<typeof sidebarMenuButtonVariants>
470
- >(({asChild = false, isActive = false, variant = "default", size = "default", tooltip, className, ...props}, ref) => {
471
- const Comp = asChild ? Slot : "button";
472
- const {isMobile, state} = useSidebar();
473
-
474
- const button = (
475
- <Comp
476
- ref={ref}
477
- data-sidebar='menu-button'
478
- data-size={size}
479
- data-active={isActive}
480
- className={cn(sidebarMenuButtonVariants({variant, size}), className)}
481
- {...props}
482
- />
483
- );
788
+ const sidebarMenuButtonSizeStyles = {
789
+ default: styles.menuButtonSizeDefault,
790
+ sm: styles.menuButtonSizeSm,
791
+ lg: styles.menuButtonSizeLg,
792
+ } as const;
484
793
 
485
- if (!tooltip) {
486
- return button;
487
- }
794
+ /**
795
+ * Props for the sidebar menu button.
796
+ */
797
+ interface SidebarMenuButtonProps extends React.ComponentProps<"button"> {
798
+ /**
799
+ * Whether to merge props into the single child element instead of rendering a wrapper `<button>`.
800
+ * @default false
801
+ */
802
+ asChild?: boolean;
803
+ /**
804
+ * Whether the menu item should be styled as active.
805
+ * @default false
806
+ */
807
+ isActive?: boolean;
808
+ /**
809
+ * Tooltip content displayed when the sidebar is collapsed on desktop.
810
+ * @default undefined
811
+ */
812
+ tooltip?: string | React.ComponentProps<typeof TooltipContent>;
813
+ /**
814
+ * Visual style variant for the menu button.
815
+ * @default "default"
816
+ */
817
+ variant?: keyof typeof sidebarMenuButtonVariantStyles;
818
+ /**
819
+ * Size preset for the menu button.
820
+ * @default "default"
821
+ */
822
+ size?: keyof typeof sidebarMenuButtonSizeStyles;
823
+ }
488
824
 
489
- if (typeof tooltip === "string") {
490
- tooltip = {
491
- children: tooltip,
825
+ /**
826
+ * Renders the primary interactive element for a sidebar menu item.
827
+ *
828
+ * @remarks
829
+ * - Renders a `<button>` element by default
830
+ * - Supports `asChild` composition and contextual tooltips when collapsed
831
+ *
832
+ * @example
833
+ * ```tsx
834
+ * <SidebarMenuButton isActive>Dashboard</SidebarMenuButton>
835
+ * ```
836
+ *
837
+ * @see {@link https://react.dev/reference/react/cloneElement | React cloneElement Docs}
838
+ */
839
+ const SidebarMenuButton = React.forwardRef<HTMLButtonElement, SidebarMenuButtonProps>(
840
+ ({asChild = false, isActive = false, variant = "default", size = "default", tooltip, className, children, ...props}, ref) => {
841
+ const {isMobile, state} = useSidebar();
842
+ const mergedProps: SidebarCloneableButtonProps = {
843
+ ...props,
844
+ children,
845
+ className: cn(styles.menuButton, sidebarMenuButtonVariantStyles[variant], sidebarMenuButtonSizeStyles[size], className),
846
+ "data-active": isActive,
847
+ "data-sidebar": "menu-button",
848
+ "data-size": size,
849
+ ref,
850
+ type: props.type ?? "button",
492
851
  };
493
- }
852
+ const clonedChild = asChild ? cloneSidebarChild(children, mergedProps) : null;
494
853
 
495
- return (
496
- <Tooltip>
497
- <TooltipTrigger asChild>{button}</TooltipTrigger>
498
- <TooltipContent
499
- side='right'
500
- align='center'
501
- hidden={state !== "collapsed" || isMobile}
502
- {...tooltip}
854
+ const button = clonedChild ?? (
855
+ <button
856
+ type={props.type === "submit" ? "submit" : props.type === "reset" ? "reset" : "button"}
857
+ {...mergedProps}
503
858
  />
504
- </Tooltip>
505
- );
506
- });
859
+ );
860
+
861
+ if (!tooltip) {
862
+ return button;
863
+ }
864
+
865
+ const resolvedTooltip = typeof tooltip === "string" ? {children: tooltip} : tooltip;
866
+
867
+ return (
868
+ <Tooltip>
869
+ <TooltipTrigger render={button as React.ReactElement} />
870
+ <TooltipContent
871
+ hidden={state !== "collapsed" || isMobile}
872
+ {...resolvedTooltip}
873
+ />
874
+ </Tooltip>
875
+ );
876
+ },
877
+ );
507
878
  SidebarMenuButton.displayName = "SidebarMenuButton";
508
879
 
509
- const SidebarMenuAction = React.forwardRef<
510
- HTMLButtonElement,
511
- React.ComponentProps<"button"> & {
512
- asChild?: boolean;
513
- showOnHover?: boolean;
514
- }
515
- >(({className, asChild = false, showOnHover = false, ...props}, ref) => {
516
- const Comp = asChild ? Slot : "button";
880
+ /**
881
+ * Props for the sidebar menu action button.
882
+ */
883
+ interface SidebarMenuActionProps extends React.ComponentProps<"button"> {
884
+ /**
885
+ * Whether to merge props into the single child element instead of rendering a wrapper `<button>`.
886
+ * @default false
887
+ */
888
+ asChild?: boolean;
889
+ /**
890
+ * Whether the action should remain hidden until its parent item is hovered.
891
+ * @default false
892
+ */
893
+ showOnHover?: boolean;
894
+ }
517
895
 
518
- return (
519
- <Comp
520
- ref={ref}
521
- data-sidebar='menu-action'
522
- className={cn(
523
- "text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 transition-transform outline-none focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
524
- // Increases the hit area of the button on mobile.
525
- "after:absolute after:-inset-2 after:md:hidden",
526
- "peer-data-[size=sm]/menu-button:top-1",
527
- "peer-data-[size=default]/menu-button:top-1.5",
528
- "peer-data-[size=lg]/menu-button:top-2.5",
529
- "group-data-[collapsible=icon]:hidden",
530
- showOnHover
531
- && "peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0",
532
- className,
533
- )}
534
- {...props}
535
- />
536
- );
537
- });
896
+ /**
897
+ * Renders a secondary action button aligned within a sidebar menu item.
898
+ *
899
+ * @remarks
900
+ * - Renders a `<button>` element by default
901
+ * - Supports `asChild` composition for custom controls
902
+ *
903
+ * @example
904
+ * ```tsx
905
+ * <SidebarMenuAction showOnHover>⋯</SidebarMenuAction>
906
+ * ```
907
+ *
908
+ * @see {@link https://react.dev/reference/react/cloneElement | React cloneElement Docs}
909
+ */
910
+ const SidebarMenuAction = React.forwardRef<HTMLButtonElement, SidebarMenuActionProps>(
911
+ ({className, asChild = false, showOnHover = false, children, ...props}, ref) => {
912
+ const mergedProps: SidebarCloneableButtonProps = {
913
+ ...props,
914
+ children,
915
+ className: cn(styles.menuAction, showOnHover && styles.menuActionShowOnHover, className),
916
+ "data-sidebar": "menu-action",
917
+ ref,
918
+ type: props.type ?? "button",
919
+ };
920
+
921
+ if (asChild) {
922
+ const clonedChild = cloneSidebarChild(children, mergedProps);
923
+
924
+ if (clonedChild) {
925
+ return clonedChild;
926
+ }
927
+ }
928
+
929
+ return (
930
+ <button
931
+ type={props.type === "submit" ? "submit" : props.type === "reset" ? "reset" : "button"}
932
+ {...mergedProps}
933
+ />
934
+ );
935
+ },
936
+ );
538
937
  SidebarMenuAction.displayName = "SidebarMenuAction";
539
938
 
939
+ /**
940
+ * Renders a badge alongside a sidebar menu item.
941
+ *
942
+ * @remarks
943
+ * - Renders a `<div>` element
944
+ * - Built as a lightweight presentational helper for counts and statuses
945
+ *
946
+ * @example
947
+ * ```tsx
948
+ * <SidebarMenuBadge>3</SidebarMenuBadge>
949
+ * ```
950
+ *
951
+ * @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/div | HTML div element}
952
+ */
540
953
  const SidebarMenuBadge = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({className, ...props}, ref) => (
541
954
  <div
542
955
  ref={ref}
543
956
  data-sidebar='menu-badge'
544
- className={cn(
545
- "text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none",
546
- "peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground",
547
- "peer-data-[size=sm]/menu-button:top-1",
548
- "peer-data-[size=default]/menu-button:top-1.5",
549
- "peer-data-[size=lg]/menu-button:top-2.5",
550
- "group-data-[collapsible=icon]:hidden",
551
- className,
552
- )}
957
+ className={cn(styles.menuBadge, className)}
553
958
  {...props}
554
959
  />
555
960
  ));
556
961
  SidebarMenuBadge.displayName = "SidebarMenuBadge";
557
962
 
558
- const SidebarMenuSkeleton = React.forwardRef<
559
- HTMLDivElement,
560
- React.ComponentProps<"div"> & {
561
- showIcon?: boolean;
562
- }
563
- >(({className, showIcon = false, ...props}, ref) => {
564
- // Random width between 50 to 90%.
565
- const width = React.useMemo(() => {
566
- return `${Math.floor(Math.random() * 40) + 50}%`;
567
- }, []);
963
+ /**
964
+ * Props for the sidebar menu skeleton.
965
+ */
966
+ interface SidebarMenuSkeletonProps extends React.ComponentProps<"div"> {
967
+ /**
968
+ * Whether to render a leading skeleton icon placeholder.
969
+ * @default false
970
+ */
971
+ showIcon?: boolean;
972
+ }
973
+
974
+ /**
975
+ * Renders a loading placeholder for sidebar menu items.
976
+ *
977
+ * @remarks
978
+ * - Renders a `<div>` element
979
+ * - Built from shared `Skeleton` primitives
980
+ *
981
+ * @example
982
+ * ```tsx
983
+ * <SidebarMenuSkeleton showIcon />
984
+ * ```
985
+ *
986
+ * @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/div | HTML div element}
987
+ */
988
+ const SidebarMenuSkeleton = React.forwardRef<HTMLDivElement, SidebarMenuSkeletonProps>(({className, showIcon = false, ...props}, ref) => {
989
+ const width = React.useMemo(() => `${Math.floor(Math.random() * 40) + 50}%`, []);
568
990
 
569
991
  return (
570
992
  <div
571
993
  ref={ref}
572
994
  data-sidebar='menu-skeleton'
573
- className={cn("flex h-8 items-center gap-2 rounded-md px-2", className)}
995
+ className={cn(styles.menuSkeleton, className)}
574
996
  {...props}>
575
- {showIcon && (
997
+ {Boolean(showIcon) && (
576
998
  <Skeleton
577
- className='size-4 rounded-md'
999
+ className={styles.menuSkeletonIcon}
578
1000
  data-sidebar='menu-skeleton-icon'
579
1001
  />
580
1002
  )}
581
1003
  <Skeleton
582
- className='h-4 max-w-[--skeleton-width] flex-1'
1004
+ className={styles.menuSkeletonText}
583
1005
  data-sidebar='menu-skeleton-text'
584
- style={
585
- {
586
- "--skeleton-width": width,
587
- } as React.CSSProperties
588
- }
1006
+ style={{"--ac-skeleton-width": width} as React.CSSProperties}
589
1007
  />
590
1008
  </div>
591
1009
  );
592
1010
  });
593
1011
  SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton";
594
1012
 
1013
+ /**
1014
+ * Renders a nested menu list within the sidebar.
1015
+ *
1016
+ * @remarks
1017
+ * - Renders a `<ul>` element
1018
+ * - Built for multi-level navigation structures
1019
+ *
1020
+ * @example
1021
+ * ```tsx
1022
+ * <SidebarMenuSub>
1023
+ * <SidebarMenuSubItem />
1024
+ * </SidebarMenuSub>
1025
+ * ```
1026
+ *
1027
+ * @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/ul | HTML ul element}
1028
+ */
595
1029
  const SidebarMenuSub = React.forwardRef<HTMLUListElement, React.ComponentProps<"ul">>(({className, ...props}, ref) => (
596
1030
  <ul
597
1031
  ref={ref}
598
1032
  data-sidebar='menu-sub'
599
- className={cn(
600
- "border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5",
601
- "group-data-[collapsible=icon]:hidden",
602
- className,
603
- )}
1033
+ className={cn(styles.menuSub, className)}
604
1034
  {...props}
605
1035
  />
606
1036
  ));
607
1037
  SidebarMenuSub.displayName = "SidebarMenuSub";
608
1038
 
609
- const SidebarMenuSubItem = React.forwardRef<HTMLLIElement, React.ComponentProps<"li">>(({...props}, ref) => (
1039
+ /**
1040
+ * Renders a single nested sidebar menu list item.
1041
+ *
1042
+ * @remarks
1043
+ * - Renders an `<li>` element
1044
+ * - Built as a structural wrapper for nested menu links
1045
+ *
1046
+ * @example
1047
+ * ```tsx
1048
+ * <SidebarMenuSubItem />
1049
+ * ```
1050
+ *
1051
+ * @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/li | HTML li element}
1052
+ */
1053
+ const SidebarMenuSubItem = React.forwardRef<HTMLLIElement, React.ComponentProps<"li">>((props, ref) => (
610
1054
  <li
611
1055
  ref={ref}
612
1056
  {...props}
@@ -614,34 +1058,64 @@ const SidebarMenuSubItem = React.forwardRef<HTMLLIElement, React.ComponentProps<
614
1058
  ));
615
1059
  SidebarMenuSubItem.displayName = "SidebarMenuSubItem";
616
1060
 
617
- const SidebarMenuSubButton = React.forwardRef<
618
- HTMLAnchorElement,
619
- React.ComponentProps<"a"> & {
620
- asChild?: boolean;
621
- size?: "sm" | "md";
622
- isActive?: boolean;
623
- }
624
- >(({asChild = false, size = "md", isActive, className, ...props}, ref) => {
625
- const Comp = asChild ? Slot : "a";
1061
+ /**
1062
+ * Props for the sidebar nested menu button.
1063
+ */
1064
+ interface SidebarMenuSubButtonProps extends React.ComponentProps<"a"> {
1065
+ /**
1066
+ * Whether to merge props into the single child element instead of rendering a wrapper `<a>`.
1067
+ * @default false
1068
+ */
1069
+ asChild?: boolean;
1070
+ /**
1071
+ * Size preset for the nested menu link.
1072
+ * @default "md"
1073
+ */
1074
+ size?: "sm" | "md";
1075
+ /**
1076
+ * Whether the nested menu item should be styled as active.
1077
+ * @default undefined
1078
+ */
1079
+ isActive?: boolean;
1080
+ }
626
1081
 
627
- return (
628
- <Comp
629
- ref={ref}
630
- data-sidebar='menu-sub-button'
631
- data-size={size}
632
- data-active={isActive}
633
- className={cn(
634
- "text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-none focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
635
- "data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground",
636
- size === "sm" && "text-xs",
637
- size === "md" && "text-sm",
638
- "group-data-[collapsible=icon]:hidden",
639
- className,
640
- )}
641
- {...props}
642
- />
643
- );
644
- });
1082
+ /**
1083
+ * Renders a nested sidebar menu link.
1084
+ *
1085
+ * @remarks
1086
+ * - Renders an `<a>` element by default
1087
+ * - Supports `asChild` composition for custom link components
1088
+ *
1089
+ * @example
1090
+ * ```tsx
1091
+ * <SidebarMenuSubButton href='/settings/profile'>Profile</SidebarMenuSubButton>
1092
+ * ```
1093
+ *
1094
+ * @see {@link https://react.dev/reference/react/cloneElement | React cloneElement Docs}
1095
+ */
1096
+ const SidebarMenuSubButton = React.forwardRef<HTMLAnchorElement, SidebarMenuSubButtonProps>(
1097
+ ({asChild = false, size = "md", isActive, className, children, ...props}, ref) => {
1098
+ const mergedProps: SidebarCloneableAnchorProps = {
1099
+ ...props,
1100
+ children,
1101
+ className: cn(styles.menuSubButton, size === "sm" ? styles.menuSubButtonSm : styles.menuSubButtonMd, className),
1102
+ "data-active": isActive,
1103
+ "data-sidebar": "menu-sub-button",
1104
+ "data-size": size,
1105
+ ref,
1106
+ };
1107
+
1108
+ if (asChild) {
1109
+ const clonedChild = cloneSidebarChild(children, mergedProps);
1110
+
1111
+ if (clonedChild) {
1112
+ return clonedChild;
1113
+ }
1114
+ }
1115
+
1116
+ return <a {...mergedProps}>{children}</a>;
1117
+ },
1118
+ );
645
1119
  SidebarMenuSubButton.displayName = "SidebarMenuSubButton";
646
1120
 
647
1121
  export {