@arolariu/components 0.5.0 → 1.1.0

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