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,756 @@
1
+ import { useDevContext } from "../../dev/components/dev-context";
2
+ import {
3
+ DocsCode,
4
+ DocsLi,
5
+ DocsP,
6
+ DocsUl,
7
+ ExampleGrid,
8
+ ExampleSection,
9
+ Showcase,
10
+ ShowcaseDocs,
11
+ } from "../../dev/components/showcase";
12
+ import {
13
+ CheckCircle2Icon,
14
+ InfoIcon,
15
+ TriangleAlertIcon,
16
+ XCircleIcon,
17
+ XIcon,
18
+ } from "lucide-react";
19
+ import { useState } from "react";
20
+
21
+ import { AlertPreset } from "../../components/macro/alert-preset";
22
+ import {
23
+ Alert,
24
+ AlertAction,
25
+ AlertDescription,
26
+ AlertIcon,
27
+ AlertTitle,
28
+ } from "../../components/micro/alert";
29
+ import { Button } from "../../components/micro/button";
30
+ import { type Size } from "../../lib/types";
31
+
32
+ // ──────────────────────────────────────────────────────────
33
+ // SECTION 1: Macro Content (không export)
34
+ // ──────────────────────────────────────────────────────────
35
+ function AlertMacroShowcase({ globalSize }: { globalSize: Size }) {
36
+ const [controlledOpen, setControlledOpen] = useState(true);
37
+
38
+ return (
39
+ <div className="space-y-10 mt-6">
40
+ <ExampleSection
41
+ label="Controlled vs Uncontrolled"
42
+ fullWidth
43
+ codeString={`<div className="space-y-4 px-2 py-4">
44
+ <DocsUl>
45
+ <DocsLi>
46
+ <b>Uncontrolled (Mặc định):</b> Nếu truyền{" "}
47
+ <DocsCode>dismissible=true</DocsCode>, component tự quản lý state
48
+ để tắt (ẩn) Alert khi click vào nút X.
49
+ </DocsLi>
50
+ <DocsLi>
51
+ <b>Controlled:</b> Có thể kiểm soát state đóng/mở thông qua React
52
+ state và truyền hàm vào <DocsCode>onDismiss</DocsCode>. Tuy nhiên
53
+ thông thường Alert chỉ bị huỷ (unmount), nên nếu bạn kiểm soát thì
54
+ hãy render nó có điều kiện bên ngoài.
55
+ </DocsLi>
56
+ </DocsUl>
57
+ </div>`}
58
+ >
59
+ <div className="space-y-4 px-2 py-4">
60
+ <DocsUl>
61
+ <DocsLi>
62
+ <b>Uncontrolled (Mặc định):</b> Nếu truyền{" "}
63
+ <DocsCode>dismissible=true</DocsCode>, component tự quản lý state
64
+ để tắt (ẩn) Alert khi click vào nút X.
65
+ </DocsLi>
66
+ <DocsLi>
67
+ <b>Controlled:</b> Có thể kiểm soát state đóng/mở thông qua React
68
+ state và truyền hàm vào <DocsCode>onDismiss</DocsCode>. Tuy nhiên
69
+ thông thường Alert chỉ bị huỷ (unmount), nên nếu bạn kiểm soát thì
70
+ hãy render nó có điều kiện bên ngoài.
71
+ </DocsLi>
72
+ </DocsUl>
73
+ </div>
74
+ </ExampleSection>
75
+
76
+ <ExampleGrid>
77
+ <ExampleSection
78
+ label="Tiêu chuẩn (Standard)"
79
+ description="Truyền props trực tiếp thay vì lồng children."
80
+ fullWidth
81
+ codeString={`<AlertPreset
82
+ color="info"
83
+ title="Có bản cập nhật mới"
84
+ description="Phiên bản 2.0.4 đã sẵn sàng để tải xuống."
85
+ icon={<InfoIcon />}
86
+ />
87
+ `}
88
+ >
89
+ <AlertPreset
90
+ color="info"
91
+ size={globalSize}
92
+ title="Có bản cập nhật mới"
93
+ description="Phiên bản 2.0.4 đã sẵn sàng để tải xuống."
94
+ icon={<InfoIcon />}
95
+ />
96
+ </ExampleSection>
97
+
98
+ <ExampleSection
99
+ label="Tự Đóng (Dismissible)"
100
+ description="Thêm dismissible=true để hiển thị nút [X]. Thử bấm vào nút X bên dưới."
101
+ fullWidth
102
+ codeString={`<AlertPreset
103
+ color="warning"
104
+ title="Phiên bản sắp hết hạn"
105
+ description="Phiên đăng nhập của bạn sẽ hết hạn trong 5 phút."
106
+ icon={<TriangleAlertIcon />}
107
+ dismissible
108
+ />
109
+ `}
110
+ >
111
+ <AlertPreset
112
+ color="warning"
113
+ size={globalSize}
114
+ title="Phiên bản sắp hết hạn"
115
+ description="Phiên đăng nhập của bạn sẽ hết hạn trong 5 phút."
116
+ icon={<TriangleAlertIcon />}
117
+ dismissible
118
+ />
119
+ </ExampleSection>
120
+ </ExampleGrid>
121
+
122
+ <ExampleGrid>
123
+ <ExampleSection
124
+ label="Controlled"
125
+ description="Quản lý trạng thái đóng mở thông qua state bên ngoài bằng React (Conditional Rendering)."
126
+ fullWidth
127
+ codeString={`const [controlledOpen, setControlledOpen] = useState(true);
128
+ return (
129
+ <>
130
+ <div className="mb-4">
131
+ <Button size="sm" variant="outline" onClick={() => setControlledOpen(true)} disabled={controlledOpen}>
132
+ Mở lại Alert
133
+ </Button>
134
+ </div>
135
+ {controlledOpen && (
136
+ <AlertPreset
137
+ color="destructive"
138
+ size="${globalSize}"
139
+ title="Bảo trì hệ thống"
140
+ description="Hệ thống sẽ tạm ngừng hoạt động để bảo trì vào lúc nửa đêm."
141
+ icon={<TriangleAlertIcon />}
142
+ dismissible
143
+ onDismiss={() => setControlledOpen(false)}
144
+ />
145
+ )}
146
+ </>
147
+ );`}
148
+ >
149
+ <div className="flex w-full flex-col gap-3">
150
+ <div className="flex items-center justify-between">
151
+ <p className="text-xs text-muted-foreground">
152
+ State:{" "}
153
+ <code className="rounded bg-muted px-1.5 py-0.5 text-xs font-mono">
154
+ {controlledOpen ? "true" : "false"}
155
+ </code>
156
+ </p>
157
+ <Button
158
+ size="sm"
159
+ variant="outline"
160
+ className="h-7 text-xs"
161
+ onClick={() => setControlledOpen(true)}
162
+ disabled={controlledOpen}
163
+ >
164
+ Mở lại Alert
165
+ </Button>
166
+ </div>
167
+ {controlledOpen && (
168
+ <AlertPreset
169
+ color="destructive"
170
+ size={globalSize}
171
+ title="Bảo trì hệ thống"
172
+ description="Hệ thống sẽ tạm ngừng hoạt động để bảo trì vào lúc nửa đêm."
173
+ icon={<TriangleAlertIcon />}
174
+ dismissible
175
+ onDismiss={() => setControlledOpen(false)}
176
+ />
177
+ )}
178
+ </div>
179
+ </ExampleSection>
180
+
181
+ <ExampleSection
182
+ label="Nội Dung Phức Tạp (Complex Content)"
183
+ description="Có thể truyền ReactNode hoặc thay thế toàn bộ bằng thẻ children."
184
+ codeString={`<div className="flex w-full flex-col gap-4 max-w-xl">
185
+ <AlertPreset
186
+ color="success"
187
+ title="Thanh toán thành công"
188
+ icon={<CheckCircle2Icon />}
189
+ dismissible
190
+ action={
191
+ <Button
192
+ size="sm"
193
+ variant="outline"
194
+ className="h-7 px-2 text-xs"
195
+ >
196
+ Xem biên lai
197
+ </Button>
198
+ }
199
+ >
200
+ <p className="text-sm mt-1 text-success/90">
201
+ Hoá đơn #1234 của bạn đã được thanh toán hoàn tất.
202
+ </p>
203
+ </AlertPreset>
204
+ </div>
205
+ `}
206
+ >
207
+ <div className="flex w-full flex-col gap-4 max-w-xl">
208
+ <AlertPreset
209
+ color="success"
210
+ size={globalSize}
211
+ title="Thanh toán thành công"
212
+ icon={<CheckCircle2Icon />}
213
+ dismissible
214
+ action={
215
+ <Button
216
+ size="sm"
217
+ variant="outline"
218
+ className="h-7 px-2 text-xs"
219
+ >
220
+ Xem biên lai
221
+ </Button>
222
+ }
223
+ >
224
+ <p className="text-sm mt-1 text-success/90">
225
+ Hoá đơn #1234 của bạn đã được thanh toán hoàn tất.
226
+ </p>
227
+ </AlertPreset>
228
+ </div>
229
+ </ExampleSection>
230
+ </ExampleGrid>
231
+ </div>
232
+ );
233
+ }
234
+
235
+ // ──────────────────────────────────────────────────────────
236
+ // SECTION 2: Micro Content (không export)
237
+ // ──────────────────────────────────────────────────────────
238
+ function AlertMicroShowcase({ globalSize }: { globalSize: Size }) {
239
+ return (
240
+ <div className="space-y-10 mt-6">
241
+ {/* ── Semantic Colors ──────────────────────── */}
242
+ <ExampleSection
243
+ label="Màu Sắc Ngữ Nghĩa (Semantic Colors)"
244
+ description="Mỗi màu sắc truyền đạt một mức độ khẩn cấp hoặc ý nghĩa khác nhau."
245
+ fullWidth
246
+ codeString={`<Alert color="info" className="flex items-start">
247
+ <AlertIcon render={<InfoIcon />} className="mt-0.5 shrink-0" />
248
+ <div className="flex-1 space-y-0.5">
249
+ <AlertTitle>Có bản cập nhật mới</AlertTitle>
250
+ <AlertDescription>
251
+ Phiên bản 2.0.4 đã sẵn sàng để tải xuống. Hãy cập nhật để trải
252
+ nghiệm tính năng mới.
253
+ </AlertDescription>
254
+ </div>
255
+ </Alert>
256
+
257
+ <Alert color="success" className="flex items-start">
258
+ <AlertIcon
259
+ render={<CheckCircle2Icon />}
260
+ className="mt-0.5 shrink-0"
261
+ />
262
+ <div className="flex-1 space-y-0.5">
263
+ <AlertTitle>Đã lưu thành công</AlertTitle>
264
+ <AlertDescription>
265
+ Các thay đổi của bạn đã được đồng bộ lên đám mây.
266
+ </AlertDescription>
267
+ </div>
268
+ </Alert>
269
+
270
+ <Alert color="warning" className="flex items-start">
271
+ <AlertIcon
272
+ render={<TriangleAlertIcon />}
273
+ className="mt-0.5 shrink-0"
274
+ />
275
+ <div className="flex-1 space-y-0.5">
276
+ <AlertTitle>Phiên bản sắp hết hạn</AlertTitle>
277
+ <AlertDescription>
278
+ Phiên đăng nhập của bạn sẽ hết hạn trong 5 phút nữa. Vui lòng lưu
279
+ lại công việc.
280
+ </AlertDescription>
281
+ </div>
282
+ </Alert>
283
+
284
+ <Alert
285
+ color="destructive"
286
+ className="flex items-start"
287
+ >
288
+ <AlertIcon render={<XCircleIcon />} className="mt-0.5 shrink-0" />
289
+ <div className="flex-1 space-y-0.5">
290
+ <AlertTitle>Kết nối thất bại</AlertTitle>
291
+ <AlertDescription>
292
+ Không thể kết nối đến cơ sở dữ liệu. Vui lòng kiểm tra lại đường
293
+ truyền mạng.
294
+ </AlertDescription>
295
+ </div>
296
+ </Alert>
297
+ `}
298
+ >
299
+ <Alert color="info" size={globalSize} className="flex items-start">
300
+ <AlertIcon render={<InfoIcon />} className="mt-0.5 shrink-0" />
301
+ <div className="flex-1 space-y-0.5">
302
+ <AlertTitle>Có bản cập nhật mới</AlertTitle>
303
+ <AlertDescription>
304
+ Phiên bản 2.0.4 đã sẵn sàng để tải xuống. Hãy cập nhật để trải
305
+ nghiệm tính năng mới.
306
+ </AlertDescription>
307
+ </div>
308
+ </Alert>
309
+
310
+ <Alert color="success" size={globalSize} className="flex items-start">
311
+ <AlertIcon
312
+ render={<CheckCircle2Icon />}
313
+ className="mt-0.5 shrink-0"
314
+ />
315
+ <div className="flex-1 space-y-0.5">
316
+ <AlertTitle>Đã lưu thành công</AlertTitle>
317
+ <AlertDescription>
318
+ Các thay đổi của bạn đã được đồng bộ lên đám mây.
319
+ </AlertDescription>
320
+ </div>
321
+ </Alert>
322
+
323
+ <Alert color="warning" size={globalSize} className="flex items-start">
324
+ <AlertIcon
325
+ render={<TriangleAlertIcon />}
326
+ className="mt-0.5 shrink-0"
327
+ />
328
+ <div className="flex-1 space-y-0.5">
329
+ <AlertTitle>Phiên bản sắp hết hạn</AlertTitle>
330
+ <AlertDescription>
331
+ Phiên đăng nhập của bạn sẽ hết hạn trong 5 phút nữa. Vui lòng lưu
332
+ lại công việc.
333
+ </AlertDescription>
334
+ </div>
335
+ </Alert>
336
+
337
+ <Alert
338
+ color="destructive"
339
+ size={globalSize}
340
+ className="flex items-start"
341
+ >
342
+ <AlertIcon render={<XCircleIcon />} className="mt-0.5 shrink-0" />
343
+ <div className="flex-1 space-y-0.5">
344
+ <AlertTitle>Kết nối thất bại</AlertTitle>
345
+ <AlertDescription>
346
+ Không thể kết nối đến cơ sở dữ liệu. Vui lòng kiểm tra lại đường
347
+ truyền mạng.
348
+ </AlertDescription>
349
+ </div>
350
+ </Alert>
351
+ </ExampleSection>
352
+
353
+ <ExampleGrid>
354
+ {/* ── Default (no color) ───────────────────── */}
355
+ <ExampleSection
356
+ label="Cơ bản (Basic)"
357
+ description="Hiển thị Alert với màu sắc mặc định (info)."
358
+ fullWidth
359
+ codeString={`<Alert className="flex items-start">
360
+ <AlertIcon render={<InfoIcon />} className="mt-0.5 shrink-0" />
361
+ <div className="flex-1 space-y-0.5">
362
+ <AlertTitle>Chú ý!</AlertTitle>
363
+ <AlertDescription>
364
+ Bạn có thể thêm các component vào dự án bằng cách sử dụng CLI.
365
+ </AlertDescription>
366
+ </div>
367
+ </Alert>
368
+ `}
369
+ >
370
+ <Alert size={globalSize} className="flex items-start">
371
+ <AlertIcon render={<InfoIcon />} className="mt-0.5 shrink-0" />
372
+ <div className="flex-1 space-y-0.5">
373
+ <AlertTitle>Chú ý!</AlertTitle>
374
+ <AlertDescription>
375
+ Bạn có thể thêm các component vào dự án bằng cách sử dụng CLI.
376
+ </AlertDescription>
377
+ </div>
378
+ </Alert>
379
+ </ExampleSection>
380
+
381
+ {/* ── With Action ───────────────────── */}
382
+ <ExampleSection
383
+ label="Có Nút Hành Động (With Action)"
384
+ description="Alert kèm theo một nút tắt (dismiss) được đặt ở góc trên bên phải."
385
+ fullWidth
386
+ codeString={`<Alert
387
+ color="info"
388
+ className="flex items-start relative"
389
+ >
390
+ <AlertIcon render={<InfoIcon />} className="mt-0.5 shrink-0" />
391
+ <div className="flex-1 space-y-0.5 pr-8">
392
+ <AlertTitle>Tính năng mới</AlertTitle>
393
+ <AlertDescription>
394
+ Hãy khám phá trang thống kê dashboard hoàn toàn mới của chúng
395
+ tôi.
396
+ </AlertDescription>
397
+ </div>
398
+ <AlertAction className="absolute right-1 top-1">
399
+ <Button
400
+ variant="ghost"
401
+ size="sm"
402
+ className="size-6 p-0 group-data-[size=sm]/alert:size-5 group-data-[size=lg]/alert:size-7"
403
+ >
404
+ <XIcon className="size-3.5 group-data-[size=sm]/alert:size-3 group-data-[size=lg]/alert:size-4" />
405
+ </Button>
406
+ </AlertAction>
407
+ </Alert>
408
+ `}
409
+ >
410
+ <Alert
411
+ color="info"
412
+ size={globalSize}
413
+ className="flex items-start relative"
414
+ >
415
+ <AlertIcon render={<InfoIcon />} className="mt-0.5 shrink-0" />
416
+ <div className="flex-1 space-y-0.5 pr-8">
417
+ <AlertTitle>Tính năng mới</AlertTitle>
418
+ <AlertDescription>
419
+ Hãy khám phá trang thống kê dashboard hoàn toàn mới của chúng
420
+ tôi.
421
+ </AlertDescription>
422
+ </div>
423
+ <AlertAction className="absolute right-1 top-1">
424
+ <Button
425
+ variant="ghost"
426
+ size="sm"
427
+ className="size-6 p-0 group-data-[size=sm]/alert:size-5 group-data-[size=lg]/alert:size-7"
428
+ iconOnly
429
+ >
430
+ <XIcon className="size-3.5 group-data-[size=sm]/alert:size-3 group-data-[size=lg]/alert:size-4" />
431
+ </Button>
432
+ </AlertAction>
433
+ </Alert>
434
+ </ExampleSection>
435
+ </ExampleGrid>
436
+
437
+ {/* ── Minimal (no title) ───────────────────── */}
438
+ <ExampleSection
439
+ label="Tối Giản (Minimal)"
440
+ description="Alert chỉ có nội dung mô tả, không có tiêu đề."
441
+ fullWidth
442
+ codeString={`<Alert color="info" className="flex items-start">
443
+ <AlertIcon render={<InfoIcon />} className="mt-0.5 shrink-0" />
444
+ <AlertDescription className="flex-1">
445
+ Bạn có thể thêm các component vào dự án bằng cách sử dụng CLI.
446
+ </AlertDescription>
447
+ </Alert>
448
+ <Alert color="warning" className="flex items-start">
449
+ <AlertIcon
450
+ render={<TriangleAlertIcon />}
451
+ className="mt-0.5 shrink-0"
452
+ />
453
+ <AlertDescription className="flex-1">
454
+ Bản dùng thử của bạn sẽ hết hạn trong 3 ngày nữa.
455
+ </AlertDescription>
456
+ </Alert>
457
+ `}
458
+ >
459
+ <Alert color="info" size={globalSize} className="flex items-start">
460
+ <AlertIcon render={<InfoIcon />} className="mt-0.5 shrink-0" />
461
+ <AlertDescription className="flex-1">
462
+ Bạn có thể thêm các component vào dự án bằng cách sử dụng CLI.
463
+ </AlertDescription>
464
+ </Alert>
465
+ <Alert color="warning" size={globalSize} className="flex items-start">
466
+ <AlertIcon
467
+ render={<TriangleAlertIcon />}
468
+ className="mt-0.5 shrink-0"
469
+ />
470
+ <AlertDescription className="flex-1">
471
+ Bản dùng thử của bạn sẽ hết hạn trong 3 ngày nữa.
472
+ </AlertDescription>
473
+ </Alert>
474
+ </ExampleSection>
475
+
476
+ {/* ── Text Only (no icon) ───────────────────── */}
477
+ <ExampleSection
478
+ label="Chỉ Có Chữ (Text Only)"
479
+ description="Alert đơn giản không có icon — layout tự nhiên."
480
+ fullWidth
481
+ codeString={`<Alert
482
+ color="success"
483
+ className="flex flex-col gap-0.5"
484
+ >
485
+ <AlertTitle>Thanh toán thành công</AlertTitle>
486
+ <AlertDescription>
487
+ Hoá đơn #1234 của bạn đã được thanh toán hoàn tất.
488
+ </AlertDescription>
489
+ </Alert>
490
+ <Alert
491
+ color="destructive"
492
+ className="flex flex-col gap-0.5"
493
+ >
494
+ <AlertTitle>Tài khoản bị khoá</AlertTitle>
495
+ <AlertDescription>
496
+ Vui lòng liên hệ với bộ phận hỗ trợ để mở khoá tài khoản.
497
+ </AlertDescription>
498
+ </Alert>
499
+ `}
500
+ >
501
+ <Alert
502
+ color="success"
503
+ size={globalSize}
504
+ className="flex flex-col gap-0.5"
505
+ >
506
+ <AlertTitle>Thanh toán thành công</AlertTitle>
507
+ <AlertDescription>
508
+ Hoá đơn #1234 của bạn đã được thanh toán hoàn tất.
509
+ </AlertDescription>
510
+ </Alert>
511
+ <Alert
512
+ color="destructive"
513
+ size={globalSize}
514
+ className="flex flex-col gap-0.5"
515
+ >
516
+ <AlertTitle>Tài khoản bị khoá</AlertTitle>
517
+ <AlertDescription>
518
+ Vui lòng liên hệ với bộ phận hỗ trợ để mở khoá tài khoản.
519
+ </AlertDescription>
520
+ </Alert>
521
+ </ExampleSection>
522
+
523
+ {/* ── Use Case Comparison ─────────────────────── */}
524
+ <ExampleSection
525
+ label="🧭 Use Case Comparison"
526
+ description="Các kịch bản thực tế giúp bạn quyết định nên dùng Micro hay Macro."
527
+ fullWidth
528
+ codeString={`<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
529
+ {/* ── Story 1: Macro wins ── */}
530
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
531
+ <div className="flex items-start gap-3">
532
+ <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
533
+ <CheckCircle2Icon className="size-4" aria-hidden="true" />
534
+ </span>
535
+ <div>
536
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
537
+ Story 1 · Dùng Macro
538
+ </p>
539
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
540
+ Thông báo chuẩn, cho phép tự đóng
541
+ </h3>
542
+ </div>
543
+ </div>
544
+
545
+ <p className="text-xs text-muted-foreground leading-relaxed">
546
+ Phần lớn các cảnh báo trong ứng dụng đều đi kèm Icon, Tiêu đề, Nội
547
+ dung, và nút X để tự tắt (Dismiss). Dùng Macro sẽ tiết kiệm cực kỳ
548
+ nhiều code.
549
+ </p>
550
+
551
+ <div className="rounded-lg bg-muted/50 p-3">
552
+ <AlertPreset
553
+ color="info"
554
+ size="sm"
555
+ title="Có bản cập nhật mới"
556
+ description="Phiên bản 2.0.4 đã sẵn sàng để tải xuống."
557
+ icon={<InfoIcon />}
558
+ dismissible
559
+ />
560
+ </div>
561
+
562
+ <div className="rounded-md border border-border border-green-500/20 bg-green-500/5 px-3 py-2">
563
+ <p className="text-xs font-medium text-green-700 dark:text-green-400">
564
+ ✅ Dùng <code className="font-mono">AlertPreset</code> — Prop{" "}
565
+ <code className="font-mono">dismissible</code> tự động xử lý
566
+ state tắt Alert.
567
+ </p>
568
+ </div>
569
+ </div>
570
+
571
+ {/* ── Story 2: Micro wins ── */}
572
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
573
+ <div className="flex items-start gap-3">
574
+ <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
575
+ <CheckCircle2Icon className="size-4" aria-hidden="true" />
576
+ </span>
577
+ <div>
578
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
579
+ Story 2 · Dùng Micro
580
+ </p>
581
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
582
+ Giao diện Alert không theo chuẩn
583
+ </h3>
584
+ </div>
585
+ </div>
586
+
587
+ <p className="text-xs text-muted-foreground leading-relaxed">
588
+ Khi bạn cần tạo một Alert với layout đặc biệt, ví dụ như không có
589
+ icon, hoặc muốn chèn form vào giữa. Macro sẽ bị hạn chế vì đã chốt
590
+ sẵn layout Flexbox ngang.
591
+ </p>
592
+
593
+ <div className="rounded-lg bg-muted/50 p-3">
594
+ <Alert
595
+ color="warning"
596
+ size="sm"
597
+ className="flex flex-col gap-0.5"
598
+ >
599
+ <AlertTitle>Bản dùng thử hết hạn</AlertTitle>
600
+ <AlertDescription>
601
+ Chỉ còn 3 ngày nữa. Vui lòng thanh toán!
602
+ </AlertDescription>
603
+ <Button
604
+ variant="soft"
605
+ color="warning"
606
+ size="sm"
607
+ className="mt-2 w-fit"
608
+ >
609
+ Nâng Cấp Ngay
610
+ </Button>
611
+ </Alert>
612
+ </div>
613
+
614
+ <div className="rounded-md border border-border border-blue-500/20 bg-blue-500/5 px-3 py-2">
615
+ <p className="text-xs font-medium text-blue-700 dark:text-blue-400">
616
+ ✅ Dùng <code className="font-mono">Alert</code> (Micro) — Bạn
617
+ tự viết class <code className="font-mono">flex-col</code>, tự
618
+ chèn nội dung thoải mái.
619
+ </p>
620
+ </div>
621
+ </div>
622
+ </div>
623
+ `}
624
+ >
625
+ <div className="grid grid-cols-1 gap-6 md:grid-cols-2">
626
+ {/* ── Story 1: Macro wins ── */}
627
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
628
+ <div className="flex items-start gap-3">
629
+ <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
630
+ <CheckCircle2Icon className="size-4" aria-hidden="true" />
631
+ </span>
632
+ <div>
633
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
634
+ Story 1 · Dùng Macro
635
+ </p>
636
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
637
+ Thông báo chuẩn, cho phép tự đóng
638
+ </h3>
639
+ </div>
640
+ </div>
641
+
642
+ <p className="text-xs text-muted-foreground leading-relaxed">
643
+ Phần lớn các cảnh báo trong ứng dụng đều đi kèm Icon, Tiêu đề, Nội
644
+ dung, và nút X để tự tắt (Dismiss). Dùng Macro sẽ tiết kiệm cực kỳ
645
+ nhiều code.
646
+ </p>
647
+
648
+ <div className="rounded-lg bg-muted/50 p-3">
649
+ <AlertPreset
650
+ color="info"
651
+ size="sm"
652
+ title="Có bản cập nhật mới"
653
+ description="Phiên bản 2.0.4 đã sẵn sàng để tải xuống."
654
+ icon={<InfoIcon />}
655
+ dismissible
656
+ />
657
+ </div>
658
+
659
+ <div className="rounded-md border border-border border-green-500/20 bg-green-500/5 px-3 py-2">
660
+ <p className="text-xs font-medium text-green-700 dark:text-green-400">
661
+ ✅ Dùng <code className="font-mono">AlertPreset</code> — Prop{" "}
662
+ <code className="font-mono">dismissible</code> tự động xử lý
663
+ state tắt Alert.
664
+ </p>
665
+ </div>
666
+ </div>
667
+
668
+ {/* ── Story 2: Micro wins ── */}
669
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
670
+ <div className="flex items-start gap-3">
671
+ <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
672
+ <CheckCircle2Icon className="size-4" aria-hidden="true" />
673
+ </span>
674
+ <div>
675
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
676
+ Story 2 · Dùng Micro
677
+ </p>
678
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
679
+ Giao diện Alert không theo chuẩn
680
+ </h3>
681
+ </div>
682
+ </div>
683
+
684
+ <p className="text-xs text-muted-foreground leading-relaxed">
685
+ Khi bạn cần tạo một Alert với layout đặc biệt, ví dụ như không có
686
+ icon, hoặc muốn chèn form vào giữa. Macro sẽ bị hạn chế vì đã chốt
687
+ sẵn layout Flexbox ngang.
688
+ </p>
689
+
690
+ <div className="rounded-lg bg-muted/50 p-3">
691
+ <Alert
692
+ color="warning"
693
+ size="sm"
694
+ className="flex flex-col gap-0.5"
695
+ >
696
+ <AlertTitle>Bản dùng thử hết hạn</AlertTitle>
697
+ <AlertDescription>
698
+ Chỉ còn 3 ngày nữa. Vui lòng thanh toán!
699
+ </AlertDescription>
700
+ <Button
701
+ variant="soft"
702
+ color="warning"
703
+ size="sm"
704
+ className="mt-2 w-fit"
705
+ >
706
+ Nâng Cấp Ngay
707
+ </Button>
708
+ </Alert>
709
+ </div>
710
+
711
+ <div className="rounded-md border border-border border-blue-500/20 bg-blue-500/5 px-3 py-2">
712
+ <p className="text-xs font-medium text-blue-700 dark:text-blue-400">
713
+ ✅ Dùng <code className="font-mono">Alert</code> (Micro) — Bạn
714
+ tự viết class <code className="font-mono">flex-col</code>, tự
715
+ chèn nội dung thoải mái.
716
+ </p>
717
+ </div>
718
+ </div>
719
+ </div>
720
+ </ExampleSection>
721
+ </div>
722
+ );
723
+ }
724
+
725
+ // ──────────────────────────────────────────────────────────
726
+ // SECTION 3: Entry point (export default)
727
+ // ──────────────────────────────────────────────────────────
728
+ export default function AlertShowcase() {
729
+ const { size: globalSize } = useDevContext();
730
+ return (
731
+ <Showcase
732
+ title="Alert"
733
+ description="Hiển thị một thông báo nổi bật để thu hút sự chú ý của người dùng."
734
+ generalConcept={
735
+ <ShowcaseDocs>
736
+ <DocsP>
737
+ Dùng để hiển thị một thông báo quan trọng thu hút sự chú ý của người
738
+ dùng (ví dụ: lỗi, cảnh báo, hoặc thông báo thành công). Không nên
739
+ dùng Alert cho các thông báo mang tính tạm thời tự biến mất (hãy
740
+ dùng Toast/Sonner).
741
+ </DocsP>
742
+ </ShowcaseDocs>
743
+ }
744
+ tabs={[
745
+ {
746
+ label: "Micro (Primitive)",
747
+ content: <AlertMicroShowcase globalSize={globalSize} />,
748
+ },
749
+ {
750
+ label: "Macro (Preset)",
751
+ content: <AlertMacroShowcase globalSize={globalSize} />,
752
+ },
753
+ ]}
754
+ />
755
+ );
756
+ }