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,10 @@
1
- import { useDevContext } from "../../dev/components/dev-context";
1
+ import { useState } from "react";
2
+
2
3
  import { zodResolver } from "@hookform/resolvers/zod";
3
4
  import { CheckIcon, MinusIcon } from "lucide-react";
4
- import { useState } from "react";
5
5
  import { Controller, useForm } from "react-hook-form";
6
6
  import * as z from "zod";
7
7
 
8
- import {
9
- DocsP,
10
- ExampleGrid,
11
- ExampleSection,
12
- Showcase,
13
- ShowcaseDocs,
14
- } from "../../dev/components/showcase";
15
- import { type Size } from "../../lib/types";
16
-
17
8
  import { CheckboxPreset } from "../../components/macro/checkbox-preset";
18
9
  import { Button } from "../../components/micro/button";
19
10
  import { Checkbox, CheckboxIndicator } from "../../components/micro/checkbox";
@@ -24,6 +15,15 @@ import {
24
15
  FieldLabel,
25
16
  } from "../../components/micro/field";
26
17
  import { Label } from "../../components/micro/label";
18
+ import { useDevContext } from "../../dev/components/dev-context";
19
+ import {
20
+ DocsP,
21
+ ExampleGrid,
22
+ ExampleSection,
23
+ Showcase,
24
+ ShowcaseDocs,
25
+ } from "../../dev/components/showcase";
26
+ import { type Size } from "../../lib/types";
27
27
 
28
28
  // ──────────────────────────────────────────────────────────
29
29
  // RHF Form Demo (Macro)
@@ -111,11 +111,10 @@ function CheckboxMacroShowcase({ globalSize }: { globalSize: Size }) {
111
111
  label="Tiêu chuẩn"
112
112
  description="Checkbox cơ bản kèm nhãn và mô tả."
113
113
  codeString={`<CheckboxPreset
114
- label="Đồng ý với điều khoản"
115
- description="Bạn phải đồng ý với các điều khoản và điều kiện sử dụng."
116
- className="w-full"
117
- />
118
- `}
114
+ label="Đồng ý với điều khoản"
115
+ description="Bạn phải đồng ý với các điều khoản và điều kiện sử dụng."
116
+ className="w-full"
117
+ />`}
119
118
  >
120
119
  <CheckboxPreset
121
120
  size={globalSize}
@@ -129,12 +128,11 @@ function CheckboxMacroShowcase({ globalSize }: { globalSize: Size }) {
129
128
  label="Trạng thái Lỗi (Error)"
130
129
  description="Báo lỗi khi chưa check vào ô (thường dùng trong form)."
131
130
  codeString={`<div className="w-full flex flex-col gap-6">
132
- <CheckboxPreset
133
- label="Xác nhận đủ 18 tuổi"
134
- errorMessage="Bạn phải xác nhận đủ tuổi để tiếp tục."
135
- />
136
- </div>
137
- `}
131
+ <CheckboxPreset
132
+ label="Xác nhận đủ 18 tuổi"
133
+ errorMessage="Bạn phải xác nhận đủ tuổi để tiếp tục."
134
+ />
135
+ </div>`}
138
136
  >
139
137
  <div className="w-full flex flex-col gap-6">
140
138
  <CheckboxPreset
@@ -151,19 +149,18 @@ function CheckboxMacroShowcase({ globalSize }: { globalSize: Size }) {
151
149
  label="Trạng thái Khóa (Disabled)"
152
150
  description="Checkbox bị vô hiệu hóa, không thể click."
153
151
  codeString={`<div className="w-full flex flex-col gap-6">
154
- <CheckboxPreset
155
- label="Đăng ký nhận bản tin"
156
- description="Tính năng này đang được bảo trì."
157
- disabled
158
- />
159
- <CheckboxPreset
160
- label="Cho phép thu thập log"
161
- description="Hệ thống mặc định thu thập log bảo mật."
162
- defaultChecked
163
- disabled
164
- />
165
- </div>
166
- `}
152
+ <CheckboxPreset
153
+ label="Đăng ký nhận bản tin"
154
+ description="Tính năng này đang được bảo trì."
155
+ disabled
156
+ />
157
+ <CheckboxPreset
158
+ label="Cho phép thu thập log"
159
+ description="Hệ thống mặc định thu thập log bảo mật."
160
+ defaultChecked
161
+ disabled
162
+ />
163
+ </div>`}
167
164
  >
168
165
  <div className="w-full flex flex-col gap-6">
169
166
  <CheckboxPreset
@@ -186,18 +183,17 @@ function CheckboxMacroShowcase({ globalSize }: { globalSize: Size }) {
186
183
  label="React Node Label (Custom Content)"
187
184
  description="Label có thể chứa các component React phức tạp như Badge."
188
185
  codeString={`<CheckboxPreset
189
- label={
190
- <span className="flex items-center gap-2">
191
- Tham gia chương trình BETA{" "}
192
- <span className="rounded bg-primary/20 px-1.5 py-0.5 text-[10px] font-semibold text-primary">
193
- NEW
186
+ label={
187
+ <span className="flex items-center gap-2">
188
+ Tham gia chương trình BETA{" "}
189
+ <span className="rounded bg-primary/20 px-1.5 py-0.5 text-[10px] font-semibold text-primary">
190
+ NEW
191
+ </span>
194
192
  </span>
195
- </span>
196
- }
197
- description="Được trải nghiệm sớm các tính năng mới trước khi phát hành chính thức. Có thể xảy ra lỗi."
198
- className="w-full"
199
- />
200
- `}
193
+ }
194
+ description="Được trải nghiệm sớm các tính năng mới trước khi phát hành chính thức. Có thể xảy ra lỗi."
195
+ className="w-full"
196
+ />`}
201
197
  >
202
198
  <CheckboxPreset
203
199
  size={globalSize}
@@ -219,16 +215,14 @@ function CheckboxMacroShowcase({ globalSize }: { globalSize: Size }) {
219
215
  <ExampleSection
220
216
  label="React State (Controlled Mode)"
221
217
  description="Sử dụng biến state của React để điều khiển."
222
- codeString={`const [checked, setChecked] = useState(false);
223
-
224
- return (
218
+ codeString={`const [checked, setChecked] = useState(false); return (
225
219
  <CheckboxPreset
226
220
  checked={checked}
227
221
  onCheckedChange={(c) => setChecked(!!c)}
228
222
  label="Checkbox có kiểm soát"
229
223
  description="React quản lý trạng thái của checkbox này."
230
224
  />
231
- );`}
225
+ );`}
232
226
  >
233
227
  <div className="w-full flex flex-col gap-4">
234
228
  <CheckboxPreset
@@ -272,15 +266,18 @@ function CheckboxMicroShowcase({ globalSize }: { globalSize: Size }) {
272
266
  label="Cơ bản (Primitive)"
273
267
  description="Kết nối thủ công Checkbox với thẻ Label html."
274
268
  codeString={`<div className="flex items-center gap-3">
275
- <Checkbox id="cb-micro-default">
276
- <CheckboxIndicator>
277
- <CheckIcon />
278
- </CheckboxIndicator>
279
- </Checkbox>
280
- <Label htmlFor="cb-micro-default" className="font-normal cursor-pointer">
281
- Đồng ý với điều khoản
282
- </Label>
283
- </div>`}
269
+ <Checkbox id="cb-micro-default">
270
+ <CheckboxIndicator>
271
+ <CheckIcon />
272
+ </CheckboxIndicator>
273
+ </Checkbox>
274
+ <Label
275
+ htmlFor="cb-micro-default"
276
+ className="font-normal cursor-pointer"
277
+ >
278
+ Đồng ý với điều khoản
279
+ </Label>
280
+ </div>`}
284
281
  >
285
282
  <div className="flex items-center gap-3">
286
283
  <Checkbox id="cb-micro-default" size={globalSize}>
@@ -301,15 +298,18 @@ function CheckboxMicroShowcase({ globalSize }: { globalSize: Size }) {
301
298
  label="Icon Tuỳ Biến (Custom Icon)"
302
299
  description="Vì dùng Composition, bạn có thể truyền bất kỳ icon nào (VD: MinusIcon) vào Indicator."
303
300
  codeString={`<div className="flex items-center gap-3">
304
- <Checkbox id="cb-custom-icon">
305
- <CheckboxIndicator>
306
- <MinusIcon />
307
- </CheckboxIndicator>
308
- </Checkbox>
309
- <Label htmlFor="cb-custom-icon" className="font-normal cursor-pointer">
310
- Trạng thái vô định (Indeterminate)
311
- </Label>
312
- </div>`}
301
+ <Checkbox id="cb-custom-icon">
302
+ <CheckboxIndicator>
303
+ <MinusIcon />
304
+ </CheckboxIndicator>
305
+ </Checkbox>
306
+ <Label
307
+ htmlFor="cb-custom-icon"
308
+ className="font-normal cursor-pointer"
309
+ >
310
+ Trạng thái vô định (Indeterminate)
311
+ </Label>
312
+ </div>`}
313
313
  >
314
314
  <div className="flex items-center gap-3">
315
315
  <Checkbox id="cb-custom-icon" size={globalSize}>
@@ -332,23 +332,27 @@ function CheckboxMicroShowcase({ globalSize }: { globalSize: Size }) {
332
332
  label="Ghép nối với Field"
333
333
  description="Lắp ráp thủ công các thành phần Field khi cần layout phức tạp."
334
334
  codeString={`<Field className="flex items-start gap-3">
335
- {/* 1 khoảng trắng vô hình để căn chỉnh cho Label và Checkbox thẳng hàng với nhau theo dòng chữ đầu tiên */}
336
- <div className="flex items-center text-sm leading-snug group-data-[size=sm]/field:text-xs">
337
- &#8203;
338
- <Checkbox id="cb-field-micro">
339
- <CheckboxIndicator><CheckIcon /></CheckboxIndicator>
340
- </Checkbox>
341
- </div>
342
- <div className="grid gap-1.5 leading-none">
343
- <FieldLabel htmlFor="cb-field-micro" className="font-medium cursor-pointer">
344
- Lưu mật khẩu
345
- </FieldLabel>
346
- <FieldDescription>
347
- Tự động đăng nhập vào lần sau.
348
- </FieldDescription>
349
- </div>
350
- </Field>
351
- `}
335
+ {/* 1 khoảng trắng vô hình để căn chỉnh cho Label và Checkbox thẳng hàng với nhau theo dòng chữ đầu tiên */}
336
+ <div className="flex items-center text-sm leading-snug group-data-[size=sm]/field:text-xs">
337
+ &#8203;
338
+ <Checkbox id="cb-field-micro">
339
+ <CheckboxIndicator>
340
+ <CheckIcon />
341
+ </CheckboxIndicator>
342
+ </Checkbox>
343
+ </div>
344
+ <div className="grid gap-1.5 leading-none">
345
+ <FieldLabel
346
+ htmlFor="cb-field-micro"
347
+ className="font-medium cursor-pointer"
348
+ >
349
+ Lưu mật khẩu
350
+ </FieldLabel>
351
+ <FieldDescription>
352
+ Tự động đăng nhập vào lần sau.
353
+ </FieldDescription>
354
+ </div>
355
+ </Field>`}
352
356
  >
353
357
  <Field className="flex items-start gap-3" data-size={globalSize}>
354
358
  {/* 1 khoảng trắng vô hình để căn chỉnh cho Label và Checkbox thẳng hàng với nhau theo dòng chữ đầu tiên */}
@@ -377,19 +381,28 @@ function CheckboxMicroShowcase({ globalSize }: { globalSize: Size }) {
377
381
  <ExampleSection
378
382
  label="Trạng thái Lỗi thủ công"
379
383
  description="Tự gắn aria-invalid vào Checkbox và dùng FieldError."
380
- codeString={`<Field className="flex flex-row items-start gap-3" data-invalid={true}>
381
- <div className="flex items-center text-sm leading-snug group-data-[size=sm]/field:text-xs">
382
- &#8203;
383
- <Checkbox id="cb-err-micro" aria-invalid={true}>
384
- <CheckboxIndicator><CheckIcon /></CheckboxIndicator>
385
- </Checkbox>
386
- </div>
387
- <div className="grid gap-1.5 leading-none">
388
- <FieldLabel htmlFor="cb-err-micro" className="font-medium cursor-pointer">Đồng ý quy định</FieldLabel>
389
- <FieldError>Bắt buộc phải chọn ô này.</FieldError>
390
- </div>
391
- </Field>
392
- `}
384
+ codeString={`<Field
385
+ className="flex flex-row items-start gap-3"
386
+ data-invalid={true}
387
+ >
388
+ <div className="flex items-center text-sm leading-snug group-data-[size=sm]/field:text-xs">
389
+ &#8203;
390
+ <Checkbox id="cb-err-micro" aria-invalid={true}>
391
+ <CheckboxIndicator>
392
+ <CheckIcon />
393
+ </CheckboxIndicator>
394
+ </Checkbox>
395
+ </div>
396
+ <div className="grid gap-1.5 leading-none">
397
+ <FieldLabel
398
+ htmlFor="cb-err-micro"
399
+ className="font-medium cursor-pointer"
400
+ >
401
+ Đồng ý quy định
402
+ </FieldLabel>
403
+ <FieldError>Bắt buộc phải chọn ô này.</FieldError>
404
+ </div>
405
+ </Field>`}
393
406
  >
394
407
  <Field
395
408
  className="flex flex-row items-start gap-3"
@@ -422,55 +435,108 @@ function CheckboxMicroShowcase({ globalSize }: { globalSize: Size }) {
422
435
  description="So sánh nhanh khi nào dùng Micro và Macro."
423
436
  fullWidth
424
437
  codeString={`<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
425
- {/* Story 1: Macro wins */}
426
- <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
427
- <div className="flex items-start gap-3">
428
- <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
429
- <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>
430
- </span>
431
- <div>
432
- <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">Story 1 · Dùng Macro</p>
433
- <h3 className="mt-0.5 text-sm font-semibold text-foreground">Checkbox trong trang Cài đặt</h3>
438
+ {/* Story 1: Macro wins */}
439
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
440
+ <div className="flex items-start gap-3">
441
+ <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
442
+ <svg
443
+ xmlns="http://www.w3.org/2000/svg"
444
+ className="size-4"
445
+ viewBox="0 0 24 24"
446
+ fill="none"
447
+ stroke="currentColor"
448
+ strokeWidth="2"
449
+ strokeLinecap="round"
450
+ strokeLinejoin="round"
451
+ aria-hidden="true"
452
+ >
453
+ <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" />
454
+ </svg>
455
+ </span>
456
+ <div>
457
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
458
+ Story 1 · Dùng Macro
459
+ </p>
460
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
461
+ Checkbox trong trang Cài đặt
462
+ </h3>
463
+ </div>
434
464
  </div>
435
- </div>
436
- <p className="text-xs text-muted-foreground leading-relaxed">
437
- Form cài đặt có rất nhiều tuỳ chọn dạng "Bật / Tắt" với mô tả dài. Code sẽ rất sạch và ngắn.
438
- </p>
439
- <div className="rounded-lg bg-muted/50 p-3 flex flex-col gap-4">
440
- <CheckboxPreset size="sm" label="Nhận Email Marketing" description="Gửi email cho bạn về các chương trình khuyến mãi hàng tuần." />
441
- <CheckboxPreset size="sm" label="Thông báo bảo mật" description="Cảnh báo khi có thiết bị lạ đăng nhập." defaultChecked />
442
- </div>
443
- </div>
444
-
445
- {/* Story 2: Micro wins */}
446
- <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
447
- <div className="flex items-start gap-3">
448
- <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
449
- <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>
450
- </span>
451
- <div>
452
- <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">Story 2 · Dùng Micro</p>
453
- <h3 className="mt-0.5 text-sm font-semibold text-foreground">Table Row Selection</h3>
465
+ <p className="text-xs text-muted-foreground leading-relaxed">
466
+ Form cài đặt có rất nhiều tuỳ chọn dạng "Bật / Tắt"
467
+ với mô tả dài. Code sẽ rất sạch và ngắn.
468
+ </p>
469
+ <div className="rounded-lg bg-muted/50 p-3 flex flex-col gap-4">
470
+ <CheckboxPreset
471
+ size="sm"
472
+ label="Nhận Email Marketing"
473
+ description="Gửi email cho bạn về các chương trình khuyến mãi hàng tuần."
474
+ />
475
+ <CheckboxPreset
476
+ size="sm"
477
+ label="Thông báo bảo mật"
478
+ description="Cảnh báo khi thiết bị lạ đăng nhập."
479
+ defaultChecked
480
+ />
454
481
  </div>
455
482
  </div>
456
- <p className="text-xs text-muted-foreground leading-relaxed">
457
- Bạn cần ô Checkbox đầu mỗi dòng trong bảng để chọn nhiều hàng. Ở đây Checkbox đứng độc lập, hoàn toàn không cần Label hay Description đi kèm.
458
- </p>
459
- <div className="rounded-lg bg-muted/50 p-3">
460
- <div className="border border-border rounded-md divide-y overflow-hidden">
461
- <div className="flex items-center gap-3 p-2 bg-muted">
462
- <Checkbox size="sm"><CheckboxIndicator><MinusIcon /></CheckboxIndicator></Checkbox>
463
- <span className="text-xs font-semibold">Tên nhân viên</span>
483
+
484
+ {/* Story 2: Micro wins */}
485
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
486
+ <div className="flex items-start gap-3">
487
+ <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
488
+ <svg
489
+ xmlns="http://www.w3.org/2000/svg"
490
+ className="size-4"
491
+ viewBox="0 0 24 24"
492
+ fill="none"
493
+ stroke="currentColor"
494
+ strokeWidth="2"
495
+ strokeLinecap="round"
496
+ strokeLinejoin="round"
497
+ aria-hidden="true"
498
+ >
499
+ <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" />
500
+ </svg>
501
+ </span>
502
+ <div>
503
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
504
+ Story 2 · Dùng Micro
505
+ </p>
506
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
507
+ Table Row Selection
508
+ </h3>
464
509
  </div>
465
- <div className="flex items-center gap-3 p-2 bg-background hover:bg-muted/50">
466
- <Checkbox size="sm" defaultChecked><CheckboxIndicator><CheckIcon /></CheckboxIndicator></Checkbox>
467
- <span className="text-xs">John Doe</span>
510
+ </div>
511
+ <p className="text-xs text-muted-foreground leading-relaxed">
512
+ Bạn cần ô Checkbox ở đầu mỗi dòng trong bảng để chọn
513
+ nhiều hàng. Ở đây Checkbox đứng độc lập, hoàn toàn
514
+ không cần Label hay Description đi kèm.
515
+ </p>
516
+ <div className="rounded-lg bg-muted/50 p-3">
517
+ <div className="border border-border rounded-md divide-y overflow-hidden">
518
+ <div className="flex items-center gap-3 p-2 bg-muted">
519
+ <Checkbox size="sm">
520
+ <CheckboxIndicator>
521
+ <MinusIcon />
522
+ </CheckboxIndicator>
523
+ </Checkbox>
524
+ <span className="text-xs font-semibold">
525
+ Tên nhân viên
526
+ </span>
527
+ </div>
528
+ <div className="flex items-center gap-3 p-2 bg-background hover:bg-muted/50">
529
+ <Checkbox size="sm" defaultChecked>
530
+ <CheckboxIndicator>
531
+ <CheckIcon />
532
+ </CheckboxIndicator>
533
+ </Checkbox>
534
+ <span className="text-xs">John Doe</span>
535
+ </div>
468
536
  </div>
469
537
  </div>
470
538
  </div>
471
- </div>
472
- </div>
473
- `}
539
+ </div>`}
474
540
  >
475
541
  <div className="grid grid-cols-1 gap-6 md:grid-cols-2">
476
542
  {/* Story 1: Macro wins */}