gladvn 0.2.14

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 (500) hide show
  1. package/README.md +112 -0
  2. package/bin/cli.js +326 -0
  3. package/dist/components/macro/accordion-preset.d.ts +14 -0
  4. package/dist/components/macro/accordion-preset.d.ts.map +1 -0
  5. package/dist/components/macro/alert-dialog-preset.d.ts +26 -0
  6. package/dist/components/macro/alert-dialog-preset.d.ts.map +1 -0
  7. package/dist/components/macro/alert-preset.d.ts +14 -0
  8. package/dist/components/macro/alert-preset.d.ts.map +1 -0
  9. package/dist/components/macro/avatar-preset.d.ts +11 -0
  10. package/dist/components/macro/avatar-preset.d.ts.map +1 -0
  11. package/dist/components/macro/breadcrumb-preset.d.ts +12 -0
  12. package/dist/components/macro/breadcrumb-preset.d.ts.map +1 -0
  13. package/dist/components/macro/card-preset.d.ts +10 -0
  14. package/dist/components/macro/card-preset.d.ts.map +1 -0
  15. package/dist/components/macro/carousel-preset.d.ts +18 -0
  16. package/dist/components/macro/carousel-preset.d.ts.map +1 -0
  17. package/dist/components/macro/checkbox-preset.d.ts +14 -0
  18. package/dist/components/macro/checkbox-preset.d.ts.map +1 -0
  19. package/dist/components/macro/combobox-preset.d.ts +27 -0
  20. package/dist/components/macro/combobox-preset.d.ts.map +1 -0
  21. package/dist/components/macro/command-preset.d.ts +16 -0
  22. package/dist/components/macro/command-preset.d.ts.map +1 -0
  23. package/dist/components/macro/date-picker.d.ts +62 -0
  24. package/dist/components/macro/date-picker.d.ts.map +1 -0
  25. package/dist/components/macro/dialog-preset.d.ts +24 -0
  26. package/dist/components/macro/dialog-preset.d.ts.map +1 -0
  27. package/dist/components/macro/empty-preset.d.ts +15 -0
  28. package/dist/components/macro/empty-preset.d.ts.map +1 -0
  29. package/dist/components/macro/field-preset.d.ts +15 -0
  30. package/dist/components/macro/field-preset.d.ts.map +1 -0
  31. package/dist/components/macro/index.d.ts +22 -0
  32. package/dist/components/macro/index.d.ts.map +1 -0
  33. package/dist/components/macro/input-otp-preset.d.ts +13 -0
  34. package/dist/components/macro/input-otp-preset.d.ts.map +1 -0
  35. package/dist/components/macro/input-preset.d.ts +21 -0
  36. package/dist/components/macro/input-preset.d.ts.map +1 -0
  37. package/dist/components/macro/pagination-preset.d.ts +13 -0
  38. package/dist/components/macro/pagination-preset.d.ts.map +1 -0
  39. package/dist/components/macro/progress-preset.d.ts +10 -0
  40. package/dist/components/macro/progress-preset.d.ts.map +1 -0
  41. package/dist/components/macro/radio-group-preset.d.ts +22 -0
  42. package/dist/components/macro/radio-group-preset.d.ts.map +1 -0
  43. package/dist/components/macro/select-preset.d.ts +42 -0
  44. package/dist/components/macro/select-preset.d.ts.map +1 -0
  45. package/dist/components/macro/slider-preset.d.ts +12 -0
  46. package/dist/components/macro/slider-preset.d.ts.map +1 -0
  47. package/dist/components/macro/switch-preset.d.ts +12 -0
  48. package/dist/components/macro/switch-preset.d.ts.map +1 -0
  49. package/dist/components/macro/tabs-preset.d.ts +17 -0
  50. package/dist/components/macro/tabs-preset.d.ts.map +1 -0
  51. package/dist/components/macro/textarea-preset.d.ts +17 -0
  52. package/dist/components/macro/textarea-preset.d.ts.map +1 -0
  53. package/dist/components/micro/accordion.d.ts +8 -0
  54. package/dist/components/micro/accordion.d.ts.map +1 -0
  55. package/dist/components/micro/alert-dialog.d.ts +33 -0
  56. package/dist/components/micro/alert-dialog.d.ts.map +1 -0
  57. package/dist/components/micro/alert.d.ts +28 -0
  58. package/dist/components/micro/alert.d.ts.map +1 -0
  59. package/dist/components/micro/aspect-ratio.d.ts +13 -0
  60. package/dist/components/micro/aspect-ratio.d.ts.map +1 -0
  61. package/dist/components/micro/avatar.d.ts +23 -0
  62. package/dist/components/micro/avatar.d.ts.map +1 -0
  63. package/dist/components/micro/badge.d.ts +16 -0
  64. package/dist/components/micro/badge.d.ts.map +1 -0
  65. package/dist/components/micro/breadcrumb.d.ts +24 -0
  66. package/dist/components/micro/breadcrumb.d.ts.map +1 -0
  67. package/dist/components/micro/button.d.ts +39 -0
  68. package/dist/components/micro/button.d.ts.map +1 -0
  69. package/dist/components/micro/calendar.d.ts +28 -0
  70. package/dist/components/micro/calendar.d.ts.map +1 -0
  71. package/dist/components/micro/card.d.ts +28 -0
  72. package/dist/components/micro/card.d.ts.map +1 -0
  73. package/dist/components/micro/carousel.d.ts +29 -0
  74. package/dist/components/micro/carousel.d.ts.map +1 -0
  75. package/dist/components/micro/chart.d.ts +49 -0
  76. package/dist/components/micro/chart.d.ts.map +1 -0
  77. package/dist/components/micro/checkbox.d.ts +17 -0
  78. package/dist/components/micro/checkbox.d.ts.map +1 -0
  79. package/dist/components/micro/collapsible.d.ts +15 -0
  80. package/dist/components/micro/collapsible.d.ts.map +1 -0
  81. package/dist/components/micro/combobox.d.ts +33 -0
  82. package/dist/components/micro/combobox.d.ts.map +1 -0
  83. package/dist/components/micro/command.d.ts +79 -0
  84. package/dist/components/micro/command.d.ts.map +1 -0
  85. package/dist/components/micro/context-menu.d.ts +60 -0
  86. package/dist/components/micro/context-menu.d.ts.map +1 -0
  87. package/dist/components/micro/dialog.d.ts +14 -0
  88. package/dist/components/micro/dialog.d.ts.map +1 -0
  89. package/dist/components/micro/direction.d.ts +2 -0
  90. package/dist/components/micro/direction.d.ts.map +1 -0
  91. package/dist/components/micro/drawer.d.ts +17 -0
  92. package/dist/components/micro/drawer.d.ts.map +1 -0
  93. package/dist/components/micro/dropdown-menu.d.ts +37 -0
  94. package/dist/components/micro/dropdown-menu.d.ts.map +1 -0
  95. package/dist/components/micro/empty.d.ts +23 -0
  96. package/dist/components/micro/empty.d.ts.map +1 -0
  97. package/dist/components/micro/field.d.ts +29 -0
  98. package/dist/components/micro/field.d.ts.map +1 -0
  99. package/dist/components/micro/hover-card.d.ts +17 -0
  100. package/dist/components/micro/hover-card.d.ts.map +1 -0
  101. package/dist/components/micro/input-group.d.ts +17 -0
  102. package/dist/components/micro/input-group.d.ts.map +1 -0
  103. package/dist/components/micro/input-otp.d.ts +44 -0
  104. package/dist/components/micro/input-otp.d.ts.map +1 -0
  105. package/dist/components/micro/input.d.ts +22 -0
  106. package/dist/components/micro/input.d.ts.map +1 -0
  107. package/dist/components/micro/item.d.ts +31 -0
  108. package/dist/components/micro/item.d.ts.map +1 -0
  109. package/dist/components/micro/kbd.d.ts +9 -0
  110. package/dist/components/micro/kbd.d.ts.map +1 -0
  111. package/dist/components/micro/label.d.ts +15 -0
  112. package/dist/components/micro/label.d.ts.map +1 -0
  113. package/dist/components/micro/menubar.d.ts +41 -0
  114. package/dist/components/micro/menubar.d.ts.map +1 -0
  115. package/dist/components/micro/navigation-menu.d.ts +18 -0
  116. package/dist/components/micro/navigation-menu.d.ts.map +1 -0
  117. package/dist/components/micro/pagination.d.ts +33 -0
  118. package/dist/components/micro/pagination.d.ts.map +1 -0
  119. package/dist/components/micro/popover.d.ts +23 -0
  120. package/dist/components/micro/popover.d.ts.map +1 -0
  121. package/dist/components/micro/progress.d.ts +19 -0
  122. package/dist/components/micro/progress.d.ts.map +1 -0
  123. package/dist/components/micro/radio-group.d.ts +13 -0
  124. package/dist/components/micro/radio-group.d.ts.map +1 -0
  125. package/dist/components/micro/resizable.d.ts +12 -0
  126. package/dist/components/micro/resizable.d.ts.map +1 -0
  127. package/dist/components/micro/scroll-area.d.ts +12 -0
  128. package/dist/components/micro/scroll-area.d.ts.map +1 -0
  129. package/dist/components/micro/select.d.ts +21 -0
  130. package/dist/components/micro/select.d.ts.map +1 -0
  131. package/dist/components/micro/separator.d.ts +9 -0
  132. package/dist/components/micro/separator.d.ts.map +1 -0
  133. package/dist/components/micro/sheet.d.ts +17 -0
  134. package/dist/components/micro/sheet.d.ts.map +1 -0
  135. package/dist/components/micro/sidebar.d.ts +28 -0
  136. package/dist/components/micro/sidebar.d.ts.map +1 -0
  137. package/dist/components/micro/skeleton.d.ts +9 -0
  138. package/dist/components/micro/skeleton.d.ts.map +1 -0
  139. package/dist/components/micro/slider.d.ts +14 -0
  140. package/dist/components/micro/slider.d.ts.map +1 -0
  141. package/dist/components/micro/sonner.d.ts +5 -0
  142. package/dist/components/micro/sonner.d.ts.map +1 -0
  143. package/dist/components/micro/spinner.d.ts +21 -0
  144. package/dist/components/micro/spinner.d.ts.map +1 -0
  145. package/dist/components/micro/switch.d.ts +13 -0
  146. package/dist/components/micro/switch.d.ts.map +1 -0
  147. package/dist/components/micro/table.d.ts +17 -0
  148. package/dist/components/micro/table.d.ts.map +1 -0
  149. package/dist/components/micro/tabs.d.ts +13 -0
  150. package/dist/components/micro/tabs.d.ts.map +1 -0
  151. package/dist/components/micro/textarea.d.ts +17 -0
  152. package/dist/components/micro/textarea.d.ts.map +1 -0
  153. package/dist/components/micro/theme-provider.d.ts +76 -0
  154. package/dist/components/micro/theme-provider.d.ts.map +1 -0
  155. package/dist/components/micro/toggle-group.d.ts +22 -0
  156. package/dist/components/micro/toggle-group.d.ts.map +1 -0
  157. package/dist/components/micro/toggle.d.ts +16 -0
  158. package/dist/components/micro/toggle.d.ts.map +1 -0
  159. package/dist/components/micro/tooltip.d.ts +20 -0
  160. package/dist/components/micro/tooltip.d.ts.map +1 -0
  161. package/dist/dev/App.d.ts +3 -0
  162. package/dist/dev/App.d.ts.map +1 -0
  163. package/dist/dev/components/GladcnLogo.d.ts +10 -0
  164. package/dist/dev/components/GladcnLogo.d.ts.map +1 -0
  165. package/dist/dev/components/code-highlighter.d.ts +5 -0
  166. package/dist/dev/components/code-highlighter.d.ts.map +1 -0
  167. package/dist/dev/components/dev-context.d.ts +12 -0
  168. package/dist/dev/components/dev-context.d.ts.map +1 -0
  169. package/dist/dev/components/showcase.d.ts +72 -0
  170. package/dist/dev/components/showcase.d.ts.map +1 -0
  171. package/dist/dev/data.d.ts +68 -0
  172. package/dist/dev/data.d.ts.map +1 -0
  173. package/dist/dev/main.d.ts +1 -0
  174. package/dist/dev/main.d.ts.map +1 -0
  175. package/dist/dev/sections/buttons.d.ts +2 -0
  176. package/dist/dev/sections/buttons.d.ts.map +1 -0
  177. package/dist/dev/sections/display.d.ts +2 -0
  178. package/dist/dev/sections/display.d.ts.map +1 -0
  179. package/dist/dev/sections/feedback.d.ts +2 -0
  180. package/dist/dev/sections/feedback.d.ts.map +1 -0
  181. package/dist/dev/sections/forms.d.ts +2 -0
  182. package/dist/dev/sections/forms.d.ts.map +1 -0
  183. package/dist/dev/sections/interactive.d.ts +2 -0
  184. package/dist/dev/sections/interactive.d.ts.map +1 -0
  185. package/dist/dev/sections/overview.d.ts +2 -0
  186. package/dist/dev/sections/overview.d.ts.map +1 -0
  187. package/dist/dev/showcase/accordion.d.ts +2 -0
  188. package/dist/dev/showcase/accordion.d.ts.map +1 -0
  189. package/dist/dev/showcase/alert-dialog.d.ts +2 -0
  190. package/dist/dev/showcase/alert-dialog.d.ts.map +1 -0
  191. package/dist/dev/showcase/alert.d.ts +2 -0
  192. package/dist/dev/showcase/alert.d.ts.map +1 -0
  193. package/dist/dev/showcase/aspect-ratio.d.ts +2 -0
  194. package/dist/dev/showcase/aspect-ratio.d.ts.map +1 -0
  195. package/dist/dev/showcase/avatar.d.ts +2 -0
  196. package/dist/dev/showcase/avatar.d.ts.map +1 -0
  197. package/dist/dev/showcase/badge.d.ts +2 -0
  198. package/dist/dev/showcase/badge.d.ts.map +1 -0
  199. package/dist/dev/showcase/breadcrumb.d.ts +2 -0
  200. package/dist/dev/showcase/breadcrumb.d.ts.map +1 -0
  201. package/dist/dev/showcase/button.d.ts +2 -0
  202. package/dist/dev/showcase/button.d.ts.map +1 -0
  203. package/dist/dev/showcase/calendar.d.ts +2 -0
  204. package/dist/dev/showcase/calendar.d.ts.map +1 -0
  205. package/dist/dev/showcase/card.d.ts +2 -0
  206. package/dist/dev/showcase/card.d.ts.map +1 -0
  207. package/dist/dev/showcase/carousel.d.ts +2 -0
  208. package/dist/dev/showcase/carousel.d.ts.map +1 -0
  209. package/dist/dev/showcase/chart.d.ts +2 -0
  210. package/dist/dev/showcase/chart.d.ts.map +1 -0
  211. package/dist/dev/showcase/checkbox.d.ts +2 -0
  212. package/dist/dev/showcase/checkbox.d.ts.map +1 -0
  213. package/dist/dev/showcase/collapsible.d.ts +3 -0
  214. package/dist/dev/showcase/collapsible.d.ts.map +1 -0
  215. package/dist/dev/showcase/combobox.d.ts +2 -0
  216. package/dist/dev/showcase/combobox.d.ts.map +1 -0
  217. package/dist/dev/showcase/command.d.ts +2 -0
  218. package/dist/dev/showcase/command.d.ts.map +1 -0
  219. package/dist/dev/showcase/context-menu.d.ts +2 -0
  220. package/dist/dev/showcase/context-menu.d.ts.map +1 -0
  221. package/dist/dev/showcase/dialog.d.ts +2 -0
  222. package/dist/dev/showcase/dialog.d.ts.map +1 -0
  223. package/dist/dev/showcase/drawer.d.ts +2 -0
  224. package/dist/dev/showcase/drawer.d.ts.map +1 -0
  225. package/dist/dev/showcase/dropdown-menu.d.ts +2 -0
  226. package/dist/dev/showcase/dropdown-menu.d.ts.map +1 -0
  227. package/dist/dev/showcase/empty.d.ts +2 -0
  228. package/dist/dev/showcase/empty.d.ts.map +1 -0
  229. package/dist/dev/showcase/hover-card.d.ts +2 -0
  230. package/dist/dev/showcase/hover-card.d.ts.map +1 -0
  231. package/dist/dev/showcase/input-group.d.ts +2 -0
  232. package/dist/dev/showcase/input-group.d.ts.map +1 -0
  233. package/dist/dev/showcase/input-otp.d.ts +2 -0
  234. package/dist/dev/showcase/input-otp.d.ts.map +1 -0
  235. package/dist/dev/showcase/input.d.ts +2 -0
  236. package/dist/dev/showcase/input.d.ts.map +1 -0
  237. package/dist/dev/showcase/item.d.ts +2 -0
  238. package/dist/dev/showcase/item.d.ts.map +1 -0
  239. package/dist/dev/showcase/kbd.d.ts +2 -0
  240. package/dist/dev/showcase/kbd.d.ts.map +1 -0
  241. package/dist/dev/showcase/label.d.ts +2 -0
  242. package/dist/dev/showcase/label.d.ts.map +1 -0
  243. package/dist/dev/showcase/menubar.d.ts +2 -0
  244. package/dist/dev/showcase/menubar.d.ts.map +1 -0
  245. package/dist/dev/showcase/navigation-menu.d.ts +3 -0
  246. package/dist/dev/showcase/navigation-menu.d.ts.map +1 -0
  247. package/dist/dev/showcase/overview.d.ts +2 -0
  248. package/dist/dev/showcase/overview.d.ts.map +1 -0
  249. package/dist/dev/showcase/pagination.d.ts +2 -0
  250. package/dist/dev/showcase/pagination.d.ts.map +1 -0
  251. package/dist/dev/showcase/popover.d.ts +2 -0
  252. package/dist/dev/showcase/popover.d.ts.map +1 -0
  253. package/dist/dev/showcase/progress.d.ts +2 -0
  254. package/dist/dev/showcase/progress.d.ts.map +1 -0
  255. package/dist/dev/showcase/radio-group.d.ts +2 -0
  256. package/dist/dev/showcase/radio-group.d.ts.map +1 -0
  257. package/dist/dev/showcase/resizable.d.ts +2 -0
  258. package/dist/dev/showcase/resizable.d.ts.map +1 -0
  259. package/dist/dev/showcase/scroll-area.d.ts +2 -0
  260. package/dist/dev/showcase/scroll-area.d.ts.map +1 -0
  261. package/dist/dev/showcase/select.d.ts +2 -0
  262. package/dist/dev/showcase/select.d.ts.map +1 -0
  263. package/dist/dev/showcase/separator.d.ts +2 -0
  264. package/dist/dev/showcase/separator.d.ts.map +1 -0
  265. package/dist/dev/showcase/sheet.d.ts +2 -0
  266. package/dist/dev/showcase/sheet.d.ts.map +1 -0
  267. package/dist/dev/showcase/sidebar.d.ts +2 -0
  268. package/dist/dev/showcase/sidebar.d.ts.map +1 -0
  269. package/dist/dev/showcase/skeleton.d.ts +2 -0
  270. package/dist/dev/showcase/skeleton.d.ts.map +1 -0
  271. package/dist/dev/showcase/slider.d.ts +2 -0
  272. package/dist/dev/showcase/slider.d.ts.map +1 -0
  273. package/dist/dev/showcase/sonner.d.ts +2 -0
  274. package/dist/dev/showcase/sonner.d.ts.map +1 -0
  275. package/dist/dev/showcase/spinner.d.ts +2 -0
  276. package/dist/dev/showcase/spinner.d.ts.map +1 -0
  277. package/dist/dev/showcase/switch.d.ts +2 -0
  278. package/dist/dev/showcase/switch.d.ts.map +1 -0
  279. package/dist/dev/showcase/table.d.ts +2 -0
  280. package/dist/dev/showcase/table.d.ts.map +1 -0
  281. package/dist/dev/showcase/tabs.d.ts +2 -0
  282. package/dist/dev/showcase/tabs.d.ts.map +1 -0
  283. package/dist/dev/showcase/textarea.d.ts +2 -0
  284. package/dist/dev/showcase/textarea.d.ts.map +1 -0
  285. package/dist/dev/showcase/theme-provider.d.ts +2 -0
  286. package/dist/dev/showcase/theme-provider.d.ts.map +1 -0
  287. package/dist/dev/showcase/toast.d.ts +2 -0
  288. package/dist/dev/showcase/toast.d.ts.map +1 -0
  289. package/dist/dev/showcase/toggle-group.d.ts +2 -0
  290. package/dist/dev/showcase/toggle-group.d.ts.map +1 -0
  291. package/dist/dev/showcase/toggle.d.ts +2 -0
  292. package/dist/dev/showcase/toggle.d.ts.map +1 -0
  293. package/dist/dev/showcase/tooltip.d.ts +2 -0
  294. package/dist/dev/showcase/tooltip.d.ts.map +1 -0
  295. package/dist/hooks/use-controllable-state.d.ts +14 -0
  296. package/dist/hooks/use-controllable-state.d.ts.map +1 -0
  297. package/dist/hooks/use-mobile.d.ts +2 -0
  298. package/dist/hooks/use-mobile.d.ts.map +1 -0
  299. package/dist/index.cjs +5099 -0
  300. package/dist/index.cjs.map +1 -0
  301. package/dist/index.d.ts +58 -0
  302. package/dist/index.d.ts.map +1 -0
  303. package/dist/index.js +4740 -0
  304. package/dist/index.js.map +1 -0
  305. package/dist/lib/types.d.ts +4 -0
  306. package/dist/lib/types.d.ts.map +1 -0
  307. package/dist/lib/utils.d.ts +3 -0
  308. package/dist/lib/utils.d.ts.map +1 -0
  309. package/dist/preset.d.ts +18 -0
  310. package/dist/preset.d.ts.map +1 -0
  311. package/dist/test/setup.d.ts +1 -0
  312. package/dist/test/setup.d.ts.map +1 -0
  313. package/llms.txt +74 -0
  314. package/package.json +117 -0
  315. package/scripts/add-icononly-prop.ts +84 -0
  316. package/scripts/audit-best-practices.ts +114 -0
  317. package/scripts/audit-showcase.ts +262 -0
  318. package/scripts/audit-showcases.ts +83 -0
  319. package/scripts/clean-imports.ts +21 -0
  320. package/scripts/count_missing.ts +24 -0
  321. package/scripts/find-css-vars.ts +62 -0
  322. package/scripts/fix-portals.ts +90 -0
  323. package/scripts/full-audit.ts +89 -0
  324. package/scripts/merge-components.cjs +65 -0
  325. package/scripts/merge-components.js +64 -0
  326. package/scripts/optimize-barrel.ts +116 -0
  327. package/scripts/postinstall.cjs +228 -0
  328. package/scripts/refactor_divs.ts +39 -0
  329. package/scripts/remove_div_wrappers.ts +17 -0
  330. package/scripts/update-gaps.ts +83 -0
  331. package/scripts/update_showcase_codestrings.ts +87 -0
  332. package/src/components/macro/accordion-preset.test.tsx +37 -0
  333. package/src/components/macro/accordion-preset.tsx +41 -0
  334. package/src/components/macro/alert-dialog-preset.tsx +116 -0
  335. package/src/components/macro/alert-preset.tsx +94 -0
  336. package/src/components/macro/avatar-preset.tsx +54 -0
  337. package/src/components/macro/breadcrumb-preset.tsx +50 -0
  338. package/src/components/macro/card-preset.tsx +44 -0
  339. package/src/components/macro/carousel-preset.tsx +150 -0
  340. package/src/components/macro/checkbox-preset.test.tsx +49 -0
  341. package/src/components/macro/checkbox-preset.tsx +84 -0
  342. package/src/components/macro/combobox-preset.tsx +171 -0
  343. package/src/components/macro/command-preset.tsx +74 -0
  344. package/src/components/macro/date-picker.tsx +289 -0
  345. package/src/components/macro/dialog-preset.tsx +105 -0
  346. package/src/components/macro/empty-preset.tsx +46 -0
  347. package/src/components/macro/field-preset.test.tsx +69 -0
  348. package/src/components/macro/field-preset.tsx +65 -0
  349. package/src/components/macro/index.ts +21 -0
  350. package/src/components/macro/input-otp-preset.tsx +98 -0
  351. package/src/components/macro/input-preset.test.tsx +52 -0
  352. package/src/components/macro/input-preset.tsx +139 -0
  353. package/src/components/macro/pagination-preset.tsx +153 -0
  354. package/src/components/macro/progress-preset.test.tsx +65 -0
  355. package/src/components/macro/progress-preset.tsx +45 -0
  356. package/src/components/macro/radio-group-preset.tsx +115 -0
  357. package/src/components/macro/select-preset.tsx +168 -0
  358. package/src/components/macro/slider-preset.test.tsx +43 -0
  359. package/src/components/macro/slider-preset.tsx +86 -0
  360. package/src/components/macro/switch-preset.test.tsx +53 -0
  361. package/src/components/macro/switch-preset.tsx +70 -0
  362. package/src/components/macro/tabs-preset.test.tsx +31 -0
  363. package/src/components/macro/tabs-preset.tsx +51 -0
  364. package/src/components/macro/textarea-preset.test.tsx +39 -0
  365. package/src/components/macro/textarea-preset.tsx +55 -0
  366. package/src/components/micro/accordion.tsx +76 -0
  367. package/src/components/micro/alert-dialog.tsx +213 -0
  368. package/src/components/micro/alert.tsx +146 -0
  369. package/src/components/micro/aspect-ratio.tsx +38 -0
  370. package/src/components/micro/avatar.tsx +143 -0
  371. package/src/components/micro/badge.tsx +207 -0
  372. package/src/components/micro/breadcrumb.tsx +162 -0
  373. package/src/components/micro/button.test.tsx +25 -0
  374. package/src/components/micro/button.tsx +361 -0
  375. package/src/components/micro/calendar.tsx +383 -0
  376. package/src/components/micro/card.tsx +112 -0
  377. package/src/components/micro/carousel.tsx +341 -0
  378. package/src/components/micro/chart.tsx +392 -0
  379. package/src/components/micro/checkbox.tsx +74 -0
  380. package/src/components/micro/collapsible.tsx +65 -0
  381. package/src/components/micro/combobox.tsx +349 -0
  382. package/src/components/micro/command.tsx +238 -0
  383. package/src/components/micro/context-menu.tsx +285 -0
  384. package/src/components/micro/dialog.tsx +143 -0
  385. package/src/components/micro/direction.tsx +13 -0
  386. package/src/components/micro/drawer.tsx +149 -0
  387. package/src/components/micro/dropdown-menu.tsx +305 -0
  388. package/src/components/micro/empty.tsx +144 -0
  389. package/src/components/micro/field.tsx +311 -0
  390. package/src/components/micro/hover-card.tsx +86 -0
  391. package/src/components/micro/input-group.tsx +269 -0
  392. package/src/components/micro/input-otp.tsx +130 -0
  393. package/src/components/micro/input.tsx +56 -0
  394. package/src/components/micro/item.tsx +206 -0
  395. package/src/components/micro/kbd.tsx +38 -0
  396. package/src/components/micro/label.tsx +48 -0
  397. package/src/components/micro/menubar.tsx +302 -0
  398. package/src/components/micro/navigation-menu.tsx +197 -0
  399. package/src/components/micro/pagination.tsx +162 -0
  400. package/src/components/micro/popover.tsx +131 -0
  401. package/src/components/micro/progress.tsx +144 -0
  402. package/src/components/micro/radio-group.tsx +73 -0
  403. package/src/components/micro/resizable.tsx +64 -0
  404. package/src/components/micro/scroll-area.tsx +68 -0
  405. package/src/components/micro/select.tsx +234 -0
  406. package/src/components/micro/separator.tsx +37 -0
  407. package/src/components/micro/sheet.tsx +144 -0
  408. package/src/components/micro/sidebar.tsx +238 -0
  409. package/src/components/micro/skeleton.tsx +29 -0
  410. package/src/components/micro/slider.tsx +135 -0
  411. package/src/components/micro/sonner.tsx +85 -0
  412. package/src/components/micro/spinner.tsx +44 -0
  413. package/src/components/micro/switch.tsx +70 -0
  414. package/src/components/micro/table.tsx +210 -0
  415. package/src/components/micro/tabs.tsx +100 -0
  416. package/src/components/micro/textarea.tsx +53 -0
  417. package/src/components/micro/theme-provider.tsx +163 -0
  418. package/src/components/micro/toggle-group.tsx +121 -0
  419. package/src/components/micro/toggle.tsx +55 -0
  420. package/src/components/micro/tooltip.tsx +105 -0
  421. package/src/dev/App.tsx +322 -0
  422. package/src/dev/_debug_select.html +29 -0
  423. package/src/dev/components/GladcnLogo.tsx +80 -0
  424. package/src/dev/components/code-highlighter.tsx +67 -0
  425. package/src/dev/components/dev-context.tsx +31 -0
  426. package/src/dev/components/showcase.tsx +413 -0
  427. package/src/dev/data.ts +341 -0
  428. package/src/dev/index.css +55 -0
  429. package/src/dev/main.tsx +30 -0
  430. package/src/dev/sections/buttons.tsx +303 -0
  431. package/src/dev/sections/display.tsx +270 -0
  432. package/src/dev/sections/feedback.tsx +371 -0
  433. package/src/dev/sections/forms.tsx +652 -0
  434. package/src/dev/sections/interactive.tsx +51 -0
  435. package/src/dev/sections/overview.tsx +396 -0
  436. package/src/dev/showcase/accordion.tsx +947 -0
  437. package/src/dev/showcase/alert-dialog.tsx +1056 -0
  438. package/src/dev/showcase/alert.tsx +756 -0
  439. package/src/dev/showcase/aspect-ratio.tsx +339 -0
  440. package/src/dev/showcase/avatar.tsx +470 -0
  441. package/src/dev/showcase/badge.tsx +227 -0
  442. package/src/dev/showcase/breadcrumb.tsx +269 -0
  443. package/src/dev/showcase/button.tsx +309 -0
  444. package/src/dev/showcase/calendar.tsx +380 -0
  445. package/src/dev/showcase/card.tsx +448 -0
  446. package/src/dev/showcase/carousel.tsx +562 -0
  447. package/src/dev/showcase/chart.tsx +130 -0
  448. package/src/dev/showcase/checkbox.tsx +611 -0
  449. package/src/dev/showcase/collapsible.tsx +298 -0
  450. package/src/dev/showcase/combobox.tsx +777 -0
  451. package/src/dev/showcase/command.tsx +245 -0
  452. package/src/dev/showcase/context-menu.tsx +239 -0
  453. package/src/dev/showcase/dialog.tsx +1141 -0
  454. package/src/dev/showcase/drawer.tsx +392 -0
  455. package/src/dev/showcase/dropdown-menu.tsx +420 -0
  456. package/src/dev/showcase/empty.tsx +493 -0
  457. package/src/dev/showcase/hover-card.tsx +336 -0
  458. package/src/dev/showcase/input-group.tsx +511 -0
  459. package/src/dev/showcase/input-otp.tsx +404 -0
  460. package/src/dev/showcase/input.tsx +530 -0
  461. package/src/dev/showcase/item.tsx +295 -0
  462. package/src/dev/showcase/kbd.tsx +276 -0
  463. package/src/dev/showcase/label.tsx +121 -0
  464. package/src/dev/showcase/menubar.tsx +392 -0
  465. package/src/dev/showcase/navigation-menu.tsx +304 -0
  466. package/src/dev/showcase/overview.tsx +1106 -0
  467. package/src/dev/showcase/pagination.tsx +312 -0
  468. package/src/dev/showcase/popover.tsx +374 -0
  469. package/src/dev/showcase/progress.tsx +299 -0
  470. package/src/dev/showcase/radio-group.tsx +612 -0
  471. package/src/dev/showcase/resizable.tsx +237 -0
  472. package/src/dev/showcase/scroll-area.tsx +157 -0
  473. package/src/dev/showcase/select.tsx +628 -0
  474. package/src/dev/showcase/separator.tsx +126 -0
  475. package/src/dev/showcase/sheet.tsx +566 -0
  476. package/src/dev/showcase/sidebar.tsx +120 -0
  477. package/src/dev/showcase/skeleton.tsx +213 -0
  478. package/src/dev/showcase/slider.tsx +506 -0
  479. package/src/dev/showcase/sonner.tsx +376 -0
  480. package/src/dev/showcase/spinner.tsx +124 -0
  481. package/src/dev/showcase/switch.tsx +602 -0
  482. package/src/dev/showcase/table.tsx +196 -0
  483. package/src/dev/showcase/tabs.tsx +662 -0
  484. package/src/dev/showcase/textarea.tsx +498 -0
  485. package/src/dev/showcase/theme-provider.tsx +894 -0
  486. package/src/dev/showcase/toast.tsx +119 -0
  487. package/src/dev/showcase/toggle-group.tsx +223 -0
  488. package/src/dev/showcase/toggle.tsx +171 -0
  489. package/src/dev/showcase/tooltip.tsx +372 -0
  490. package/src/hooks/use-controllable-state.ts +87 -0
  491. package/src/hooks/use-mobile.ts +21 -0
  492. package/src/index.ts +62 -0
  493. package/src/lib/types.ts +14 -0
  494. package/src/lib/utils.test.ts +14 -0
  495. package/src/lib/utils.ts +6 -0
  496. package/src/preset.ts +17 -0
  497. package/src/styles/gladcn.css +116 -0
  498. package/src/styles/tokens.css +213 -0
  499. package/src/test/setup.ts +8 -0
  500. package/src/vite-env.d.ts +1 -0
@@ -0,0 +1,302 @@
1
+ /**
2
+ * ✅ AUDITED & REFACTORED
3
+ * - Design System Compliant (22 Commandments)
4
+ * - WCAG AAA/AA
5
+ * - Form Control Parity
6
+ * - CSS Delegated Logic
7
+ */
8
+ "use client";
9
+
10
+ import * as React from "react";
11
+ import { Menu as MenuPrimitive } from "@base-ui/react/menu";
12
+ import { Menubar as MenubarPrimitive } from "@base-ui/react/menubar";
13
+
14
+ import {
15
+ DropdownMenu,
16
+ DropdownMenuContent,
17
+ DropdownMenuGroup,
18
+ DropdownMenuItem,
19
+ DropdownMenuLabel,
20
+ DropdownMenuPortal,
21
+ DropdownMenuRadioGroup,
22
+ DropdownMenuSeparator,
23
+ DropdownMenuShortcut,
24
+ DropdownMenuSub,
25
+ DropdownMenuSubContent,
26
+ DropdownMenuSubTrigger,
27
+ DropdownMenuTrigger,
28
+ } from "../../components/micro/dropdown-menu";
29
+ import { cn } from "../../lib/utils";
30
+ import { CheckIcon } from "lucide-react";
31
+
32
+ /**
33
+ * @description A visually persistent menu common in desktop applications.
34
+ * @requires MenubarMenu, MenubarTrigger, MenubarContent, MenubarItem
35
+ * @example
36
+ * <Menubar>
37
+ * <MenubarMenu>
38
+ * <MenubarTrigger>File</MenubarTrigger>
39
+ * <MenubarContent><MenubarItem>New</MenubarItem></MenubarContent>
40
+ * </MenubarMenu>
41
+ * </Menubar>
42
+ */
43
+ function Menubar({ className, ...props }: MenubarPrimitive.Props) {
44
+ return (
45
+ <MenubarPrimitive
46
+ data-slot="menubar"
47
+ className={cn(
48
+ "flex h-8 items-center gap-0.5 rounded-lg border border-border p-[3px]",
49
+ className,
50
+ )}
51
+ {...props}
52
+ />
53
+ );
54
+ }
55
+
56
+ function MenubarMenu({ ...props }: React.ComponentProps<typeof DropdownMenu>) {
57
+ return <DropdownMenu data-slot="menubar-menu" {...props} />;
58
+ }
59
+
60
+ function MenubarGroup({
61
+ ...props
62
+ }: React.ComponentProps<typeof DropdownMenuGroup>) {
63
+ return <DropdownMenuGroup data-slot="menubar-group" {...props} />;
64
+ }
65
+
66
+ function MenubarPortal({
67
+ ...props
68
+ }: React.ComponentProps<typeof DropdownMenuPortal>) {
69
+ return <DropdownMenuPortal data-slot="menubar-portal" {...props} />;
70
+ }
71
+
72
+ function MenubarTrigger({
73
+ className,
74
+ ...props
75
+ }: React.ComponentProps<typeof DropdownMenuTrigger>) {
76
+ return (
77
+ <DropdownMenuTrigger
78
+ data-slot="menubar-trigger"
79
+ className={cn(
80
+ "flex items-center rounded-sm px-1.5 py-[2px] text-sm font-medium outline-hidden select-none hover:bg-muted aria-expanded:bg-muted",
81
+ className,
82
+ )}
83
+ {...props}
84
+ />
85
+ );
86
+ }
87
+
88
+ function MenubarContent({
89
+ className,
90
+ align = "start",
91
+ alignOffset = -4,
92
+ sideOffset = 8,
93
+ ...props
94
+ }: React.ComponentProps<typeof DropdownMenuContent>) {
95
+ return (
96
+ <DropdownMenuContent
97
+ data-slot="menubar-content"
98
+ align={align}
99
+ alignOffset={alignOffset}
100
+ sideOffset={sideOffset}
101
+ className={cn(
102
+ "min-w-36 rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95",
103
+ className,
104
+ )}
105
+ {...props}
106
+ />
107
+ );
108
+ }
109
+
110
+ function MenubarItem({
111
+ className,
112
+ inset,
113
+ variant,
114
+ ...props
115
+ }: React.ComponentProps<typeof DropdownMenuItem>) {
116
+ return (
117
+ <DropdownMenuItem
118
+ data-slot="menubar-item"
119
+ data-inset={inset}
120
+ data-variant={variant}
121
+ className={cn(
122
+ "group/menubar-item gap-1.5 rounded-md px-1.5 py-1 text-sm focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:[&>svg]:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:opacity-50 [&>svg:not([class*='size-'])]:size-4 data-[variant=destructive]:[&>svg]:text-destructive",
123
+ className,
124
+ )}
125
+ {...props}
126
+ />
127
+ );
128
+ }
129
+
130
+ function MenubarCheckboxItem({
131
+ className,
132
+ children,
133
+ checked,
134
+ inset,
135
+ ...props
136
+ }: MenuPrimitive.CheckboxItem.Props & {
137
+ inset?: boolean;
138
+ }) {
139
+ return (
140
+ <MenuPrimitive.CheckboxItem
141
+ data-slot="menubar-checkbox-item"
142
+ data-inset={inset}
143
+ className={cn(
144
+ "relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-1.5 pl-7 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:[&>svg]:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&>svg]:pointer-events-none [&>svg]:shrink-0",
145
+ className,
146
+ )}
147
+ checked={checked}
148
+ {...props}
149
+ >
150
+ <span className="pointer-events-none absolute left-1.5 flex size-4 items-center justify-center [&_svg:not([class*='size-'])]:size-4">
151
+ <MenuPrimitive.CheckboxItemIndicator>
152
+ <CheckIcon aria-hidden="true" />
153
+ </MenuPrimitive.CheckboxItemIndicator>
154
+ </span>
155
+ {children}
156
+ </MenuPrimitive.CheckboxItem>
157
+ );
158
+ }
159
+
160
+ function MenubarRadioGroup({
161
+ ...props
162
+ }: React.ComponentProps<typeof DropdownMenuRadioGroup>) {
163
+ return <DropdownMenuRadioGroup data-slot="menubar-radio-group" {...props} />;
164
+ }
165
+
166
+ function MenubarRadioItem({
167
+ className,
168
+ children,
169
+ inset,
170
+ ...props
171
+ }: MenuPrimitive.RadioItem.Props & {
172
+ inset?: boolean;
173
+ }) {
174
+ return (
175
+ <MenuPrimitive.RadioItem
176
+ data-slot="menubar-radio-item"
177
+ data-inset={inset}
178
+ className={cn(
179
+ "relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-1.5 pl-7 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:[&>svg]:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&>svg]:pointer-events-none [&>svg]:shrink-0 [&>svg:not([class*='size-'])]:size-4",
180
+ className,
181
+ )}
182
+ {...props}
183
+ >
184
+ <span className="pointer-events-none absolute left-1.5 flex size-4 items-center justify-center [&_svg:not([class*='size-'])]:size-4">
185
+ <MenuPrimitive.RadioItemIndicator>
186
+ <CheckIcon aria-hidden="true" />
187
+ </MenuPrimitive.RadioItemIndicator>
188
+ </span>
189
+ {children}
190
+ </MenuPrimitive.RadioItem>
191
+ );
192
+ }
193
+
194
+ function MenubarLabel({
195
+ className,
196
+ inset,
197
+ ...props
198
+ }: React.ComponentProps<typeof DropdownMenuLabel> & {
199
+ inset?: boolean;
200
+ }) {
201
+ return (
202
+ <DropdownMenuLabel
203
+ data-slot="menubar-label"
204
+ data-inset={inset}
205
+ className={cn(
206
+ "px-1.5 py-1 text-sm font-medium data-inset:pl-7",
207
+ className,
208
+ )}
209
+ {...props}
210
+ />
211
+ );
212
+ }
213
+
214
+ function MenubarSeparator({
215
+ className,
216
+ ...props
217
+ }: React.ComponentProps<typeof DropdownMenuSeparator>) {
218
+ return (
219
+ <DropdownMenuSeparator
220
+ data-slot="menubar-separator"
221
+ className={cn("-mx-1 my-1 h-px bg-border", className)}
222
+ {...props}
223
+ />
224
+ );
225
+ }
226
+
227
+ function MenubarShortcut({
228
+ className,
229
+ ...props
230
+ }: React.ComponentProps<typeof DropdownMenuShortcut>) {
231
+ return (
232
+ <DropdownMenuShortcut
233
+ data-slot="menubar-shortcut"
234
+ className={cn(
235
+ "ml-auto text-xs tracking-widest text-muted-foreground group-focus/menubar-item:text-accent-foreground",
236
+ className,
237
+ )}
238
+ {...props}
239
+ />
240
+ );
241
+ }
242
+
243
+ function MenubarSub({
244
+ ...props
245
+ }: React.ComponentProps<typeof DropdownMenuSub>) {
246
+ return <DropdownMenuSub data-slot="menubar-sub" {...props} />;
247
+ }
248
+
249
+ function MenubarSubTrigger({
250
+ className,
251
+ inset,
252
+ ...props
253
+ }: React.ComponentProps<typeof DropdownMenuSubTrigger> & {
254
+ inset?: boolean;
255
+ }) {
256
+ return (
257
+ <DropdownMenuSubTrigger
258
+ data-slot="menubar-sub-trigger"
259
+ data-inset={inset}
260
+ className={cn(
261
+ "gap-1.5 rounded-md px-1.5 py-1 text-sm focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-open:bg-accent data-open:text-accent-foreground [&_svg:not([class*='size-'])]:size-4",
262
+ className,
263
+ )}
264
+ {...props}
265
+ />
266
+ );
267
+ }
268
+
269
+ function MenubarSubContent({
270
+ className,
271
+ ...props
272
+ }: React.ComponentProps<typeof DropdownMenuSubContent>) {
273
+ return (
274
+ <DropdownMenuSubContent
275
+ data-slot="menubar-sub-content"
276
+ className={cn(
277
+ "min-w-32 rounded-lg bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
278
+ className,
279
+ )}
280
+ {...props}
281
+ />
282
+ );
283
+ }
284
+
285
+ export {
286
+ Menubar,
287
+ MenubarCheckboxItem,
288
+ MenubarContent,
289
+ MenubarGroup,
290
+ MenubarItem,
291
+ MenubarLabel,
292
+ MenubarMenu,
293
+ MenubarPortal,
294
+ MenubarRadioGroup,
295
+ MenubarRadioItem,
296
+ MenubarSeparator,
297
+ MenubarShortcut,
298
+ MenubarSub,
299
+ MenubarSubContent,
300
+ MenubarSubTrigger,
301
+ MenubarTrigger,
302
+ };
@@ -0,0 +1,197 @@
1
+ /**
2
+ * ✅ AUDITED & REFACTORED
3
+ * - Design System Compliant (22 Commandments)
4
+ * - WCAG AAA/AA
5
+ * - Form Control Parity
6
+ * - CSS Delegated Logic
7
+ */
8
+ import { NavigationMenu as NavigationMenuPrimitive } from "@base-ui/react/navigation-menu";
9
+ import * as React from "react";
10
+
11
+ import { cn } from "../../lib/utils";
12
+ import { ChevronDownIcon } from "lucide-react";
13
+
14
+ /**
15
+ * @description A collection of links for navigating websites.
16
+ * @requires NavigationMenuList, NavigationMenuItem, NavigationMenuTrigger, NavigationMenuContent
17
+ */
18
+ const NavigationMenu = React.forwardRef<
19
+ React.ComponentRef<typeof NavigationMenuPrimitive.Root>,
20
+ React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Root>
21
+ >(({ className, children, ...props }, ref) => {
22
+ return (
23
+ <NavigationMenuPrimitive.Root
24
+ ref={ref}
25
+ data-slot="navigation-menu"
26
+ className={cn(
27
+ "group/navigation-menu relative flex max-w-max flex-1 items-center justify-center",
28
+ className,
29
+ )}
30
+ {...props}
31
+ >
32
+ {children}
33
+ </NavigationMenuPrimitive.Root>
34
+ );
35
+ });
36
+ NavigationMenu.displayName = "NavigationMenu";
37
+
38
+ const NavigationMenuList = React.forwardRef<
39
+ React.ComponentRef<typeof NavigationMenuPrimitive.List>,
40
+ React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.List>
41
+ >(({ className, ...props }, ref) => {
42
+ return (
43
+ <NavigationMenuPrimitive.List
44
+ ref={ref}
45
+ data-slot="navigation-menu-list"
46
+ className={cn(
47
+ "group flex flex-1 list-none items-center justify-center gap-0",
48
+ className,
49
+ )}
50
+ {...props}
51
+ />
52
+ );
53
+ });
54
+ NavigationMenuList.displayName = "NavigationMenuList";
55
+
56
+ const NavigationMenuItem = React.forwardRef<
57
+ React.ComponentRef<typeof NavigationMenuPrimitive.Item>,
58
+ React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Item>
59
+ >(({ className, ...props }, ref) => {
60
+ return (
61
+ <NavigationMenuPrimitive.Item
62
+ ref={ref}
63
+ data-slot="navigation-menu-item"
64
+ className={cn("relative", className)}
65
+ {...props}
66
+ />
67
+ );
68
+ });
69
+ NavigationMenuItem.displayName = "NavigationMenuItem";
70
+
71
+ function navigationMenuTriggerStyle(className?: string) {
72
+ return cn(
73
+ "group/navigation-menu-trigger inline-flex h-9 w-max items-center justify-center rounded-lg px-2.5 py-1.5 text-sm font-medium transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 data-popup-open:bg-muted/50 data-popup-open:hover:bg-muted",
74
+ className,
75
+ );
76
+ }
77
+
78
+ const NavigationMenuTrigger = React.forwardRef<
79
+ React.ComponentRef<typeof NavigationMenuPrimitive.Trigger>,
80
+ React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Trigger>
81
+ >(({ className, children, ...props }, ref) => {
82
+ return (
83
+ <NavigationMenuPrimitive.Trigger
84
+ ref={ref}
85
+ data-slot="navigation-menu-trigger"
86
+ className={cn(navigationMenuTriggerStyle("group"), className)}
87
+ {...props}
88
+ >
89
+ {children}{" "}
90
+ <ChevronDownIcon
91
+ className="relative top-px ml-1 size-3 transition duration-300 group-data-popup-open/navigation-menu-trigger:rotate-180"
92
+ aria-hidden="true"
93
+ />
94
+ </NavigationMenuPrimitive.Trigger>
95
+ );
96
+ });
97
+ NavigationMenuTrigger.displayName = "NavigationMenuTrigger";
98
+
99
+ const NavigationMenuContent = React.forwardRef<
100
+ React.ComponentRef<typeof NavigationMenuPrimitive.Content>,
101
+ React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Content>
102
+ >(({ className, ...props }, ref) => {
103
+ return (
104
+ <NavigationMenuPrimitive.Content
105
+ ref={ref}
106
+ data-slot="navigation-menu-content"
107
+ className={cn(
108
+ "data-ending-style:data-activation-direction=left:translate-x-[50%] data-ending-style:data-activation-direction=right:translate-x-[-50%] data-starting-style:data-activation-direction=left:translate-x-[-50%] data-starting-style:data-activation-direction=right:translate-x-[50%] h-full w-auto p-1 transition-[opacity,transform,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] group-data-[viewport=false]/navigation-menu:rounded-lg group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:ring-1 group-data-[viewport=false]/navigation-menu:ring-foreground/10 group-data-[viewport=false]/navigation-menu:duration-300 data-ending-style:opacity-0 data-starting-style:opacity-0 data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 data-[motion^=from-]:animate-in data-[motion^=from-]:fade-in data-[motion^=to-]:animate-out data-[motion^=to-]:fade-out group-data-[viewport=false]/navigation-menu:data-open:animate-in group-data-[viewport=false]/navigation-menu:data-open:fade-in-0 group-data-[viewport=false]/navigation-menu:data-open:zoom-in-95 group-data-[viewport=false]/navigation-menu:data-closed:animate-out group-data-[viewport=false]/navigation-menu:data-closed:fade-out-0 group-data-[viewport=false]/navigation-menu:data-closed:zoom-out-95",
109
+ className,
110
+ )}
111
+ {...props}
112
+ />
113
+ );
114
+ });
115
+ NavigationMenuContent.displayName = "NavigationMenuContent";
116
+
117
+ const NavigationMenuPositioner = React.forwardRef<
118
+ React.ComponentRef<typeof NavigationMenuPrimitive.Positioner>,
119
+ React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Positioner>
120
+ >(
121
+ (
122
+ {
123
+ className,
124
+ side = "bottom",
125
+ sideOffset = 8,
126
+ align = "start",
127
+ alignOffset = 0,
128
+ ...props
129
+ },
130
+ ref,
131
+ ) => {
132
+ return (
133
+ <NavigationMenuPrimitive.Positioner
134
+ ref={ref}
135
+ side={side}
136
+ sideOffset={sideOffset}
137
+ align={align}
138
+ alignOffset={alignOffset}
139
+ className={cn(
140
+ "isolate z-50 h-(--positioner-height) w-(--positioner-width) max-w-(--available-width) transition-[top,left,right,bottom] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] data-instant:transition-none data-[side=bottom]:before:top-[-10px] data-[side=bottom]:before:right-0 data-[side=bottom]:before:left-0",
141
+ className,
142
+ )}
143
+ {...props}
144
+ >
145
+ <NavigationMenuPrimitive.Popup className="data-ending-style:easing-[ease] xs:w-(--popup-width) relative h-(--popup-height) w-(--popup-width) origin-(--transform-origin) rounded-lg bg-popover text-popover-foreground shadow ring-1 ring-foreground/10 transition-[opacity,transform,width,height,scale,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] outline-none data-ending-style:scale-90 data-ending-style:opacity-0 data-ending-style:duration-150 data-starting-style:scale-90 data-starting-style:opacity-0">
146
+ <NavigationMenuViewport />
147
+ </NavigationMenuPrimitive.Popup>
148
+ </NavigationMenuPrimitive.Positioner>
149
+ );
150
+ },
151
+ );
152
+ NavigationMenuPositioner.displayName = "NavigationMenuPositioner";
153
+
154
+ const NavigationMenuViewport = React.forwardRef<
155
+ React.ComponentRef<typeof NavigationMenuPrimitive.Viewport>,
156
+ React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Viewport>
157
+ >(({ className, ...props }, ref) => (
158
+ <NavigationMenuPrimitive.Viewport
159
+ ref={ref}
160
+ className={cn("relative size-full overflow-hidden", className)}
161
+ {...props}
162
+ />
163
+ ));
164
+ NavigationMenuViewport.displayName = "NavigationMenuViewport";
165
+
166
+ const NavigationMenuLink = React.forwardRef<
167
+ React.ComponentRef<typeof NavigationMenuPrimitive.Link>,
168
+ React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Link>
169
+ >(({ className, ...props }, ref) => {
170
+ return (
171
+ <NavigationMenuPrimitive.Link
172
+ ref={ref}
173
+ data-slot="navigation-menu-link"
174
+ className={cn(
175
+ "flex items-center gap-2 rounded-lg p-2 text-sm transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:ring-offset-1 focus-visible:ring-offset-background in-data-[slot=navigation-menu-content]:rounded-md in-data-[slot=navigation-menu-content]:focus:ring-0 in-data-[slot=navigation-menu-content]:focus:outline-none data-active:bg-muted/50 data-active:hover:bg-muted data-active:focus:bg-muted [&>svg:not([class*='size-'])]:size-4",
176
+ className,
177
+ )}
178
+ {...props}
179
+ />
180
+ );
181
+ });
182
+ NavigationMenuLink.displayName = "NavigationMenuLink";
183
+
184
+ const NavigationMenuPortal = NavigationMenuPrimitive.Portal;
185
+
186
+ export {
187
+ NavigationMenu,
188
+ NavigationMenuContent,
189
+ NavigationMenuItem,
190
+ NavigationMenuLink,
191
+ NavigationMenuList,
192
+ NavigationMenuPortal,
193
+ NavigationMenuPositioner,
194
+ NavigationMenuTrigger,
195
+ NavigationMenuViewport,
196
+ navigationMenuTriggerStyle,
197
+ };
@@ -0,0 +1,162 @@
1
+ /**
2
+ * ✅ AUDITED & REFACTORED
3
+ * - Design System Compliant (22 Commandments)
4
+ * - WCAG AAA/AA
5
+ * - Form Control Parity
6
+ * - CSS Delegated Logic
7
+ */
8
+ import * as React from "react";
9
+ import {
10
+ ChevronLeftIcon,
11
+ ChevronRightIcon,
12
+ MoreHorizontalIcon,
13
+ } from "lucide-react";
14
+
15
+ import { Button } from "../../components/micro/button";
16
+ import { cn } from "../../lib/utils";
17
+ import type { Size } from "../../lib/types";
18
+
19
+ const ellipsisSizeMap: Record<Size, { container: string; icon: string }> = {
20
+ sm: { container: "size-7", icon: "[&>svg:not([class*='size-'])]:size-3" },
21
+ md: { container: "size-9", icon: "[&>svg:not([class*='size-'])]:size-4" },
22
+ lg: { container: "size-11", icon: "[&>svg:not([class*='size-'])]:size-5" },
23
+ };
24
+
25
+ /**
26
+ * @description Pagination with page navigation, next and previous links.
27
+ * @requires PaginationContent, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious
28
+ */
29
+ function Pagination({ className, ...props }: React.ComponentProps<"nav">) {
30
+ return (
31
+ <nav
32
+ role="navigation"
33
+ aria-label="pagination"
34
+ data-slot="pagination"
35
+ className={cn(
36
+ "group/pagination mx-auto flex w-full justify-center",
37
+ className,
38
+ )}
39
+ {...props}
40
+ />
41
+ );
42
+ }
43
+
44
+ function PaginationContent({
45
+ className,
46
+ ...props
47
+ }: React.ComponentProps<"ul">) {
48
+ return (
49
+ <ul
50
+ data-slot="pagination-content"
51
+ className={cn("flex items-center gap-0.5", className)}
52
+ {...props}
53
+ />
54
+ );
55
+ }
56
+
57
+ function PaginationItem({ ...props }: React.ComponentProps<"li">) {
58
+ return <li data-slot="pagination-item" {...props} />;
59
+ }
60
+
61
+ type PaginationLinkProps = {
62
+ isActive?: boolean;
63
+ } & Pick<React.ComponentProps<typeof Button>, "size"> &
64
+ React.ComponentProps<"a">;
65
+
66
+ function PaginationLink({
67
+ className,
68
+ isActive,
69
+ size = "md",
70
+ ...props
71
+ }: PaginationLinkProps) {
72
+ return (
73
+ <Button
74
+ variant={isActive ? "outline" : "ghost"}
75
+ size={size}
76
+ className={className}
77
+ nativeButton={false}
78
+ render={
79
+ <a
80
+ aria-current={isActive ? "page" : undefined}
81
+ data-slot="pagination-link"
82
+ data-active={isActive ? "" : undefined}
83
+ {...props}
84
+ />
85
+ }
86
+ />
87
+ );
88
+ }
89
+
90
+ function PaginationPrevious({
91
+ className,
92
+ text = "Previous",
93
+ size = "md",
94
+ ...props
95
+ }: React.ComponentProps<typeof PaginationLink> & { text?: string }) {
96
+ return (
97
+ <PaginationLink
98
+ aria-label="Go to previous page"
99
+ size={size}
100
+ className={cn("pl-2.5", className)}
101
+ {...props}
102
+ >
103
+ <ChevronLeftIcon aria-hidden="true" data-icon="inline-start" />
104
+ <span className="hidden sm:block">{text}</span>
105
+ </PaginationLink>
106
+ );
107
+ }
108
+
109
+ function PaginationNext({
110
+ className,
111
+ text = "Next",
112
+ size = "md",
113
+ ...props
114
+ }: React.ComponentProps<typeof PaginationLink> & { text?: string }) {
115
+ return (
116
+ <PaginationLink
117
+ aria-label="Go to next page"
118
+ size={size}
119
+ className={cn("pr-2.5", className)}
120
+ {...props}
121
+ >
122
+ <span className="hidden sm:block">{text}</span>
123
+ <ChevronRightIcon aria-hidden="true" data-icon="inline-end" />
124
+ </PaginationLink>
125
+ );
126
+ }
127
+
128
+ type PaginationEllipsisProps = React.ComponentProps<"span"> & { size?: Size };
129
+
130
+ function PaginationEllipsis({
131
+ className,
132
+ size = "md",
133
+ ...props
134
+ }: PaginationEllipsisProps) {
135
+ const { container, icon } = ellipsisSizeMap[size];
136
+ return (
137
+ <span
138
+ aria-hidden
139
+ data-slot="pagination-ellipsis"
140
+ className={cn(
141
+ "flex items-center justify-center",
142
+ container,
143
+ icon,
144
+ className,
145
+ )}
146
+ {...props}
147
+ >
148
+ <MoreHorizontalIcon aria-hidden="true" />
149
+ <span className="sr-only">More pages</span>
150
+ </span>
151
+ );
152
+ }
153
+
154
+ export {
155
+ Pagination,
156
+ PaginationContent,
157
+ PaginationEllipsis,
158
+ PaginationItem,
159
+ PaginationLink,
160
+ PaginationNext,
161
+ PaginationPrevious,
162
+ };