gladvn 0.2.16 → 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 (315) 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 +2 -2
  159. package/dist/index.cjs.map +1 -1
  160. package/dist/index.js +2 -2
  161. package/dist/index.js.map +1 -1
  162. package/dist/lib/utils.d.ts.map +1 -1
  163. package/package.json +3 -1
  164. package/scripts/format-codestrings.ts +87 -0
  165. package/scripts/organize-imports.ts +21 -0
  166. package/scripts/regex-format.cjs +67 -0
  167. package/scripts/tmp.tsx +25 -0
  168. package/src/components/macro/accordion-preset.test.tsx +1 -0
  169. package/src/components/macro/accordion-preset.tsx +2 -1
  170. package/src/components/macro/alert-dialog-preset.tsx +44 -43
  171. package/src/components/macro/alert-preset.tsx +7 -3
  172. package/src/components/macro/avatar-preset.tsx +2 -1
  173. package/src/components/macro/breadcrumb-preset.tsx +2 -1
  174. package/src/components/macro/card-preset.tsx +2 -1
  175. package/src/components/macro/carousel-preset.tsx +5 -2
  176. package/src/components/macro/checkbox-preset.test.tsx +1 -0
  177. package/src/components/macro/checkbox-preset.tsx +6 -2
  178. package/src/components/macro/combobox-preset.tsx +6 -3
  179. package/src/components/macro/command-preset.tsx +7 -3
  180. package/src/components/macro/date-picker.tsx +77 -59
  181. package/src/components/macro/dialog-preset.tsx +42 -38
  182. package/src/components/macro/empty-preset.tsx +2 -1
  183. package/src/components/macro/field-preset.test.tsx +1 -0
  184. package/src/components/macro/field-preset.tsx +2 -1
  185. package/src/components/macro/input-otp-preset.tsx +6 -2
  186. package/src/components/macro/input-preset.test.tsx +1 -0
  187. package/src/components/macro/input-preset.tsx +4 -2
  188. package/src/components/macro/pagination-preset.tsx +3 -1
  189. package/src/components/macro/progress-preset.test.tsx +1 -0
  190. package/src/components/macro/progress-preset.tsx +2 -1
  191. package/src/components/macro/radio-group-preset.tsx +4 -1
  192. package/src/components/macro/select-preset.tsx +35 -30
  193. package/src/components/macro/slider-preset.test.tsx +1 -0
  194. package/src/components/macro/slider-preset.tsx +4 -1
  195. package/src/components/macro/switch-preset.test.tsx +1 -0
  196. package/src/components/macro/switch-preset.tsx +4 -1
  197. package/src/components/macro/tabs-preset.test.tsx +1 -0
  198. package/src/components/macro/tabs-preset.tsx +4 -2
  199. package/src/components/macro/textarea-preset.test.tsx +1 -0
  200. package/src/components/macro/textarea-preset.tsx +4 -1
  201. package/src/components/micro/accordion.tsx +3 -2
  202. package/src/components/micro/alert-dialog.tsx +2 -1
  203. package/src/components/micro/alert.tsx +3 -2
  204. package/src/components/micro/aspect-ratio.tsx +2 -1
  205. package/src/components/micro/avatar.tsx +2 -1
  206. package/src/components/micro/badge.tsx +3 -3
  207. package/src/components/micro/breadcrumb.tsx +3 -2
  208. package/src/components/micro/button.test.tsx +1 -0
  209. package/src/components/micro/button.tsx +3 -3
  210. package/src/components/micro/calendar.tsx +10 -9
  211. package/src/components/micro/carousel.tsx +3 -2
  212. package/src/components/micro/chart.tsx +1 -0
  213. package/src/components/micro/checkbox.tsx +2 -2
  214. package/src/components/micro/collapsible.tsx +4 -2
  215. package/src/components/micro/combobox.tsx +47 -29
  216. package/src/components/micro/command.tsx +23 -16
  217. package/src/components/micro/context-menu.tsx +3 -2
  218. package/src/components/micro/dialog.tsx +2 -1
  219. package/src/components/micro/drawer.tsx +2 -1
  220. package/src/components/micro/dropdown-menu.tsx +3 -2
  221. package/src/components/micro/empty.tsx +2 -1
  222. package/src/components/micro/field.tsx +4 -3
  223. package/src/components/micro/hover-card.tsx +20 -19
  224. package/src/components/micro/input-group.tsx +5 -4
  225. package/src/components/micro/input-otp.tsx +3 -2
  226. package/src/components/micro/input.tsx +3 -2
  227. package/src/components/micro/item.tsx +1 -0
  228. package/src/components/micro/label.tsx +2 -1
  229. package/src/components/micro/menubar.tsx +2 -1
  230. package/src/components/micro/navigation-menu.tsx +18 -17
  231. package/src/components/micro/pagination.tsx +2 -1
  232. package/src/components/micro/popover.tsx +2 -1
  233. package/src/components/micro/progress.tsx +2 -1
  234. package/src/components/micro/radio-group.tsx +3 -3
  235. package/src/components/micro/select.tsx +5 -4
  236. package/src/components/micro/sheet.tsx +2 -1
  237. package/src/components/micro/sidebar.tsx +4 -1
  238. package/src/components/micro/skeleton.tsx +2 -1
  239. package/src/components/micro/slider.tsx +4 -1
  240. package/src/components/micro/sonner.tsx +2 -1
  241. package/src/components/micro/spinner.tsx +1 -2
  242. package/src/components/micro/switch.tsx +2 -2
  243. package/src/components/micro/table.tsx +2 -1
  244. package/src/components/micro/tabs.tsx +4 -3
  245. package/src/components/micro/textarea.tsx +2 -1
  246. package/src/components/micro/toggle-group.tsx +1 -0
  247. package/src/components/micro/toggle.tsx +1 -3
  248. package/src/components/micro/tooltip.tsx +9 -3
  249. package/src/dev/App.tsx +66 -41
  250. package/src/dev/components/code-highlighter.tsx +2 -1
  251. package/src/dev/components/dev-context.tsx +1 -0
  252. package/src/dev/components/showcase.tsx +13 -14
  253. package/src/dev/data.ts +206 -52
  254. package/src/dev/main.tsx +4 -4
  255. package/src/dev/sections/buttons.tsx +14 -12
  256. package/src/dev/sections/feedback.tsx +7 -2
  257. package/src/dev/sections/forms.tsx +11 -11
  258. package/src/dev/sections/overview.tsx +2 -1
  259. package/src/dev/showcase/accordion.tsx +399 -314
  260. package/src/dev/showcase/alert-dialog.tsx +387 -384
  261. package/src/dev/showcase/alert.tsx +271 -258
  262. package/src/dev/showcase/aspect-ratio.tsx +102 -105
  263. package/src/dev/showcase/avatar.tsx +216 -145
  264. package/src/dev/showcase/badge.tsx +78 -50
  265. package/src/dev/showcase/breadcrumb.tsx +88 -85
  266. package/src/dev/showcase/button.tsx +72 -96
  267. package/src/dev/showcase/calendar.tsx +41 -39
  268. package/src/dev/showcase/card.tsx +170 -148
  269. package/src/dev/showcase/carousel.tsx +239 -77
  270. package/src/dev/showcase/chart.tsx +5 -4
  271. package/src/dev/showcase/checkbox.tsx +206 -140
  272. package/src/dev/showcase/collapsible.tsx +108 -84
  273. package/src/dev/showcase/combobox.tsx +272 -199
  274. package/src/dev/showcase/command.tsx +31 -28
  275. package/src/dev/showcase/context-menu.tsx +94 -77
  276. package/src/dev/showcase/dialog.tsx +445 -424
  277. package/src/dev/showcase/drawer.tsx +142 -135
  278. package/src/dev/showcase/dropdown-menu.tsx +165 -161
  279. package/src/dev/showcase/empty.tsx +173 -158
  280. package/src/dev/showcase/hover-card.tsx +92 -52
  281. package/src/dev/showcase/input-group.tsx +193 -160
  282. package/src/dev/showcase/input-otp.tsx +109 -99
  283. package/src/dev/showcase/input.tsx +78 -42
  284. package/src/dev/showcase/item.tsx +101 -98
  285. package/src/dev/showcase/kbd.tsx +78 -62
  286. package/src/dev/showcase/label.tsx +16 -23
  287. package/src/dev/showcase/menubar.tsx +274 -251
  288. package/src/dev/showcase/navigation-menu.tsx +175 -170
  289. package/src/dev/showcase/overview.tsx +164 -148
  290. package/src/dev/showcase/pagination.tsx +101 -69
  291. package/src/dev/showcase/popover.tsx +113 -86
  292. package/src/dev/showcase/progress.tsx +99 -69
  293. package/src/dev/showcase/radio-group.tsx +217 -134
  294. package/src/dev/showcase/resizable.tsx +65 -55
  295. package/src/dev/showcase/scroll-area.tsx +32 -22
  296. package/src/dev/showcase/select.tsx +192 -136
  297. package/src/dev/showcase/separator.tsx +28 -24
  298. package/src/dev/showcase/sheet.tsx +182 -134
  299. package/src/dev/showcase/sidebar.tsx +9 -5
  300. package/src/dev/showcase/skeleton.tsx +54 -59
  301. package/src/dev/showcase/slider.tsx +158 -129
  302. package/src/dev/showcase/sonner.tsx +3 -5
  303. package/src/dev/showcase/spinner.tsx +22 -18
  304. package/src/dev/showcase/switch.tsx +207 -110
  305. package/src/dev/showcase/table.tsx +44 -32
  306. package/src/dev/showcase/tabs.tsx +272 -267
  307. package/src/dev/showcase/textarea.tsx +162 -116
  308. package/src/dev/showcase/theme-provider.tsx +596 -534
  309. package/src/dev/showcase/toast.tsx +37 -38
  310. package/src/dev/showcase/toggle-group.tsx +87 -39
  311. package/src/dev/showcase/toggle.tsx +36 -27
  312. package/src/dev/showcase/tooltip.tsx +154 -119
  313. package/src/lib/utils.test.ts +1 -0
  314. package/src/lib/utils.ts +1 -1
  315. package/src/styles/gladvn.css +1 -1
@@ -1,11 +1,3 @@
1
- import {
2
- DocsP,
3
- ExampleGrid,
4
- ExampleSection,
5
- Showcase,
6
- ShowcaseDocs,
7
- } from "../../dev/components/showcase";
8
-
9
1
  import {
10
2
  CheckCircle2Icon,
11
3
  FileTextIcon,
@@ -27,6 +19,13 @@ import {
27
19
  EmptyMedia,
28
20
  EmptyTitle,
29
21
  } from "../../components/micro/empty";
22
+ import {
23
+ DocsP,
24
+ ExampleGrid,
25
+ ExampleSection,
26
+ Showcase,
27
+ ShowcaseDocs,
28
+ } from "../../dev/components/showcase";
30
29
 
31
30
  // ──────────────────────────────────────────────────────────
32
31
  // SECTION 1: Macro Content
@@ -39,12 +38,14 @@ function EmptyMacroShowcase() {
39
38
  label="Tiêu chuẩn (Standard)"
40
39
  description="Đầy đủ icon, title, description, action button."
41
40
  codeString={`<EmptyPreset
42
- icon={<FolderOpenIcon className="size-4 text-muted-foreground" />}
43
- title="No projects yet"
44
- description="Create your first project to get started."
45
- action={<Button>New Project</Button>}
46
- className="w-full min-h-[280px]"
47
- />`}
41
+ icon={
42
+ <FolderOpenIcon className="size-4 text-muted-foreground" />
43
+ }
44
+ title="No projects yet"
45
+ description="Create your first project to get started."
46
+ action={<Button>New Project</Button>}
47
+ className="w-full min-h-[280px]"
48
+ />`}
48
49
  >
49
50
  <EmptyPreset
50
51
  icon={<FolderOpenIcon className="size-4 text-muted-foreground" />}
@@ -59,12 +60,11 @@ function EmptyMacroShowcase() {
59
60
  label="Không có Icon (Without Icon)"
60
61
  description="Bỏ prop icon — phù hợp khi không cần hình ảnh minh họa."
61
62
  codeString={`<EmptyPreset
62
- title="No notifications"
63
- description="You're all caught up. Check back later."
64
- action={<Button variant="outline">Refresh</Button>}
65
- className="w-full min-h-[280px]"
66
- />
67
- `}
63
+ title="No notifications"
64
+ description="You're all caught up. Check back later."
65
+ action={<Button variant="outline">Refresh</Button>}
66
+ className="w-full min-h-[280px]"
67
+ />`}
68
68
  >
69
69
  <EmptyPreset
70
70
  title="No notifications"
@@ -80,11 +80,13 @@ function EmptyMacroShowcase() {
80
80
  label="Không có Nút (Without Action)"
81
81
  description="Chỉ hiển thị trạng thái, không yêu cầu hành động."
82
82
  codeString={`<EmptyPreset
83
- icon={<InboxIcon className="size-4 text-muted-foreground" />}
84
- title="No messages"
85
- description="Messages from your team will appear here."
86
- className="w-full min-h-[240px]"
87
- />`}
83
+ icon={
84
+ <InboxIcon className="size-4 text-muted-foreground" />
85
+ }
86
+ title="No messages"
87
+ description="Messages from your team will appear here."
88
+ className="w-full min-h-[240px]"
89
+ />`}
88
90
  >
89
91
  <EmptyPreset
90
92
  icon={<InboxIcon className="size-4 text-muted-foreground" />}
@@ -98,10 +100,9 @@ function EmptyMacroShowcase() {
98
100
  label="Tối giản (Minimal)"
99
101
  description="Chỉ có tiêu đề."
100
102
  codeString={`<EmptyPreset
101
- title="Nothing here yet"
102
- className="w-full min-h-[240px]"
103
- />
104
- `}
103
+ title="Nothing here yet"
104
+ className="w-full min-h-[240px]"
105
+ />`}
105
106
  >
106
107
  <EmptyPreset
107
108
  title="Nothing here yet"
@@ -116,17 +117,19 @@ function EmptyMacroShowcase() {
116
117
  description="Pattern phổ biến khi tìm kiếm không ra kết quả."
117
118
  fullWidth
118
119
  codeString={`<EmptyPreset
119
- icon={<SearchIcon className="size-4 text-muted-foreground" />}
120
- title={'No results for "invoice"'}
121
- description="Try a different search term or clear all active filters."
122
- action={
123
- <div className="flex gap-2">
124
- <Button variant="outline">Clear filters</Button>
125
- <Button>Browse all</Button>
126
- </div>
127
- }
128
- className="w-full min-h-[240px]"
129
- />`}
120
+ icon={
121
+ <SearchIcon className="size-4 text-muted-foreground" />
122
+ }
123
+ title={'No results for "invoice"'}
124
+ description="Try a different search term or clear all active filters."
125
+ action={
126
+ <div className="flex gap-2">
127
+ <Button variant="outline">Clear filters</Button>
128
+ <Button>Browse all</Button>
129
+ </div>
130
+ }
131
+ className="w-full min-h-[240px]"
132
+ />`}
130
133
  >
131
134
  <div className="w-full max-w-md">
132
135
  <EmptyPreset
@@ -149,16 +152,19 @@ function EmptyMacroShowcase() {
149
152
  description="Description chứa liên kết HTML."
150
153
  fullWidth
151
154
  codeString={`<EmptyPreset
152
- icon={<FileTextIcon className="size-4 text-muted-foreground" />}
153
- title="No documents"
154
- description={
155
- <>
156
- Upload or create your first document. <a href="#">Learn more</a>.
157
- </>
158
- }
159
- action={<Button>Upload Document</Button>}
160
- className="w-full min-h-[240px]"
161
- />`}
155
+ icon={
156
+ <FileTextIcon className="size-4 text-muted-foreground" />
157
+ }
158
+ title="No documents"
159
+ description={
160
+ <>
161
+ Upload or create your first document.{" "}
162
+ <a href="#">Learn more</a>.
163
+ </>
164
+ }
165
+ action={<Button>Upload Document</Button>}
166
+ className="w-full min-h-[240px]"
167
+ />`}
162
168
  >
163
169
  <div className="w-full max-w-md">
164
170
  <EmptyPreset
@@ -191,22 +197,21 @@ function EmptyMicroShowcase() {
191
197
  label="Cơ bản (Default)"
192
198
  description="Trạng thái trống cơ bản với cấu trúc thủ công."
193
199
  codeString={`<Empty className="w-full min-h-[280px]">
194
- <EmptyHeader>
195
- <EmptyTitle>No customers found</EmptyTitle>
196
- <EmptyDescription>
197
- Get started by adding your first customer.
198
- </EmptyDescription>
199
- </EmptyHeader>
200
- <EmptyContent>
201
- <EmptyAction>
202
- <Button>
203
- <PlusIcon className="mr-2" />
204
- Add Customer
205
- </Button>
206
- </EmptyAction>
207
- </EmptyContent>
208
- </Empty>
209
- `}
200
+ <EmptyHeader>
201
+ <EmptyTitle>No customers found</EmptyTitle>
202
+ <EmptyDescription>
203
+ Get started by adding your first customer.
204
+ </EmptyDescription>
205
+ </EmptyHeader>
206
+ <EmptyContent>
207
+ <EmptyAction>
208
+ <Button>
209
+ <PlusIcon className="mr-2" />
210
+ Add Customer
211
+ </Button>
212
+ </EmptyAction>
213
+ </EmptyContent>
214
+ </Empty>`}
210
215
  >
211
216
  <Empty className="w-full min-h-[280px]">
212
217
  <EmptyHeader>
@@ -230,24 +235,24 @@ function EmptyMicroShowcase() {
230
235
  label="Kèm Icon nền màu (Icon Variant)"
231
236
  description="Dùng EmptyMedia variant='icon' để hiển thị background mờ cho Icon."
232
237
  codeString={`<Empty className="w-full min-h-[280px]">
233
- <EmptyHeader>
234
- <EmptyMedia variant="icon">
235
- <FolderOpenIcon className="size-4 text-muted-foreground" />
236
- </EmptyMedia>
237
- <EmptyTitle>No projects</EmptyTitle>
238
- <EmptyDescription>
239
- You don't have any active projects.
240
- </EmptyDescription>
241
- </EmptyHeader>
242
- <EmptyContent>
243
- <EmptyAction>
244
- <Button>
245
- <PlusIcon className="mr-2" />
246
- New Project
247
- </Button>
248
- </EmptyAction>
249
- </EmptyContent>
250
- </Empty>`}
238
+ <EmptyHeader>
239
+ <EmptyMedia variant="icon">
240
+ <FolderOpenIcon className="size-4 text-muted-foreground" />
241
+ </EmptyMedia>
242
+ <EmptyTitle>No projects</EmptyTitle>
243
+ <EmptyDescription>
244
+ You don't have any active projects.
245
+ </EmptyDescription>
246
+ </EmptyHeader>
247
+ <EmptyContent>
248
+ <EmptyAction>
249
+ <Button>
250
+ <PlusIcon className="mr-2" />
251
+ New Project
252
+ </Button>
253
+ </EmptyAction>
254
+ </EmptyContent>
255
+ </Empty>`}
251
256
  >
252
257
  <Empty className="w-full min-h-[280px]">
253
258
  <EmptyHeader>
@@ -276,14 +281,13 @@ function EmptyMicroShowcase() {
276
281
  label="Chỉ văn bản (Text Only)"
277
282
  description="Không icon, không action."
278
283
  codeString={`<Empty className="w-full min-h-[200px]">
279
- <EmptyHeader>
280
- <EmptyTitle>No results</EmptyTitle>
281
- <EmptyDescription>
282
- Try adjusting your filters or search terms.
283
- </EmptyDescription>
284
- </EmptyHeader>
285
- </Empty>
286
- `}
284
+ <EmptyHeader>
285
+ <EmptyTitle>No results</EmptyTitle>
286
+ <EmptyDescription>
287
+ Try adjusting your filters or search terms.
288
+ </EmptyDescription>
289
+ </EmptyHeader>
290
+ </Empty>`}
287
291
  >
288
292
  <Empty className="w-full min-h-[200px]">
289
293
  <EmptyHeader>
@@ -299,17 +303,17 @@ function EmptyMicroShowcase() {
299
303
  label="Link bên trong mô tả (Link in Description)"
300
304
  description="EmptyDescription tự động style thẻ <a> bên trong."
301
305
  codeString={`<Empty className="w-full min-h-[200px]">
302
- <EmptyHeader>
303
- <EmptyMedia variant="icon">
304
- <InboxIcon className="size-4 text-muted-foreground" />
305
- </EmptyMedia>
306
- <EmptyTitle>No messages yet</EmptyTitle>
307
- <EmptyDescription>
308
- Messages from your team will appear here. Learn more in our{" "}
309
- <a href="#">documentation</a>.
310
- </EmptyDescription>
311
- </EmptyHeader>
312
- </Empty>`}
306
+ <EmptyHeader>
307
+ <EmptyMedia variant="icon">
308
+ <InboxIcon className="size-4 text-muted-foreground" />
309
+ </EmptyMedia>
310
+ <EmptyTitle>No messages yet</EmptyTitle>
311
+ <EmptyDescription>
312
+ Messages from your team will appear here. Learn more
313
+ in our <a href="#">documentation</a>.
314
+ </EmptyDescription>
315
+ </EmptyHeader>
316
+ </Empty>`}
313
317
  >
314
318
  <Empty className="w-full min-h-[200px]">
315
319
  <EmptyHeader>
@@ -331,24 +335,25 @@ function EmptyMicroShowcase() {
331
335
  description="Nút xóa bộ lọc nằm tách biệt khỏi hành động chính."
332
336
  fullWidth
333
337
  codeString={`<div className="w-full max-w-md">
334
- <Empty className="w-full min-h-[240px]">
335
- <EmptyHeader>
336
- <EmptyMedia variant="icon">
337
- <SearchIcon className="size-4 text-muted-foreground" />
338
- </EmptyMedia>
339
- <EmptyTitle>No results for &quot;invoice&quot;</EmptyTitle>
340
- <EmptyDescription>
341
- Try a different search term or clear all filters.
342
- </EmptyDescription>
343
- </EmptyHeader>
344
- <EmptyContent>
345
- <EmptyAction>
346
- <Button variant="outline">Clear filters</Button>
347
- </EmptyAction>
348
- </EmptyContent>
349
- </Empty>
350
- </div>
351
- `}
338
+ <Empty className="w-full min-h-[240px]">
339
+ <EmptyHeader>
340
+ <EmptyMedia variant="icon">
341
+ <SearchIcon className="size-4 text-muted-foreground" />
342
+ </EmptyMedia>
343
+ <EmptyTitle>
344
+ No results for &quot;invoice&quot;
345
+ </EmptyTitle>
346
+ <EmptyDescription>
347
+ Try a different search term or clear all filters.
348
+ </EmptyDescription>
349
+ </EmptyHeader>
350
+ <EmptyContent>
351
+ <EmptyAction>
352
+ <Button variant="outline">Clear filters</Button>
353
+ </EmptyAction>
354
+ </EmptyContent>
355
+ </Empty>
356
+ </div>`}
352
357
  >
353
358
  <div className="w-full max-w-md">
354
359
  <Empty className="w-full min-h-[240px]">
@@ -376,46 +381,56 @@ function EmptyMicroShowcase() {
376
381
  description="Các kịch bản thực tế giúp bạn quyết định nên dùng Micro hay Macro."
377
382
  fullWidth
378
383
  codeString={`<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
379
- {/* ── Story 1: Macro wins ── */}
380
- <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
381
- <div className="flex items-start gap-3">
382
- <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
383
- <CheckCircle2Icon className="size-4" aria-hidden="true" />
384
- </span>
385
- <div>
386
- <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
387
- Story 1 · Dùng Macro
388
- </p>
389
- <h3 className="mt-0.5 text-sm font-semibold text-foreground">
390
- Giao diện trống tiêu chuẩn
391
- </h3>
384
+ {/* ── Story 1: Macro wins ── */}
385
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
386
+ <div className="flex items-start gap-3">
387
+ <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
388
+ <CheckCircle2Icon
389
+ className="size-4"
390
+ aria-hidden="true"
391
+ />
392
+ </span>
393
+ <div>
394
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
395
+ Story 1 · Dùng Macro
396
+ </p>
397
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
398
+ Giao diện trống tiêu chuẩn
399
+ </h3>
400
+ </div>
392
401
  </div>
402
+ <p className="text-xs text-muted-foreground leading-relaxed">
403
+ Dùng \`EmptyPreset\` khi bạn chỉ cần một cấu trúc
404
+ trạng thái trống mặc định, bao gồm icon, tiêu đề, mô
405
+ tả và nút hành động. Giúp rút ngắn code đáng kể.
406
+ </p>
393
407
  </div>
394
- <p className="text-xs text-muted-foreground leading-relaxed">
395
- Dùng \`EmptyPreset\` khi bạn chỉ cần một cấu trúc trạng thái trống mặc định, bao gồm icon, tiêu đề, mô tả và nút hành động. Giúp rút ngắn code đáng kể.
396
- </p>
397
- </div>
398
408
 
399
- {/* ── Story 2: Micro wins ── */}
400
- <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
401
- <div className="flex items-start gap-3">
402
- <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
403
- <LayersIcon className="size-4" aria-hidden="true" />
404
- </span>
405
- <div>
406
- <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
407
- Story 2 · Dùng Micro
408
- </p>
409
- <h3 className="mt-0.5 text-sm font-semibold text-foreground">
410
- Bố cục tuỳ biến phức tạp
411
- </h3>
409
+ {/* ── Story 2: Micro wins ── */}
410
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
411
+ <div className="flex items-start gap-3">
412
+ <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
413
+ <LayersIcon
414
+ className="size-4"
415
+ aria-hidden="true"
416
+ />
417
+ </span>
418
+ <div>
419
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
420
+ Story 2 · Dùng Micro
421
+ </p>
422
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
423
+ Bố cục tuỳ biến phức tạp
424
+ </h3>
425
+ </div>
412
426
  </div>
427
+ <p className="text-xs text-muted-foreground leading-relaxed">
428
+ Dùng các thành phần con khi cần render SVG animation
429
+ tuỳ chỉnh, hoán đổi vị trí của phần mô tả hoặc nút,
430
+ thêm nội dung phụ như danh sách liên kết.
431
+ </p>
413
432
  </div>
414
- <p className="text-xs text-muted-foreground leading-relaxed">
415
- Dùng các thành phần con khi cần render SVG animation tuỳ chỉnh, hoán đổi vị trí của phần mô tả hoặc nút, thêm nội dung phụ như danh sách liên kết.
416
- </p>
417
- </div>
418
- </div>`}
433
+ </div>`}
419
434
  >
420
435
  <div className="grid grid-cols-1 gap-6 md:grid-cols-2">
421
436
  {/* ── Story 1: Macro wins ── */}
@@ -479,8 +494,8 @@ export default function EmptyShowcase() {
479
494
  <ShowcaseDocs>
480
495
  <DocsP>
481
496
  Dùng để thông báo cho người dùng rằng không có dữ liệu để hiển thị ở
482
- đây. Nó thường đi kèm với hình ảnh hoặc icon minh họa
483
- và một hành động hướng dẫn để lấp đầy nội dung này (ví dụ: Tạo mới).
497
+ đây. Nó thường đi kèm với hình ảnh hoặc icon minh họa và một hành
498
+ động hướng dẫn để lấp đầy nội dung này (ví dụ: Tạo mới).
484
499
  </DocsP>
485
500
  </ShowcaseDocs>
486
501
  }
@@ -1,14 +1,4 @@
1
- import { useDevContext } from "../../dev/components/dev-context";
2
- import {
3
- DocsCode,
4
- DocsP,
5
- ExampleGrid,
6
- ExampleSection,
7
- Showcase,
8
- ShowcaseDocs,
9
- } from "../../dev/components/showcase";
10
1
  import { CalendarIcon } from "lucide-react";
11
- import { useState } from "react";
12
2
 
13
3
  import {
14
4
  Avatar,
@@ -19,9 +9,18 @@ import { Button } from "../../components/micro/button";
19
9
  import {
20
10
  HoverCard,
21
11
  HoverCardContent,
22
- HoverCardTrigger,
23
12
  HoverCardPortal,
13
+ HoverCardTrigger,
24
14
  } from "../../components/micro/hover-card";
15
+ import { useDevContext } from "../../dev/components/dev-context";
16
+ import {
17
+ DocsCode,
18
+ DocsP,
19
+ ExampleGrid,
20
+ ExampleSection,
21
+ Showcase,
22
+ ShowcaseDocs,
23
+ } from "../../dev/components/showcase";
25
24
  import { type Size } from "../../lib/types";
26
25
 
27
26
  // ──────────────────────────────────────────────────────────
@@ -65,28 +64,42 @@ function HoverCardMicroShowcase({ globalSize }: { globalSize: Size }) {
65
64
  label="Default"
66
65
  description="Di chuột qua liên kết để xem bản xem trước. Trigger render dưới dạng Button với variant link."
67
66
  codeString={`<HoverCard>
68
- <HoverCardTrigger render={<Button variant="link" />}>
69
- @nextjs
70
- </HoverCardTrigger>
71
- <HoverCardPortal><HoverCardContent className="w-80">
72
- <div className="flex justify-between space-x-4">
73
- <Avatar>
74
- <AvatarImage src="https://github.com/vercel.png" alt="Vercel avatar" />
75
- <AvatarFallback>VC</AvatarFallback>
76
- </Avatar>
77
- <div className="space-y-1">
78
- <h4 className="text-sm font-semibold">@nextjs</h4>
79
- <p className="text-sm">
80
- The React Framework – created and maintained by @vercel.
81
- </p>
82
- <div className="flex items-center pt-2">
83
- <CalendarIcon aria-hidden="true" focusable="false" className="mr-2 h-4 w-4 opacity-70" />
84
- <span className="text-xs text-muted-foreground">Joined December 2021</span>
67
+ <HoverCardTrigger render={<Button variant="link" />}>
68
+ @nextjs
69
+ </HoverCardTrigger>
70
+ <HoverCardPortal>
71
+ <HoverCardContent className="w-80">
72
+ <div className="flex justify-between space-x-4">
73
+ <Avatar>
74
+ <AvatarImage
75
+ src="https://github.com/vercel.png"
76
+ alt="Vercel avatar"
77
+ />
78
+ <AvatarFallback>VC</AvatarFallback>
79
+ </Avatar>
80
+ <div className="space-y-1">
81
+ <h4 className="text-sm font-semibold">
82
+ @nextjs
83
+ </h4>
84
+ <p className="text-sm">
85
+ The React Framework – created and maintained
86
+ by @vercel.
87
+ </p>
88
+ <div className="flex items-center pt-2">
89
+ <CalendarIcon
90
+ aria-hidden="true"
91
+ focusable="false"
92
+ className="mr-2 h-4 w-4 opacity-70"
93
+ />
94
+ <span className="text-xs text-muted-foreground">
95
+ Joined December 2021
96
+ </span>
97
+ </div>
98
+ </div>
85
99
  </div>
86
- </div>
87
- </div>
88
- </HoverCardContent></HoverCardPortal>
89
- </HoverCard>`}
100
+ </HoverCardContent>
101
+ </HoverCardPortal>
102
+ </HoverCard>`}
90
103
  >
91
104
  <HoverCard>
92
105
  <HoverCardTrigger
@@ -108,9 +121,15 @@ function HoverCardMicroShowcase({ globalSize }: { globalSize: Size }) {
108
121
  label="Vị trí (Side)"
109
122
  description="HoverCard có thể xuất hiện ở bốn phía của trigger thông qua prop side."
110
123
  codeString={`<HoverCard>
111
- <HoverCardTrigger render={<Button variant="outline">Top</Button>} />
112
- <HoverCardPortal><HoverCardContent side="top" className="w-80">...</HoverCardContent></HoverCardPortal>
113
- </HoverCard>`}
124
+ <HoverCardTrigger
125
+ render={<Button variant="outline">Top</Button>}
126
+ />
127
+ <HoverCardPortal>
128
+ <HoverCardContent side="top" className="w-80">
129
+ ...
130
+ </HoverCardContent>
131
+ </HoverCardPortal>
132
+ </HoverCard>`}
114
133
  >
115
134
  <div className="flex flex-wrap items-center justify-center gap-4 py-8">
116
135
  {(["top", "right", "bottom", "left"] as const).map((side) => (
@@ -175,8 +194,8 @@ function HoverCardMicroShowcase({ globalSize }: { globalSize: Size }) {
175
194
  label="Trigger: Button Link"
176
195
  description="Trigger render như Button variant link — phù hợp cho text nội tuyến."
177
196
  codeString={`<HoverCardTrigger render={<Button variant="link" />}>
178
- @nextjs
179
- </HoverCardTrigger>`}
197
+ @nextjs
198
+ </HoverCardTrigger>`}
180
199
  >
181
200
  <HoverCard>
182
201
  <HoverCardTrigger
@@ -197,10 +216,15 @@ function HoverCardMicroShowcase({ globalSize }: { globalSize: Size }) {
197
216
  label="Trigger: Thẻ anchor thuần"
198
217
  description="Trigger render như thẻ <a> HTML thuần — phù hợp cho liên kết tự nhiên trong văn bản."
199
218
  codeString={`<HoverCardTrigger
200
- render={<a href="#" className="text-primary underline underline-offset-4" />}
201
- >
202
- @nextjs
203
- </HoverCardTrigger>`}
219
+ render={
220
+ <a
221
+ href="#"
222
+ className="text-primary underline underline-offset-4"
223
+ />
224
+ }
225
+ >
226
+ @nextjs
227
+ </HoverCardTrigger>`}
204
228
  >
205
229
  <HoverCard>
206
230
  <HoverCardTrigger
@@ -229,19 +253,35 @@ function HoverCardMicroShowcase({ globalSize }: { globalSize: Size }) {
229
253
  description="Tuỳ chỉnh thời gian trễ trước khi card xuất hiện hoặc biến mất. Props delay và closeDelay đặt trên HoverCardTrigger."
230
254
  fullWidth
231
255
  codeString={`<HoverCard>
232
- <HoverCardTrigger delay={0} render={<Button />}>Tức thì</HoverCardTrigger>
233
- <HoverCardPortal><HoverCardContent>...</HoverCardContent></HoverCardPortal>
234
- </HoverCard>
256
+ <HoverCardTrigger delay={0} render={<Button />}>
257
+ Tức thì
258
+ </HoverCardTrigger>
259
+ <HoverCardPortal>
260
+ <HoverCardContent>...</HoverCardContent>
261
+ </HoverCardPortal>
262
+ </HoverCard>
235
263
 
236
- <HoverCard>
237
- <HoverCardTrigger delay={500} render={<Button />}>Mặc định (500ms)</HoverCardTrigger>
238
- <HoverCardPortal><HoverCardContent>...</HoverCardContent></HoverCardPortal>
239
- </HoverCard>
264
+ <HoverCard>
265
+ <HoverCardTrigger delay={500} render={<Button />}>
266
+ Mặc định (500ms)
267
+ </HoverCardTrigger>
268
+ <HoverCardPortal>
269
+ <HoverCardContent>...</HoverCardContent>
270
+ </HoverCardPortal>
271
+ </HoverCard>
240
272
 
241
- <HoverCard>
242
- <HoverCardTrigger delay={1500} closeDelay={500} render={<Button />}>Chậm (1500ms)</HoverCardTrigger>
243
- <HoverCardPortal><HoverCardContent>...</HoverCardContent></HoverCardPortal>
244
- </HoverCard>`}
273
+ <HoverCard>
274
+ <HoverCardTrigger
275
+ delay={1500}
276
+ closeDelay={500}
277
+ render={<Button />}
278
+ >
279
+ Chậm (1500ms)
280
+ </HoverCardTrigger>
281
+ <HoverCardPortal>
282
+ <HoverCardContent>...</HoverCardContent>
283
+ </HoverCardPortal>
284
+ </HoverCard>`}
245
285
  >
246
286
  <div className="grid grid-cols-1 md:grid-cols-3 gap-4 w-full">
247
287
  <HoverCard>