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,13 +1,3 @@
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
1
  import { useState } from "react";
12
2
 
13
3
  import { PaginationPreset } from "../../components/macro/pagination-preset";
@@ -20,6 +10,16 @@ import {
20
10
  PaginationNext,
21
11
  PaginationPrevious,
22
12
  } from "../../components/micro/pagination";
13
+ import { useDevContext } from "../../dev/components/dev-context";
14
+ import {
15
+ DocsCode,
16
+ DocsH3,
17
+ DocsP,
18
+ ExampleGrid,
19
+ ExampleSection,
20
+ Showcase,
21
+ ShowcaseDocs,
22
+ } from "../../dev/components/showcase";
23
23
  import { type Size } from "../../lib/types";
24
24
 
25
25
  // ──────────────────────────────────────────────────────────
@@ -34,15 +34,14 @@ function PaginationMacroShowcase({ globalSize }: { globalSize: Size }) {
34
34
  <ExampleSection
35
35
  label="Tiêu chuẩn (Standard)"
36
36
  description="Phân trang cơ bản với state điều khiển."
37
- codeString={`const [currentPage, setCurrentPage] = useState(1);
38
-
39
- return (
37
+ codeString={`const [currentPage, setCurrentPage] = useState(1); return
38
+ (
40
39
  <PaginationPreset
41
40
  currentPage={currentPage}
42
41
  totalPages={10}
43
42
  onPageChange={setCurrentPage}
44
43
  />
45
- );`}
44
+ );`}
46
45
  >
47
46
  <PaginationPreset
48
47
  currentPage={currentPage}
@@ -99,34 +98,29 @@ function PaginationMicroShowcase({ globalSize }: { globalSize: Size }) {
99
98
  label="Cơ bản (Default)"
100
99
  description="Lắp ráp thủ công các item và link. Hỗ trợ prop size."
101
100
  codeString={`<Pagination>
102
- <PaginationContent>
103
- <PaginationItem>
104
- <PaginationPrevious href="#" />
105
- </PaginationItem>
106
- <PaginationItem>
107
- <PaginationLink href="#">
108
- 1
109
- </PaginationLink>
110
- </PaginationItem>
111
- <PaginationItem>
112
- <PaginationLink href="#" isActive>
113
- 2
114
- </PaginationLink>
115
- </PaginationItem>
116
- <PaginationItem>
117
- <PaginationLink href="#">
118
- 3
119
- </PaginationLink>
120
- </PaginationItem>
121
- <PaginationItem>
122
- <PaginationEllipsis />
123
- </PaginationItem>
124
- <PaginationItem>
125
- <PaginationNext href="#" />
126
- </PaginationItem>
127
- </PaginationContent>
128
- </Pagination>
129
- `}
101
+ <PaginationContent>
102
+ <PaginationItem>
103
+ <PaginationPrevious href="#" />
104
+ </PaginationItem>
105
+ <PaginationItem>
106
+ <PaginationLink href="#">1</PaginationLink>
107
+ </PaginationItem>
108
+ <PaginationItem>
109
+ <PaginationLink href="#" isActive>
110
+ 2
111
+ </PaginationLink>
112
+ </PaginationItem>
113
+ <PaginationItem>
114
+ <PaginationLink href="#">3</PaginationLink>
115
+ </PaginationItem>
116
+ <PaginationItem>
117
+ <PaginationEllipsis />
118
+ </PaginationItem>
119
+ <PaginationItem>
120
+ <PaginationNext href="#" />
121
+ </PaginationItem>
122
+ </PaginationContent>
123
+ </Pagination>`}
130
124
  >
131
125
  <Pagination>
132
126
  <PaginationContent>
@@ -163,38 +157,76 @@ function PaginationMicroShowcase({ globalSize }: { globalSize: Size }) {
163
157
  description="So sánh nhanh khi nào dùng Micro và Macro."
164
158
  fullWidth
165
159
  codeString={`<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
166
- {/* Story 1: Macro wins */}
167
- <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
168
- <div className="flex items-start gap-3">
169
- <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
170
- <svg xmlns="http://www.w3.org/2000/svg" className="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>
171
- </span>
172
- <div>
173
- <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">Story 1 · Dùng Macro</p>
174
- <h3 className="mt-0.5 text-sm font-semibold text-foreground">Xử lý tự động</h3>
160
+ {/* Story 1: Macro wins */}
161
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
162
+ <div className="flex items-start gap-3">
163
+ <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
164
+ <svg
165
+ xmlns="http://www.w3.org/2000/svg"
166
+ className="size-4"
167
+ viewBox="0 0 24 24"
168
+ fill="none"
169
+ stroke="currentColor"
170
+ strokeWidth="2"
171
+ strokeLinecap="round"
172
+ strokeLinejoin="round"
173
+ aria-hidden="true"
174
+ >
175
+ <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" />
176
+ </svg>
177
+ </span>
178
+ <div>
179
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
180
+ Story 1 · Dùng Macro
181
+ </p>
182
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
183
+ Xử lý tự động
184
+ </h3>
185
+ </div>
175
186
  </div>
187
+ <p className="text-xs text-muted-foreground leading-relaxed">
188
+ Dùng Preset khi bạn chỉ muốn truyền vào{" "}
189
+ <DocsCode>currentPage</DocsCode> và{" "}
190
+ <DocsCode>totalPages</DocsCode> để tự động sinh ra
191
+ UI phân trang chuẩn xác (bao gồm dấu ba chấm).
192
+ </p>
176
193
  </div>
177
- <p className="text-xs text-muted-foreground leading-relaxed">
178
- Dùng Preset khi bạn chỉ muốn truyền vào <DocsCode>currentPage</DocsCode> và <DocsCode>totalPages</DocsCode> để tự động sinh ra UI phân trang chuẩn xác (bao gồm dấu ba chấm).
179
- </p>
180
- </div>
181
194
 
182
- {/* Story 2: Micro wins */}
183
- <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
184
- <div className="flex items-start gap-3">
185
- <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
186
- <svg xmlns="http://www.w3.org/2000/svg" className="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"/></svg>
187
- </span>
188
- <div>
189
- <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">Story 2 · Dùng Micro</p>
190
- <h3 className="mt-0.5 text-sm font-semibold text-foreground">Tuỳ biến HTML / SEO</h3>
195
+ {/* Story 2: Micro wins */}
196
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
197
+ <div className="flex items-start gap-3">
198
+ <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
199
+ <svg
200
+ xmlns="http://www.w3.org/2000/svg"
201
+ className="size-4"
202
+ viewBox="0 0 24 24"
203
+ fill="none"
204
+ stroke="currentColor"
205
+ strokeWidth="2"
206
+ strokeLinecap="round"
207
+ strokeLinejoin="round"
208
+ aria-hidden="true"
209
+ >
210
+ <path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z" />
211
+ </svg>
212
+ </span>
213
+ <div>
214
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
215
+ Story 2 · Dùng Micro
216
+ </p>
217
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
218
+ Tuỳ biến HTML / SEO
219
+ </h3>
220
+ </div>
191
221
  </div>
222
+ <p className="text-xs text-muted-foreground leading-relaxed">
223
+ Dùng Micro khi bạn muốn dùng{" "}
224
+ <DocsCode>&lt;a&gt;</DocsCode> tag thực sự thay vì
225
+ onClick (tốt cho SEO) hoặc khi bạn có luồng logic
226
+ hiển thị pagination đặc biệt.
227
+ </p>
192
228
  </div>
193
- <p className="text-xs text-muted-foreground leading-relaxed">
194
- Dùng Micro khi bạn muốn dùng <DocsCode>&lt;a&gt;</DocsCode> tag thực sự thay vì onClick (tốt cho SEO) hoặc khi bạn có luồng logic hiển thị pagination đặc biệt.
195
- </p>
196
- </div>
197
- </div>`}
229
+ </div>`}
198
230
  >
199
231
  <div className="grid grid-cols-1 gap-6 md:grid-cols-2">
200
232
  {/* Story 1: Macro wins */}
@@ -1,13 +1,7 @@
1
- import { useDevContext } from "../../dev/components/dev-context";
2
- import {
3
- DocsP,
4
- ExampleGrid,
5
- ExampleSection,
6
- Showcase,
7
- ShowcaseDocs,
8
- } from "../../dev/components/showcase";
9
1
  import { useState } from "react";
10
2
 
3
+ import { Bell, Settings } from "lucide-react";
4
+
11
5
  import { Button } from "../../components/micro/button";
12
6
  import { Input } from "../../components/micro/input";
13
7
  import { Label } from "../../components/micro/label";
@@ -16,12 +10,19 @@ import {
16
10
  PopoverContent,
17
11
  PopoverDescription,
18
12
  PopoverHeader,
13
+ PopoverPortal,
19
14
  PopoverTitle,
20
15
  PopoverTrigger,
21
- PopoverPortal,
22
16
  } from "../../components/micro/popover";
17
+ import { useDevContext } from "../../dev/components/dev-context";
18
+ import {
19
+ DocsP,
20
+ ExampleGrid,
21
+ ExampleSection,
22
+ Showcase,
23
+ ShowcaseDocs,
24
+ } from "../../dev/components/showcase";
23
25
  import { type Size } from "../../lib/types";
24
- import { Bell, Settings } from "lucide-react";
25
26
 
26
27
  // ──────────────────────────────────────────────────────────
27
28
  // SECTION 2: Micro Content (không export)
@@ -116,59 +117,72 @@ function PopoverMicroShowcase({ globalSize }: { globalSize: Size }) {
116
117
  label="Icon Trigger"
117
118
  description="Mở Popover bằng Icon Button."
118
119
  codeString={`<div className="flex gap-4">
119
- <Popover>
120
- <PopoverTrigger
121
- render={
122
- <Button
123
- variant="ghost"
124
- size="md"
125
- iconOnly
126
- className="rounded-full"
120
+ <Popover>
121
+ <PopoverTrigger
122
+ render={
123
+ <Button
124
+ variant="ghost"
125
+ size="md"
126
+ iconOnly
127
+ className="rounded-full"
128
+ >
129
+ <Bell className="size-4" />
130
+ </Button>
131
+ }
132
+ />
133
+ <PopoverPortal>
134
+ <PopoverContent
135
+ className="w-64"
136
+ sideOffset={8}
137
+ align="start"
127
138
  >
128
- <Bell className="size-4" />
129
- </Button>
130
- }
131
- />
132
- <PopoverPortal><PopoverContent className="w-64" sideOffset={8} align="start">
133
- <PopoverHeader>
134
- <PopoverTitle>Thông báo</PopoverTitle>
135
- <PopoverDescription>
136
- Bạn có 3 tin nhắn chưa đọc.
137
- </PopoverDescription>
138
- </PopoverHeader>
139
- </PopoverContent></PopoverPortal>
140
- </Popover>
139
+ <PopoverHeader>
140
+ <PopoverTitle>Thông báo</PopoverTitle>
141
+ <PopoverDescription>
142
+ Bạn có 3 tin nhắn chưa đọc.
143
+ </PopoverDescription>
144
+ </PopoverHeader>
145
+ </PopoverContent>
146
+ </PopoverPortal>
147
+ </Popover>
141
148
 
142
- <Popover>
143
- <PopoverTrigger
144
- render={
145
- <Button variant="outline" size="md" iconOnly>
146
- <Settings className="size-4" />
147
- </Button>
148
- }
149
- />
150
- <PopoverPortal><PopoverContent className="w-56" sideOffset={8}>
151
- <PopoverHeader>
152
- <PopoverTitle>Cài đặt nhanh</PopoverTitle>
153
- </PopoverHeader>
154
- <div className="flex flex-col gap-2 mt-2">
155
- <Button variant="ghost" className="justify-start">
156
- Tài khoản
157
- </Button>
158
- <Button variant="ghost" className="justify-start">
159
- Giao diện
160
- </Button>
161
- <Button
162
- variant="ghost"
163
- className="justify-start text-destructive hover:text-destructive"
164
- >
165
- Đăng xuất
166
- </Button>
167
- </div>
168
- </PopoverContent></PopoverPortal>
169
- </Popover>
170
- </div>
171
- `}
149
+ <Popover>
150
+ <PopoverTrigger
151
+ render={
152
+ <Button variant="outline" size="md" iconOnly>
153
+ <Settings className="size-4" />
154
+ </Button>
155
+ }
156
+ />
157
+ <PopoverPortal>
158
+ <PopoverContent className="w-56" sideOffset={8}>
159
+ <PopoverHeader>
160
+ <PopoverTitle>Cài đặt nhanh</PopoverTitle>
161
+ </PopoverHeader>
162
+ <div className="flex flex-col gap-2 mt-2">
163
+ <Button
164
+ variant="ghost"
165
+ className="justify-start"
166
+ >
167
+ Tài khoản
168
+ </Button>
169
+ <Button
170
+ variant="ghost"
171
+ className="justify-start"
172
+ >
173
+ Giao diện
174
+ </Button>
175
+ <Button
176
+ variant="ghost"
177
+ className="justify-start text-destructive hover:text-destructive"
178
+ >
179
+ Đăng xuất
180
+ </Button>
181
+ </div>
182
+ </PopoverContent>
183
+ </PopoverPortal>
184
+ </Popover>
185
+ </div>`}
172
186
  >
173
187
  <div className="flex gap-4">
174
188
  <Popover>
@@ -236,13 +250,19 @@ function PopoverMicroShowcase({ globalSize }: { globalSize: Size }) {
236
250
  label="Placement (Vị trí)"
237
251
  description="Popover có thể hiển thị ở nhiều hướng khác nhau so với trigger (Top, Bottom, Left, Right)."
238
252
  codeString={`<Popover>
239
- <PopoverTrigger asChild>
240
- <Button variant="outline">top</Button>
241
- </PopoverTrigger>
242
- <PopoverPortal><PopoverContent side="top" sideOffset={8} className="w-48 text-center text-sm p-4">
243
- Hiển thị ở phía <strong>top</strong>
244
- </PopoverContent></PopoverPortal>
245
- </Popover>`}
253
+ <PopoverTrigger asChild>
254
+ <Button variant="outline">top</Button>
255
+ </PopoverTrigger>
256
+ <PopoverPortal>
257
+ <PopoverContent
258
+ side="top"
259
+ sideOffset={8}
260
+ className="w-48 text-center text-sm p-4"
261
+ >
262
+ Hiển thị ở phía <strong>top</strong>
263
+ </PopoverContent>
264
+ </PopoverPortal>
265
+ </Popover>`}
246
266
  >
247
267
  <div className="flex flex-wrap items-center justify-center gap-4 py-8">
248
268
  {(["top", "right", "bottom", "left"] as const).map((side) => (
@@ -275,28 +295,35 @@ function PopoverMicroShowcase({ globalSize }: { globalSize: Size }) {
275
295
  <ExampleSection
276
296
  label="Controlled State"
277
297
  description="Quản lý trạng thái đóng/mở của Popover thông qua React state (open và onOpenChange)."
278
- codeString={`const [isOpen, setIsOpen] = React.useState(false)
279
-
280
- return (
298
+ codeString={`const [isOpen, setIsOpen] = React.useState(false) return (
281
299
  <Popover open={isOpen} onOpenChange={setIsOpen}>
282
300
  <PopoverTrigger asChild>
283
- <Button variant="outline">Toggle Controlled Popover</Button>
301
+ <Button variant="outline">
302
+ Toggle Controlled Popover
303
+ </Button>
284
304
  </PopoverTrigger>
285
- <PopoverPortal><PopoverContent className="w-80" sideOffset={8}>
286
- <PopoverHeader>
287
- <PopoverTitle>Controlled Mode</PopoverTitle>
288
- <PopoverDescription>
289
- Popover này được control bởi state. Bạn có thể đóng nó bằng nút bên dưới hoặc click ra ngoài.
290
- </PopoverDescription>
291
- </PopoverHeader>
292
- <div className="mt-4 flex justify-end">
293
- <Button size="sm" color="secondary" onClick={() => setIsOpen(false)}>
294
- Đóng Popover
295
- </Button>
296
- </div>
297
- </PopoverContent></PopoverPortal>
305
+ <PopoverPortal>
306
+ <PopoverContent className="w-80" sideOffset={8}>
307
+ <PopoverHeader>
308
+ <PopoverTitle>Controlled Mode</PopoverTitle>
309
+ <PopoverDescription>
310
+ Popover này được control bởi state. Bạn có thể
311
+ đóng nó bằng nút bên dưới hoặc click ra ngoài.
312
+ </PopoverDescription>
313
+ </PopoverHeader>
314
+ <div className="mt-4 flex justify-end">
315
+ <Button
316
+ size="sm"
317
+ color="secondary"
318
+ onClick={() => setIsOpen(false)}
319
+ >
320
+ Đóng Popover
321
+ </Button>
322
+ </div>
323
+ </PopoverContent>
324
+ </PopoverPortal>
298
325
  </Popover>
299
- )`}
326
+ )`}
300
327
  >
301
328
  <div className="flex items-center gap-4">
302
329
  <Popover open={isOpen} onOpenChange={setIsOpen}>