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,3 +1,7 @@
1
+ import { useState } from "react";
2
+
3
+ import { BoxIcon, SettingsIcon, SlidersHorizontalIcon } from "lucide-react";
4
+
1
5
  import { AccordionPreset } from "../../components/macro/accordion-preset";
2
6
  import {
3
7
  Accordion,
@@ -12,8 +16,6 @@ import {
12
16
  Showcase,
13
17
  ShowcaseDocs,
14
18
  } from "../../dev/components/showcase";
15
- import { BoxIcon, SettingsIcon, SlidersHorizontalIcon } from "lucide-react";
16
- import { useState } from "react";
17
19
 
18
20
  // ──────────────────────────────────────────────────────────
19
21
  // Shared Data
@@ -70,27 +72,29 @@ function AccordionMacroShowcase() {
70
72
  label="Tiêu Chuẩn (Standard)"
71
73
  description="Accordion mở đơn cơ bản."
72
74
  codeString={`<AccordionPreset
73
- className="w-full"
74
- defaultValue={["item-1"]}
75
- items={[
76
- {
77
- value: "item-1",
78
- title: "Is it accessible?",
79
- content: "Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
80
- },
81
- {
82
- value: "item-2",
83
- title: "Is it styled?",
84
- content: "Yes. It comes with default styles that match the other components' aesthetic.",
85
- },
86
- {
87
- value: "item-3",
88
- title: "Is it animated?",
89
- content: "Yes. It's animated by default with smooth transitions.",
90
- },
91
- ]}
92
- />
93
- `}
75
+ className="w-full"
76
+ defaultValue={["item-1"]}
77
+ items={[
78
+ {
79
+ value: "item-1",
80
+ title: "Is it accessible?",
81
+ content:
82
+ "Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
83
+ },
84
+ {
85
+ value: "item-2",
86
+ title: "Is it styled?",
87
+ content:
88
+ "Yes. It comes with default styles that match the other components' aesthetic.",
89
+ },
90
+ {
91
+ value: "item-3",
92
+ title: "Is it animated?",
93
+ content:
94
+ "Yes. It's animated by default with smooth transitions.",
95
+ },
96
+ ]}
97
+ />`}
94
98
  >
95
99
  <AccordionPreset
96
100
  className="w-full"
@@ -122,28 +126,30 @@ function AccordionMacroShowcase() {
122
126
  label="Mở Nhiều (Multiple Expansion)"
123
127
  description="Cho phép mở nhiều mục cùng một lúc."
124
128
  codeString={`<AccordionPreset
125
- className="w-full"
126
- multiple
127
- defaultValue={["item-1", "item-2"]}
128
- items={[
129
- {
130
- value: "item-1",
131
- title: "Is it accessible?",
132
- content: "Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
133
- },
134
- {
135
- value: "item-2",
136
- title: "Is it styled?",
137
- content: "Yes. It comes with default styles that match the other components' aesthetic.",
138
- },
139
- {
140
- value: "item-3",
141
- title: "Is it animated?",
142
- content: "Yes. It's animated by default with smooth transitions.",
143
- },
144
- ]}
145
- />
146
- `}
129
+ className="w-full"
130
+ multiple
131
+ defaultValue={["item-1", "item-2"]}
132
+ items={[
133
+ {
134
+ value: "item-1",
135
+ title: "Is it accessible?",
136
+ content:
137
+ "Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
138
+ },
139
+ {
140
+ value: "item-2",
141
+ title: "Is it styled?",
142
+ content:
143
+ "Yes. It comes with default styles that match the other components' aesthetic.",
144
+ },
145
+ {
146
+ value: "item-3",
147
+ title: "Is it animated?",
148
+ content:
149
+ "Yes. It's animated by default with smooth transitions.",
150
+ },
151
+ ]}
152
+ />`}
147
153
  >
148
154
  <AccordionPreset
149
155
  className="w-full"
@@ -246,29 +252,29 @@ return (
246
252
  label="Disabled (Vô hiệu hoá)"
247
253
  description="Từng mục riêng lẻ có thể bị vô hiệu hóa trong khi các mục khác vẫn tương tác bình thường."
248
254
  codeString={`<AccordionPreset
249
- className="w-full"
250
- items={[
251
- {
252
- value: "enabled-1",
253
- title: "Available Feature",
254
- content:
255
- "This feature is available and can be expanded normally.",
256
- },
257
- {
258
- value: "disabled-1",
259
- title: "Premium Feature (Locked)",
260
- content: "This content is hidden behind a premium plan.",
261
- disabled: true,
262
- },
263
- {
264
- value: "enabled-2",
265
- title: "Another Feature",
266
- content:
267
- "This is another available feature you can interact with freely.",
268
- },
269
- ]}
270
- />
271
- `}
255
+ className="w-full"
256
+ items={[
257
+ {
258
+ value: "enabled-1",
259
+ title: "Available Feature",
260
+ content:
261
+ "This feature is available and can be expanded normally.",
262
+ },
263
+ {
264
+ value: "disabled-1",
265
+ title: "Premium Feature (Locked)",
266
+ content:
267
+ "This content is hidden behind a premium plan.",
268
+ disabled: true,
269
+ },
270
+ {
271
+ value: "enabled-2",
272
+ title: "Another Feature",
273
+ content:
274
+ "This is another available feature you can interact with freely.",
275
+ },
276
+ ]}
277
+ />`}
272
278
  >
273
279
  <AccordionPreset
274
280
  className="w-full"
@@ -301,25 +307,25 @@ return (
301
307
  label="Nội Dung Phức Tạp"
302
308
  description="Render các React Node bên trong nội dung."
303
309
  codeString={`<AccordionPreset
304
- className="w-full"
305
- items={[
306
- {
307
- value: "profile",
308
- title: "User Profile Settings",
309
- content: (
310
- <div className="flex flex-col items-start gap-3">
311
- <p className="text-sm">
312
- Update your personal information and preferences.
313
- </p>
314
- <button className="rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground">
315
- Edit Profile
316
- </button>
317
- </div>
318
- ),
319
- },
320
- ]}
321
- />
322
- `}
310
+ className="w-full"
311
+ items={[
312
+ {
313
+ value: "profile",
314
+ title: "User Profile Settings",
315
+ content: (
316
+ <div className="flex flex-col items-start gap-3">
317
+ <p className="text-sm">
318
+ Update your personal information and
319
+ preferences.
320
+ </p>
321
+ <button className="rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground">
322
+ Edit Profile
323
+ </button>
324
+ </div>
325
+ ),
326
+ },
327
+ ]}
328
+ />`}
323
329
  >
324
330
  <AccordionPreset
325
331
  className="w-full"
@@ -346,45 +352,44 @@ return (
346
352
  label="Lồng Nhau (Nested Accordions)"
347
353
  description="Nội dung bên trong có thể chứa một Accordion khác."
348
354
  codeString={`<AccordionPreset
349
- className="w-full"
350
- items={[
351
- {
352
- value: "getting-started",
353
- title: "Getting Started",
354
- content: (
355
- <AccordionPreset
356
- className="w-full"
357
- items={[
358
- {
359
- value: "installation",
360
- title: "Installation",
361
- content:
362
- "Run npm install to add the component to your project.",
363
- },
364
- ]}
365
- />
366
- ),
367
- },
368
- {
369
- value: "advanced",
370
- title: "Advanced Usage",
371
- content: (
372
- <AccordionPreset
373
- className="w-full"
374
- items={[
375
- {
376
- value: "controlled",
377
- title: "Controlled Mode",
378
- content:
379
- "Use the value and onValueChange props to control which items are open.",
380
- },
381
- ]}
382
- />
383
- ),
384
- },
385
- ]}
386
- />
387
- `}
355
+ className="w-full"
356
+ items={[
357
+ {
358
+ value: "getting-started",
359
+ title: "Getting Started",
360
+ content: (
361
+ <AccordionPreset
362
+ className="w-full"
363
+ items={[
364
+ {
365
+ value: "installation",
366
+ title: "Installation",
367
+ content:
368
+ "Run npm install to add the component to your project.",
369
+ },
370
+ ]}
371
+ />
372
+ ),
373
+ },
374
+ {
375
+ value: "advanced",
376
+ title: "Advanced Usage",
377
+ content: (
378
+ <AccordionPreset
379
+ className="w-full"
380
+ items={[
381
+ {
382
+ value: "controlled",
383
+ title: "Controlled Mode",
384
+ content:
385
+ "Use the value and onValueChange props to control which items are open.",
386
+ },
387
+ ]}
388
+ />
389
+ ),
390
+ },
391
+ ]}
392
+ />`}
388
393
  >
389
394
  <AccordionPreset
390
395
  className="w-full"
@@ -441,20 +446,35 @@ function AccordionMicroShowcase() {
441
446
  <ExampleSection
442
447
  label="Mở Đơn (Single Expand)"
443
448
  description="Chỉ một mục được phép mở tại một thời điểm (mặc định)."
444
- codeString={`<Accordion className="w-full" defaultValue={["Is it accessible?"]}>
445
- <AccordionItem value="Is it accessible?">
446
- <AccordionTrigger>Is it accessible?</AccordionTrigger>
447
- <AccordionContent>Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.</AccordionContent>
448
- </AccordionItem>
449
- <AccordionItem value="Is it styled?">
450
- <AccordionTrigger>Is it styled?</AccordionTrigger>
451
- <AccordionContent>Yes. It comes with default styles that match the other components' aesthetic. You can override every token via CSS variables.</AccordionContent>
452
- </AccordionItem>
453
- <AccordionItem value="Is it animated?">
454
- <AccordionTrigger>Is it animated?</AccordionTrigger>
455
- <AccordionContent>Yes. It's animated by default with smooth expand/collapse transitions, but you can disable animation if you prefer.</AccordionContent>
456
- </AccordionItem>
457
- </Accordion>`}
449
+ codeString={`<Accordion
450
+ className="w-full"
451
+ defaultValue={["Is it accessible?"]}
452
+ >
453
+ <AccordionItem value="Is it accessible?">
454
+ <AccordionTrigger>Is it accessible?</AccordionTrigger>
455
+ <AccordionContent>
456
+ Yes. It adheres to the WAI-ARIA design pattern.
457
+ Keyboard navigation and screen readers are fully
458
+ supported.
459
+ </AccordionContent>
460
+ </AccordionItem>
461
+ <AccordionItem value="Is it styled?">
462
+ <AccordionTrigger>Is it styled?</AccordionTrigger>
463
+ <AccordionContent>
464
+ Yes. It comes with default styles that match the
465
+ other components' aesthetic. You can override every
466
+ token via CSS variables.
467
+ </AccordionContent>
468
+ </AccordionItem>
469
+ <AccordionItem value="Is it animated?">
470
+ <AccordionTrigger>Is it animated?</AccordionTrigger>
471
+ <AccordionContent>
472
+ Yes. It's animated by default with smooth
473
+ expand/collapse transitions, but you can disable
474
+ animation if you prefer.
475
+ </AccordionContent>
476
+ </AccordionItem>
477
+ </Accordion>`}
458
478
  >
459
479
  <Accordion className="w-full" defaultValue={["Is it accessible?"]}>
460
480
  <AccordionItem value="Is it accessible?">
@@ -482,20 +502,36 @@ function AccordionMicroShowcase() {
482
502
  <ExampleSection
483
503
  label="Mở Nhiều (Multiple Expand)"
484
504
  description="Cho phép mở nhiều mục cùng lúc."
485
- codeString={`<Accordion className="w-full" multiple defaultValue={["Is it accessible?", "Is it styled?"]}>
486
- <AccordionItem value="Is it accessible?">
487
- <AccordionTrigger>Is it accessible?</AccordionTrigger>
488
- <AccordionContent>Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.</AccordionContent>
489
- </AccordionItem>
490
- <AccordionItem value="Is it styled?">
491
- <AccordionTrigger>Is it styled?</AccordionTrigger>
492
- <AccordionContent>Yes. It comes with default styles that match the other components' aesthetic. You can override every token via CSS variables.</AccordionContent>
493
- </AccordionItem>
494
- <AccordionItem value="Is it animated?">
495
- <AccordionTrigger>Is it animated?</AccordionTrigger>
496
- <AccordionContent>Yes. It's animated by default with smooth expand/collapse transitions, but you can disable animation if you prefer.</AccordionContent>
497
- </AccordionItem>
498
- </Accordion>`}
505
+ codeString={`<Accordion
506
+ className="w-full"
507
+ multiple
508
+ defaultValue={["Is it accessible?", "Is it styled?"]}
509
+ >
510
+ <AccordionItem value="Is it accessible?">
511
+ <AccordionTrigger>Is it accessible?</AccordionTrigger>
512
+ <AccordionContent>
513
+ Yes. It adheres to the WAI-ARIA design pattern.
514
+ Keyboard navigation and screen readers are fully
515
+ supported.
516
+ </AccordionContent>
517
+ </AccordionItem>
518
+ <AccordionItem value="Is it styled?">
519
+ <AccordionTrigger>Is it styled?</AccordionTrigger>
520
+ <AccordionContent>
521
+ Yes. It comes with default styles that match the
522
+ other components' aesthetic. You can override every
523
+ token via CSS variables.
524
+ </AccordionContent>
525
+ </AccordionItem>
526
+ <AccordionItem value="Is it animated?">
527
+ <AccordionTrigger>Is it animated?</AccordionTrigger>
528
+ <AccordionContent>
529
+ Yes. It's animated by default with smooth
530
+ expand/collapse transitions, but you can disable
531
+ animation if you prefer.
532
+ </AccordionContent>
533
+ </AccordionItem>
534
+ </Accordion>`}
499
535
  >
500
536
  <Accordion
501
537
  className="w-full"
@@ -530,27 +566,29 @@ function AccordionMicroShowcase() {
530
566
  label="Disabled (Vô hiệu hoá)"
531
567
  description="Từng mục riêng lẻ có thể bị vô hiệu hóa trong khi các mục khác vẫn tương tác bình thường."
532
568
  codeString={`<Accordion className="w-full">
533
- <AccordionItem value="enabled-1">
534
- <AccordionTrigger>Available Feature</AccordionTrigger>
535
- <AccordionContent>
536
- This feature is available and can be expanded normally. Click to
537
- see the details.
538
- </AccordionContent>
539
- </AccordionItem>
540
- <AccordionItem value="disabled-1" disabled>
541
- <AccordionTrigger>Premium Feature (Locked)</AccordionTrigger>
542
- <AccordionContent>
543
- This content is hidden behind a premium plan.
544
- </AccordionContent>
545
- </AccordionItem>
546
- <AccordionItem value="enabled-2">
547
- <AccordionTrigger>Another Feature</AccordionTrigger>
548
- <AccordionContent>
549
- This is another available feature you can interact with freely.
550
- </AccordionContent>
551
- </AccordionItem>
552
- </Accordion>
553
- `}
569
+ <AccordionItem value="enabled-1">
570
+ <AccordionTrigger>Available Feature</AccordionTrigger>
571
+ <AccordionContent>
572
+ This feature is available and can be expanded
573
+ normally. Click to see the details.
574
+ </AccordionContent>
575
+ </AccordionItem>
576
+ <AccordionItem value="disabled-1" disabled>
577
+ <AccordionTrigger>
578
+ Premium Feature (Locked)
579
+ </AccordionTrigger>
580
+ <AccordionContent>
581
+ This content is hidden behind a premium plan.
582
+ </AccordionContent>
583
+ </AccordionItem>
584
+ <AccordionItem value="enabled-2">
585
+ <AccordionTrigger>Another Feature</AccordionTrigger>
586
+ <AccordionContent>
587
+ This is another available feature you can interact
588
+ with freely.
589
+ </AccordionContent>
590
+ </AccordionItem>
591
+ </Accordion>`}
554
592
  >
555
593
  <Accordion className="w-full">
556
594
  <AccordionItem value="enabled-1">
@@ -579,47 +617,57 @@ function AccordionMicroShowcase() {
579
617
  label="Lồng Nhau (Nested Accordions)"
580
618
  description="Nội dung bên trong có thể chứa một Accordion khác để tạo cấu trúc nhiều cấp."
581
619
  codeString={`<Accordion className="w-full max-w-lg">
582
- <AccordionItem value="getting-started">
583
- <AccordionTrigger>Getting Started</AccordionTrigger>
584
- <AccordionContent>
585
- <Accordion>
586
- <AccordionItem value="installation">
587
- <AccordionTrigger>Installation</AccordionTrigger>
588
- <AccordionContent>
589
- Run npm install to add the component to your project.
590
- </AccordionContent>
591
- </AccordionItem>
592
- <AccordionItem value="configuration">
593
- <AccordionTrigger>Configuration</AccordionTrigger>
594
- <AccordionContent>
595
- Import and wrap your content with the Accordion component.
596
- </AccordionContent>
597
- </AccordionItem>
598
- </Accordion>
599
- </AccordionContent>
600
- </AccordionItem>
601
- <AccordionItem value="advanced">
602
- <AccordionTrigger>Advanced Usage</AccordionTrigger>
603
- <AccordionContent>
604
- <Accordion>
605
- <AccordionItem value="controlled">
606
- <AccordionTrigger>Controlled Mode</AccordionTrigger>
607
- <AccordionContent>
608
- Use the value and onValueChange props to control which
609
- items are open.
610
- </AccordionContent>
611
- </AccordionItem>
612
- <AccordionItem value="animation">
613
- <AccordionTrigger>Custom Animation</AccordionTrigger>
614
- <AccordionContent>
615
- Override transition duration and easing via className.
616
- </AccordionContent>
617
- </AccordionItem>
618
- </Accordion>
619
- </AccordionContent>
620
- </AccordionItem>
621
- </Accordion>
622
- `}
620
+ <AccordionItem value="getting-started">
621
+ <AccordionTrigger>Getting Started</AccordionTrigger>
622
+ <AccordionContent>
623
+ <Accordion>
624
+ <AccordionItem value="installation">
625
+ <AccordionTrigger>
626
+ Installation
627
+ </AccordionTrigger>
628
+ <AccordionContent>
629
+ Run npm install to add the component to your
630
+ project.
631
+ </AccordionContent>
632
+ </AccordionItem>
633
+ <AccordionItem value="configuration">
634
+ <AccordionTrigger>
635
+ Configuration
636
+ </AccordionTrigger>
637
+ <AccordionContent>
638
+ Import and wrap your content with the
639
+ Accordion component.
640
+ </AccordionContent>
641
+ </AccordionItem>
642
+ </Accordion>
643
+ </AccordionContent>
644
+ </AccordionItem>
645
+ <AccordionItem value="advanced">
646
+ <AccordionTrigger>Advanced Usage</AccordionTrigger>
647
+ <AccordionContent>
648
+ <Accordion>
649
+ <AccordionItem value="controlled">
650
+ <AccordionTrigger>
651
+ Controlled Mode
652
+ </AccordionTrigger>
653
+ <AccordionContent>
654
+ Use the value and onValueChange props to
655
+ control which items are open.
656
+ </AccordionContent>
657
+ </AccordionItem>
658
+ <AccordionItem value="animation">
659
+ <AccordionTrigger>
660
+ Custom Animation
661
+ </AccordionTrigger>
662
+ <AccordionContent>
663
+ Override transition duration and easing via
664
+ className.
665
+ </AccordionContent>
666
+ </AccordionItem>
667
+ </Accordion>
668
+ </AccordionContent>
669
+ </AccordionItem>
670
+ </Accordion>`}
623
671
  >
624
672
  <Accordion className="w-full max-w-lg">
625
673
  <AccordionItem value="getting-started">
@@ -669,23 +717,40 @@ function AccordionMicroShowcase() {
669
717
  label="FAQ Hoàn Chỉnh"
670
718
  description="Ví dụ một phần hỏi đáp FAQ hoàn chỉnh."
671
719
  codeString={`<Accordion className="w-full max-w-lg">
672
- <AccordionItem value="Is it accessible?">
673
- <AccordionTrigger>Is it accessible?</AccordionTrigger>
674
- <AccordionContent>Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.</AccordionContent>
675
- </AccordionItem>
676
- <AccordionItem value="Is it styled?">
677
- <AccordionTrigger>Is it styled?</AccordionTrigger>
678
- <AccordionContent>Yes. It comes with default styles that match the other components' aesthetic. You can override every token via CSS variables.</AccordionContent>
679
- </AccordionItem>
680
- <AccordionItem value="Is it animated?">
681
- <AccordionTrigger>Is it animated?</AccordionTrigger>
682
- <AccordionContent>Yes. It's animated by default with smooth expand/collapse transitions, but you can disable animation if you prefer.</AccordionContent>
683
- </AccordionItem>
684
- <AccordionItem value="Can I nest accordions?">
685
- <AccordionTrigger>Can I nest accordions?</AccordionTrigger>
686
- <AccordionContent>Yes. You can nest accordion components inside each other to create multi-level collapsible sections.</AccordionContent>
687
- </AccordionItem>
688
- </Accordion>`}
720
+ <AccordionItem value="Is it accessible?">
721
+ <AccordionTrigger>Is it accessible?</AccordionTrigger>
722
+ <AccordionContent>
723
+ Yes. It adheres to the WAI-ARIA design pattern.
724
+ Keyboard navigation and screen readers are fully
725
+ supported.
726
+ </AccordionContent>
727
+ </AccordionItem>
728
+ <AccordionItem value="Is it styled?">
729
+ <AccordionTrigger>Is it styled?</AccordionTrigger>
730
+ <AccordionContent>
731
+ Yes. It comes with default styles that match the
732
+ other components' aesthetic. You can override every
733
+ token via CSS variables.
734
+ </AccordionContent>
735
+ </AccordionItem>
736
+ <AccordionItem value="Is it animated?">
737
+ <AccordionTrigger>Is it animated?</AccordionTrigger>
738
+ <AccordionContent>
739
+ Yes. It's animated by default with smooth
740
+ expand/collapse transitions, but you can disable
741
+ animation if you prefer.
742
+ </AccordionContent>
743
+ </AccordionItem>
744
+ <AccordionItem value="Can I nest accordions?">
745
+ <AccordionTrigger>
746
+ Can I nest accordions?
747
+ </AccordionTrigger>
748
+ <AccordionContent>
749
+ Yes. You can nest accordion components inside each
750
+ other to create multi-level collapsible sections.
751
+ </AccordionContent>
752
+ </AccordionItem>
753
+ </Accordion>`}
689
754
  >
690
755
  <Accordion className="w-full max-w-lg">
691
756
  <AccordionItem value="Is it accessible?">
@@ -723,97 +788,117 @@ function AccordionMicroShowcase() {
723
788
  description="Các kịch bản thực tế giúp bạn quyết định nên dùng Micro (Accordion) hay Macro (AccordionPreset)."
724
789
  fullWidth
725
790
  codeString={`<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
726
- {/* ── Story 1: Macro wins ── */}
727
- <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
728
- <div className="flex items-start gap-3">
729
- <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
730
- <SettingsIcon className="size-4" aria-hidden="true" />
731
- </span>
732
- <div>
733
- <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
734
- Story 1 · Dùng Macro
735
- </p>
736
- <h3 className="mt-0.5 text-sm font-semibold text-foreground">
737
- Render danh sách FAQ từ API
738
- </h3>
791
+ {/* ── Story 1: Macro wins ── */}
792
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
793
+ <div className="flex items-start gap-3">
794
+ <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
795
+ <SettingsIcon
796
+ className="size-4"
797
+ aria-hidden="true"
798
+ />
799
+ </span>
800
+ <div>
801
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
802
+ Story 1 · Dùng Macro
803
+ </p>
804
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
805
+ Render danh sách FAQ từ API
806
+ </h3>
807
+ </div>
739
808
  </div>
740
- </div>
741
809
 
742
- <p className="text-xs text-muted-foreground leading-relaxed">
743
- Bạn nhận được một mảng dữ liệu FAQ (hỏi đáp) từ server. Nội dung
744
- đơn giản chỉ là text. Dùng Macro để tiết kiệm code.
745
- </p>
746
-
747
- <div className="rounded-lg bg-muted/50 p-3">
748
- <AccordionPreset
749
- className="w-full"
750
- items={[
751
- { value: "Is it accessible?", title: "Is it accessible?", content: "Yes. It adheres to the WAI-ARIA design pattern." },
752
- { value: "Is it styled?", title: "Is it styled?", content: "Yes. It comes with default styles that match the other components' aesthetic." },
753
- ]}
754
- />
755
- </div>
756
-
757
- <div className="rounded-md border border-border border-green-500/20 bg-green-500/5 px-3 py-2">
758
- <p className="text-xs font-medium text-green-700 dark:text-green-400">
759
- ✅ Dùng <code className="font-mono">AccordionPreset</code> — Tự
760
- động lặp qua array, không cần viết lại JSX cho từng thẻ Item.
810
+ <p className="text-xs text-muted-foreground leading-relaxed">
811
+ Bạn nhận được một mảng dữ liệu FAQ (hỏi đáp) từ
812
+ server. Nội dung đơn giản chỉ là text. Dùng Macro để
813
+ tiết kiệm code.
761
814
  </p>
762
- </div>
763
- </div>
764
-
765
- {/* ── Story 2: Micro wins ── */}
766
- <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
767
- <div className="flex items-start gap-3">
768
- <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
769
- <BoxIcon className="size-4" aria-hidden="true" />
770
- </span>
771
- <div>
772
- <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
773
- Story 2 · Dùng Micro
815
+
816
+ <div className="rounded-lg bg-muted/50 p-3">
817
+ <AccordionPreset
818
+ className="w-full"
819
+ items={[
820
+ {
821
+ value: "Is it accessible?",
822
+ title: "Is it accessible?",
823
+ content:
824
+ "Yes. It adheres to the WAI-ARIA design pattern.",
825
+ },
826
+ {
827
+ value: "Is it styled?",
828
+ title: "Is it styled?",
829
+ content:
830
+ "Yes. It comes with default styles that match the other components' aesthetic.",
831
+ },
832
+ ]}
833
+ />
834
+ </div>
835
+
836
+ <div className="rounded-md border border-border border-green-500/20 bg-green-500/5 px-3 py-2">
837
+ <p className="text-xs font-medium text-green-700 dark:text-green-400">
838
+ ✅ Dùng{" "}
839
+ <code className="font-mono">AccordionPreset</code>{" "}
840
+ — Tự động lặp qua array, không cần viết lại JSX
841
+ cho từng thẻ Item.
774
842
  </p>
775
- <h3 className="mt-0.5 text-sm font-semibold text-foreground">
776
- Tuỳ biến Trigger / Form phức tạp
777
- </h3>
778
843
  </div>
779
844
  </div>
780
845
 
781
- <p className="text-xs text-muted-foreground leading-relaxed">
782
- Trigger cần hiển thị Icon hoặc Badge. Nội dung bên trong là một
783
- Form phức tạp (chứ không phải text đơn thuần). Macro không thể làm
784
- được việc này.
785
- </p>
786
-
787
- <div className="rounded-lg bg-muted/50 p-3">
788
- <Accordion className="w-full">
789
- <AccordionItem value="settings">
790
- <AccordionTrigger className="gap-3">
791
- <SlidersHorizontalIcon className="size-4 text-primary" />
792
- <span className="flex-1 text-left">Advanced Settings</span>
793
- <span className="mr-2 rounded bg-primary/10 px-2 py-0.5 text-[10px] uppercase tracking-wider text-primary">
794
- New
795
- </span>
796
- </AccordionTrigger>
797
- <AccordionContent>
798
- <div className="flex items-center gap-3 rounded border border-border p-3 text-xs text-muted-foreground">
799
- <span>
800
- Nội dung tuỳ biến hoàn toàn, ví dụ: Form, Toggle, v.v.
801
- </span>
802
- </div>
803
- </AccordionContent>
804
- </AccordionItem>
805
- </Accordion>
806
- </div>
846
+ {/* ── Story 2: Micro wins ── */}
847
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
848
+ <div className="flex items-start gap-3">
849
+ <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
850
+ <BoxIcon className="size-4" aria-hidden="true" />
851
+ </span>
852
+ <div>
853
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
854
+ Story 2 · Dùng Micro
855
+ </p>
856
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
857
+ Tuỳ biến Trigger / Form phức tạp
858
+ </h3>
859
+ </div>
860
+ </div>
807
861
 
808
- <div className="rounded-md border border-border border-blue-500/20 bg-blue-500/5 px-3 py-2">
809
- <p className="text-xs font-medium text-blue-700 dark:text-blue-400">
810
- Dùng <code className="font-mono">Accordion</code> (Micro)
811
- Toàn quyền kiểm soát cấu trúc HTML của Trigger và Content.
862
+ <p className="text-xs text-muted-foreground leading-relaxed">
863
+ Trigger cần hiển thị Icon hoặc Badge. Nội dung bên
864
+ trong một Form phức tạp (chứ không phải text đơn
865
+ thuần). Macro không thể làm được việc này.
812
866
  </p>
867
+
868
+ <div className="rounded-lg bg-muted/50 p-3">
869
+ <Accordion className="w-full">
870
+ <AccordionItem value="settings">
871
+ <AccordionTrigger className="gap-3">
872
+ <SlidersHorizontalIcon className="size-4 text-primary" />
873
+ <span className="flex-1 text-left">
874
+ Advanced Settings
875
+ </span>
876
+ <span className="mr-2 rounded bg-primary/10 px-2 py-0.5 text-[10px] uppercase tracking-wider text-primary">
877
+ New
878
+ </span>
879
+ </AccordionTrigger>
880
+ <AccordionContent>
881
+ <div className="flex items-center gap-3 rounded border border-border p-3 text-xs text-muted-foreground">
882
+ <span>
883
+ Nội dung tuỳ biến hoàn toàn, ví dụ: Form,
884
+ Toggle, v.v.
885
+ </span>
886
+ </div>
887
+ </AccordionContent>
888
+ </AccordionItem>
889
+ </Accordion>
890
+ </div>
891
+
892
+ <div className="rounded-md border border-border border-blue-500/20 bg-blue-500/5 px-3 py-2">
893
+ <p className="text-xs font-medium text-blue-700 dark:text-blue-400">
894
+ ✅ Dùng{" "}
895
+ <code className="font-mono">Accordion</code>{" "}
896
+ (Micro) — Toàn quyền kiểm soát cấu trúc HTML của
897
+ Trigger và Content.
898
+ </p>
899
+ </div>
813
900
  </div>
814
- </div>
815
- </div>
816
- `}
901
+ </div>`}
817
902
  >
818
903
  <div className="grid grid-cols-1 gap-6 md:grid-cols-2">
819
904
  {/* ── Story 1: Macro wins ── */}