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,383 @@
1
+ /**
2
+ * ✅ AUDITED
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 { type Size } from "../../lib/types";
11
+ import { cva, type VariantProps } from "class-variance-authority";
12
+ import * as React from "react";
13
+ import {
14
+ DayPicker,
15
+ getDefaultClassNames,
16
+ type DayButton,
17
+ type Locale,
18
+ } from "react-day-picker";
19
+
20
+ import { buttonVariants } from "../../components/micro/button";
21
+ import {
22
+ Select,
23
+ SelectContent,
24
+ SelectItem,
25
+ SelectTrigger,
26
+ } from "../../components/micro/select";
27
+ import { cn } from "../../lib/utils";
28
+ import {
29
+ ChevronDownIcon,
30
+ ChevronLeftIcon,
31
+ ChevronRightIcon,
32
+ } from "lucide-react";
33
+
34
+ function getDropdownLabel(
35
+ options: Array<{ value: number | string; label: string }> | undefined,
36
+ value: number | string | readonly string[] | undefined,
37
+ locale?: Partial<Locale>,
38
+ ): string {
39
+ const valueStr = Array.isArray(value)
40
+ ? (value as string[])[0]
41
+ : value?.toString();
42
+ const selected = options?.find((o) => o.value.toString() === valueStr);
43
+ if (!selected) return "";
44
+ const isMonth = options?.length === 12;
45
+ if (isMonth && selected.value !== undefined) {
46
+ return new Date(2000, Number(selected.value), 1).toLocaleString(
47
+ locale?.code ?? "en-US",
48
+ { month: "short" },
49
+ );
50
+ }
51
+ return selected.label;
52
+ }
53
+
54
+ const calendarVariants = cva(
55
+ "group/calendar bg-background p-2 in-data-[slot=card-content]:bg-transparent in-data-[slot=popover-content]:bg-transparent",
56
+ {
57
+ variants: {
58
+ size: {
59
+ sm: "calendar-sm",
60
+ md: "calendar-md",
61
+ lg: "calendar-lg",
62
+ },
63
+ },
64
+ },
65
+ );
66
+
67
+ /**
68
+ * @description A date field component that allows users to enter and edit date.
69
+ * @example
70
+ * <Calendar mode="single" selected={date} onSelect={setDate} />
71
+ */
72
+ function Calendar({
73
+ className,
74
+ classNames,
75
+ showOutsideDays = true,
76
+ captionLayout = "label",
77
+ buttonVariant = "ghost",
78
+ locale,
79
+ formatters,
80
+ components,
81
+ size = "md",
82
+ ...props
83
+ }: React.ComponentProps<typeof DayPicker> &
84
+ Omit<VariantProps<typeof calendarVariants>, "size"> & {
85
+ size?: Size;
86
+ buttonVariant?: VariantProps<typeof buttonVariants>["variant"];
87
+ }) {
88
+ const defaultClassNames = getDefaultClassNames();
89
+
90
+ return (
91
+ <DayPicker
92
+ showOutsideDays={showOutsideDays}
93
+ className={cn(calendarVariants({ size }), className)}
94
+ captionLayout={captionLayout}
95
+ locale={locale}
96
+ formatters={{
97
+ formatMonthDropdown: (month) =>
98
+ month.toLocaleString(locale?.code ?? "en-US", { month: "long" }),
99
+ ...formatters,
100
+ }}
101
+ classNames={{
102
+ root: cn("w-fit", defaultClassNames.root),
103
+ months: cn(
104
+ "relative flex flex-col gap-4 md:flex-row",
105
+ defaultClassNames.months,
106
+ ),
107
+ month: cn("flex w-full flex-col gap-4", defaultClassNames.month),
108
+ nav: cn(
109
+ "absolute inset-x-0 top-0 flex items-center justify-between pointer-events-none",
110
+ "h-8 group-[.calendar-sm]/calendar:h-7 group-[.calendar-lg]/calendar:h-9",
111
+ defaultClassNames.nav,
112
+ ),
113
+ button_previous: cn(
114
+ buttonVariants({ variant: buttonVariant, color: "secondary", size }),
115
+ "p-0 aspect-square select-none pointer-events-auto aria-disabled:opacity-50",
116
+ defaultClassNames.button_previous,
117
+ ),
118
+ button_next: cn(
119
+ buttonVariants({ variant: buttonVariant, color: "secondary", size }),
120
+ "p-0 aspect-square select-none pointer-events-auto aria-disabled:opacity-50",
121
+ defaultClassNames.button_next,
122
+ ),
123
+ month_caption: cn(
124
+ "flex w-full items-center justify-center",
125
+ "h-8 px-8 group-[.calendar-sm]/calendar:h-7 group-[.calendar-sm]/calendar:px-7 group-[.calendar-lg]/calendar:h-9 group-[.calendar-lg]/calendar:px-9",
126
+ defaultClassNames.month_caption,
127
+ ),
128
+ dropdowns: cn(
129
+ "flex h-7 group-[.calendar-sm]/calendar:h-6 group-[.calendar-lg]/calendar:h-8 items-center justify-center gap-0",
130
+ defaultClassNames.dropdowns,
131
+ ),
132
+ dropdown_root: cn(
133
+ "relative flex items-center justify-center",
134
+ defaultClassNames.dropdown_root,
135
+ ),
136
+ dropdown: cn(defaultClassNames.dropdown),
137
+ caption_label: cn(
138
+ "px-2 font-bold select-none",
139
+ {
140
+ "text-sm group-[.calendar-sm]/calendar:text-xs group-[.calendar-lg]/calendar:text-base":
141
+ captionLayout === "label",
142
+ "flex items-center gap-1 rounded-md text-sm group-[.calendar-sm]/calendar:text-xs group-[.calendar-lg]/calendar:text-base [&>svg]:size-3.5 [&>svg]:text-muted-foreground":
143
+ captionLayout !== "label",
144
+ },
145
+ defaultClassNames.caption_label,
146
+ ),
147
+ month_grid: cn("w-full border-collapse", defaultClassNames.month_grid),
148
+ weekdays: cn("flex gap-1", defaultClassNames.weekdays),
149
+ weekday: cn(
150
+ "flex-1 rounded-md text-xs font-medium text-muted-foreground select-none group-[.calendar-sm]/calendar:text-[10px] group-[.calendar-lg]/calendar:text-sm",
151
+ defaultClassNames.weekday,
152
+ ),
153
+ week: cn("mt-2 flex w-full gap-1", defaultClassNames.week),
154
+ week_number_header: cn(
155
+ "w-7 group-[.calendar-sm]/calendar:w-6 group-[.calendar-lg]/calendar:w-8 select-none",
156
+ defaultClassNames.week_number_header,
157
+ ),
158
+ week_number: cn(
159
+ "text-xs text-muted-foreground select-none group-[.calendar-sm]/calendar:text-[10px] group-[.calendar-lg]/calendar:text-sm",
160
+ defaultClassNames.week_number,
161
+ ),
162
+ day: cn(
163
+ "group/day relative aspect-square h-full w-full rounded-md p-0 text-center select-none",
164
+ defaultClassNames.day,
165
+ ),
166
+ day_button: cn(defaultClassNames.day_button),
167
+ range_start: cn(
168
+ "relative isolate z-0 rounded-md bg-muted",
169
+ defaultClassNames.range_start,
170
+ ),
171
+ range_middle: cn("rounded-md bg-muted", defaultClassNames.range_middle),
172
+ range_end: cn(
173
+ "relative isolate z-0 rounded-md bg-muted",
174
+ defaultClassNames.range_end,
175
+ ),
176
+ today: cn(
177
+ "rounded-md bg-muted text-foreground",
178
+ defaultClassNames.today,
179
+ ),
180
+ outside: cn(
181
+ "text-muted-foreground aria-selected:text-muted-foreground",
182
+ defaultClassNames.outside,
183
+ ),
184
+ disabled: cn(
185
+ "text-muted-foreground opacity-50",
186
+ defaultClassNames.disabled,
187
+ ),
188
+ hidden: cn("invisible", defaultClassNames.hidden),
189
+ ...classNames,
190
+ }}
191
+ components={{
192
+ Root: ({ className, rootRef, ...props }) => {
193
+ return (
194
+ <div
195
+ data-slot="calendar"
196
+ ref={rootRef}
197
+ className={cn(className)}
198
+ {...props}
199
+ />
200
+ );
201
+ },
202
+ Dropdown: ({
203
+ value,
204
+ onChange,
205
+ options,
206
+ disabled,
207
+ "aria-label": ariaLabel,
208
+ name,
209
+ }) => {
210
+ return (
211
+ <Select
212
+ value={value?.toString()}
213
+ disabled={disabled}
214
+ onValueChange={(newVal) => {
215
+ const event = {
216
+ target: { value: newVal, name },
217
+ } as React.ChangeEvent<HTMLSelectElement>;
218
+ onChange?.(event);
219
+ }}
220
+ >
221
+ <SelectTrigger
222
+ size={size}
223
+ aria-label={ariaLabel}
224
+ className="w-fit min-w-0 px-1 border-none bg-transparent font-medium shadow-none focus-visible:ring-0 focus-visible:ring-offset-0 [&_[data-slot=select-value]]:w-auto"
225
+ >
226
+ <span
227
+ data-slot="select-value"
228
+ className="flex flex-1 text-left"
229
+ >
230
+ {getDropdownLabel(options, value, locale)}
231
+ </span>
232
+ </SelectTrigger>
233
+ <SelectContent>
234
+ {options?.map((option) => {
235
+ const isMonth = options?.length === 12;
236
+ let shortLabel = option.label;
237
+ if (isMonth && option.value !== undefined) {
238
+ const monthDate = new Date(2000, Number(option.value), 1);
239
+ shortLabel = monthDate.toLocaleString(
240
+ locale?.code ?? "en-US",
241
+ {
242
+ month: "short",
243
+ },
244
+ );
245
+ }
246
+ return (
247
+ <SelectItem
248
+ key={option.value}
249
+ value={option.value.toString()}
250
+ disabled={option.disabled}
251
+ >
252
+ {shortLabel}
253
+ </SelectItem>
254
+ );
255
+ })}
256
+ </SelectContent>
257
+ </Select>
258
+ );
259
+ },
260
+ Chevron: ({ className, orientation, ...props }) => {
261
+ const sizeClasses =
262
+ "size-4 group-[.calendar-sm]/calendar:size-3.5 group-[.calendar-lg]/calendar:size-5";
263
+
264
+ if (orientation === "left") {
265
+ return (
266
+ <ChevronLeftIcon
267
+ className={cn(
268
+ "size-5 group-[.calendar-sm]/calendar:size-4 group-[.calendar-lg]/calendar:size-6 rtl:rotate-180",
269
+ className,
270
+ )}
271
+ strokeWidth={3}
272
+ {...props}
273
+ />
274
+ );
275
+ }
276
+
277
+ if (orientation === "right") {
278
+ return (
279
+ <ChevronRightIcon
280
+ className={cn(
281
+ "size-5 group-[.calendar-sm]/calendar:size-4 group-[.calendar-lg]/calendar:size-6 rtl:rotate-180",
282
+ className,
283
+ )}
284
+ strokeWidth={3}
285
+ {...props}
286
+ />
287
+ );
288
+ }
289
+
290
+ return (
291
+ <ChevronDownIcon
292
+ className={cn(sizeClasses, className)}
293
+ strokeWidth={2.5}
294
+ {...props}
295
+ />
296
+ );
297
+ },
298
+ DayButton: ({ ...props }) => (
299
+ <CalendarDayButton locale={locale} {...props} />
300
+ ),
301
+ WeekNumber: ({ children, ...props }) => {
302
+ return (
303
+ <td {...props}>
304
+ <div className="flex size-7 group-[.calendar-sm]/calendar:size-6 group-[.calendar-lg]/calendar:size-8 items-center justify-center text-center">
305
+ {children}
306
+ </div>
307
+ </td>
308
+ );
309
+ },
310
+ ...components,
311
+ }}
312
+ {...props}
313
+ />
314
+ );
315
+ }
316
+
317
+ function CalendarDayButton({
318
+ className,
319
+ day,
320
+ modifiers,
321
+ locale,
322
+ ...props
323
+ }: React.ComponentProps<typeof DayButton> & { locale?: Partial<Locale> }) {
324
+ const defaultClassNames = getDefaultClassNames();
325
+
326
+ const ref = React.useRef<HTMLButtonElement>(null);
327
+ React.useEffect(() => {
328
+ if (modifiers.focused) ref.current?.focus();
329
+ }, [modifiers.focused]);
330
+
331
+ return (
332
+ <button
333
+ ref={ref}
334
+ type="button"
335
+ data-slot="calendar-day-button"
336
+ data-day={day.date.toLocaleDateString(locale?.code)}
337
+ data-selected-single={
338
+ modifiers.selected &&
339
+ !modifiers.range_start &&
340
+ !modifiers.range_end &&
341
+ !modifiers.range_middle
342
+ }
343
+ data-range-start={modifiers.range_start}
344
+ data-range-end={modifiers.range_end}
345
+ data-range-middle={modifiers.range_middle}
346
+ className={cn(
347
+ // Base layout — size driven by parent group
348
+ "relative isolate z-10 flex aspect-square size-7 flex-col items-center justify-center gap-1 rounded-md font-normal leading-none transition-colors outline-none select-none",
349
+ "group-[.calendar-sm]/calendar:size-6 group-[.calendar-lg]/calendar:size-8",
350
+ // Text size — responsive via parent group
351
+ "text-sm group-[.calendar-sm]/calendar:text-xs",
352
+ // Hover
353
+ "hover:bg-accent hover:text-accent-foreground",
354
+ // Focus ring (standard)
355
+ "focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:ring-offset-1 focus-visible:ring-offset-background",
356
+ // Press feedback
357
+ "active:translate-y-px",
358
+ // Disabled
359
+ "disabled:pointer-events-none disabled:opacity-50",
360
+ // Keyboard focus from react-day-picker
361
+ "group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-3 group-data-[focused=true]/day:ring-ring/50",
362
+ // Selected single
363
+ "data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground data-[selected-single=true]:hover:bg-primary/90",
364
+ // Range start
365
+ "data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground",
366
+ // Range end
367
+ "data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground",
368
+ // Range middle
369
+ "data-[range-middle=true]:bg-muted data-[range-middle=true]:text-foreground",
370
+ // Content spans (event dots etc.) — consumer should use data-slot on spans
371
+ // Dark mode
372
+ "dark:hover:text-foreground",
373
+ className,
374
+ )}
375
+ {...props}
376
+ />
377
+ );
378
+ }
379
+
380
+ Calendar.displayName = "Calendar";
381
+ CalendarDayButton.displayName = "CalendarDayButton";
382
+
383
+ export { Calendar, CalendarDayButton };
@@ -0,0 +1,112 @@
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
+
10
+ import { type Size } from "../../lib/types";
11
+ import { cn } from "../../lib/utils";
12
+
13
+ /**
14
+ * @description Displays a card with header, content, and footer.
15
+ * @requires CardHeader, CardTitle, CardDescription, CardContent, CardFooter
16
+ * @example
17
+ * <Card>
18
+ * <CardHeader><CardTitle>Title</CardTitle></CardHeader>
19
+ * <CardContent>Content here</CardContent>
20
+ * </Card>
21
+ */
22
+ const Card = React.forwardRef<
23
+ HTMLDivElement,
24
+ React.ComponentProps<"div"> & { size?: Size }
25
+ >(({ className, size = "md", ...props }, ref) => (
26
+ <div
27
+ ref={ref}
28
+ data-slot="card"
29
+ data-size={size}
30
+ className={cn(
31
+ "group/card flex flex-col overflow-hidden rounded-xl bg-card text-sm text-card-foreground ring-1 ring-foreground/10",
32
+ "p-6 gap-5 data-[size=sm]:p-4 data-[size=sm]:gap-4 data-[size=lg]:p-8 data-[size=lg]:gap-6",
33
+ className,
34
+ )}
35
+ {...props}
36
+ />
37
+ ));
38
+ Card.displayName = "Card";
39
+
40
+ const CardHeader = React.forwardRef<
41
+ HTMLDivElement,
42
+ React.ComponentProps<"div">
43
+ >(({ className, ...props }, ref) => (
44
+ <div
45
+ ref={ref}
46
+ data-slot="card-header"
47
+ className={cn("flex flex-col gap-1.5", className)}
48
+ {...props}
49
+ />
50
+ ));
51
+ CardHeader.displayName = "CardHeader";
52
+
53
+ const CardTitle = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(
54
+ ({ className, ...props }, ref) => (
55
+ <div
56
+ ref={ref}
57
+ data-slot="card-title"
58
+ className={cn(
59
+ "font-heading text-base leading-snug font-medium group-data-[size=sm]/card:text-sm group-data-[size=lg]/card:text-lg",
60
+ className,
61
+ )}
62
+ {...props}
63
+ />
64
+ ),
65
+ );
66
+ CardTitle.displayName = "CardTitle";
67
+
68
+ const CardDescription = React.forwardRef<
69
+ HTMLDivElement,
70
+ React.ComponentProps<"div">
71
+ >(({ className, ...props }, ref) => (
72
+ <div
73
+ ref={ref}
74
+ data-slot="card-description"
75
+ className={cn(
76
+ "text-sm text-muted-foreground group-data-[size=sm]/card:text-xs group-data-[size=lg]/card:text-base",
77
+ className,
78
+ )}
79
+ {...props}
80
+ />
81
+ ));
82
+ CardDescription.displayName = "CardDescription";
83
+
84
+ const CardContent = React.forwardRef<
85
+ HTMLDivElement,
86
+ React.ComponentProps<"div">
87
+ >(({ className, ...props }, ref) => (
88
+ <div ref={ref} data-slot="card-content" className={className} {...props} />
89
+ ));
90
+ CardContent.displayName = "CardContent";
91
+
92
+ const CardFooter = React.forwardRef<
93
+ HTMLDivElement,
94
+ React.ComponentProps<"div">
95
+ >(({ className, ...props }, ref) => (
96
+ <div
97
+ ref={ref}
98
+ data-slot="card-footer"
99
+ className={cn("flex items-center", className)}
100
+ {...props}
101
+ />
102
+ ));
103
+ CardFooter.displayName = "CardFooter";
104
+
105
+ export {
106
+ Card,
107
+ CardContent,
108
+ CardDescription,
109
+ CardFooter,
110
+ CardHeader,
111
+ CardTitle,
112
+ };