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,126 @@
1
+ import { Separator } from "../../components/micro/separator";
2
+ import {
3
+ DocsCode,
4
+ DocsH3,
5
+ DocsP,
6
+ ExampleSection,
7
+ Showcase,
8
+ ShowcaseDocs,
9
+ } from "../../dev/components/showcase";
10
+
11
+ // ──────────────────────────────────────────────────────────
12
+ // SECTION 1: Micro Content (Only Micro exists)
13
+ // ──────────────────────────────────────────────────────────
14
+ function SeparatorMicroShowcase() {
15
+ return (
16
+ <div className="space-y-10 mt-6">
17
+ <ExampleSection
18
+ label="Ngang (Horizontal)"
19
+ description="Sử dụng để phân tách các khối nội dung từ trên xuống dưới."
20
+ fullWidth
21
+ codeString={`<div className="w-full max-w-sm rounded-lg border border-border bg-card p-6">
22
+ <div className="space-y-1">
23
+ <h4 className="text-sm font-medium leading-none">
24
+ Gladcn UI
25
+ </h4>
26
+ <p className="text-sm text-muted-foreground">
27
+ Bộ UI Component mã nguồn mở.
28
+ </p>
29
+ </div>
30
+ <Separator className="my-4" />
31
+ <div className="text-sm text-muted-foreground">
32
+ Cập nhật lần cuối: Hôm nay
33
+ </div>
34
+ </div>
35
+ `}
36
+ >
37
+ <div className="w-full max-w-sm rounded-lg border border-border bg-card p-6">
38
+ <div className="space-y-1">
39
+ <h4 className="text-sm font-medium leading-none">Gladcn UI</h4>
40
+ <p className="text-sm text-muted-foreground">
41
+ Bộ UI Component mã nguồn mở.
42
+ </p>
43
+ </div>
44
+ <Separator className="my-4" />
45
+ <div className="text-sm text-muted-foreground">
46
+ Cập nhật lần cuối: Hôm nay
47
+ </div>
48
+ </div>
49
+ </ExampleSection>
50
+
51
+ <ExampleSection
52
+ label="Dọc (Vertical)"
53
+ description="Sử dụng để phân tách các mục nằm ngang (như menu, thanh công cụ)."
54
+ codeString={`<div className="flex h-5 items-center space-x-4 text-sm">
55
+ <div className="font-medium hover:underline cursor-pointer">Blog</div>
56
+ <Separator orientation="vertical" />
57
+ <div className="font-medium hover:underline cursor-pointer">Tài liệu</div>
58
+ <Separator orientation="vertical" />
59
+ <div className="font-medium hover:underline cursor-pointer">Mã nguồn</div>
60
+ </div>
61
+ `}
62
+ >
63
+ <div className="flex h-5 items-center space-x-4 text-sm">
64
+ <div className="font-medium hover:underline cursor-pointer">Blog</div>
65
+ <Separator orientation="vertical" />
66
+ <div className="font-medium hover:underline cursor-pointer">
67
+ Tài liệu
68
+ </div>
69
+ <Separator orientation="vertical" />
70
+ <div className="font-medium hover:underline cursor-pointer">
71
+ Mã nguồn
72
+ </div>
73
+ </div>
74
+ </ExampleSection>
75
+ <ExampleSection
76
+ label="Decorative vs Semantic"
77
+ description='Semantic (mặc định) được screen reader đọc. Truyền aria-hidden="true" khi Separator chỉ mang tính trang trí thuần.'
78
+ codeString={`{/* Semantic — screen reader đọc được */}
79
+ <Separator />
80
+
81
+ {/* Decorative — chỉ là đường kẻ trực quan */}
82
+ <Separator aria-hidden="true" />`}
83
+ >
84
+ <div className="flex flex-col gap-6 w-full max-w-sm">
85
+ <div>
86
+ <p className="text-xs text-muted-foreground mb-2">
87
+ Semantic (mặc định — screen reader nhận ra)
88
+ </p>
89
+ <Separator />
90
+ </div>
91
+ <div>
92
+ <p className="text-xs text-muted-foreground mb-2">
93
+ Decorative — <code className="text-xs">aria-hidden="true"</code>
94
+ </p>
95
+ <Separator aria-hidden="true" />
96
+ </div>
97
+ </div>
98
+ </ExampleSection>
99
+ </div>
100
+ );
101
+ }
102
+
103
+ // ──────────────────────────────────────────────────────────
104
+ // SECTION 3: Entry point
105
+ // ──────────────────────────────────────────────────────────
106
+ export default function SeparatorShowcase() {
107
+ return (
108
+ <Showcase
109
+ title="Separator"
110
+ description="Thành phần phân cách trực quan hoặc ngữ nghĩa giữa các khối nội dung (Đường kẻ)."
111
+ generalConcept={
112
+ <ShowcaseDocs>
113
+ <DocsH3>Separator (Phân cách)</DocsH3>
114
+ <DocsP>
115
+ <DocsCode>Separator</DocsCode> không có phiên bản Macro vì bản chất
116
+ nó chỉ là một đường kẻ phân tách giao diện. Mặc định là đường kẻ
117
+ ngang (<DocsCode>orientation="horizontal"</DocsCode>).
118
+ </DocsP>
119
+ </ShowcaseDocs>
120
+ }
121
+ tabs={[
122
+ { label: "Micro (Primitive)", content: <SeparatorMicroShowcase /> },
123
+ ]}
124
+ />
125
+ );
126
+ }
@@ -0,0 +1,566 @@
1
+ import { useDevContext } from "../../dev/components/dev-context";
2
+ import {
3
+ DocsCode,
4
+ DocsP,
5
+ ExampleGrid,
6
+ ExampleSection,
7
+ Showcase,
8
+ ShowcaseDocs,
9
+ } from "../../dev/components/showcase";
10
+ import { FilterIcon, PanelRightIcon, SettingsIcon } from "lucide-react";
11
+ import { useState } from "react";
12
+
13
+ import { Button } from "../../components/micro/button";
14
+ import { Input } from "../../components/micro/input";
15
+ import { Label } from "../../components/micro/label";
16
+ import {
17
+ Sheet,
18
+ SheetClose,
19
+ SheetContent,
20
+ SheetDescription,
21
+ SheetFooter,
22
+ SheetHeader,
23
+ SheetTitle,
24
+ SheetTrigger,
25
+ SheetPortal,
26
+ } from "../../components/micro/sheet";
27
+ import { type Size } from "../../lib/types";
28
+
29
+ // ──────────────────────────────────────────────────────────
30
+ // SECTION 2: Micro Content (không export)
31
+ // ──────────────────────────────────────────────────────────
32
+ function SheetMicroShowcase({ globalSize }: { globalSize: Size }) {
33
+ const [open, setOpen] = useState(false);
34
+
35
+ return (
36
+ <div className="space-y-10 mt-6">
37
+ {/* ── Sides ── */}
38
+ <ExampleSection
39
+ label="Hướng trượt (Side)"
40
+ description="Sheet có thể trượt ra từ bốn cạnh: right (mặc định), left, top, bottom."
41
+ codeString={`<Sheet>
42
+ <SheetTrigger render={<Button variant="outline" className="capitalize">right</Button>} />
43
+ <SheetPortal><SheetContent side="right">
44
+ <SheetHeader>
45
+ <SheetTitle>Edit Profile</SheetTitle>
46
+ <SheetDescription>
47
+ Thay đổi thông tin tài khoản của bạn và nhấn Lưu.
48
+ </SheetDescription>
49
+ </SheetHeader>
50
+ <div className="grid gap-4 py-4 px-4">
51
+ <div className="grid grid-cols-4 items-center gap-4">
52
+ <Label htmlFor="name-right" className="text-right">
53
+ Tên
54
+ </Label>
55
+ <Input id="name-right" defaultValue="Pedro Duarte" className="col-span-3" />
56
+ </div>
57
+ <div className="grid grid-cols-4 items-center gap-4">
58
+ <Label htmlFor="username-right" className="text-right">
59
+ Username
60
+ </Label>
61
+ <Input id="username-right" defaultValue="@peduarte" className="col-span-3" />
62
+ </div>
63
+ </div>
64
+ <SheetFooter>
65
+ <SheetClose render={<Button variant="outline" />}>
66
+ Huỷ
67
+ </SheetClose>
68
+ <Button>Lưu thay đổi</Button>
69
+ </SheetFooter>
70
+ </SheetContent></SheetPortal>
71
+ </Sheet>`}
72
+ >
73
+ <div className="grid grid-cols-2 gap-2">
74
+ {/* top */}
75
+ <Sheet>
76
+ <SheetTrigger
77
+ render={
78
+ <Button
79
+ variant="outline"
80
+ size={globalSize}
81
+ className="w-full"
82
+ />
83
+ }
84
+ >
85
+ top
86
+ </SheetTrigger>
87
+
88
+ <SheetPortal>
89
+ <SheetContent side="top">
90
+ <SheetHeader>
91
+ <SheetTitle>Edit Profile</SheetTitle>
92
+ <SheetDescription>
93
+ Thay đổi thông tin tài khoản của bạn và nhấn Lưu.
94
+ </SheetDescription>
95
+ </SheetHeader>
96
+ <div className="grid gap-4 py-4 px-4">
97
+ <div className="grid grid-cols-4 items-center gap-4">
98
+ <Label htmlFor="name-top" className="text-right">
99
+ Tên
100
+ </Label>
101
+ <Input
102
+ id="name-top"
103
+ defaultValue="Pedro Duarte"
104
+ className="col-span-3"
105
+ />
106
+ </div>
107
+ </div>
108
+ <SheetFooter>
109
+ <SheetClose
110
+ render={<Button variant="outline" size={globalSize} />}
111
+ >
112
+ Huỷ
113
+ </SheetClose>
114
+ <Button size={globalSize}>Lưu thay đổi</Button>
115
+ </SheetFooter>
116
+ </SheetContent>
117
+ </SheetPortal>
118
+ </Sheet>
119
+
120
+ {/* right */}
121
+ <Sheet>
122
+ <SheetTrigger
123
+ render={
124
+ <Button
125
+ variant="outline"
126
+ size={globalSize}
127
+ className="w-full"
128
+ />
129
+ }
130
+ >
131
+ right
132
+ </SheetTrigger>
133
+
134
+ <SheetPortal>
135
+ <SheetContent side="right">
136
+ <SheetHeader>
137
+ <SheetTitle>Edit Profile</SheetTitle>
138
+ <SheetDescription>
139
+ Thay đổi thông tin tài khoản của bạn và nhấn Lưu.
140
+ </SheetDescription>
141
+ </SheetHeader>
142
+ <div className="grid gap-4 py-4 px-4">
143
+ <div className="grid grid-cols-4 items-center gap-4">
144
+ <Label htmlFor="name-right" className="text-right">
145
+ Tên
146
+ </Label>
147
+ <Input
148
+ id="name-right"
149
+ defaultValue="Pedro Duarte"
150
+ className="col-span-3"
151
+ />
152
+ </div>
153
+ <div className="grid grid-cols-4 items-center gap-4">
154
+ <Label htmlFor="username-right" className="text-right">
155
+ Username
156
+ </Label>
157
+ <Input
158
+ id="username-right"
159
+ defaultValue="@peduarte"
160
+ className="col-span-3"
161
+ />
162
+ </div>
163
+ </div>
164
+ <SheetFooter>
165
+ <SheetClose
166
+ render={<Button variant="outline" size={globalSize} />}
167
+ >
168
+ Huỷ
169
+ </SheetClose>
170
+ <Button size={globalSize}>Lưu thay đổi</Button>
171
+ </SheetFooter>
172
+ </SheetContent>
173
+ </SheetPortal>
174
+ </Sheet>
175
+
176
+ {/* bottom */}
177
+ <Sheet>
178
+ <SheetTrigger
179
+ render={
180
+ <Button
181
+ variant="outline"
182
+ size={globalSize}
183
+ className="w-full"
184
+ />
185
+ }
186
+ >
187
+ bottom
188
+ </SheetTrigger>
189
+
190
+ <SheetPortal>
191
+ <SheetContent side="bottom">
192
+ <SheetHeader>
193
+ <SheetTitle>Edit Profile</SheetTitle>
194
+ <SheetDescription>
195
+ Thay đổi thông tin tài khoản của bạn và nhấn Lưu.
196
+ </SheetDescription>
197
+ </SheetHeader>
198
+ <div className="grid gap-4 py-4 px-4">
199
+ <div className="grid grid-cols-4 items-center gap-4">
200
+ <Label htmlFor="name-bottom" className="text-right">
201
+ Tên
202
+ </Label>
203
+ <Input
204
+ id="name-bottom"
205
+ defaultValue="Pedro Duarte"
206
+ className="col-span-3"
207
+ />
208
+ </div>
209
+ </div>
210
+ <SheetFooter>
211
+ <SheetClose
212
+ render={<Button variant="outline" size={globalSize} />}
213
+ >
214
+ Huỷ
215
+ </SheetClose>
216
+ <Button size={globalSize}>Lưu thay đổi</Button>
217
+ </SheetFooter>
218
+ </SheetContent>
219
+ </SheetPortal>
220
+ </Sheet>
221
+
222
+ {/* left */}
223
+ <Sheet>
224
+ <SheetTrigger
225
+ render={
226
+ <Button
227
+ variant="outline"
228
+ size={globalSize}
229
+ className="w-full"
230
+ />
231
+ }
232
+ >
233
+ left
234
+ </SheetTrigger>
235
+
236
+ <SheetPortal>
237
+ <SheetContent side="left">
238
+ <SheetHeader>
239
+ <SheetTitle>Edit Profile</SheetTitle>
240
+ <SheetDescription>
241
+ Thay đổi thông tin tài khoản của bạn và nhấn Lưu.
242
+ </SheetDescription>
243
+ </SheetHeader>
244
+ <div className="grid gap-4 py-4 px-4">
245
+ <div className="grid grid-cols-4 items-center gap-4">
246
+ <Label htmlFor="name-left" className="text-right">
247
+ Tên
248
+ </Label>
249
+ <Input
250
+ id="name-left"
251
+ defaultValue="Pedro Duarte"
252
+ className="col-span-3"
253
+ />
254
+ </div>
255
+ <div className="grid grid-cols-4 items-center gap-4">
256
+ <Label htmlFor="username-left" className="text-right">
257
+ Username
258
+ </Label>
259
+ <Input
260
+ id="username-left"
261
+ defaultValue="@peduarte"
262
+ className="col-span-3"
263
+ />
264
+ </div>
265
+ </div>
266
+ <SheetFooter>
267
+ <SheetClose
268
+ render={<Button variant="outline" size={globalSize} />}
269
+ >
270
+ Huỷ
271
+ </SheetClose>
272
+ <Button size={globalSize}>Lưu thay đổi</Button>
273
+ </SheetFooter>
274
+ </SheetContent>
275
+ </SheetPortal>
276
+ </Sheet>
277
+ </div>
278
+ </ExampleSection>
279
+
280
+ {/* ── showCloseButton ── */}
281
+ <ExampleGrid>
282
+ <ExampleSection
283
+ label="Có nút đóng (mặc định)"
284
+ description="showCloseButton={true} — nút X tự động hiển thị ở góc trên phải."
285
+ codeString={`<Sheet>
286
+ <SheetTrigger render={<Button variant="outline" />}>
287
+ <PanelRightIcon />
288
+ Mở Sheet
289
+ </SheetTrigger>
290
+ <SheetPortal><SheetContent side="right">
291
+ <SheetHeader>
292
+ <SheetTitle>Có nút đóng</SheetTitle>
293
+ <SheetDescription>Nút X xuất hiện tự động.</SheetDescription>
294
+ </SheetHeader>
295
+ </SheetContent></SheetPortal>
296
+ </Sheet>`}
297
+ >
298
+ <Sheet>
299
+ <SheetTrigger
300
+ render={<Button variant="outline" size={globalSize} />}
301
+ >
302
+ <PanelRightIcon aria-hidden="true" />
303
+ Mở Sheet
304
+ </SheetTrigger>
305
+
306
+ <SheetPortal>
307
+ <SheetContent side="right">
308
+ <SheetHeader>
309
+ <SheetTitle>Có nút đóng</SheetTitle>
310
+ <SheetDescription>Nút X xuất hiện tự động.</SheetDescription>
311
+ </SheetHeader>
312
+ </SheetContent>
313
+ </SheetPortal>
314
+ </Sheet>
315
+ </ExampleSection>
316
+
317
+ <ExampleSection
318
+ label="Ẩn nút đóng"
319
+ description="showCloseButton={false} — dùng khi muốn tự control nút đóng bên trong nội dung."
320
+ codeString={`<Sheet>
321
+ <SheetTrigger render={<Button variant="outline" />}>
322
+ <PanelRightIcon />
323
+ Không có X
324
+ </SheetTrigger>
325
+ <SheetPortal><SheetContent side="right" showCloseButton={false}>
326
+ <SheetHeader>
327
+ <SheetTitle>Ẩn nút đóng</SheetTitle>
328
+ <SheetDescription>
329
+ Consumer tự render nút đóng trong footer.
330
+ </SheetDescription>
331
+ </SheetHeader>
332
+ <SheetFooter>
333
+ <SheetClose render={<Button variant="outline" className="w-full" />}>
334
+ Đóng thủ công
335
+ </SheetClose>
336
+ </SheetFooter>
337
+ </SheetContent></SheetPortal>
338
+ </Sheet>`}
339
+ >
340
+ <Sheet>
341
+ <SheetTrigger
342
+ render={<Button variant="outline" size={globalSize} />}
343
+ >
344
+ <PanelRightIcon aria-hidden="true" />
345
+ Không có X
346
+ </SheetTrigger>
347
+
348
+ <SheetPortal>
349
+ <SheetContent side="right" showCloseButton={false}>
350
+ <SheetHeader>
351
+ <SheetTitle>Ẩn nút đóng</SheetTitle>
352
+ <SheetDescription>
353
+ Consumer tự render nút đóng trong footer.
354
+ </SheetDescription>
355
+ </SheetHeader>
356
+ <SheetFooter>
357
+ <SheetClose
358
+ render={
359
+ <Button
360
+ variant="outline"
361
+ size={globalSize}
362
+ className="w-full"
363
+ />
364
+ }
365
+ >
366
+ Đóng thủ công
367
+ </SheetClose>
368
+ </SheetFooter>
369
+ </SheetContent>
370
+ </SheetPortal>
371
+ </Sheet>
372
+ </ExampleSection>
373
+ </ExampleGrid>
374
+
375
+ {/* ── Controlled ── */}
376
+ <ExampleSection
377
+ label="Controlled State"
378
+ description="Quản lý trạng thái đóng/mở qua React state với open và onOpenChange."
379
+ codeString={`const [open, setOpen] = useState(false);
380
+
381
+ <div className="flex items-center gap-4">
382
+ <Sheet open={open} onOpenChange={setOpen}>
383
+ <SheetTrigger render={<Button variant="outline" />}>
384
+ <SettingsIcon />
385
+ Toggle Controlled
386
+ </SheetTrigger>
387
+ <SheetPortal><SheetContent side="right">
388
+ <SheetHeader>
389
+ <SheetTitle>Controlled Mode</SheetTitle>
390
+ <SheetDescription>
391
+ Sheet được điều khiển hoàn toàn bởi React state.
392
+ </SheetDescription>
393
+ </SheetHeader>
394
+ <SheetFooter>
395
+ <Button onClick={() => setOpen(false)}>
396
+ Đóng bằng state
397
+ </Button>
398
+ </SheetFooter>
399
+ </SheetContent></SheetPortal>
400
+ </Sheet>
401
+ <p className="text-sm text-muted-foreground">
402
+ Trạng thái:{" "}
403
+ <strong
404
+ data-active={open ? "" : undefined}
405
+ className="data-active:text-primary"
406
+ >
407
+ {open ? "Mở" : "Đóng"}
408
+ </strong>
409
+ </p>
410
+ </div>`}
411
+ >
412
+ <div className="flex items-center gap-4">
413
+ <Sheet open={open} onOpenChange={setOpen}>
414
+ <SheetTrigger
415
+ render={<Button variant="outline" size={globalSize} />}
416
+ >
417
+ <SettingsIcon aria-hidden="true" />
418
+ Toggle Controlled
419
+ </SheetTrigger>
420
+
421
+ <SheetPortal>
422
+ <SheetContent side="right">
423
+ <SheetHeader>
424
+ <SheetTitle>Controlled Mode</SheetTitle>
425
+ <SheetDescription>
426
+ Sheet được điều khiển hoàn toàn bởi React state.
427
+ </SheetDescription>
428
+ </SheetHeader>
429
+ <SheetFooter>
430
+ <Button size={globalSize} onClick={() => setOpen(false)}>
431
+ Đóng bằng state
432
+ </Button>
433
+ </SheetFooter>
434
+ </SheetContent>
435
+ </SheetPortal>
436
+ </Sheet>
437
+ <p className="text-sm text-muted-foreground">
438
+ Trạng thái:{" "}
439
+ <strong
440
+ data-active={open ? "" : undefined}
441
+ className="data-active:text-primary"
442
+ >
443
+ {open ? "Mở" : "Đóng"}
444
+ </strong>
445
+ </p>
446
+ </div>
447
+ </ExampleSection>
448
+
449
+ {/* ── Real-world: Filter Panel ── */}
450
+ <ExampleSection
451
+ label="Use case — Filter Panel"
452
+ description="Sheet dùng làm bảng lọc dữ liệu bên phải — pattern phổ biến trong dashboard, table view."
453
+ codeString={`<Sheet>
454
+ <SheetTrigger render={<Button variant="outline" />}>
455
+ <FilterIcon />
456
+ Lọc dữ liệu
457
+ </SheetTrigger>
458
+ <SheetPortal><SheetContent side="right">
459
+ <SheetHeader>
460
+ <SheetTitle>Bộ lọc</SheetTitle>
461
+ <SheetDescription>
462
+ Tinh chỉnh kết quả hiển thị theo điều kiện.
463
+ </SheetDescription>
464
+ </SheetHeader>
465
+ <div className="flex flex-col gap-4 p-4">
466
+ <div className="flex flex-col gap-2">
467
+ <Label htmlFor="filter-status">Trạng thái</Label>
468
+ <Input id="filter-status" placeholder="Tất cả" />
469
+ </div>
470
+ <div className="flex flex-col gap-2">
471
+ <Label htmlFor="filter-date-from">Từ ngày</Label>
472
+ <Input id="filter-date-from" type="date" />
473
+ </div>
474
+ <div className="flex flex-col gap-2">
475
+ <Label htmlFor="filter-date-to">Đến ngày</Label>
476
+ <Input id="filter-date-to" type="date" />
477
+ </div>
478
+ </div>
479
+ <SheetFooter>
480
+ <SheetClose render={<Button variant="outline" />}>
481
+ Xoá bộ lọc
482
+ </SheetClose>
483
+ <Button>Áp dụng</Button>
484
+ </SheetFooter>
485
+ </SheetContent></SheetPortal>
486
+ </Sheet>`}
487
+ >
488
+ <Sheet>
489
+ <SheetTrigger render={<Button variant="outline" size={globalSize} />}>
490
+ <FilterIcon aria-hidden="true" />
491
+ Lọc dữ liệu
492
+ </SheetTrigger>
493
+
494
+ <SheetPortal>
495
+ <SheetContent side="right">
496
+ <SheetHeader>
497
+ <SheetTitle>Bộ lọc</SheetTitle>
498
+ <SheetDescription>
499
+ Tinh chỉnh kết quả hiển thị theo điều kiện.
500
+ </SheetDescription>
501
+ </SheetHeader>
502
+ <div className="flex flex-col gap-4 p-4">
503
+ <div className="flex flex-col gap-2">
504
+ <Label htmlFor="filter-status">Trạng thái</Label>
505
+ <Input id="filter-status" placeholder="Tất cả" />
506
+ </div>
507
+ <div className="flex flex-col gap-2">
508
+ <Label htmlFor="filter-date-from">Từ ngày</Label>
509
+ <Input id="filter-date-from" type="date" />
510
+ </div>
511
+ <div className="flex flex-col gap-2">
512
+ <Label htmlFor="filter-date-to">Đến ngày</Label>
513
+ <Input id="filter-date-to" type="date" />
514
+ </div>
515
+ </div>
516
+ <SheetFooter>
517
+ <SheetClose
518
+ render={<Button variant="outline" size={globalSize} />}
519
+ >
520
+ Xoá bộ lọc
521
+ </SheetClose>
522
+ <Button size={globalSize}>Áp dụng</Button>
523
+ </SheetFooter>
524
+ </SheetContent>
525
+ </SheetPortal>
526
+ </Sheet>
527
+ </ExampleSection>
528
+ </div>
529
+ );
530
+ }
531
+
532
+ // ──────────────────────────────────────────────────────────
533
+ // SECTION 3: Entry point (export default)
534
+ // ──────────────────────────────────────────────────────────
535
+ export default function SheetShowcase() {
536
+ const { size: globalSize } = useDevContext();
537
+ return (
538
+ <Showcase
539
+ title="Sheet"
540
+ description="Panel trượt từ cạnh màn hình — mở rộng Dialog để hiển thị nội dung bổ sung mà không rời trang."
541
+ generalConcept={
542
+ <ShowcaseDocs>
543
+ <DocsP>
544
+ <DocsCode>Sheet</DocsCode> là một variant của Dialog, nhưng thay vì
545
+ hiện ở giữa màn hình, nó trượt ra từ một cạnh (right, left, top,
546
+ bottom). Phù hợp cho navigation drawer, filter panel, settings
547
+ sidebar, hay form chỉnh sửa.
548
+ </DocsP>
549
+ <DocsP>
550
+ <DocsCode>SheetContent</DocsCode> tự tích hợp{" "}
551
+ <DocsCode>Portal</DocsCode> và <DocsCode>Overlay</DocsCode> bên
552
+ trong. Prop <DocsCode>showCloseButton</DocsCode> cho phép bật/tắt
553
+ nút X tự động. Dùng <DocsCode>open</DocsCode> /{" "}
554
+ <DocsCode>onOpenChange</DocsCode> để controlled mode.
555
+ </DocsP>
556
+ </ShowcaseDocs>
557
+ }
558
+ tabs={[
559
+ {
560
+ label: "Micro (Primitive)",
561
+ content: <SheetMicroShowcase globalSize={globalSize} />,
562
+ },
563
+ ]}
564
+ />
565
+ );
566
+ }