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,19 +1,7 @@
1
- import { useDevContext } from "../../dev/components/dev-context";
2
1
  import { zodResolver } from "@hookform/resolvers/zod";
3
- import { useState } from "react";
4
2
  import { Controller, useForm } from "react-hook-form";
5
3
  import * as z from "zod";
6
4
 
7
- import {
8
- DocsCode,
9
- DocsP,
10
- ExampleGrid,
11
- ExampleSection,
12
- Showcase,
13
- ShowcaseDocs,
14
- } from "../../dev/components/showcase";
15
- import { type Size } from "../../lib/types";
16
-
17
5
  import { ComboboxPreset } from "../../components/macro/combobox-preset";
18
6
  import { Button } from "../../components/micro/button";
19
7
  import {
@@ -47,6 +35,16 @@ import {
47
35
  InputGroupAddon,
48
36
  InputGroupInput,
49
37
  } from "../../components/micro/input-group";
38
+ import { useDevContext } from "../../dev/components/dev-context";
39
+ import {
40
+ DocsCode,
41
+ DocsP,
42
+ ExampleGrid,
43
+ ExampleSection,
44
+ Showcase,
45
+ ShowcaseDocs,
46
+ } from "../../dev/components/showcase";
47
+ import { type Size } from "../../lib/types";
50
48
 
51
49
  const frontendFrameworks = ["react", "vue", "svelte"];
52
50
  const backendFrameworks = ["express", "nest"];
@@ -148,7 +146,8 @@ function ComboboxMacroShowcase({ globalSize }: { globalSize: Size }) {
148
146
  <ExampleSection
149
147
  label="Tiêu chuẩn"
150
148
  description="Tương tự Select nhưng có thể gõ để tìm kiếm."
151
- codeString={`<ComboboxPreset className="w-full"
149
+ codeString={`<ComboboxPreset
150
+ className="w-full"
152
151
  label="Framework"
153
152
  description="Hỗ trợ hàng ngàn bản ghi mà không lag."
154
153
  placeholder="Chọn framework..."
@@ -160,8 +159,7 @@ function ComboboxMacroShowcase({ globalSize }: { globalSize: Size }) {
160
159
  { value: "angular", label: "Angular" },
161
160
  { value: "svelte", label: "Svelte" },
162
161
  ]}
163
- />
164
- `}
162
+ />`}
165
163
  >
166
164
  <ComboboxPreset
167
165
  className="w-full"
@@ -184,14 +182,15 @@ function ComboboxMacroShowcase({ globalSize }: { globalSize: Size }) {
184
182
  label="Trạng thái Lỗi (Error)"
185
183
  description="Báo lỗi khi bỏ trống form."
186
184
  codeString={`<div className="w-full flex flex-col gap-6">
187
- <ComboboxPreset
188
- label="Khu vực (Lỗi)"
189
- placeholder="Chọn khu vực..."
190
- options={[{ value: "ap", label: "Châu Á Thái Bình Dương" }]}
191
- errorMessage="Khu vực bắt buộc."
192
- />
193
- </div>
194
- `}
185
+ <ComboboxPreset
186
+ label="Khu vực (Lỗi)"
187
+ placeholder="Chọn khu vực..."
188
+ options={[
189
+ { value: "ap", label: "Châu Á Thái Bình Dương" },
190
+ ]}
191
+ errorMessage="Khu vực là bắt buộc."
192
+ />
193
+ </div>`}
195
194
  >
196
195
  <div className="w-full flex flex-col gap-6">
197
196
  <ComboboxPreset
@@ -209,7 +208,8 @@ function ComboboxMacroShowcase({ globalSize }: { globalSize: Size }) {
209
208
  <ExampleSection
210
209
  label="Khóa / Bất hoạt (Disabled)"
211
210
  description="Người dùng không thể click hay gõ vào ô."
212
- codeString={`<ComboboxPreset className="w-full"
211
+ codeString={`<ComboboxPreset
212
+ className="w-full"
213
213
  label="Đội nhóm (Team)"
214
214
  description="Bạn không có quyền thay đổi đội trong dự án này."
215
215
  placeholder="Chọn đội..."
@@ -219,8 +219,7 @@ function ComboboxMacroShowcase({ globalSize }: { globalSize: Size }) {
219
219
  ]}
220
220
  value="engineering"
221
221
  disabled
222
- />
223
- `}
222
+ />`}
224
223
  >
225
224
  <ComboboxPreset
226
225
  className="w-full"
@@ -240,18 +239,18 @@ function ComboboxMacroShowcase({ globalSize }: { globalSize: Size }) {
240
239
  <ExampleSection
241
240
  label="Cuộn danh sách dài (Long List)"
242
241
  description="Trải nghiệm mượt mà với danh sách ảo hoá."
243
- codeString={`<ComboboxPreset className="w-full"
244
-
242
+ codeString={`<ComboboxPreset
243
+ className="w-full"
244
+
245
245
  label="Múi giờ (Timezone)"
246
246
  placeholder="Chọn múi giờ..."
247
247
  searchPlaceholder="Tìm kiếm múi giờ..."
248
248
  emptyText="Không tìm thấy múi giờ."
249
249
  options={Array.from({ length: 50 }).map((_, i) => ({
250
250
  value: \`utc\${i - 12}\`,
251
- label: \`UTC \${i - 12 > 0 ? '+' : ''}\${i - 12}:00\`,
251
+ label: \`UTC \${i - 12 > 0 ? "+" : ""}\${i - 12}:00\`,
252
252
  }))}
253
- />
254
- `}
253
+ />`}
255
254
  >
256
255
  <ComboboxPreset
257
256
  className="w-full"
@@ -292,42 +291,51 @@ function ComboboxMicroShowcase({ globalSize }: { globalSize: Size }) {
292
291
  label="Cơ bản & Phân nhóm"
293
292
  description="Sử dụng InputGroup, ComboboxAnchor, ComboboxGroup."
294
293
  codeString={`<Field className="w-full">
295
- <FieldLabel>Tìm kiếm Framework</FieldLabel>
296
- <FieldContent>
297
- <Combobox items={allFrameworks}>
298
- <ComboboxAnchor className="w-full">
299
- <InputGroup className="w-full">
300
- <ComboboxInput
301
- placeholder="Tìm framework..."
302
- render={<InputGroupInput />}
303
- />
304
- <InputGroupAddon align="end">
305
- <ComboboxTrigger className="flex h-full cursor-default items-center justify-center px-2.5 outline-none group-has-data-[slot=combobox-clear]/input-group:hidden disabled:cursor-not-allowed disabled:opacity-50" />
306
- <ComboboxClear />
307
- </InputGroupAddon>
308
- </InputGroup>
309
- </ComboboxAnchor>
310
- <ComboboxPortal><ComboboxContent>
311
- <ComboboxEmpty>Không tìm thấy.</ComboboxEmpty>
312
- <ComboboxList>
313
- <ComboboxGroup>
314
- <ComboboxLabel>Frontend</ComboboxLabel>
315
- <ComboboxItem value="react">React</ComboboxItem>
316
- <ComboboxItem value="vue">Vue</ComboboxItem>
317
- <ComboboxItem value="svelte">Svelte</ComboboxItem>
318
- </ComboboxGroup>
319
- <ComboboxSeparator />
320
- <ComboboxGroup>
321
- <ComboboxLabel>Backend</ComboboxLabel>
322
- <ComboboxItem value="express">Express</ComboboxItem>
323
- <ComboboxItem value="nest">NestJS</ComboboxItem>
324
- </ComboboxGroup>
325
- </ComboboxList>
326
- </ComboboxContent></ComboboxPortal>
327
- </Combobox>
328
- </FieldContent>
329
- </Field>
330
- `}
294
+ <FieldLabel>Tìm kiếm Framework</FieldLabel>
295
+ <FieldContent>
296
+ <Combobox items={allFrameworks}>
297
+ <ComboboxAnchor className="w-full">
298
+ <InputGroup className="w-full">
299
+ <ComboboxInput
300
+ placeholder="Tìm framework..."
301
+ render={<InputGroupInput />}
302
+ />
303
+ <InputGroupAddon align="end">
304
+ <ComboboxTrigger className="flex h-full cursor-default items-center justify-center px-2.5 outline-none group-has-data-[slot=combobox-clear]/input-group:hidden disabled:cursor-not-allowed disabled:opacity-50" />
305
+ <ComboboxClear />
306
+ </InputGroupAddon>
307
+ </InputGroup>
308
+ </ComboboxAnchor>
309
+ <ComboboxPortal>
310
+ <ComboboxContent>
311
+ <ComboboxEmpty>Không tìm thấy.</ComboboxEmpty>
312
+ <ComboboxList>
313
+ <ComboboxGroup>
314
+ <ComboboxLabel>Frontend</ComboboxLabel>
315
+ <ComboboxItem value="react">
316
+ React
317
+ </ComboboxItem>
318
+ <ComboboxItem value="vue">Vue</ComboboxItem>
319
+ <ComboboxItem value="svelte">
320
+ Svelte
321
+ </ComboboxItem>
322
+ </ComboboxGroup>
323
+ <ComboboxSeparator />
324
+ <ComboboxGroup>
325
+ <ComboboxLabel>Backend</ComboboxLabel>
326
+ <ComboboxItem value="express">
327
+ Express
328
+ </ComboboxItem>
329
+ <ComboboxItem value="nest">
330
+ NestJS
331
+ </ComboboxItem>
332
+ </ComboboxGroup>
333
+ </ComboboxList>
334
+ </ComboboxContent>
335
+ </ComboboxPortal>
336
+ </Combobox>
337
+ </FieldContent>
338
+ </Field>`}
331
339
  >
332
340
  <Field size={globalSize} className="w-full">
333
341
  <FieldLabel>Tìm kiếm Framework</FieldLabel>
@@ -374,34 +382,43 @@ function ComboboxMicroShowcase({ globalSize }: { globalSize: Size }) {
374
382
  label="Chọn nhiều (Multi-select Chips)"
375
383
  description="Sử dụng ComboboxChips và ComboboxChip thay cho Input."
376
384
  codeString={`<Field className="w-full">
377
- <FieldLabel>Gán thẻ (Tags)</FieldLabel>
378
- <FieldContent>
379
- <Combobox items={tagItems} multiple>
380
- <ComboboxChips>
381
- <ComboboxChip value="bug">Lỗi (Bug)</ComboboxChip>
382
- <ComboboxChip value="feature">
383
- Tính năng (Feature)
384
- </ComboboxChip>
385
- <ComboboxChipsInput placeholder="Thêm thẻ..." />
386
- </ComboboxChips>
387
- <ComboboxPortal><ComboboxContent>
388
- <ComboboxEmpty>Không tìm thấy thẻ.</ComboboxEmpty>
389
- <ComboboxList>
390
- <ComboboxItem value="bug">Lỗi (Bug)</ComboboxItem>
391
- <ComboboxItem value="feature">
385
+ <FieldLabel>Gán thẻ (Tags)</FieldLabel>
386
+ <FieldContent>
387
+ <Combobox items={tagItems} multiple>
388
+ <ComboboxChips>
389
+ <ComboboxChip value="bug">Lỗi (Bug)</ComboboxChip>
390
+ <ComboboxChip value="feature">
392
391
  Tính năng (Feature)
393
- </ComboboxItem>
394
- <ComboboxItem value="enhancement">Cải thiện</ComboboxItem>
395
- <ComboboxItem value="docs">Tài liệu</ComboboxItem>
396
- </ComboboxList>
397
- </ComboboxContent></ComboboxPortal>
398
- </Combobox>
399
- </FieldContent>
400
- <FieldDescription>
401
- Bạn có thể chọn nhiều thẻ cùng lúc.
402
- </FieldDescription>
403
- </Field>
404
- `}
392
+ </ComboboxChip>
393
+ <ComboboxChipsInput placeholder="Thêm thẻ..." />
394
+ </ComboboxChips>
395
+ <ComboboxPortal>
396
+ <ComboboxContent>
397
+ <ComboboxEmpty>
398
+ Không tìm thấy thẻ.
399
+ </ComboboxEmpty>
400
+ <ComboboxList>
401
+ <ComboboxItem value="bug">
402
+ Lỗi (Bug)
403
+ </ComboboxItem>
404
+ <ComboboxItem value="feature">
405
+ Tính năng (Feature)
406
+ </ComboboxItem>
407
+ <ComboboxItem value="enhancement">
408
+ Cải thiện
409
+ </ComboboxItem>
410
+ <ComboboxItem value="docs">
411
+ Tài liệu
412
+ </ComboboxItem>
413
+ </ComboboxList>
414
+ </ComboboxContent>
415
+ </ComboboxPortal>
416
+ </Combobox>
417
+ </FieldContent>
418
+ <FieldDescription>
419
+ Bạn có thể chọn nhiều thẻ cùng lúc.
420
+ </FieldDescription>
421
+ </Field>`}
405
422
  >
406
423
  <Field size={globalSize} className="w-full">
407
424
  <FieldLabel>Gán thẻ (Tags)</FieldLabel>
@@ -442,30 +459,36 @@ function ComboboxMicroShowcase({ globalSize }: { globalSize: Size }) {
442
459
  label="Disabled thủ công"
443
460
  description="Truyền disabled vào InputGroupInput và ComboboxTrigger."
444
461
  codeString={`<Field className="w-full">
445
- <FieldLabel>Tìm kiếm (Disabled)</FieldLabel>
446
- <FieldContent>
447
- <Combobox items={["react"]}>
448
- <ComboboxAnchor className="w-full">
449
- <InputGroup className="w-full">
450
- <ComboboxInput
451
- placeholder="Tìm kiếm..."
452
- disabled
453
- render={<InputGroupInput disabled />}
454
- />
455
- <InputGroupAddon align="end">
456
- <ComboboxTrigger className="flex h-full cursor-default items-center justify-center px-2.5 outline-none group-has-data-[slot=combobox-clear]/input-group:hidden disabled:cursor-not-allowed disabled:opacity-50" disabled />
457
- </InputGroupAddon>
458
- </InputGroup>
459
- </ComboboxAnchor>
460
- <ComboboxPortal><ComboboxContent>
461
- <ComboboxList>
462
- <ComboboxItem value="react">React</ComboboxItem>
463
- </ComboboxList>
464
- </ComboboxContent></ComboboxPortal>
465
- </Combobox>
466
- </FieldContent>
467
- </Field>
468
- `}
462
+ <FieldLabel>Tìm kiếm (Disabled)</FieldLabel>
463
+ <FieldContent>
464
+ <Combobox items={["react"]}>
465
+ <ComboboxAnchor className="w-full">
466
+ <InputGroup className="w-full">
467
+ <ComboboxInput
468
+ placeholder="Tìm kiếm..."
469
+ disabled
470
+ render={<InputGroupInput disabled />}
471
+ />
472
+ <InputGroupAddon align="end">
473
+ <ComboboxTrigger
474
+ className="flex h-full cursor-default items-center justify-center px-2.5 outline-none group-has-data-[slot=combobox-clear]/input-group:hidden disabled:cursor-not-allowed disabled:opacity-50"
475
+ disabled
476
+ />
477
+ </InputGroupAddon>
478
+ </InputGroup>
479
+ </ComboboxAnchor>
480
+ <ComboboxPortal>
481
+ <ComboboxContent>
482
+ <ComboboxList>
483
+ <ComboboxItem value="react">
484
+ React
485
+ </ComboboxItem>
486
+ </ComboboxList>
487
+ </ComboboxContent>
488
+ </ComboboxPortal>
489
+ </Combobox>
490
+ </FieldContent>
491
+ </Field>`}
469
492
  >
470
493
  <Field size={globalSize} className="w-full">
471
494
  <FieldLabel>Tìm kiếm (Disabled)</FieldLabel>
@@ -503,34 +526,41 @@ function ComboboxMicroShowcase({ globalSize }: { globalSize: Size }) {
503
526
  label="Trạng thái Lỗi (Invalid)"
504
527
  description="Gắn aria-invalid vào ô nhập liệu."
505
528
  codeString={`<Field data-invalid={true} className="w-full">
506
- <FieldLabel>Mã giảm giá</FieldLabel>
507
- <FieldContent>
508
- <Combobox items={["sale20", "sale50"]}>
509
- <ComboboxAnchor className="w-full">
510
- <InputGroup className="w-full">
511
- <ComboboxInput
512
- placeholder="Nhập mã..."
513
- aria-invalid={true}
514
- render={<InputGroupInput />}
515
- />
516
- <InputGroupAddon align="end">
517
- <ComboboxTrigger className="flex h-full cursor-default items-center justify-center px-2.5 outline-none group-has-data-[slot=combobox-clear]/input-group:hidden disabled:cursor-not-allowed disabled:opacity-50" />
518
- <ComboboxClear />
519
- </InputGroupAddon>
520
- </InputGroup>
521
- </ComboboxAnchor>
522
- <ComboboxPortal><ComboboxContent>
523
- <ComboboxEmpty>Không tìm thấy mã.</ComboboxEmpty>
524
- <ComboboxList>
525
- <ComboboxItem value="sale20">Giảm 20%</ComboboxItem>
526
- <ComboboxItem value="sale50">Giảm 50%</ComboboxItem>
527
- </ComboboxList>
528
- </ComboboxContent></ComboboxPortal>
529
- </Combobox>
530
- </FieldContent>
531
- <FieldError>Mã này đã hết hạn.</FieldError>
532
- </Field>
533
- `}
529
+ <FieldLabel>Mã giảm giá</FieldLabel>
530
+ <FieldContent>
531
+ <Combobox items={["sale20", "sale50"]}>
532
+ <ComboboxAnchor className="w-full">
533
+ <InputGroup className="w-full">
534
+ <ComboboxInput
535
+ placeholder="Nhập mã..."
536
+ aria-invalid={true}
537
+ render={<InputGroupInput />}
538
+ />
539
+ <InputGroupAddon align="end">
540
+ <ComboboxTrigger className="flex h-full cursor-default items-center justify-center px-2.5 outline-none group-has-data-[slot=combobox-clear]/input-group:hidden disabled:cursor-not-allowed disabled:opacity-50" />
541
+ <ComboboxClear />
542
+ </InputGroupAddon>
543
+ </InputGroup>
544
+ </ComboboxAnchor>
545
+ <ComboboxPortal>
546
+ <ComboboxContent>
547
+ <ComboboxEmpty>
548
+ Không tìm thấy mã.
549
+ </ComboboxEmpty>
550
+ <ComboboxList>
551
+ <ComboboxItem value="sale20">
552
+ Giảm 20%
553
+ </ComboboxItem>
554
+ <ComboboxItem value="sale50">
555
+ Giảm 50%
556
+ </ComboboxItem>
557
+ </ComboboxList>
558
+ </ComboboxContent>
559
+ </ComboboxPortal>
560
+ </Combobox>
561
+ </FieldContent>
562
+ <FieldError>Mã này đã hết hạn.</FieldError>
563
+ </Field>`}
534
564
  >
535
565
  <Field size={globalSize} data-invalid={true} className="w-full">
536
566
  <FieldLabel>Mã giảm giá</FieldLabel>
@@ -571,31 +601,36 @@ function ComboboxMicroShowcase({ globalSize }: { globalSize: Size }) {
571
601
  label="Giao diện Nút (With Trigger)"
572
602
  description="Combobox dùng nút bấm (giống Select) thay vì ô nhập chữ (Input)."
573
603
  codeString={`<Field className="w-full">
574
- <FieldLabel>Chọn Engine</FieldLabel>
575
- <FieldContent>
576
- <Combobox items={engineItems}>
577
- <ComboboxTrigger className="w-full justify-between flex items-center border border-border rounded-md p-2 hover:bg-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring">
578
- <ComboboxValue placeholder="Chọn một engine" />
579
- </ComboboxTrigger>
580
- <ComboboxPortal><ComboboxContent>
581
- <div className="p-1">
582
- <InputGroup className="w-full">
583
- <ComboboxInput
584
- placeholder="Tìm engine..."
585
- render={<InputGroupInput />}
586
- />
587
- </InputGroup>
588
- </div>
589
- <ComboboxEmpty>Không tìm thấy.</ComboboxEmpty>
590
- <ComboboxList>
591
- <ComboboxItem value="v8">V8 (Chrome)</ComboboxItem>
592
- <ComboboxItem value="spidermonkey">SpiderMonkey (Firefox)</ComboboxItem>
593
- </ComboboxList>
594
- </ComboboxContent></ComboboxPortal>
595
- </Combobox>
596
- </FieldContent>
597
- </Field>
598
- `}
604
+ <FieldLabel>Chọn Engine</FieldLabel>
605
+ <FieldContent>
606
+ <Combobox items={engineItems}>
607
+ <ComboboxTrigger className="w-full justify-between flex items-center border border-border rounded-md p-2 hover:bg-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring">
608
+ <ComboboxValue placeholder="Chọn một engine" />
609
+ </ComboboxTrigger>
610
+ <ComboboxPortal>
611
+ <ComboboxContent>
612
+ <div className="p-1">
613
+ <InputGroup className="w-full">
614
+ <ComboboxInput
615
+ placeholder="Tìm engine..."
616
+ render={<InputGroupInput />}
617
+ />
618
+ </InputGroup>
619
+ </div>
620
+ <ComboboxEmpty>Không tìm thấy.</ComboboxEmpty>
621
+ <ComboboxList>
622
+ <ComboboxItem value="v8">
623
+ V8 (Chrome)
624
+ </ComboboxItem>
625
+ <ComboboxItem value="spidermonkey">
626
+ SpiderMonkey (Firefox)
627
+ </ComboboxItem>
628
+ </ComboboxList>
629
+ </ComboboxContent>
630
+ </ComboboxPortal>
631
+ </Combobox>
632
+ </FieldContent>
633
+ </Field>`}
599
634
  >
600
635
  <Field size={globalSize} className="w-full">
601
636
  <FieldLabel>Chọn Engine</FieldLabel>
@@ -635,39 +670,77 @@ function ComboboxMicroShowcase({ globalSize }: { globalSize: Size }) {
635
670
  description="So sánh nhanh khi nào dùng Micro và Macro."
636
671
  fullWidth
637
672
  codeString={`<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
638
- {/* Story 1: Macro wins */}
639
- <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
640
- <div className="flex items-start gap-3">
641
- <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
642
- <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>
643
- </span>
644
- <div>
645
- <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">Story 1 · Dùng Macro</p>
646
- <h3 className="mt-0.5 text-sm font-semibold text-foreground">Single Select tự động hoàn thành</h3>
673
+ {/* Story 1: Macro wins */}
674
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
675
+ <div className="flex items-start gap-3">
676
+ <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
677
+ <svg
678
+ xmlns="http://www.w3.org/2000/svg"
679
+ className="size-4"
680
+ viewBox="0 0 24 24"
681
+ fill="none"
682
+ stroke="currentColor"
683
+ strokeWidth="2"
684
+ strokeLinecap="round"
685
+ strokeLinejoin="round"
686
+ aria-hidden="true"
687
+ >
688
+ <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" />
689
+ </svg>
690
+ </span>
691
+ <div>
692
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
693
+ Story 1 · Dùng Macro
694
+ </p>
695
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
696
+ Single Select tự động hoàn thành
697
+ </h3>
698
+ </div>
647
699
  </div>
700
+ <p className="text-xs text-muted-foreground leading-relaxed">
701
+ Bạn cần một form chọn Thành phố. Số lượng thành phố
702
+ quá lớn nên không dùng Select được, phải dùng
703
+ Combobox để gõ tìm.{" "}
704
+ <DocsCode>ComboboxPreset</DocsCode> sinh ra để giải
705
+ quyết đúng bài toán chọn 1 giá trị từ tập lớn này.
706
+ </p>
648
707
  </div>
649
- <p className="text-xs text-muted-foreground leading-relaxed">
650
- Bạn cần một form chọn Thành phố. Số lượng thành phố quá lớn nên không dùng Select được, phải dùng Combobox để gõ tìm. <DocsCode>ComboboxPreset</DocsCode> sinh ra để giải quyết đúng bài toán chọn 1 giá trị từ tập lớn này.
651
- </p>
652
- </div>
653
708
 
654
- {/* Story 2: Micro wins */}
655
- <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
656
- <div className="flex items-start gap-3">
657
- <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
658
- <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>
659
- </span>
660
- <div>
661
- <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">Story 2 · Dùng Micro</p>
662
- <h3 className="mt-0.5 text-sm font-semibold text-foreground">Gán thẻ (Multi-select)</h3>
709
+ {/* Story 2: Micro wins */}
710
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
711
+ <div className="flex items-start gap-3">
712
+ <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
713
+ <svg
714
+ xmlns="http://www.w3.org/2000/svg"
715
+ className="size-4"
716
+ viewBox="0 0 24 24"
717
+ fill="none"
718
+ stroke="currentColor"
719
+ strokeWidth="2"
720
+ strokeLinecap="round"
721
+ strokeLinejoin="round"
722
+ aria-hidden="true"
723
+ >
724
+ <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" />
725
+ </svg>
726
+ </span>
727
+ <div>
728
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
729
+ Story 2 · Dùng Micro
730
+ </p>
731
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
732
+ Gán thẻ (Multi-select)
733
+ </h3>
734
+ </div>
663
735
  </div>
736
+ <p className="text-xs text-muted-foreground leading-relaxed">
737
+ Bạn làm form tạo bài viết mới và cần gán nhiều Thẻ
738
+ (Tags) cho bài viết. Macro không hỗ trợ
739
+ Multi-select. Bạn buộc phải dùng Micro kết hợp với
740
+ cụm <DocsCode>{\`<ComboboxChips />\`}</DocsCode>.
741
+ </p>
664
742
  </div>
665
- <p className="text-xs text-muted-foreground leading-relaxed">
666
- Bạn làm form tạo bài viết mới và cần gán nhiều Thẻ (Tags) cho bài viết. Macro không hỗ trợ Multi-select. Bạn buộc phải dùng Micro kết hợp với cụm <DocsCode>{\`<ComboboxChips />\`}</DocsCode>.
667
- </p>
668
- </div>
669
- </div>
670
- `}
743
+ </div>`}
671
744
  >
672
745
  <div className="grid grid-cols-1 gap-6 md:grid-cols-2">
673
746
  {/* Story 1: Macro wins */}