gladvn 0.2.17 → 0.2.18

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 (313) hide show
  1. package/bin/cli.js +9 -6
  2. package/dist/components/macro/accordion-preset.d.ts.map +1 -1
  3. package/dist/components/macro/alert-dialog-preset.d.ts.map +1 -1
  4. package/dist/components/macro/alert-preset.d.ts.map +1 -1
  5. package/dist/components/macro/avatar-preset.d.ts.map +1 -1
  6. package/dist/components/macro/breadcrumb-preset.d.ts.map +1 -1
  7. package/dist/components/macro/card-preset.d.ts.map +1 -1
  8. package/dist/components/macro/carousel-preset.d.ts.map +1 -1
  9. package/dist/components/macro/checkbox-preset.d.ts.map +1 -1
  10. package/dist/components/macro/combobox-preset.d.ts.map +1 -1
  11. package/dist/components/macro/command-preset.d.ts +1 -1
  12. package/dist/components/macro/command-preset.d.ts.map +1 -1
  13. package/dist/components/macro/date-picker.d.ts.map +1 -1
  14. package/dist/components/macro/dialog-preset.d.ts.map +1 -1
  15. package/dist/components/macro/empty-preset.d.ts.map +1 -1
  16. package/dist/components/macro/field-preset.d.ts.map +1 -1
  17. package/dist/components/macro/input-otp-preset.d.ts +6 -0
  18. package/dist/components/macro/input-otp-preset.d.ts.map +1 -1
  19. package/dist/components/macro/input-preset.d.ts +1 -1
  20. package/dist/components/macro/input-preset.d.ts.map +1 -1
  21. package/dist/components/macro/pagination-preset.d.ts.map +1 -1
  22. package/dist/components/macro/progress-preset.d.ts.map +1 -1
  23. package/dist/components/macro/radio-group-preset.d.ts.map +1 -1
  24. package/dist/components/macro/select-preset.d.ts.map +1 -1
  25. package/dist/components/macro/slider-preset.d.ts.map +1 -1
  26. package/dist/components/macro/switch-preset.d.ts.map +1 -1
  27. package/dist/components/macro/tabs-preset.d.ts +1 -1
  28. package/dist/components/macro/tabs-preset.d.ts.map +1 -1
  29. package/dist/components/macro/textarea-preset.d.ts +1 -1
  30. package/dist/components/macro/textarea-preset.d.ts.map +1 -1
  31. package/dist/components/micro/accordion.d.ts +7 -0
  32. package/dist/components/micro/accordion.d.ts.map +1 -1
  33. package/dist/components/micro/alert-dialog.d.ts.map +1 -1
  34. package/dist/components/micro/alert.d.ts +7 -0
  35. package/dist/components/micro/alert.d.ts.map +1 -1
  36. package/dist/components/micro/aspect-ratio.d.ts +7 -0
  37. package/dist/components/micro/aspect-ratio.d.ts.map +1 -1
  38. package/dist/components/micro/avatar.d.ts.map +1 -1
  39. package/dist/components/micro/badge.d.ts +8 -1
  40. package/dist/components/micro/badge.d.ts.map +1 -1
  41. package/dist/components/micro/breadcrumb.d.ts +7 -0
  42. package/dist/components/micro/breadcrumb.d.ts.map +1 -1
  43. package/dist/components/micro/button.d.ts +8 -1
  44. package/dist/components/micro/button.d.ts.map +1 -1
  45. package/dist/components/micro/calendar.d.ts +2 -2
  46. package/dist/components/micro/calendar.d.ts.map +1 -1
  47. package/dist/components/micro/carousel.d.ts.map +1 -1
  48. package/dist/components/micro/chart.d.ts.map +1 -1
  49. package/dist/components/micro/checkbox.d.ts.map +1 -1
  50. package/dist/components/micro/collapsible.d.ts.map +1 -1
  51. package/dist/components/micro/combobox.d.ts.map +1 -1
  52. package/dist/components/micro/command.d.ts.map +1 -1
  53. package/dist/components/micro/context-menu.d.ts.map +1 -1
  54. package/dist/components/micro/dialog.d.ts.map +1 -1
  55. package/dist/components/micro/drawer.d.ts.map +1 -1
  56. package/dist/components/micro/dropdown-menu.d.ts.map +1 -1
  57. package/dist/components/micro/empty.d.ts +7 -0
  58. package/dist/components/micro/empty.d.ts.map +1 -1
  59. package/dist/components/micro/field.d.ts.map +1 -1
  60. package/dist/components/micro/hover-card.d.ts +1 -1
  61. package/dist/components/micro/hover-card.d.ts.map +1 -1
  62. package/dist/components/micro/input-group.d.ts.map +1 -1
  63. package/dist/components/micro/input-otp.d.ts.map +1 -1
  64. package/dist/components/micro/input.d.ts +7 -0
  65. package/dist/components/micro/input.d.ts.map +1 -1
  66. package/dist/components/micro/item.d.ts.map +1 -1
  67. package/dist/components/micro/label.d.ts.map +1 -1
  68. package/dist/components/micro/menubar.d.ts.map +1 -1
  69. package/dist/components/micro/navigation-menu.d.ts +8 -1
  70. package/dist/components/micro/navigation-menu.d.ts.map +1 -1
  71. package/dist/components/micro/pagination.d.ts.map +1 -1
  72. package/dist/components/micro/popover.d.ts.map +1 -1
  73. package/dist/components/micro/progress.d.ts.map +1 -1
  74. package/dist/components/micro/radio-group.d.ts.map +1 -1
  75. package/dist/components/micro/select.d.ts +1 -1
  76. package/dist/components/micro/select.d.ts.map +1 -1
  77. package/dist/components/micro/sheet.d.ts.map +1 -1
  78. package/dist/components/micro/sidebar.d.ts.map +1 -1
  79. package/dist/components/micro/skeleton.d.ts +7 -0
  80. package/dist/components/micro/skeleton.d.ts.map +1 -1
  81. package/dist/components/micro/slider.d.ts +7 -0
  82. package/dist/components/micro/slider.d.ts.map +1 -1
  83. package/dist/components/micro/sonner.d.ts.map +1 -1
  84. package/dist/components/micro/spinner.d.ts.map +1 -1
  85. package/dist/components/micro/switch.d.ts.map +1 -1
  86. package/dist/components/micro/table.d.ts.map +1 -1
  87. package/dist/components/micro/tabs.d.ts +1 -1
  88. package/dist/components/micro/tabs.d.ts.map +1 -1
  89. package/dist/components/micro/textarea.d.ts +7 -0
  90. package/dist/components/micro/textarea.d.ts.map +1 -1
  91. package/dist/components/micro/toggle-group.d.ts.map +1 -1
  92. package/dist/components/micro/toggle.d.ts.map +1 -1
  93. package/dist/components/micro/tooltip.d.ts +1 -1
  94. package/dist/components/micro/tooltip.d.ts.map +1 -1
  95. package/dist/dev/App.d.ts.map +1 -1
  96. package/dist/dev/components/code-highlighter.d.ts.map +1 -1
  97. package/dist/dev/components/dev-context.d.ts.map +1 -1
  98. package/dist/dev/components/showcase.d.ts +1 -1
  99. package/dist/dev/components/showcase.d.ts.map +1 -1
  100. package/dist/dev/data.d.ts.map +1 -1
  101. package/dist/dev/main.d.ts.map +1 -1
  102. package/dist/dev/sections/buttons.d.ts.map +1 -1
  103. package/dist/dev/sections/feedback.d.ts.map +1 -1
  104. package/dist/dev/sections/overview.d.ts.map +1 -1
  105. package/dist/dev/showcase/accordion.d.ts.map +1 -1
  106. package/dist/dev/showcase/alert-dialog.d.ts.map +1 -1
  107. package/dist/dev/showcase/alert.d.ts.map +1 -1
  108. package/dist/dev/showcase/aspect-ratio.d.ts.map +1 -1
  109. package/dist/dev/showcase/avatar.d.ts.map +1 -1
  110. package/dist/dev/showcase/breadcrumb.d.ts.map +1 -1
  111. package/dist/dev/showcase/button.d.ts.map +1 -1
  112. package/dist/dev/showcase/calendar.d.ts.map +1 -1
  113. package/dist/dev/showcase/card.d.ts.map +1 -1
  114. package/dist/dev/showcase/carousel.d.ts.map +1 -1
  115. package/dist/dev/showcase/chart.d.ts.map +1 -1
  116. package/dist/dev/showcase/checkbox.d.ts.map +1 -1
  117. package/dist/dev/showcase/collapsible.d.ts.map +1 -1
  118. package/dist/dev/showcase/combobox.d.ts.map +1 -1
  119. package/dist/dev/showcase/command.d.ts.map +1 -1
  120. package/dist/dev/showcase/context-menu.d.ts.map +1 -1
  121. package/dist/dev/showcase/dialog.d.ts.map +1 -1
  122. package/dist/dev/showcase/drawer.d.ts.map +1 -1
  123. package/dist/dev/showcase/dropdown-menu.d.ts.map +1 -1
  124. package/dist/dev/showcase/empty.d.ts.map +1 -1
  125. package/dist/dev/showcase/hover-card.d.ts.map +1 -1
  126. package/dist/dev/showcase/input-group.d.ts.map +1 -1
  127. package/dist/dev/showcase/input-otp.d.ts.map +1 -1
  128. package/dist/dev/showcase/input.d.ts.map +1 -1
  129. package/dist/dev/showcase/item.d.ts.map +1 -1
  130. package/dist/dev/showcase/kbd.d.ts.map +1 -1
  131. package/dist/dev/showcase/label.d.ts.map +1 -1
  132. package/dist/dev/showcase/menubar.d.ts.map +1 -1
  133. package/dist/dev/showcase/navigation-menu.d.ts.map +1 -1
  134. package/dist/dev/showcase/overview.d.ts.map +1 -1
  135. package/dist/dev/showcase/pagination.d.ts.map +1 -1
  136. package/dist/dev/showcase/popover.d.ts.map +1 -1
  137. package/dist/dev/showcase/progress.d.ts.map +1 -1
  138. package/dist/dev/showcase/radio-group.d.ts.map +1 -1
  139. package/dist/dev/showcase/resizable.d.ts.map +1 -1
  140. package/dist/dev/showcase/scroll-area.d.ts.map +1 -1
  141. package/dist/dev/showcase/select.d.ts.map +1 -1
  142. package/dist/dev/showcase/separator.d.ts.map +1 -1
  143. package/dist/dev/showcase/sheet.d.ts.map +1 -1
  144. package/dist/dev/showcase/sidebar.d.ts.map +1 -1
  145. package/dist/dev/showcase/skeleton.d.ts.map +1 -1
  146. package/dist/dev/showcase/slider.d.ts.map +1 -1
  147. package/dist/dev/showcase/sonner.d.ts.map +1 -1
  148. package/dist/dev/showcase/spinner.d.ts.map +1 -1
  149. package/dist/dev/showcase/switch.d.ts.map +1 -1
  150. package/dist/dev/showcase/table.d.ts.map +1 -1
  151. package/dist/dev/showcase/tabs.d.ts.map +1 -1
  152. package/dist/dev/showcase/textarea.d.ts.map +1 -1
  153. package/dist/dev/showcase/theme-provider.d.ts.map +1 -1
  154. package/dist/dev/showcase/toast.d.ts.map +1 -1
  155. package/dist/dev/showcase/toggle-group.d.ts.map +1 -1
  156. package/dist/dev/showcase/toggle.d.ts.map +1 -1
  157. package/dist/dev/showcase/tooltip.d.ts.map +1 -1
  158. package/dist/index.cjs.map +1 -1
  159. package/dist/index.js.map +1 -1
  160. package/dist/lib/utils.d.ts.map +1 -1
  161. package/package.json +3 -1
  162. package/scripts/format-codestrings.ts +87 -0
  163. package/scripts/organize-imports.ts +21 -0
  164. package/scripts/regex-format.cjs +67 -0
  165. package/scripts/tmp.tsx +25 -0
  166. package/src/components/macro/accordion-preset.test.tsx +1 -0
  167. package/src/components/macro/accordion-preset.tsx +2 -1
  168. package/src/components/macro/alert-dialog-preset.tsx +44 -43
  169. package/src/components/macro/alert-preset.tsx +7 -3
  170. package/src/components/macro/avatar-preset.tsx +2 -1
  171. package/src/components/macro/breadcrumb-preset.tsx +2 -1
  172. package/src/components/macro/card-preset.tsx +2 -1
  173. package/src/components/macro/carousel-preset.tsx +5 -2
  174. package/src/components/macro/checkbox-preset.test.tsx +1 -0
  175. package/src/components/macro/checkbox-preset.tsx +6 -2
  176. package/src/components/macro/combobox-preset.tsx +6 -3
  177. package/src/components/macro/command-preset.tsx +7 -3
  178. package/src/components/macro/date-picker.tsx +77 -59
  179. package/src/components/macro/dialog-preset.tsx +42 -38
  180. package/src/components/macro/empty-preset.tsx +2 -1
  181. package/src/components/macro/field-preset.test.tsx +1 -0
  182. package/src/components/macro/field-preset.tsx +2 -1
  183. package/src/components/macro/input-otp-preset.tsx +6 -2
  184. package/src/components/macro/input-preset.test.tsx +1 -0
  185. package/src/components/macro/input-preset.tsx +4 -2
  186. package/src/components/macro/pagination-preset.tsx +3 -1
  187. package/src/components/macro/progress-preset.test.tsx +1 -0
  188. package/src/components/macro/progress-preset.tsx +2 -1
  189. package/src/components/macro/radio-group-preset.tsx +4 -1
  190. package/src/components/macro/select-preset.tsx +35 -30
  191. package/src/components/macro/slider-preset.test.tsx +1 -0
  192. package/src/components/macro/slider-preset.tsx +4 -1
  193. package/src/components/macro/switch-preset.test.tsx +1 -0
  194. package/src/components/macro/switch-preset.tsx +4 -1
  195. package/src/components/macro/tabs-preset.test.tsx +1 -0
  196. package/src/components/macro/tabs-preset.tsx +4 -2
  197. package/src/components/macro/textarea-preset.test.tsx +1 -0
  198. package/src/components/macro/textarea-preset.tsx +4 -1
  199. package/src/components/micro/accordion.tsx +3 -2
  200. package/src/components/micro/alert-dialog.tsx +2 -1
  201. package/src/components/micro/alert.tsx +3 -2
  202. package/src/components/micro/aspect-ratio.tsx +2 -1
  203. package/src/components/micro/avatar.tsx +2 -1
  204. package/src/components/micro/badge.tsx +3 -3
  205. package/src/components/micro/breadcrumb.tsx +3 -2
  206. package/src/components/micro/button.test.tsx +1 -0
  207. package/src/components/micro/button.tsx +3 -3
  208. package/src/components/micro/calendar.tsx +10 -9
  209. package/src/components/micro/carousel.tsx +3 -2
  210. package/src/components/micro/chart.tsx +1 -0
  211. package/src/components/micro/checkbox.tsx +2 -2
  212. package/src/components/micro/collapsible.tsx +4 -2
  213. package/src/components/micro/combobox.tsx +41 -29
  214. package/src/components/micro/command.tsx +23 -16
  215. package/src/components/micro/context-menu.tsx +3 -2
  216. package/src/components/micro/dialog.tsx +2 -1
  217. package/src/components/micro/drawer.tsx +2 -1
  218. package/src/components/micro/dropdown-menu.tsx +3 -2
  219. package/src/components/micro/empty.tsx +2 -1
  220. package/src/components/micro/field.tsx +4 -3
  221. package/src/components/micro/hover-card.tsx +20 -19
  222. package/src/components/micro/input-group.tsx +2 -1
  223. package/src/components/micro/input-otp.tsx +3 -2
  224. package/src/components/micro/input.tsx +3 -2
  225. package/src/components/micro/item.tsx +1 -0
  226. package/src/components/micro/label.tsx +2 -1
  227. package/src/components/micro/menubar.tsx +2 -1
  228. package/src/components/micro/navigation-menu.tsx +18 -17
  229. package/src/components/micro/pagination.tsx +2 -1
  230. package/src/components/micro/popover.tsx +2 -1
  231. package/src/components/micro/progress.tsx +2 -1
  232. package/src/components/micro/radio-group.tsx +3 -3
  233. package/src/components/micro/select.tsx +5 -4
  234. package/src/components/micro/sheet.tsx +2 -1
  235. package/src/components/micro/sidebar.tsx +4 -1
  236. package/src/components/micro/skeleton.tsx +2 -1
  237. package/src/components/micro/slider.tsx +4 -1
  238. package/src/components/micro/sonner.tsx +2 -1
  239. package/src/components/micro/spinner.tsx +1 -2
  240. package/src/components/micro/switch.tsx +2 -2
  241. package/src/components/micro/table.tsx +2 -1
  242. package/src/components/micro/tabs.tsx +4 -3
  243. package/src/components/micro/textarea.tsx +2 -1
  244. package/src/components/micro/toggle-group.tsx +1 -0
  245. package/src/components/micro/toggle.tsx +1 -3
  246. package/src/components/micro/tooltip.tsx +9 -3
  247. package/src/dev/App.tsx +66 -41
  248. package/src/dev/components/code-highlighter.tsx +2 -1
  249. package/src/dev/components/dev-context.tsx +1 -0
  250. package/src/dev/components/showcase.tsx +13 -14
  251. package/src/dev/data.ts +206 -52
  252. package/src/dev/main.tsx +4 -4
  253. package/src/dev/sections/buttons.tsx +14 -12
  254. package/src/dev/sections/feedback.tsx +7 -2
  255. package/src/dev/sections/forms.tsx +11 -11
  256. package/src/dev/sections/overview.tsx +2 -1
  257. package/src/dev/showcase/accordion.tsx +399 -314
  258. package/src/dev/showcase/alert-dialog.tsx +387 -384
  259. package/src/dev/showcase/alert.tsx +271 -258
  260. package/src/dev/showcase/aspect-ratio.tsx +102 -105
  261. package/src/dev/showcase/avatar.tsx +216 -145
  262. package/src/dev/showcase/badge.tsx +78 -50
  263. package/src/dev/showcase/breadcrumb.tsx +88 -85
  264. package/src/dev/showcase/button.tsx +72 -96
  265. package/src/dev/showcase/calendar.tsx +41 -39
  266. package/src/dev/showcase/card.tsx +170 -148
  267. package/src/dev/showcase/carousel.tsx +239 -77
  268. package/src/dev/showcase/chart.tsx +5 -4
  269. package/src/dev/showcase/checkbox.tsx +206 -140
  270. package/src/dev/showcase/collapsible.tsx +108 -84
  271. package/src/dev/showcase/combobox.tsx +272 -199
  272. package/src/dev/showcase/command.tsx +31 -28
  273. package/src/dev/showcase/context-menu.tsx +94 -77
  274. package/src/dev/showcase/dialog.tsx +445 -424
  275. package/src/dev/showcase/drawer.tsx +142 -135
  276. package/src/dev/showcase/dropdown-menu.tsx +165 -161
  277. package/src/dev/showcase/empty.tsx +173 -158
  278. package/src/dev/showcase/hover-card.tsx +92 -52
  279. package/src/dev/showcase/input-group.tsx +193 -160
  280. package/src/dev/showcase/input-otp.tsx +109 -99
  281. package/src/dev/showcase/input.tsx +78 -42
  282. package/src/dev/showcase/item.tsx +101 -98
  283. package/src/dev/showcase/kbd.tsx +78 -62
  284. package/src/dev/showcase/label.tsx +16 -23
  285. package/src/dev/showcase/menubar.tsx +274 -251
  286. package/src/dev/showcase/navigation-menu.tsx +175 -170
  287. package/src/dev/showcase/overview.tsx +164 -148
  288. package/src/dev/showcase/pagination.tsx +101 -69
  289. package/src/dev/showcase/popover.tsx +113 -86
  290. package/src/dev/showcase/progress.tsx +99 -69
  291. package/src/dev/showcase/radio-group.tsx +217 -134
  292. package/src/dev/showcase/resizable.tsx +65 -55
  293. package/src/dev/showcase/scroll-area.tsx +32 -22
  294. package/src/dev/showcase/select.tsx +192 -136
  295. package/src/dev/showcase/separator.tsx +28 -24
  296. package/src/dev/showcase/sheet.tsx +182 -134
  297. package/src/dev/showcase/sidebar.tsx +9 -5
  298. package/src/dev/showcase/skeleton.tsx +54 -59
  299. package/src/dev/showcase/slider.tsx +158 -129
  300. package/src/dev/showcase/sonner.tsx +3 -5
  301. package/src/dev/showcase/spinner.tsx +22 -18
  302. package/src/dev/showcase/switch.tsx +207 -110
  303. package/src/dev/showcase/table.tsx +44 -32
  304. package/src/dev/showcase/tabs.tsx +272 -267
  305. package/src/dev/showcase/textarea.tsx +162 -116
  306. package/src/dev/showcase/theme-provider.tsx +596 -534
  307. package/src/dev/showcase/toast.tsx +37 -38
  308. package/src/dev/showcase/toggle-group.tsx +87 -39
  309. package/src/dev/showcase/toggle.tsx +36 -27
  310. package/src/dev/showcase/tooltip.tsx +154 -119
  311. package/src/lib/utils.test.ts +1 -0
  312. package/src/lib/utils.ts +1 -1
  313. package/src/styles/gladvn.css +1 -1
@@ -1,16 +1,7 @@
1
- import { useDevContext } from "../../dev/components/dev-context";
2
- import {
3
- DocsCode,
4
- DocsH3,
5
- DocsP,
6
- ExampleGrid,
7
- ExampleSection,
8
- Showcase,
9
- ShowcaseDocs,
10
- } from "../../dev/components/showcase";
11
- import { CheckCircle2Icon, LayersIcon, XIcon } from "lucide-react";
12
1
  import { useState } from "react";
13
2
 
3
+ import { CheckCircle2Icon, LayersIcon, XIcon } from "lucide-react";
4
+
14
5
  import { DialogPreset } from "../../components/macro/dialog-preset";
15
6
  import { Button } from "../../components/micro/button";
16
7
  import {
@@ -20,12 +11,22 @@ import {
20
11
  DialogDescription,
21
12
  DialogFooter,
22
13
  DialogHeader,
14
+ DialogPortal,
23
15
  DialogTitle,
24
16
  DialogTrigger,
25
- DialogPortal,
26
17
  } from "../../components/micro/dialog";
27
18
  import { Input } from "../../components/micro/input";
28
19
  import { Label } from "../../components/micro/label";
20
+ import { useDevContext } from "../../dev/components/dev-context";
21
+ import {
22
+ DocsCode,
23
+ DocsH3,
24
+ DocsP,
25
+ ExampleGrid,
26
+ ExampleSection,
27
+ Showcase,
28
+ ShowcaseDocs,
29
+ } from "../../dev/components/showcase";
29
30
  import { type Size } from "../../lib/types";
30
31
  import { cn } from "../../lib/utils";
31
32
 
@@ -42,17 +43,18 @@ function DialogMacroShowcase({ globalSize }: { globalSize: Size }) {
42
43
  label="Basic Usage"
43
44
  description="DialogPreset với title, description và footer đơn giản."
44
45
  codeString={`<DialogPreset
45
- title="Update Subscription"
46
- description="Are you sure you want to upgrade your plan to Pro? This will charge your card immediately."
47
- trigger={<Button variant="outline">Upgrade Plan</Button>}
48
- footer={
49
- <>
50
- <Button variant="ghost">Cancel</Button>
51
- <Button color="primary">Confirm</Button>
52
- </>
53
- }
54
- />
55
- `}
46
+ title="Update Subscription"
47
+ description="Are you sure you want to upgrade your plan to Pro? This will charge your card immediately."
48
+ trigger={
49
+ <Button variant="outline">Upgrade Plan</Button>
50
+ }
51
+ footer={
52
+ <>
53
+ <Button variant="ghost">Cancel</Button>
54
+ <Button color="primary">Confirm</Button>
55
+ </>
56
+ }
57
+ />`}
56
58
  >
57
59
  <DialogPreset
58
60
  size={globalSize}
@@ -80,35 +82,36 @@ function DialogMacroShowcase({ globalSize }: { globalSize: Size }) {
80
82
  label="Forms & Custom Content"
81
83
  description="Sử dụng children để render form hoặc nội dung phức tạp."
82
84
  codeString={`<DialogPreset
83
- title="Edit profile"
84
- description="Make changes to your profile here. Click save when you're done."
85
- trigger={<Button variant="outline">Edit Profile</Button>}
86
- footer={<Button type="submit">Save changes</Button>}
87
- >
88
- <div className="grid gap-4 py-4">
89
- <div className="grid grid-cols-4 items-center gap-4">
90
- <Label htmlFor="name" className="text-right">
91
- Name
92
- </Label>
93
- <Input
94
- id="name"
95
- defaultValue="Pedro Duarte"
96
- className="col-span-3"
97
- />
98
- </div>
99
- <div className="grid grid-cols-4 items-center gap-4">
100
- <Label htmlFor="username" className="text-right">
101
- Username
102
- </Label>
103
- <Input
104
- id="username"
105
- defaultValue="@peduarte"
106
- className="col-span-3"
107
- />
85
+ title="Edit profile"
86
+ description="Make changes to your profile here. Click save when you're done."
87
+ trigger={
88
+ <Button variant="outline">Edit Profile</Button>
89
+ }
90
+ footer={<Button type="submit">Save changes</Button>}
91
+ >
92
+ <div className="grid gap-4 py-4">
93
+ <div className="grid grid-cols-4 items-center gap-4">
94
+ <Label htmlFor="name" className="text-right">
95
+ Name
96
+ </Label>
97
+ <Input
98
+ id="name"
99
+ defaultValue="Pedro Duarte"
100
+ className="col-span-3"
101
+ />
102
+ </div>
103
+ <div className="grid grid-cols-4 items-center gap-4">
104
+ <Label htmlFor="username" className="text-right">
105
+ Username
106
+ </Label>
107
+ <Input
108
+ id="username"
109
+ defaultValue="@peduarte"
110
+ className="col-span-3"
111
+ />
112
+ </div>
108
113
  </div>
109
- </div>
110
- </DialogPreset>
111
- `}
114
+ </DialogPreset>`}
112
115
  >
113
116
  <DialogPreset
114
117
  size={globalSize}
@@ -156,22 +159,22 @@ function DialogMacroShowcase({ globalSize }: { globalSize: Size }) {
156
159
  label="No Close Button"
157
160
  description="Ẩn nút X ở góc trên bằng showCloseButton={false}."
158
161
  codeString={`<DialogPreset
159
- showCloseButton={false}
160
- title="Terms of Service"
161
- description="You must accept the new terms to continue using the application."
162
- trigger={<Button variant="outline">View Terms</Button>}
163
- footer={
164
- <>
165
- <Button variant="outline">Decline</Button>
166
- <Button>Accept</Button>
167
- </>
168
- }
169
- >
170
- <p className="text-sm text-muted-foreground">
171
- By clicking accept, you agree to our updated Terms of Service and Privacy Policy.
172
- </p>
173
- </DialogPreset>
174
- `}
162
+ showCloseButton={false}
163
+ title="Terms of Service"
164
+ description="You must accept the new terms to continue using the application."
165
+ trigger={<Button variant="outline">View Terms</Button>}
166
+ footer={
167
+ <>
168
+ <Button variant="outline">Decline</Button>
169
+ <Button>Accept</Button>
170
+ </>
171
+ }
172
+ >
173
+ <p className="text-sm text-muted-foreground">
174
+ By clicking accept, you agree to our updated Terms of
175
+ Service and Privacy Policy.
176
+ </p>
177
+ </DialogPreset>`}
175
178
  >
176
179
  <DialogPreset
177
180
  size={globalSize}
@@ -203,16 +206,17 @@ function DialogMacroShowcase({ globalSize }: { globalSize: Size }) {
203
206
  label="Large Content Sizing"
204
207
  description="Sử dụng size='lg' cho nội dung lớn hơn."
205
208
  codeString={`<DialogPreset
206
- title="Detailed Report"
207
- description="Monthly analytics and performance overview."
208
- trigger={<Button variant="outline">View Report</Button>}
209
- footer={<Button>Download PDF</Button>}
210
- >
211
- <div className="h-[200px] flex items-center justify-center rounded-md border border-border border-dashed bg-muted/20">
212
- <span className="text-muted-foreground text-sm">Large Content Area</span>
213
- </div>
214
- </DialogPreset>
215
- `}
209
+ title="Detailed Report"
210
+ description="Monthly analytics and performance overview."
211
+ trigger={<Button variant="outline">View Report</Button>}
212
+ footer={<Button>Download PDF</Button>}
213
+ >
214
+ <div className="h-[200px] flex items-center justify-center rounded-md border border-border border-dashed bg-muted/20">
215
+ <span className="text-muted-foreground text-sm">
216
+ Large Content Area
217
+ </span>
218
+ </div>
219
+ </DialogPreset>`}
216
220
  >
217
221
  <DialogPreset
218
222
  size={globalSize}
@@ -239,30 +243,37 @@ function DialogMacroShowcase({ globalSize }: { globalSize: Size }) {
239
243
  label="Controlled State"
240
244
  description="Sử dụng open và onOpenChange để quản lý trạng thái đóng mở bằng React state."
241
245
  codeString={`<div className="w-full flex flex-col gap-4 items-center justify-center">
242
- <div className="flex gap-4 items-center">
243
- <Button onClick={() => setControlledOpen(true)} variant="outline">
244
- Open Controlled Dialog
245
- </Button>
246
- <span className="text-sm text-muted-foreground font-mono">
247
- State: {controlledOpen ? "true" : "false"}
248
- </span>
249
- </div>
250
-
251
- <DialogPreset
252
- open={controlledOpen}
253
- onOpenChange={setControlledOpen}
254
- title="Controlled Dialog"
255
- description="Trạng thái của dialog này được quản lý hoàn toàn bởi React state bên ngoài."
256
- footer={
257
- <Button color="primary" onClick={() => setControlledOpen(false)}>
258
- Close Manually
246
+ <div className="flex gap-4 items-center">
247
+ <Button
248
+ onClick={() => setControlledOpen(true)}
249
+ variant="outline"
250
+ >
251
+ Open Controlled Dialog
259
252
  </Button>
260
- }
261
- >
262
- <p className="text-sm text-foreground">Bạn có thể đóng bằng nút bên dưới hoặc dấu X.</p>
263
- </DialogPreset>
264
- </div>
265
- `}
253
+ <span className="text-sm text-muted-foreground font-mono">
254
+ State: {controlledOpen ? "true" : "false"}
255
+ </span>
256
+ </div>
257
+
258
+ <DialogPreset
259
+ open={controlledOpen}
260
+ onOpenChange={setControlledOpen}
261
+ title="Controlled Dialog"
262
+ description="Trạng thái của dialog này được quản lý hoàn toàn bởi React state bên ngoài."
263
+ footer={
264
+ <Button
265
+ color="primary"
266
+ onClick={() => setControlledOpen(false)}
267
+ >
268
+ Close Manually
269
+ </Button>
270
+ }
271
+ >
272
+ <p className="text-sm text-foreground">
273
+ Bạn có thể đóng bằng nút bên dưới hoặc dấu X.
274
+ </p>
275
+ </DialogPreset>
276
+ </div>`}
266
277
  >
267
278
  <div className="w-full flex flex-col gap-4 items-center justify-center">
268
279
  <div className="flex gap-4 items-center">
@@ -305,38 +316,35 @@ function DialogMacroShowcase({ globalSize }: { globalSize: Size }) {
305
316
  label="Sticky Footer (Long Content)"
306
317
  description="Layout in-flow giúp footer luôn dính ở dưới cùng khi có thanh cuộn."
307
318
  codeString={`<DialogPreset
308
- trigger={
309
- <Button variant="outline">
310
- View Long Content
311
- </Button>
312
- }
313
- title="Terms & Conditions"
314
- description="Cuộn xuống dưới cùng để có thể đồng ý với điều khoản."
315
- footer={
316
- <div className="flex w-full sm:justify-end gap-2">
317
- <DialogClose
318
- render={<Button variant="ghost" />}
319
- >
320
- Cancel
321
- </DialogClose>
322
- <Button>I Agree</Button>
323
- </div>
324
- }
325
- >
326
- <div className="flex h-[800px] flex-col items-center justify-between rounded-md border border-border border-dashed bg-muted/20 py-8">
327
- <span className="text-sm font-medium text-muted-foreground">
328
- START OF CONTENT
329
- </span>
330
- <div className="flex flex-col items-center gap-2">
331
- <span className="text-4xl">👇</span>
332
- <span className="text-sm text-muted-foreground">Keep scrolling</span>
319
+ trigger={
320
+ <Button variant="outline">View Long Content</Button>
321
+ }
322
+ title="Terms & Conditions"
323
+ description="Cuộn xuống dưới cùng để có thể đồng ý với điều khoản."
324
+ footer={
325
+ <div className="flex w-full sm:justify-end gap-2">
326
+ <DialogClose render={<Button variant="ghost" />}>
327
+ Cancel
328
+ </DialogClose>
329
+ <Button>I Agree</Button>
330
+ </div>
331
+ }
332
+ >
333
+ <div className="flex h-[800px] flex-col items-center justify-between rounded-md border border-border border-dashed bg-muted/20 py-8">
334
+ <span className="text-sm font-medium text-muted-foreground">
335
+ START OF CONTENT
336
+ </span>
337
+ <div className="flex flex-col items-center gap-2">
338
+ <span className="text-4xl">👇</span>
339
+ <span className="text-sm text-muted-foreground">
340
+ Keep scrolling
341
+ </span>
342
+ </div>
343
+ <span className="text-sm font-medium text-muted-foreground">
344
+ END OF CONTENT
345
+ </span>
333
346
  </div>
334
- <span className="text-sm font-medium text-muted-foreground">
335
- END OF CONTENT
336
- </span>
337
- </div>
338
- </DialogPreset>
339
- `}
347
+ </DialogPreset>`}
340
348
  >
341
349
  <DialogPreset
342
350
  trigger={
@@ -398,49 +406,43 @@ function DialogMicroShowcase({ globalSize }: { globalSize: Size }) {
398
406
  label="Basic Usage"
399
407
  description="Sử dụng các thành phần rời rạc để tạo dialog cơ bản."
400
408
  codeString={`<Dialog>
401
- <DialogTrigger
402
- render={
403
- <Button variant="outline">
404
- Upgrade Plan
405
- </Button>
406
- }
407
- />
408
-
409
- <DialogPortal><DialogContent className={contentClass}>
410
- <DialogHeader>
411
- <DialogTitle>Update Subscription</DialogTitle>
412
- <DialogDescription>
413
- Are you sure you want to upgrade your plan to Pro? This will
414
- charge your card immediately.
415
- </DialogDescription>
416
- </DialogHeader>
417
- <DialogFooter className="-mx-4 -mb-4 mt-4 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
418
- <DialogClose
419
- render={<Button variant="ghost" />}
420
- >
421
- Cancel
422
- </DialogClose>
423
- <Button color="primary">
424
- Confirm
425
- </Button>
426
- </DialogFooter>
427
- <DialogClose
409
+ <DialogTrigger
428
410
  render={
429
- <Button
430
- variant="ghost"
431
- className="absolute top-2 right-2"
432
- size="sm"
433
- iconOnly
434
- />
411
+ <Button variant="outline">Upgrade Plan</Button>
435
412
  }
436
- >
437
- <XIcon />
438
- <span className="sr-only">Close</span>
439
- </DialogClose>
440
- </DialogContent></DialogPortal>
413
+ />
441
414
 
442
- </Dialog>
443
- `}
415
+ <DialogPortal>
416
+ <DialogContent className={contentClass}>
417
+ <DialogHeader>
418
+ <DialogTitle>Update Subscription</DialogTitle>
419
+ <DialogDescription>
420
+ Are you sure you want to upgrade your plan to
421
+ Pro? This will charge your card immediately.
422
+ </DialogDescription>
423
+ </DialogHeader>
424
+ <DialogFooter className="-mx-4 -mb-4 mt-4 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
425
+ <DialogClose render={<Button variant="ghost" />}>
426
+ Cancel
427
+ </DialogClose>
428
+ <Button color="primary">Confirm</Button>
429
+ </DialogFooter>
430
+ <DialogClose
431
+ render={
432
+ <Button
433
+ variant="ghost"
434
+ className="absolute top-2 right-2"
435
+ size="sm"
436
+ iconOnly
437
+ />
438
+ }
439
+ >
440
+ <XIcon />
441
+ <span className="sr-only">Close</span>
442
+ </DialogClose>
443
+ </DialogContent>
444
+ </DialogPortal>
445
+ </Dialog>`}
444
446
  >
445
447
  <Dialog>
446
448
  <DialogTrigger
@@ -492,66 +494,65 @@ function DialogMicroShowcase({ globalSize }: { globalSize: Size }) {
492
494
  label="Forms & Custom Content"
493
495
  description="Sử dụng form bên trong DialogContent."
494
496
  codeString={`<Dialog>
495
- <DialogTrigger
496
- render={
497
- <Button variant="outline">
498
- Edit Profile
499
- </Button>
500
- }
501
- />
502
-
503
- <DialogPortal><DialogContent className={contentClass}>
504
- <DialogHeader>
505
- <DialogTitle>Edit profile</DialogTitle>
506
- <DialogDescription>
507
- Make changes to your profile here. Click save when you're
508
- done.
509
- </DialogDescription>
510
- </DialogHeader>
511
- <div className="grid gap-4 py-4">
512
- <div className="grid grid-cols-4 items-center gap-4">
513
- <Label htmlFor="name" className="text-right">
514
- Name
515
- </Label>
516
- <Input
517
- id="name"
518
- defaultValue="Pedro Duarte"
519
- className="col-span-3"
520
- />
521
- </div>
522
- <div className="grid grid-cols-4 items-center gap-4">
523
- <Label htmlFor="username" className="text-right">
524
- Username
525
- </Label>
526
- <Input
527
- id="username"
528
- defaultValue="@peduarte"
529
- className="col-span-3"
530
- />
531
- </div>
532
- </div>
533
- <DialogFooter className="-mx-4 -mb-4 mt-4 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
534
- <Button type="submit">
535
- Save changes
536
- </Button>
537
- </DialogFooter>
538
- <DialogClose
497
+ <DialogTrigger
539
498
  render={
540
- <Button
541
- variant="ghost"
542
- className="absolute top-2 right-2"
543
- size="sm"
544
- iconOnly
545
- />
499
+ <Button variant="outline">Edit Profile</Button>
546
500
  }
547
- >
548
- <XIcon />
549
- <span className="sr-only">Close</span>
550
- </DialogClose>
551
- </DialogContent></DialogPortal>
501
+ />
552
502
 
553
- </Dialog>
554
- `}
503
+ <DialogPortal>
504
+ <DialogContent className={contentClass}>
505
+ <DialogHeader>
506
+ <DialogTitle>Edit profile</DialogTitle>
507
+ <DialogDescription>
508
+ Make changes to your profile here. Click save
509
+ when you're done.
510
+ </DialogDescription>
511
+ </DialogHeader>
512
+ <div className="grid gap-4 py-4">
513
+ <div className="grid grid-cols-4 items-center gap-4">
514
+ <Label htmlFor="name" className="text-right">
515
+ Name
516
+ </Label>
517
+ <Input
518
+ id="name"
519
+ defaultValue="Pedro Duarte"
520
+ className="col-span-3"
521
+ />
522
+ </div>
523
+ <div className="grid grid-cols-4 items-center gap-4">
524
+ <Label
525
+ htmlFor="username"
526
+ className="text-right"
527
+ >
528
+ Username
529
+ </Label>
530
+ <Input
531
+ id="username"
532
+ defaultValue="@peduarte"
533
+ className="col-span-3"
534
+ />
535
+ </div>
536
+ </div>
537
+ <DialogFooter className="-mx-4 -mb-4 mt-4 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
538
+ <Button type="submit">Save changes</Button>
539
+ </DialogFooter>
540
+ <DialogClose
541
+ render={
542
+ <Button
543
+ variant="ghost"
544
+ className="absolute top-2 right-2"
545
+ size="sm"
546
+ iconOnly
547
+ />
548
+ }
549
+ >
550
+ <XIcon />
551
+ <span className="sr-only">Close</span>
552
+ </DialogClose>
553
+ </DialogContent>
554
+ </DialogPortal>
555
+ </Dialog>`}
555
556
  >
556
557
  <Dialog>
557
558
  <DialogTrigger
@@ -622,38 +623,34 @@ function DialogMicroShowcase({ globalSize }: { globalSize: Size }) {
622
623
  label="No Close Button"
623
624
  description="Không render nút XIcon thủ công."
624
625
  codeString={`<Dialog>
625
- <DialogTrigger
626
- render={
627
- <Button variant="outline">
628
- View Terms
629
- </Button>
630
- }
631
- />
632
-
633
- <DialogPortal><DialogContent className={contentClass}>
634
- <DialogHeader>
635
- <DialogTitle>Terms of Service</DialogTitle>
636
- <DialogDescription>
637
- You must accept the new terms to continue using the
638
- application.
639
- </DialogDescription>
640
- </DialogHeader>
641
- <p className="text-sm text-muted-foreground">
642
- By clicking accept, you agree to our updated Terms of Service
643
- and Privacy Policy.
644
- </p>
645
- <DialogFooter className="-mx-4 -mb-4 mt-4 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
646
- <DialogClose
647
- render={<Button variant="outline" />}
648
- >
649
- Decline
650
- </DialogClose>
651
- <Button>Accept</Button>
652
- </DialogFooter>
653
- </DialogContent></DialogPortal>
626
+ <DialogTrigger
627
+ render={<Button variant="outline">View Terms</Button>}
628
+ />
654
629
 
655
- </Dialog>
656
- `}
630
+ <DialogPortal>
631
+ <DialogContent className={contentClass}>
632
+ <DialogHeader>
633
+ <DialogTitle>Terms of Service</DialogTitle>
634
+ <DialogDescription>
635
+ You must accept the new terms to continue using
636
+ the application.
637
+ </DialogDescription>
638
+ </DialogHeader>
639
+ <p className="text-sm text-muted-foreground">
640
+ By clicking accept, you agree to our updated Terms
641
+ of Service and Privacy Policy.
642
+ </p>
643
+ <DialogFooter className="-mx-4 -mb-4 mt-4 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
644
+ <DialogClose
645
+ render={<Button variant="outline" />}
646
+ >
647
+ Decline
648
+ </DialogClose>
649
+ <Button>Accept</Button>
650
+ </DialogFooter>
651
+ </DialogContent>
652
+ </DialogPortal>
653
+ </Dialog>`}
657
654
  >
658
655
  <Dialog>
659
656
  <DialogTrigger
@@ -694,46 +691,44 @@ function DialogMicroShowcase({ globalSize }: { globalSize: Size }) {
694
691
  label="Large Content Sizing"
695
692
  description="Sử dụng sm:max-w-lg cho nội dung lớn hơn."
696
693
  codeString={`<Dialog>
697
- <DialogTrigger
698
- render={
699
- <Button variant="outline">
700
- View Report
701
- </Button>
702
- }
703
- />
704
-
705
- <DialogPortal><DialogContent className={contentClass}>
706
- <DialogHeader>
707
- <DialogTitle>Detailed Report</DialogTitle>
708
- <DialogDescription>
709
- Monthly analytics and performance overview.
710
- </DialogDescription>
711
- </DialogHeader>
712
- <div className="flex h-[200px] items-center justify-center rounded-md border border-border border-dashed bg-muted/20">
713
- <span className="text-sm text-muted-foreground">
714
- Large Content Area
715
- </span>
716
- </div>
717
- <DialogFooter className="-mx-4 -mb-4 mt-4 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
718
- <Button>Download PDF</Button>
719
- </DialogFooter>
720
- <DialogClose
694
+ <DialogTrigger
721
695
  render={
722
- <Button
723
- variant="ghost"
724
- className="absolute top-2 right-2"
725
- size="sm"
726
- iconOnly
727
- />
696
+ <Button variant="outline">View Report</Button>
728
697
  }
729
- >
730
- <XIcon />
731
- <span className="sr-only">Close</span>
732
- </DialogClose>
733
- </DialogContent></DialogPortal>
698
+ />
734
699
 
735
- </Dialog>
736
- `}
700
+ <DialogPortal>
701
+ <DialogContent className={contentClass}>
702
+ <DialogHeader>
703
+ <DialogTitle>Detailed Report</DialogTitle>
704
+ <DialogDescription>
705
+ Monthly analytics and performance overview.
706
+ </DialogDescription>
707
+ </DialogHeader>
708
+ <div className="flex h-[200px] items-center justify-center rounded-md border border-border border-dashed bg-muted/20">
709
+ <span className="text-sm text-muted-foreground">
710
+ Large Content Area
711
+ </span>
712
+ </div>
713
+ <DialogFooter className="-mx-4 -mb-4 mt-4 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
714
+ <Button>Download PDF</Button>
715
+ </DialogFooter>
716
+ <DialogClose
717
+ render={
718
+ <Button
719
+ variant="ghost"
720
+ className="absolute top-2 right-2"
721
+ size="sm"
722
+ iconOnly
723
+ />
724
+ }
725
+ >
726
+ <XIcon />
727
+ <span className="sr-only">Close</span>
728
+ </DialogClose>
729
+ </DialogContent>
730
+ </DialogPortal>
731
+ </Dialog>`}
737
732
  >
738
733
  <Dialog>
739
734
  <DialogTrigger
@@ -784,48 +779,59 @@ function DialogMicroShowcase({ globalSize }: { globalSize: Size }) {
784
779
  label="Controlled State"
785
780
  description="Sử dụng open và onOpenChange để quản lý trạng thái đóng mở bằng React state."
786
781
  codeString={`<div className="w-full flex flex-col gap-4 items-center justify-center">
787
- <div className="flex gap-4 items-center">
788
- <Button onClick={() => setControlledOpen(true)} variant="outline">
789
- Open Controlled Dialog
790
- </Button>
791
- <span className="text-sm text-muted-foreground font-mono">
792
- State: {controlledOpen ? "true" : "false"}
793
- </span>
794
- </div>
795
-
796
- <Dialog open={controlledOpen} onOpenChange={setControlledOpen}>
797
-
798
- <DialogPortal><DialogContent className={contentClass}>
799
- <DialogHeader>
800
- <DialogTitle>Controlled Dialog</DialogTitle>
801
- <DialogDescription>
802
- Trạng thái của dialog này được quản lý hoàn toàn bởi React state bên ngoài.
803
- </DialogDescription>
804
- </DialogHeader>
805
- <p className="text-sm text-foreground">Bạn có thể đóng bằng nút bên dưới hoặc dấu X.</p>
806
- <DialogFooter className="-mx-4 -mb-4 mt-4 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
807
- <Button color="primary" onClick={() => setControlledOpen(false)}>
808
- Close Manually
809
- </Button>
810
- </DialogFooter>
811
- <DialogClose
812
- render={
813
- <Button
814
- variant="ghost"
815
- className="absolute top-2 right-2"
816
- size="sm"
817
- iconOnly
818
- />
819
- }
782
+ <div className="flex gap-4 items-center">
783
+ <Button
784
+ onClick={() => setControlledOpen(true)}
785
+ variant="outline"
820
786
  >
821
- <XIcon />
822
- <span className="sr-only">Close</span>
823
- </DialogClose>
824
- </DialogContent></DialogPortal>
787
+ Open Controlled Dialog
788
+ </Button>
789
+ <span className="text-sm text-muted-foreground font-mono">
790
+ State: {controlledOpen ? "true" : "false"}
791
+ </span>
792
+ </div>
825
793
 
826
- </Dialog>
827
- </div>
828
- `}
794
+ <Dialog
795
+ open={controlledOpen}
796
+ onOpenChange={setControlledOpen}
797
+ >
798
+ <DialogPortal>
799
+ <DialogContent className={contentClass}>
800
+ <DialogHeader>
801
+ <DialogTitle>Controlled Dialog</DialogTitle>
802
+ <DialogDescription>
803
+ Trạng thái của dialog này được quản lý hoàn
804
+ toàn bởi React state bên ngoài.
805
+ </DialogDescription>
806
+ </DialogHeader>
807
+ <p className="text-sm text-foreground">
808
+ Bạn có thể đóng bằng nút bên dưới hoặc dấu X.
809
+ </p>
810
+ <DialogFooter className="-mx-4 -mb-4 mt-4 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
811
+ <Button
812
+ color="primary"
813
+ onClick={() => setControlledOpen(false)}
814
+ >
815
+ Close Manually
816
+ </Button>
817
+ </DialogFooter>
818
+ <DialogClose
819
+ render={
820
+ <Button
821
+ variant="ghost"
822
+ className="absolute top-2 right-2"
823
+ size="sm"
824
+ iconOnly
825
+ />
826
+ }
827
+ >
828
+ <XIcon />
829
+ <span className="sr-only">Close</span>
830
+ </DialogClose>
831
+ </DialogContent>
832
+ </DialogPortal>
833
+ </Dialog>
834
+ </div>`}
829
835
  >
830
836
  <div className="w-full flex flex-col gap-4 items-center justify-center">
831
837
  <div className="flex gap-4 items-center">
@@ -847,8 +853,8 @@ function DialogMicroShowcase({ globalSize }: { globalSize: Size }) {
847
853
  <DialogHeader>
848
854
  <DialogTitle>Controlled Dialog</DialogTitle>
849
855
  <DialogDescription>
850
- Trạng thái của dialog này được quản lý hoàn toàn bởi
851
- React state bên ngoài.
856
+ Trạng thái của dialog này được quản lý hoàn toàn bởi React
857
+ state bên ngoài.
852
858
  </DialogDescription>
853
859
  </DialogHeader>
854
860
  <p className="text-sm text-foreground">
@@ -886,60 +892,64 @@ function DialogMicroShowcase({ globalSize }: { globalSize: Size }) {
886
892
  label="Sticky Footer (Long Content)"
887
893
  description="Ghi đè class của DialogContent thành flex-col để khóa scroll ở phần body."
888
894
  codeString={`<Dialog>
889
- <DialogTrigger
890
- render={
891
- <Button variant="outline">
892
- View Long Content
893
- </Button>
894
- }
895
- />
896
-
897
- <DialogPortal><DialogContent className={cn(contentClass, "flex flex-col gap-0 p-0 overflow-hidden")}>
898
- <DialogHeader className="shrink-0 p-4 pb-0">
899
- <DialogTitle>Terms & Conditions</DialogTitle>
900
- <DialogDescription>
901
- Cuộn xuống dưới cùng để có thể đồng ý với điều khoản.
902
- </DialogDescription>
903
- </DialogHeader>
904
- <div className="flex-1 min-h-0 overflow-y-auto p-4">
905
- <div className="flex h-[800px] flex-col items-center justify-between rounded-md border border-border border-dashed bg-muted/20 py-8">
906
- <span className="text-sm font-medium text-muted-foreground">
907
- START OF CONTENT
908
- </span>
909
- <div className="flex flex-col items-center gap-2">
910
- <span className="text-4xl">👇</span>
911
- <span className="text-sm text-muted-foreground">Keep scrolling</span>
912
- </div>
913
- <span className="text-sm font-medium text-muted-foreground">
914
- END OF CONTENT
915
- </span>
916
- </div>
917
- </div>
918
- <DialogFooter className="shrink-0 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
919
- <DialogClose
920
- render={<Button variant="ghost" />}
921
- >
922
- Cancel
923
- </DialogClose>
924
- <Button>I Agree</Button>
925
- </DialogFooter>
926
- <DialogClose
895
+ <DialogTrigger
927
896
  render={
928
- <Button
929
- variant="ghost"
930
- className="absolute top-2 right-2"
931
- size="sm"
932
- iconOnly
933
- />
897
+ <Button variant="outline">View Long Content</Button>
934
898
  }
935
- >
936
- <XIcon />
937
- <span className="sr-only">Close</span>
938
- </DialogClose>
939
- </DialogContent></DialogPortal>
899
+ />
940
900
 
941
- </Dialog>
942
- `}
901
+ <DialogPortal>
902
+ <DialogContent
903
+ className={cn(
904
+ contentClass,
905
+ "flex flex-col gap-0 p-0 overflow-hidden",
906
+ )}
907
+ >
908
+ <DialogHeader className="shrink-0 p-4 pb-0">
909
+ <DialogTitle>Terms & Conditions</DialogTitle>
910
+ <DialogDescription>
911
+ Cuộn xuống dưới cùng để có thể đồng ý với điều
912
+ khoản.
913
+ </DialogDescription>
914
+ </DialogHeader>
915
+ <div className="flex-1 min-h-0 overflow-y-auto p-4">
916
+ <div className="flex h-[800px] flex-col items-center justify-between rounded-md border border-border border-dashed bg-muted/20 py-8">
917
+ <span className="text-sm font-medium text-muted-foreground">
918
+ START OF CONTENT
919
+ </span>
920
+ <div className="flex flex-col items-center gap-2">
921
+ <span className="text-4xl">👇</span>
922
+ <span className="text-sm text-muted-foreground">
923
+ Keep scrolling
924
+ </span>
925
+ </div>
926
+ <span className="text-sm font-medium text-muted-foreground">
927
+ END OF CONTENT
928
+ </span>
929
+ </div>
930
+ </div>
931
+ <DialogFooter className="shrink-0 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
932
+ <DialogClose render={<Button variant="ghost" />}>
933
+ Cancel
934
+ </DialogClose>
935
+ <Button>I Agree</Button>
936
+ </DialogFooter>
937
+ <DialogClose
938
+ render={
939
+ <Button
940
+ variant="ghost"
941
+ className="absolute top-2 right-2"
942
+ size="sm"
943
+ iconOnly
944
+ />
945
+ }
946
+ >
947
+ <XIcon />
948
+ <span className="sr-only">Close</span>
949
+ </DialogClose>
950
+ </DialogContent>
951
+ </DialogPortal>
952
+ </Dialog>`}
943
953
  >
944
954
  <Dialog>
945
955
  <DialogTrigger
@@ -1011,46 +1021,57 @@ function DialogMicroShowcase({ globalSize }: { globalSize: Size }) {
1011
1021
  description="Các kịch bản thực tế giúp bạn quyết định nên dùng Micro hay Macro."
1012
1022
  fullWidth
1013
1023
  codeString={`<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
1014
- {/* ── Story 1: Macro wins ── */}
1015
- <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
1016
- <div className="flex items-start gap-3">
1017
- <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
1018
- <CheckCircle2Icon className="size-4" aria-hidden="true" />
1019
- </span>
1020
- <div>
1021
- <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
1022
- Story 1 · Dùng Macro
1023
- </p>
1024
- <h3 className="mt-0.5 text-sm font-semibold text-foreground">
1025
- Cảnh báo hoặc Form cơ bản
1026
- </h3>
1024
+ {/* ── Story 1: Macro wins ── */}
1025
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
1026
+ <div className="flex items-start gap-3">
1027
+ <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
1028
+ <CheckCircle2Icon
1029
+ className="size-4"
1030
+ aria-hidden="true"
1031
+ />
1032
+ </span>
1033
+ <div>
1034
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
1035
+ Story 1 · Dùng Macro
1036
+ </p>
1037
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
1038
+ Cảnh báo hoặc Form cơ bản
1039
+ </h3>
1040
+ </div>
1027
1041
  </div>
1042
+ <p className="text-xs text-muted-foreground leading-relaxed">
1043
+ Khi bạn chỉ cần một tiêu đề, mô tả và vài nút bấm ở
1044
+ footer (hoặc 1 form ngắn), Macro giúp bạn không phải
1045
+ khai báo hàng loạt component con.
1046
+ </p>
1028
1047
  </div>
1029
- <p className="text-xs text-muted-foreground leading-relaxed">
1030
- Khi bạn chỉ cần một tiêu đề, mô tả và vài nút bấm ở footer (hoặc 1 form ngắn), Macro giúp bạn không phải khai báo hàng loạt component con.
1031
- </p>
1032
- </div>
1033
1048
 
1034
- {/* ── Story 2: Micro wins ── */}
1035
- <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
1036
- <div className="flex items-start gap-3">
1037
- <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
1038
- <LayersIcon className="size-4" aria-hidden="true" />
1039
- </span>
1040
- <div>
1041
- <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
1042
- Story 2 · Dùng Micro
1043
- </p>
1044
- <h3 className="mt-0.5 text-sm font-semibold text-foreground">
1045
- Layout tuỳ chỉnh phức tạp
1046
- </h3>
1049
+ {/* ── Story 2: Micro wins ── */}
1050
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
1051
+ <div className="flex items-start gap-3">
1052
+ <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
1053
+ <LayersIcon
1054
+ className="size-4"
1055
+ aria-hidden="true"
1056
+ />
1057
+ </span>
1058
+ <div>
1059
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
1060
+ Story 2 · Dùng Micro
1061
+ </p>
1062
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
1063
+ Layout tuỳ chỉnh phức tạp
1064
+ </h3>
1065
+ </div>
1047
1066
  </div>
1067
+ <p className="text-xs text-muted-foreground leading-relaxed">
1068
+ Khi bạn muốn Header có hình ảnh/icon đặc biệt, bỏ
1069
+ qua Footer chuẩn, hoặc có layout split-pane phức tạp
1070
+ bên trong Dialog. Micro cho phép bạn tự do thay đổi
1071
+ từng phần.
1072
+ </p>
1048
1073
  </div>
1049
- <p className="text-xs text-muted-foreground leading-relaxed">
1050
- Khi bạn muốn Header có hình ảnh/icon đặc biệt, bỏ qua Footer chuẩn, hoặc có layout split-pane phức tạp bên trong Dialog. Micro cho phép bạn tự do thay đổi từng phần.
1051
- </p>
1052
- </div>
1053
- </div>`}
1074
+ </div>`}
1054
1075
  >
1055
1076
  <div className="grid grid-cols-1 gap-6 md:grid-cols-2">
1056
1077
  {/* ── Story 1: Macro wins ── */}