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,947 @@
1
+ import { AccordionPreset } from "../../components/macro/accordion-preset";
2
+ import {
3
+ Accordion,
4
+ AccordionContent,
5
+ AccordionItem,
6
+ AccordionTrigger,
7
+ } from "../../components/micro/accordion";
8
+ import {
9
+ DocsP,
10
+ ExampleGrid,
11
+ ExampleSection,
12
+ Showcase,
13
+ ShowcaseDocs,
14
+ } from "../../dev/components/showcase";
15
+ import { BoxIcon, SettingsIcon, SlidersHorizontalIcon } from "lucide-react";
16
+ import { useState } from "react";
17
+
18
+ // ──────────────────────────────────────────────────────────
19
+ // Shared Data
20
+ // ──────────────────────────────────────────────────────────
21
+ const faqItems = [
22
+ {
23
+ q: "Is it accessible?",
24
+ a: "Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
25
+ },
26
+ {
27
+ q: "Is it styled?",
28
+ a: "Yes. It comes with default styles that match the other components' aesthetic. You can override every token via CSS variables.",
29
+ },
30
+ {
31
+ q: "Is it animated?",
32
+ a: "Yes. It's animated by default with smooth expand/collapse transitions, but you can disable animation if you prefer.",
33
+ },
34
+ {
35
+ q: "Can I nest accordions?",
36
+ a: "Yes. You can nest accordion components inside each other to create multi-level collapsible sections.",
37
+ },
38
+ ];
39
+
40
+ const presetItems = [
41
+ {
42
+ value: "item-1",
43
+ title: "Is it accessible?",
44
+ content:
45
+ "Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
46
+ },
47
+ {
48
+ value: "item-2",
49
+ title: "Is it styled?",
50
+ content:
51
+ "Yes. It comes with default styles that match the other components' aesthetic.",
52
+ },
53
+ {
54
+ value: "item-3",
55
+ title: "Is it animated?",
56
+ content: "Yes. It's animated by default with smooth transitions.",
57
+ },
58
+ ];
59
+
60
+ // ──────────────────────────────────────────────────────────
61
+ // SECTION 1: Macro Content (không export)
62
+ // ──────────────────────────────────────────────────────────
63
+ function AccordionMacroShowcase() {
64
+ const [controlledValue, setControlledValue] = useState<string[]>([]);
65
+
66
+ return (
67
+ <div className="space-y-10 mt-6">
68
+ <ExampleGrid>
69
+ <ExampleSection
70
+ label="Tiêu Chuẩn (Standard)"
71
+ description="Accordion mở đơn cơ bản."
72
+ codeString={`<AccordionPreset
73
+ className="w-full"
74
+ defaultValue={["item-1"]}
75
+ items={[
76
+ {
77
+ value: "item-1",
78
+ title: "Is it accessible?",
79
+ content: "Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
80
+ },
81
+ {
82
+ value: "item-2",
83
+ title: "Is it styled?",
84
+ content: "Yes. It comes with default styles that match the other components' aesthetic.",
85
+ },
86
+ {
87
+ value: "item-3",
88
+ title: "Is it animated?",
89
+ content: "Yes. It's animated by default with smooth transitions.",
90
+ },
91
+ ]}
92
+ />
93
+ `}
94
+ >
95
+ <AccordionPreset
96
+ className="w-full"
97
+ defaultValue={["item-1"]}
98
+ items={[
99
+ {
100
+ value: "item-1",
101
+ title: "Is it accessible?",
102
+ content:
103
+ "Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
104
+ },
105
+ {
106
+ value: "item-2",
107
+ title: "Is it styled?",
108
+ content:
109
+ "Yes. It comes with default styles that match the other components' aesthetic.",
110
+ },
111
+ {
112
+ value: "item-3",
113
+ title: "Is it animated?",
114
+ content:
115
+ "Yes. It's animated by default with smooth transitions.",
116
+ },
117
+ ]}
118
+ />
119
+ </ExampleSection>
120
+
121
+ <ExampleSection
122
+ label="Mở Nhiều (Multiple Expansion)"
123
+ description="Cho phép mở nhiều mục cùng một lúc."
124
+ codeString={`<AccordionPreset
125
+ className="w-full"
126
+ multiple
127
+ defaultValue={["item-1", "item-2"]}
128
+ items={[
129
+ {
130
+ value: "item-1",
131
+ title: "Is it accessible?",
132
+ content: "Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
133
+ },
134
+ {
135
+ value: "item-2",
136
+ title: "Is it styled?",
137
+ content: "Yes. It comes with default styles that match the other components' aesthetic.",
138
+ },
139
+ {
140
+ value: "item-3",
141
+ title: "Is it animated?",
142
+ content: "Yes. It's animated by default with smooth transitions.",
143
+ },
144
+ ]}
145
+ />
146
+ `}
147
+ >
148
+ <AccordionPreset
149
+ className="w-full"
150
+ multiple
151
+ defaultValue={["item-1", "item-2"]}
152
+ items={[
153
+ {
154
+ value: "item-1",
155
+ title: "Is it accessible?",
156
+ content:
157
+ "Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
158
+ },
159
+ {
160
+ value: "item-2",
161
+ title: "Is it styled?",
162
+ content:
163
+ "Yes. It comes with default styles that match the other components' aesthetic.",
164
+ },
165
+ {
166
+ value: "item-3",
167
+ title: "Is it animated?",
168
+ content:
169
+ "Yes. It's animated by default with smooth transitions.",
170
+ },
171
+ ]}
172
+ />
173
+ </ExampleSection>
174
+ </ExampleGrid>
175
+
176
+ <ExampleGrid>
177
+ <ExampleSection
178
+ label="Controlled"
179
+ description="Trạng thái mở được quản lý bằng state. Click vào các mục để xem state thay đổi."
180
+ codeString={`const [controlledValue, setControlledValue] = useState<string[]>([]);
181
+ return (
182
+ <AccordionPreset
183
+ className="w-full"
184
+ multiple
185
+ value={controlledValue}
186
+ onValueChange={setControlledValue}
187
+ items={[
188
+ {
189
+ value: "item-1",
190
+ title: "Is it accessible?",
191
+ content: "Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
192
+ },
193
+ {
194
+ value: "item-2",
195
+ title: "Is it styled?",
196
+ content: "Yes. It comes with default styles that match the other components' aesthetic.",
197
+ },
198
+ {
199
+ value: "item-3",
200
+ title: "Is it animated?",
201
+ content: "Yes. It's animated by default with smooth transitions.",
202
+ },
203
+ ]}
204
+ />
205
+ );`}
206
+ >
207
+ <div className="flex w-full flex-col gap-3">
208
+ <p className="text-xs text-muted-foreground">
209
+ Open:{" "}
210
+ <code className="rounded bg-muted px-1.5 py-0.5 text-xs font-mono">
211
+ {controlledValue.length > 0
212
+ ? controlledValue.map((v) => `"${v}"`).join(", ")
213
+ : "(none)"}
214
+ </code>
215
+ </p>
216
+ <AccordionPreset
217
+ className="w-full"
218
+ multiple
219
+ value={controlledValue}
220
+ onValueChange={setControlledValue}
221
+ items={[
222
+ {
223
+ value: "item-1",
224
+ title: "Is it accessible?",
225
+ content:
226
+ "Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
227
+ },
228
+ {
229
+ value: "item-2",
230
+ title: "Is it styled?",
231
+ content:
232
+ "Yes. It comes with default styles that match the other components' aesthetic.",
233
+ },
234
+ {
235
+ value: "item-3",
236
+ title: "Is it animated?",
237
+ content:
238
+ "Yes. It's animated by default with smooth transitions.",
239
+ },
240
+ ]}
241
+ />
242
+ </div>
243
+ </ExampleSection>
244
+
245
+ <ExampleSection
246
+ label="Disabled (Vô hiệu hoá)"
247
+ description="Từng mục riêng lẻ có thể bị vô hiệu hóa trong khi các mục khác vẫn tương tác bình thường."
248
+ codeString={`<AccordionPreset
249
+ className="w-full"
250
+ items={[
251
+ {
252
+ value: "enabled-1",
253
+ title: "Available Feature",
254
+ content:
255
+ "This feature is available and can be expanded normally.",
256
+ },
257
+ {
258
+ value: "disabled-1",
259
+ title: "Premium Feature (Locked)",
260
+ content: "This content is hidden behind a premium plan.",
261
+ disabled: true,
262
+ },
263
+ {
264
+ value: "enabled-2",
265
+ title: "Another Feature",
266
+ content:
267
+ "This is another available feature you can interact with freely.",
268
+ },
269
+ ]}
270
+ />
271
+ `}
272
+ >
273
+ <AccordionPreset
274
+ className="w-full"
275
+ items={[
276
+ {
277
+ value: "enabled-1",
278
+ title: "Available Feature",
279
+ content:
280
+ "This feature is available and can be expanded normally.",
281
+ },
282
+ {
283
+ value: "disabled-1",
284
+ title: "Premium Feature (Locked)",
285
+ content: "This content is hidden behind a premium plan.",
286
+ disabled: true,
287
+ },
288
+ {
289
+ value: "enabled-2",
290
+ title: "Another Feature",
291
+ content:
292
+ "This is another available feature you can interact with freely.",
293
+ },
294
+ ]}
295
+ />
296
+ </ExampleSection>
297
+ </ExampleGrid>
298
+
299
+ <ExampleGrid>
300
+ <ExampleSection
301
+ label="Nội Dung Phức Tạp"
302
+ description="Render các React Node bên trong nội dung."
303
+ codeString={`<AccordionPreset
304
+ className="w-full"
305
+ items={[
306
+ {
307
+ value: "profile",
308
+ title: "User Profile Settings",
309
+ content: (
310
+ <div className="flex flex-col items-start gap-3">
311
+ <p className="text-sm">
312
+ Update your personal information and preferences.
313
+ </p>
314
+ <button className="rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground">
315
+ Edit Profile
316
+ </button>
317
+ </div>
318
+ ),
319
+ },
320
+ ]}
321
+ />
322
+ `}
323
+ >
324
+ <AccordionPreset
325
+ className="w-full"
326
+ items={[
327
+ {
328
+ value: "profile",
329
+ title: "User Profile Settings",
330
+ content: (
331
+ <div className="flex flex-col items-start gap-3">
332
+ <p className="text-sm">
333
+ Update your personal information and preferences.
334
+ </p>
335
+ <button className="rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground">
336
+ Edit Profile
337
+ </button>
338
+ </div>
339
+ ),
340
+ },
341
+ ]}
342
+ />
343
+ </ExampleSection>
344
+
345
+ <ExampleSection
346
+ label="Lồng Nhau (Nested Accordions)"
347
+ description="Nội dung bên trong có thể chứa một Accordion khác."
348
+ codeString={`<AccordionPreset
349
+ className="w-full"
350
+ items={[
351
+ {
352
+ value: "getting-started",
353
+ title: "Getting Started",
354
+ content: (
355
+ <AccordionPreset
356
+ className="w-full"
357
+ items={[
358
+ {
359
+ value: "installation",
360
+ title: "Installation",
361
+ content:
362
+ "Run npm install to add the component to your project.",
363
+ },
364
+ ]}
365
+ />
366
+ ),
367
+ },
368
+ {
369
+ value: "advanced",
370
+ title: "Advanced Usage",
371
+ content: (
372
+ <AccordionPreset
373
+ className="w-full"
374
+ items={[
375
+ {
376
+ value: "controlled",
377
+ title: "Controlled Mode",
378
+ content:
379
+ "Use the value and onValueChange props to control which items are open.",
380
+ },
381
+ ]}
382
+ />
383
+ ),
384
+ },
385
+ ]}
386
+ />
387
+ `}
388
+ >
389
+ <AccordionPreset
390
+ className="w-full"
391
+ items={[
392
+ {
393
+ value: "getting-started",
394
+ title: "Getting Started",
395
+ content: (
396
+ <AccordionPreset
397
+ className="w-full"
398
+ items={[
399
+ {
400
+ value: "installation",
401
+ title: "Installation",
402
+ content:
403
+ "Run npm install to add the component to your project.",
404
+ },
405
+ ]}
406
+ />
407
+ ),
408
+ },
409
+ {
410
+ value: "advanced",
411
+ title: "Advanced Usage",
412
+ content: (
413
+ <AccordionPreset
414
+ className="w-full"
415
+ items={[
416
+ {
417
+ value: "controlled",
418
+ title: "Controlled Mode",
419
+ content:
420
+ "Use the value and onValueChange props to control which items are open.",
421
+ },
422
+ ]}
423
+ />
424
+ ),
425
+ },
426
+ ]}
427
+ />
428
+ </ExampleSection>
429
+ </ExampleGrid>
430
+ </div>
431
+ );
432
+ }
433
+
434
+ // ──────────────────────────────────────────────────────────
435
+ // SECTION 2: Micro Content (không export)
436
+ // ──────────────────────────────────────────────────────────
437
+ function AccordionMicroShowcase() {
438
+ return (
439
+ <div className="space-y-10 mt-6">
440
+ <ExampleGrid>
441
+ <ExampleSection
442
+ label="Mở Đơn (Single Expand)"
443
+ description="Chỉ một mục được phép mở tại một thời điểm (mặc định)."
444
+ codeString={`<Accordion className="w-full" defaultValue={["Is it accessible?"]}>
445
+ <AccordionItem value="Is it accessible?">
446
+ <AccordionTrigger>Is it accessible?</AccordionTrigger>
447
+ <AccordionContent>Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.</AccordionContent>
448
+ </AccordionItem>
449
+ <AccordionItem value="Is it styled?">
450
+ <AccordionTrigger>Is it styled?</AccordionTrigger>
451
+ <AccordionContent>Yes. It comes with default styles that match the other components' aesthetic. You can override every token via CSS variables.</AccordionContent>
452
+ </AccordionItem>
453
+ <AccordionItem value="Is it animated?">
454
+ <AccordionTrigger>Is it animated?</AccordionTrigger>
455
+ <AccordionContent>Yes. It's animated by default with smooth expand/collapse transitions, but you can disable animation if you prefer.</AccordionContent>
456
+ </AccordionItem>
457
+ </Accordion>`}
458
+ >
459
+ <Accordion className="w-full" defaultValue={["Is it accessible?"]}>
460
+ <AccordionItem value="Is it accessible?">
461
+ <AccordionTrigger>Is it accessible?</AccordionTrigger>
462
+ <AccordionContent>
463
+ Yes. It adheres to the WAI-ARIA design pattern.
464
+ </AccordionContent>
465
+ </AccordionItem>
466
+ <AccordionItem value="Is it styled?">
467
+ <AccordionTrigger>Is it styled?</AccordionTrigger>
468
+ <AccordionContent>
469
+ Yes. It comes with default styles that match the other
470
+ components' aesthetic.
471
+ </AccordionContent>
472
+ </AccordionItem>
473
+ <AccordionItem value="Is it animated?">
474
+ <AccordionTrigger>Is it animated?</AccordionTrigger>
475
+ <AccordionContent>
476
+ Yes. It's animated by default with smooth transitions.
477
+ </AccordionContent>
478
+ </AccordionItem>
479
+ </Accordion>
480
+ </ExampleSection>
481
+
482
+ <ExampleSection
483
+ label="Mở Nhiều (Multiple Expand)"
484
+ description="Cho phép mở nhiều mục cùng lúc."
485
+ codeString={`<Accordion className="w-full" multiple defaultValue={["Is it accessible?", "Is it styled?"]}>
486
+ <AccordionItem value="Is it accessible?">
487
+ <AccordionTrigger>Is it accessible?</AccordionTrigger>
488
+ <AccordionContent>Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.</AccordionContent>
489
+ </AccordionItem>
490
+ <AccordionItem value="Is it styled?">
491
+ <AccordionTrigger>Is it styled?</AccordionTrigger>
492
+ <AccordionContent>Yes. It comes with default styles that match the other components' aesthetic. You can override every token via CSS variables.</AccordionContent>
493
+ </AccordionItem>
494
+ <AccordionItem value="Is it animated?">
495
+ <AccordionTrigger>Is it animated?</AccordionTrigger>
496
+ <AccordionContent>Yes. It's animated by default with smooth expand/collapse transitions, but you can disable animation if you prefer.</AccordionContent>
497
+ </AccordionItem>
498
+ </Accordion>`}
499
+ >
500
+ <Accordion
501
+ className="w-full"
502
+ multiple
503
+ defaultValue={["Is it accessible?", "Is it styled?"]}
504
+ >
505
+ <AccordionItem value="Is it accessible?">
506
+ <AccordionTrigger>Is it accessible?</AccordionTrigger>
507
+ <AccordionContent>
508
+ Yes. It adheres to the WAI-ARIA design pattern.
509
+ </AccordionContent>
510
+ </AccordionItem>
511
+ <AccordionItem value="Is it styled?">
512
+ <AccordionTrigger>Is it styled?</AccordionTrigger>
513
+ <AccordionContent>
514
+ Yes. It comes with default styles that match the other
515
+ components' aesthetic.
516
+ </AccordionContent>
517
+ </AccordionItem>
518
+ <AccordionItem value="Is it animated?">
519
+ <AccordionTrigger>Is it animated?</AccordionTrigger>
520
+ <AccordionContent>
521
+ Yes. It's animated by default with smooth transitions.
522
+ </AccordionContent>
523
+ </AccordionItem>
524
+ </Accordion>
525
+ </ExampleSection>
526
+ </ExampleGrid>
527
+
528
+ <ExampleGrid>
529
+ <ExampleSection
530
+ label="Disabled (Vô hiệu hoá)"
531
+ description="Từng mục riêng lẻ có thể bị vô hiệu hóa trong khi các mục khác vẫn tương tác bình thường."
532
+ codeString={`<Accordion className="w-full">
533
+ <AccordionItem value="enabled-1">
534
+ <AccordionTrigger>Available Feature</AccordionTrigger>
535
+ <AccordionContent>
536
+ This feature is available and can be expanded normally. Click to
537
+ see the details.
538
+ </AccordionContent>
539
+ </AccordionItem>
540
+ <AccordionItem value="disabled-1" disabled>
541
+ <AccordionTrigger>Premium Feature (Locked)</AccordionTrigger>
542
+ <AccordionContent>
543
+ This content is hidden behind a premium plan.
544
+ </AccordionContent>
545
+ </AccordionItem>
546
+ <AccordionItem value="enabled-2">
547
+ <AccordionTrigger>Another Feature</AccordionTrigger>
548
+ <AccordionContent>
549
+ This is another available feature you can interact with freely.
550
+ </AccordionContent>
551
+ </AccordionItem>
552
+ </Accordion>
553
+ `}
554
+ >
555
+ <Accordion className="w-full">
556
+ <AccordionItem value="enabled-1">
557
+ <AccordionTrigger>Available Feature</AccordionTrigger>
558
+ <AccordionContent>
559
+ This feature is available and can be expanded normally. Click to
560
+ see the details.
561
+ </AccordionContent>
562
+ </AccordionItem>
563
+ <AccordionItem value="disabled-1" disabled>
564
+ <AccordionTrigger>Premium Feature (Locked)</AccordionTrigger>
565
+ <AccordionContent>
566
+ This content is hidden behind a premium plan.
567
+ </AccordionContent>
568
+ </AccordionItem>
569
+ <AccordionItem value="enabled-2">
570
+ <AccordionTrigger>Another Feature</AccordionTrigger>
571
+ <AccordionContent>
572
+ This is another available feature you can interact with freely.
573
+ </AccordionContent>
574
+ </AccordionItem>
575
+ </Accordion>
576
+ </ExampleSection>
577
+
578
+ <ExampleSection
579
+ label="Lồng Nhau (Nested Accordions)"
580
+ description="Nội dung bên trong có thể chứa một Accordion khác để tạo cấu trúc nhiều cấp."
581
+ codeString={`<Accordion className="w-full max-w-lg">
582
+ <AccordionItem value="getting-started">
583
+ <AccordionTrigger>Getting Started</AccordionTrigger>
584
+ <AccordionContent>
585
+ <Accordion>
586
+ <AccordionItem value="installation">
587
+ <AccordionTrigger>Installation</AccordionTrigger>
588
+ <AccordionContent>
589
+ Run npm install to add the component to your project.
590
+ </AccordionContent>
591
+ </AccordionItem>
592
+ <AccordionItem value="configuration">
593
+ <AccordionTrigger>Configuration</AccordionTrigger>
594
+ <AccordionContent>
595
+ Import and wrap your content with the Accordion component.
596
+ </AccordionContent>
597
+ </AccordionItem>
598
+ </Accordion>
599
+ </AccordionContent>
600
+ </AccordionItem>
601
+ <AccordionItem value="advanced">
602
+ <AccordionTrigger>Advanced Usage</AccordionTrigger>
603
+ <AccordionContent>
604
+ <Accordion>
605
+ <AccordionItem value="controlled">
606
+ <AccordionTrigger>Controlled Mode</AccordionTrigger>
607
+ <AccordionContent>
608
+ Use the value and onValueChange props to control which
609
+ items are open.
610
+ </AccordionContent>
611
+ </AccordionItem>
612
+ <AccordionItem value="animation">
613
+ <AccordionTrigger>Custom Animation</AccordionTrigger>
614
+ <AccordionContent>
615
+ Override transition duration and easing via className.
616
+ </AccordionContent>
617
+ </AccordionItem>
618
+ </Accordion>
619
+ </AccordionContent>
620
+ </AccordionItem>
621
+ </Accordion>
622
+ `}
623
+ >
624
+ <Accordion className="w-full max-w-lg">
625
+ <AccordionItem value="getting-started">
626
+ <AccordionTrigger>Getting Started</AccordionTrigger>
627
+ <AccordionContent>
628
+ <Accordion>
629
+ <AccordionItem value="installation">
630
+ <AccordionTrigger>Installation</AccordionTrigger>
631
+ <AccordionContent>
632
+ Run npm install to add the component to your project.
633
+ </AccordionContent>
634
+ </AccordionItem>
635
+ <AccordionItem value="configuration">
636
+ <AccordionTrigger>Configuration</AccordionTrigger>
637
+ <AccordionContent>
638
+ Import and wrap your content with the Accordion component.
639
+ </AccordionContent>
640
+ </AccordionItem>
641
+ </Accordion>
642
+ </AccordionContent>
643
+ </AccordionItem>
644
+ <AccordionItem value="advanced">
645
+ <AccordionTrigger>Advanced Usage</AccordionTrigger>
646
+ <AccordionContent>
647
+ <Accordion>
648
+ <AccordionItem value="controlled">
649
+ <AccordionTrigger>Controlled Mode</AccordionTrigger>
650
+ <AccordionContent>
651
+ Use the value and onValueChange props to control which
652
+ items are open.
653
+ </AccordionContent>
654
+ </AccordionItem>
655
+ <AccordionItem value="animation">
656
+ <AccordionTrigger>Custom Animation</AccordionTrigger>
657
+ <AccordionContent>
658
+ Override transition duration and easing via className.
659
+ </AccordionContent>
660
+ </AccordionItem>
661
+ </Accordion>
662
+ </AccordionContent>
663
+ </AccordionItem>
664
+ </Accordion>
665
+ </ExampleSection>
666
+ </ExampleGrid>
667
+
668
+ <ExampleSection
669
+ label="FAQ Hoàn Chỉnh"
670
+ description="Ví dụ một phần hỏi đáp FAQ hoàn chỉnh."
671
+ codeString={`<Accordion className="w-full max-w-lg">
672
+ <AccordionItem value="Is it accessible?">
673
+ <AccordionTrigger>Is it accessible?</AccordionTrigger>
674
+ <AccordionContent>Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.</AccordionContent>
675
+ </AccordionItem>
676
+ <AccordionItem value="Is it styled?">
677
+ <AccordionTrigger>Is it styled?</AccordionTrigger>
678
+ <AccordionContent>Yes. It comes with default styles that match the other components' aesthetic. You can override every token via CSS variables.</AccordionContent>
679
+ </AccordionItem>
680
+ <AccordionItem value="Is it animated?">
681
+ <AccordionTrigger>Is it animated?</AccordionTrigger>
682
+ <AccordionContent>Yes. It's animated by default with smooth expand/collapse transitions, but you can disable animation if you prefer.</AccordionContent>
683
+ </AccordionItem>
684
+ <AccordionItem value="Can I nest accordions?">
685
+ <AccordionTrigger>Can I nest accordions?</AccordionTrigger>
686
+ <AccordionContent>Yes. You can nest accordion components inside each other to create multi-level collapsible sections.</AccordionContent>
687
+ </AccordionItem>
688
+ </Accordion>`}
689
+ >
690
+ <Accordion className="w-full max-w-lg">
691
+ <AccordionItem value="Is it accessible?">
692
+ <AccordionTrigger>Is it accessible?</AccordionTrigger>
693
+ <AccordionContent>
694
+ Yes. It adheres to the WAI-ARIA design pattern.
695
+ </AccordionContent>
696
+ </AccordionItem>
697
+ <AccordionItem value="Is it styled?">
698
+ <AccordionTrigger>Is it styled?</AccordionTrigger>
699
+ <AccordionContent>
700
+ Yes. It comes with default styles that match the other components'
701
+ aesthetic.
702
+ </AccordionContent>
703
+ </AccordionItem>
704
+ <AccordionItem value="Is it animated?">
705
+ <AccordionTrigger>Is it animated?</AccordionTrigger>
706
+ <AccordionContent>
707
+ Yes. It's animated by default with smooth transitions.
708
+ </AccordionContent>
709
+ </AccordionItem>
710
+ <AccordionItem value="Can I nest accordions?">
711
+ <AccordionTrigger>Can I nest accordions?</AccordionTrigger>
712
+ <AccordionContent>
713
+ Yes. You can nest accordion components inside each other to create
714
+ multi-level collapsible sections.
715
+ </AccordionContent>
716
+ </AccordionItem>
717
+ </Accordion>
718
+ </ExampleSection>
719
+
720
+ {/* ── Use Case Comparison ─────────────────────── */}
721
+ <ExampleSection
722
+ label="🧭 Use Case Comparison"
723
+ description="Các kịch bản thực tế giúp bạn quyết định nên dùng Micro (Accordion) hay Macro (AccordionPreset)."
724
+ fullWidth
725
+ codeString={`<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
726
+ {/* ── Story 1: Macro wins ── */}
727
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
728
+ <div className="flex items-start gap-3">
729
+ <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
730
+ <SettingsIcon className="size-4" aria-hidden="true" />
731
+ </span>
732
+ <div>
733
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
734
+ Story 1 · Dùng Macro
735
+ </p>
736
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
737
+ Render danh sách FAQ từ API
738
+ </h3>
739
+ </div>
740
+ </div>
741
+
742
+ <p className="text-xs text-muted-foreground leading-relaxed">
743
+ Bạn nhận được một mảng dữ liệu FAQ (hỏi đáp) từ server. Nội dung
744
+ đơn giản chỉ là text. Dùng Macro để tiết kiệm code.
745
+ </p>
746
+
747
+ <div className="rounded-lg bg-muted/50 p-3">
748
+ <AccordionPreset
749
+ className="w-full"
750
+ items={[
751
+ { value: "Is it accessible?", title: "Is it accessible?", content: "Yes. It adheres to the WAI-ARIA design pattern." },
752
+ { value: "Is it styled?", title: "Is it styled?", content: "Yes. It comes with default styles that match the other components' aesthetic." },
753
+ ]}
754
+ />
755
+ </div>
756
+
757
+ <div className="rounded-md border border-border border-green-500/20 bg-green-500/5 px-3 py-2">
758
+ <p className="text-xs font-medium text-green-700 dark:text-green-400">
759
+ ✅ Dùng <code className="font-mono">AccordionPreset</code> — Tự
760
+ động lặp qua array, không cần viết lại JSX cho từng thẻ Item.
761
+ </p>
762
+ </div>
763
+ </div>
764
+
765
+ {/* ── Story 2: Micro wins ── */}
766
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
767
+ <div className="flex items-start gap-3">
768
+ <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
769
+ <BoxIcon className="size-4" aria-hidden="true" />
770
+ </span>
771
+ <div>
772
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
773
+ Story 2 · Dùng Micro
774
+ </p>
775
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
776
+ Tuỳ biến Trigger / Form phức tạp
777
+ </h3>
778
+ </div>
779
+ </div>
780
+
781
+ <p className="text-xs text-muted-foreground leading-relaxed">
782
+ Trigger cần hiển thị Icon hoặc Badge. Nội dung bên trong là một
783
+ Form phức tạp (chứ không phải text đơn thuần). Macro không thể làm
784
+ được việc này.
785
+ </p>
786
+
787
+ <div className="rounded-lg bg-muted/50 p-3">
788
+ <Accordion className="w-full">
789
+ <AccordionItem value="settings">
790
+ <AccordionTrigger className="gap-3">
791
+ <SlidersHorizontalIcon className="size-4 text-primary" />
792
+ <span className="flex-1 text-left">Advanced Settings</span>
793
+ <span className="mr-2 rounded bg-primary/10 px-2 py-0.5 text-[10px] uppercase tracking-wider text-primary">
794
+ New
795
+ </span>
796
+ </AccordionTrigger>
797
+ <AccordionContent>
798
+ <div className="flex items-center gap-3 rounded border border-border p-3 text-xs text-muted-foreground">
799
+ <span>
800
+ Nội dung tuỳ biến hoàn toàn, ví dụ: Form, Toggle, v.v.
801
+ </span>
802
+ </div>
803
+ </AccordionContent>
804
+ </AccordionItem>
805
+ </Accordion>
806
+ </div>
807
+
808
+ <div className="rounded-md border border-border border-blue-500/20 bg-blue-500/5 px-3 py-2">
809
+ <p className="text-xs font-medium text-blue-700 dark:text-blue-400">
810
+ ✅ Dùng <code className="font-mono">Accordion</code> (Micro) —
811
+ Toàn quyền kiểm soát cấu trúc HTML của Trigger và Content.
812
+ </p>
813
+ </div>
814
+ </div>
815
+ </div>
816
+ `}
817
+ >
818
+ <div className="grid grid-cols-1 gap-6 md:grid-cols-2">
819
+ {/* ── Story 1: Macro wins ── */}
820
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
821
+ <div className="flex items-start gap-3">
822
+ <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
823
+ <SettingsIcon className="size-4" aria-hidden="true" />
824
+ </span>
825
+ <div>
826
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
827
+ Story 1 · Dùng Macro
828
+ </p>
829
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
830
+ Render danh sách FAQ từ API
831
+ </h3>
832
+ </div>
833
+ </div>
834
+
835
+ <p className="text-xs text-muted-foreground leading-relaxed">
836
+ Bạn nhận được một mảng dữ liệu FAQ (hỏi đáp) từ server. Nội dung
837
+ đơn giản chỉ là text. Dùng Macro để tiết kiệm code.
838
+ </p>
839
+
840
+ <div className="rounded-lg bg-muted/50 p-3">
841
+ <AccordionPreset
842
+ className="w-full"
843
+ items={[
844
+ {
845
+ value: "Is it accessible?",
846
+ title: "Is it accessible?",
847
+ content: "Yes. It adheres to the WAI-ARIA design pattern.",
848
+ },
849
+ {
850
+ value: "Is it styled?",
851
+ title: "Is it styled?",
852
+ content:
853
+ "Yes. It comes with default styles that match the other components' aesthetic.",
854
+ },
855
+ ]}
856
+ />
857
+ </div>
858
+
859
+ <div className="rounded-md border border-border border-green-500/20 bg-green-500/5 px-3 py-2">
860
+ <p className="text-xs font-medium text-green-700 dark:text-green-400">
861
+ ✅ Dùng <code className="font-mono">AccordionPreset</code> — Tự
862
+ động lặp qua array, không cần viết lại JSX cho từng thẻ Item.
863
+ </p>
864
+ </div>
865
+ </div>
866
+
867
+ {/* ── Story 2: Micro wins ── */}
868
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
869
+ <div className="flex items-start gap-3">
870
+ <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
871
+ <BoxIcon className="size-4" aria-hidden="true" />
872
+ </span>
873
+ <div>
874
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
875
+ Story 2 · Dùng Micro
876
+ </p>
877
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
878
+ Tuỳ biến Trigger / Form phức tạp
879
+ </h3>
880
+ </div>
881
+ </div>
882
+
883
+ <p className="text-xs text-muted-foreground leading-relaxed">
884
+ Trigger cần hiển thị Icon hoặc Badge. Nội dung bên trong là một
885
+ Form phức tạp (chứ không phải text đơn thuần). Macro không thể làm
886
+ được việc này.
887
+ </p>
888
+
889
+ <div className="rounded-lg bg-muted/50 p-3">
890
+ <Accordion className="w-full">
891
+ <AccordionItem value="settings">
892
+ <AccordionTrigger className="gap-3">
893
+ <SlidersHorizontalIcon className="size-4 text-primary" />
894
+ <span className="flex-1 text-left">Advanced Settings</span>
895
+ <span className="mr-2 rounded bg-primary/10 px-2 py-0.5 text-[10px] uppercase tracking-wider text-primary">
896
+ New
897
+ </span>
898
+ </AccordionTrigger>
899
+ <AccordionContent>
900
+ <div className="flex items-center gap-3 rounded border border-border p-3 text-xs text-muted-foreground">
901
+ <span>
902
+ Nội dung tuỳ biến hoàn toàn, ví dụ: Form, Toggle, v.v.
903
+ </span>
904
+ </div>
905
+ </AccordionContent>
906
+ </AccordionItem>
907
+ </Accordion>
908
+ </div>
909
+
910
+ <div className="rounded-md border border-border border-blue-500/20 bg-blue-500/5 px-3 py-2">
911
+ <p className="text-xs font-medium text-blue-700 dark:text-blue-400">
912
+ ✅ Dùng <code className="font-mono">Accordion</code> (Micro) —
913
+ Toàn quyền kiểm soát cấu trúc HTML của Trigger và Content.
914
+ </p>
915
+ </div>
916
+ </div>
917
+ </div>
918
+ </ExampleSection>
919
+ </div>
920
+ );
921
+ }
922
+
923
+ // ──────────────────────────────────────────────────────────
924
+ // SECTION 3: Entry point (export default)
925
+ // ──────────────────────────────────────────────────────────
926
+ export default function AccordionShowcase() {
927
+ return (
928
+ <Showcase
929
+ title="Accordion"
930
+ description="Tập hợp các tiêu đề có thể tương tác xếp chồng lên nhau theo chiều dọc, mỗi tiêu đề sẽ mở ra một phần nội dung."
931
+ generalConcept={
932
+ <ShowcaseDocs>
933
+ <DocsP>
934
+ Dùng để gom nhóm các khối nội dung lớn nhằm tiết kiệm không gian
935
+ hiển thị (ví dụ: FAQ, Advanced Settings). Không nên dùng Accordion
936
+ nếu nội dung bên trong quá quan trọng và cần user phải nhìn thấy
937
+ ngay lập tức.
938
+ </DocsP>
939
+ </ShowcaseDocs>
940
+ }
941
+ tabs={[
942
+ { label: "Micro (Primitive)", content: <AccordionMicroShowcase /> },
943
+ { label: "Macro (Preset)", content: <AccordionMacroShowcase /> },
944
+ ]}
945
+ />
946
+ );
947
+ }