gladvn 0.2.17 → 0.2.19

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 +0 -1
@@ -1,14 +1,3 @@
1
- import { useDevContext } from "../../dev/components/dev-context";
2
- import {
3
- DocsCode,
4
- DocsH3,
5
- DocsP,
6
- ExampleGrid,
7
- ExampleSection,
8
- Showcase,
9
- ShowcaseDocs,
10
- } from "../../dev/components/showcase";
11
- import { type Size } from "../../lib/types";
12
1
  import { useState } from "react";
13
2
 
14
3
  import { SliderPreset } from "../../components/macro/slider-preset";
@@ -26,6 +15,17 @@ import {
26
15
  SliderThumb,
27
16
  SliderTrack,
28
17
  } from "../../components/micro/slider";
18
+ import { useDevContext } from "../../dev/components/dev-context";
19
+ import {
20
+ DocsCode,
21
+ DocsH3,
22
+ DocsP,
23
+ ExampleGrid,
24
+ ExampleSection,
25
+ Showcase,
26
+ ShowcaseDocs,
27
+ } from "../../dev/components/showcase";
28
+ import { type Size } from "../../lib/types";
29
29
 
30
30
  // ──────────────────────────────────────────────────────────
31
31
  // SECTION 1: Macro Content
@@ -40,14 +40,14 @@ function SliderMacroShowcase({ globalSize }: { globalSize: Size }) {
40
40
  <ExampleSection
41
41
  label="Tiêu chuẩn"
42
42
  description="Thanh trượt cơ bản có nhãn và mô tả."
43
- codeString={`<SliderPreset className="w-full"
43
+ codeString={`<SliderPreset
44
+ className="w-full"
44
45
  label="Âm lượng"
45
46
  description="Điều chỉnh âm lượng hệ thống."
46
47
  defaultValue={[50]}
47
48
  max={100}
48
49
  step={1}
49
- />
50
- `}
50
+ />`}
51
51
  >
52
52
  <SliderPreset
53
53
  className="w-full"
@@ -64,15 +64,14 @@ function SliderMacroShowcase({ globalSize }: { globalSize: Size }) {
64
64
  label="Trạng thái Lỗi (Error)"
65
65
  description="Báo lỗi khi giá trị không hợp lệ."
66
66
  codeString={`<div className="w-full flex flex-col gap-6">
67
- <SliderPreset
68
- label="Mức âm lượng (Lỗi)"
69
- defaultValue={[110]}
70
- max={100}
71
- step={1}
72
- errorMessage="Mức âm lượng không được vượt quá 100."
73
- />
74
- </div>
75
- `}
67
+ <SliderPreset
68
+ label="Mức âm lượng (Lỗi)"
69
+ defaultValue={[110]}
70
+ max={100}
71
+ step={1}
72
+ errorMessage="Mức âm lượng không được vượt quá 100."
73
+ />
74
+ </div>`}
76
75
  >
77
76
  <div className="w-full flex flex-col gap-6">
78
77
  <SliderPreset
@@ -91,9 +90,8 @@ function SliderMacroShowcase({ globalSize }: { globalSize: Size }) {
91
90
  <ExampleSection
92
91
  label="Thanh trượt Khoảng (Range Slider)"
93
92
  description="Truyền mảng 2 giá trị vào defaultValue hoặc value để tạo Range Slider."
94
- codeString={`const [rangeVal, setRangeVal] = useState([20, 80]);
95
-
96
- return (
93
+ codeString={`const [rangeVal, setRangeVal] = useState([20, 80]); return
94
+ (
97
95
  <SliderPreset
98
96
  label="Khoảng giá"
99
97
  value={rangeVal}
@@ -102,7 +100,7 @@ return (
102
100
  step={5}
103
101
  description={\`Từ $\${rangeVal[0]} đến $\${rangeVal[1]}\`}
104
102
  />
105
- );`}
103
+ );`}
106
104
  >
107
105
  <SliderPreset
108
106
  className="w-full"
@@ -119,14 +117,14 @@ return (
119
117
  <ExampleSection
120
118
  label="Khóa / Bất hoạt (Disabled)"
121
119
  description="Người dùng không thể tương tác với thanh trượt."
122
- codeString={`<SliderPreset className="w-full"
120
+ codeString={`<SliderPreset
121
+ className="w-full"
123
122
  label="Độ sáng màn hình"
124
123
  description="Độ sáng đang được hệ thống điều khiển tự động (Auto-brightness)."
125
124
  defaultValue={[75]}
126
125
  max={100}
127
126
  disabled
128
- />
129
- `}
127
+ />`}
130
128
  >
131
129
  <SliderPreset
132
130
  className="w-full"
@@ -144,16 +142,14 @@ return (
144
142
  <ExampleSection
145
143
  label="Controlled Mode"
146
144
  description="Sử dụng biến state của React để điều khiển."
147
- codeString={`const [val, setVal] = useState([50]);
148
-
149
- return (
145
+ codeString={`const [val, setVal] = useState([50]); return (
150
146
  <SliderPreset
151
147
  value={val}
152
148
  onValueChange={setVal}
153
149
  label="Giá trị có kiểm soát"
154
150
  description={\`Giá trị hiện tại là: \${val[0]}\`}
155
151
  />
156
- );`}
152
+ );`}
157
153
  >
158
154
  <div className="w-full max-w-sm flex flex-col gap-4">
159
155
  <SliderPreset
@@ -181,19 +177,18 @@ function SliderMicroShowcase({ globalSize }: { globalSize: Size }) {
181
177
  label="Cơ bản (Primitive)"
182
178
  description="Slider đơn giản không có Field hay Label bọc ngoài."
183
179
  codeString={`<CompositionalSlider
184
- defaultValue={[40]}
185
- max={100}
186
- step={1}
187
- className="w-full"
188
- >
189
- <SliderControl>
190
- <SliderTrack>
191
- <SliderIndicator />
192
- </SliderTrack>
193
- <SliderThumb />
194
- </SliderControl>
195
- </CompositionalSlider>
196
- `}
180
+ defaultValue={[40]}
181
+ max={100}
182
+ step={1}
183
+ className="w-full"
184
+ >
185
+ <SliderControl>
186
+ <SliderTrack>
187
+ <SliderIndicator />
188
+ </SliderTrack>
189
+ <SliderThumb />
190
+ </SliderControl>
191
+ </CompositionalSlider>`}
197
192
  >
198
193
  <CompositionalSlider
199
194
  size={globalSize}
@@ -215,21 +210,20 @@ function SliderMicroShowcase({ globalSize }: { globalSize: Size }) {
215
210
  label="Nhiều Thumb (Multi-thumb)"
216
211
  description="Chỉ cần render nhiều SliderThumb, hệ thống sẽ tự chia."
217
212
  codeString={`<CompositionalSlider
218
- defaultValue={[20, 50, 80]}
219
- max={100}
220
- step={1}
221
- className="w-full"
222
- >
223
- <SliderControl>
224
- <SliderTrack>
225
- <SliderIndicator />
226
- </SliderTrack>
227
- <SliderThumb />
228
- <SliderThumb />
229
- <SliderThumb />
230
- </SliderControl>
231
- </CompositionalSlider>
232
- `}
213
+ defaultValue={[20, 50, 80]}
214
+ max={100}
215
+ step={1}
216
+ className="w-full"
217
+ >
218
+ <SliderControl>
219
+ <SliderTrack>
220
+ <SliderIndicator />
221
+ </SliderTrack>
222
+ <SliderThumb />
223
+ <SliderThumb />
224
+ <SliderThumb />
225
+ </SliderControl>
226
+ </CompositionalSlider>`}
233
227
  >
234
228
  <CompositionalSlider
235
229
  size={globalSize}
@@ -255,26 +249,25 @@ function SliderMicroShowcase({ globalSize }: { globalSize: Size }) {
255
249
  label="Ghép nối Field thủ công"
256
250
  description="Lắp ráp với Field để có nhãn và mô tả."
257
251
  codeString={`<Field className="w-full">
258
- <FieldLabel>Mật độ hiển thị</FieldLabel>
259
- <FieldContent>
260
- <CompositionalSlider
261
- defaultValue={[50]}
262
- max={100}
263
- step={1}
264
- >
265
- <SliderControl>
266
- <SliderTrack>
267
- <SliderIndicator />
268
- </SliderTrack>
269
- <SliderThumb />
270
- </SliderControl>
271
- </CompositionalSlider>
272
- </FieldContent>
273
- <FieldDescription>
274
- Điều chỉnh khoảng cách giữa các phần tử.
275
- </FieldDescription>
276
- </Field>
277
- `}
252
+ <FieldLabel>Mật độ hiển thị</FieldLabel>
253
+ <FieldContent>
254
+ <CompositionalSlider
255
+ defaultValue={[50]}
256
+ max={100}
257
+ step={1}
258
+ >
259
+ <SliderControl>
260
+ <SliderTrack>
261
+ <SliderIndicator />
262
+ </SliderTrack>
263
+ <SliderThumb />
264
+ </SliderControl>
265
+ </CompositionalSlider>
266
+ </FieldContent>
267
+ <FieldDescription>
268
+ Điều chỉnh khoảng cách giữa các phần tử.
269
+ </FieldDescription>
270
+ </Field>`}
278
271
  >
279
272
  <Field size={globalSize} className="w-full">
280
273
  <FieldLabel>Mật độ hiển thị</FieldLabel>
@@ -303,25 +296,24 @@ function SliderMicroShowcase({ globalSize }: { globalSize: Size }) {
303
296
  label="Trạng thái Lỗi thủ công"
304
297
  description="Tự gắn aria-invalid vào Slider và dùng FieldError."
305
298
  codeString={`<Field className="w-full gap-2" data-invalid={true}>
306
- <FieldLabel>Ngân sách tối đa</FieldLabel>
307
- <FieldContent>
308
- <CompositionalSlider
309
- defaultValue={[120]}
310
- max={100}
311
- step={1}
312
- aria-invalid={true}
313
- >
314
- <SliderControl>
315
- <SliderTrack>
316
- <SliderIndicator />
317
- </SliderTrack>
318
- <SliderThumb />
319
- </SliderControl>
320
- </CompositionalSlider>
321
- </FieldContent>
322
- <FieldError>Ngân sách của bạn chỉ còn \$100.</FieldError>
323
- </Field>
324
- `}
299
+ <FieldLabel>Ngân sách tối đa</FieldLabel>
300
+ <FieldContent>
301
+ <CompositionalSlider
302
+ defaultValue={[120]}
303
+ max={100}
304
+ step={1}
305
+ aria-invalid={true}
306
+ >
307
+ <SliderControl>
308
+ <SliderTrack>
309
+ <SliderIndicator />
310
+ </SliderTrack>
311
+ <SliderThumb />
312
+ </SliderControl>
313
+ </CompositionalSlider>
314
+ </FieldContent>
315
+ <FieldError>Ngân sách của bạn chỉ còn $100.</FieldError>
316
+ </Field>`}
325
317
  >
326
318
  <Field size={globalSize} className="w-full gap-2" data-invalid={true}>
327
319
  <FieldLabel>Ngân sách tối đa</FieldLabel>
@@ -351,39 +343,76 @@ function SliderMicroShowcase({ globalSize }: { globalSize: Size }) {
351
343
  description="So sánh nhanh khi nào dùng Micro và Macro."
352
344
  fullWidth
353
345
  codeString={`<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
354
- {/* Story 1: Macro wins */}
355
- <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
356
- <div className="flex items-start gap-3">
357
- <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
358
- <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>
359
- </span>
360
- <div>
361
- <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">Story 1 · Dùng Macro</p>
362
- <h3 className="mt-0.5 text-sm font-semibold text-foreground">Bộ lọc sản phẩm</h3>
346
+ {/* Story 1: Macro wins */}
347
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
348
+ <div className="flex items-start gap-3">
349
+ <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
350
+ <svg
351
+ xmlns="http://www.w3.org/2000/svg"
352
+ className="size-4"
353
+ viewBox="0 0 24 24"
354
+ fill="none"
355
+ stroke="currentColor"
356
+ strokeWidth="2"
357
+ strokeLinecap="round"
358
+ strokeLinejoin="round"
359
+ aria-hidden="true"
360
+ >
361
+ <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" />
362
+ </svg>
363
+ </span>
364
+ <div>
365
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
366
+ Story 1 · Dùng Macro
367
+ </p>
368
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
369
+ Bộ lọc sản phẩm
370
+ </h3>
371
+ </div>
363
372
  </div>
373
+ <p className="text-xs text-muted-foreground leading-relaxed">
374
+ Bạn cần làm bộ lọc "Khoảng giá" ở cột Sidebar cho
375
+ trang Ecommerce. <DocsCode>SliderPreset</DocsCode>{" "}
376
+ sẽ giúp bạn tiết kiệm hàng tá dòng code bọc Field
377
+ loằng ngoằng.
378
+ </p>
364
379
  </div>
365
- <p className="text-xs text-muted-foreground leading-relaxed">
366
- Bạn cần làm bộ lọc "Khoảng giá" ở cột Sidebar cho trang Ecommerce. <DocsCode>SliderPreset</DocsCode> sẽ giúp bạn tiết kiệm hàng tá dòng code bọc Field loằng ngoằng.
367
- </p>
368
- </div>
369
380
 
370
- {/* Story 2: Micro wins */}
371
- <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
372
- <div className="flex items-start gap-3">
373
- <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
374
- <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>
375
- </span>
376
- <div>
377
- <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">Story 2 · Dùng Micro</p>
378
- <h3 className="mt-0.5 text-sm font-semibold text-foreground">Thanh thời lượng Video (Video Player)</h3>
381
+ {/* Story 2: Micro wins */}
382
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
383
+ <div className="flex items-start gap-3">
384
+ <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
385
+ <svg
386
+ xmlns="http://www.w3.org/2000/svg"
387
+ className="size-4"
388
+ viewBox="0 0 24 24"
389
+ fill="none"
390
+ stroke="currentColor"
391
+ strokeWidth="2"
392
+ strokeLinecap="round"
393
+ strokeLinejoin="round"
394
+ aria-hidden="true"
395
+ >
396
+ <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" />
397
+ </svg>
398
+ </span>
399
+ <div>
400
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
401
+ Story 2 · Dùng Micro
402
+ </p>
403
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
404
+ Thanh thời lượng Video (Video Player)
405
+ </h3>
406
+ </div>
379
407
  </div>
408
+ <p className="text-xs text-muted-foreground leading-relaxed">
409
+ Bạn đang làm một trình phát Video giống Youtube.
410
+ Thanh Timeline chạy dưới đáy không hề có Label hay
411
+ Description. Ở đây bạn BẮT BUỘC dùng Micro để dựng
412
+ độc lập.
413
+ </p>
380
414
  </div>
381
- <p className="text-xs text-muted-foreground leading-relaxed">
382
- Bạn đang làm một trình phát Video giống Youtube. Thanh Timeline chạy dưới đáy không hề có Label hay Description. Ở đây bạn BẮT BUỘC dùng Micro để dựng độc lập.
383
- </p>
384
- </div>
385
- </div>
386
- `}
415
+ </div>`}
387
416
  >
388
417
  <div className="grid grid-cols-1 gap-6 md:grid-cols-2">
389
418
  {/* Story 1: Macro wins */}
@@ -248,11 +248,9 @@ toast.dismiss(toastId);`}
248
248
  label="Position"
249
249
  description="Toaster nhận prop position để xác định vị trí hiển thị — cấu hình một lần ở root layout. Nhấn vào từng vùng để xem toast xuất hiện ở đâu."
250
250
  codeString={`// Trong root layout (app/layout.tsx):
251
- <Toaster position="bottom-right" /> // mặc định
252
-
253
- // Các vị trí hỗ trợ:
254
- // "top-left" | "top-center" | "top-right"
255
- // "bottom-left" | "bottom-center" | "bottom-right"`}
251
+ <Toaster position="bottom-right" /> // mặc định // Các vị
252
+ trí hỗ trợ: // "top-left" | "top-center" | "top-right" //
253
+ "bottom-left" | "bottom-center" | "bottom-right"`}
256
254
  >
257
255
  {/* Visual 3×2 position grid */}
258
256
  <div className="w-full max-w-sm">
@@ -1,8 +1,5 @@
1
- import { useDevContext } from "../../dev/components/dev-context";
2
- import { useState } from "react";
3
-
4
1
  import { Spinner } from "../../components/micro/spinner";
5
- import { type Size } from "../../lib/types";
2
+ import { useDevContext } from "../../dev/components/dev-context";
6
3
  import {
7
4
  DocsCode,
8
5
  DocsH3,
@@ -12,6 +9,7 @@ import {
12
9
  Showcase,
13
10
  ShowcaseDocs,
14
11
  } from "../../dev/components/showcase";
12
+ import { type Size } from "../../lib/types";
15
13
 
16
14
  // ──────────────────────────────────────────────────────────
17
15
  // SECTION 1: Micro Content
@@ -24,9 +22,9 @@ function SpinnerMicroShowcase({ globalSize }: { globalSize: Size }) {
24
22
  label="Default"
25
23
  description="Spinner mặc định với kích thước được kiểm soát bởi size toggle ở trên."
26
24
  codeString={`<Spinner />
27
- <Spinner size="sm" />
28
- <Spinner size="md" />
29
- <Spinner size="lg" />`}
25
+ <Spinner size="sm" />
26
+ <Spinner size="md" />
27
+ <Spinner size="lg" />`}
30
28
  >
31
29
  <Spinner size={globalSize} />
32
30
  </ExampleSection>
@@ -37,9 +35,9 @@ function SpinnerMicroShowcase({ globalSize }: { globalSize: Size }) {
37
35
  label="Custom Colors"
38
36
  description="Truyền className để override màu sắc — Spinner kế thừa currentColor của SVG."
39
37
  codeString={`<Spinner className="text-primary" />
40
- <Spinner className="text-destructive" />
41
- <Spinner className="text-warning" />
42
- <Spinner className="text-success" />`}
38
+ <Spinner className="text-destructive" />
39
+ <Spinner className="text-warning" />
40
+ <Spinner className="text-success" />`}
43
41
  >
44
42
  <div className="flex items-center gap-4">
45
43
  <Spinner size={globalSize} className="text-primary" />
@@ -52,10 +50,16 @@ function SpinnerMicroShowcase({ globalSize }: { globalSize: Size }) {
52
50
  <ExampleSection
53
51
  label="In Context — Button Loading"
54
52
  description="Kết hợp Spinner trong Button để mô phỏng trạng thái loading."
55
- codeString={`<button disabled className="flex items-center gap-2 px-4 py-2 rounded-md bg-primary text-primary-foreground text-sm opacity-70">
56
- <Spinner size="sm" className="text-primary-foreground" />
57
- Đang lưu...
58
- </button>`}
53
+ codeString={`<button
54
+ disabled
55
+ className="flex items-center gap-2 px-4 py-2 rounded-md bg-primary text-primary-foreground text-sm opacity-70"
56
+ >
57
+ <Spinner
58
+ size="sm"
59
+ className="text-primary-foreground"
60
+ />
61
+ Đang lưu...
62
+ </button>`}
59
63
  >
60
64
  <button
61
65
  disabled
@@ -72,10 +76,10 @@ function SpinnerMicroShowcase({ globalSize }: { globalSize: Size }) {
72
76
  label="Overlay Loading"
73
77
  description="Đặt Spinner trên một overlay để chặn tương tác trong khi tải nội dung."
74
78
  codeString={`<div className="relative rounded-xl border border-border bg-card h-32">
75
- <div className="absolute inset-0 flex items-center justify-center bg-background/60 rounded-xl">
76
- <Spinner size="lg" className="text-primary" />
77
- </div>
78
- </div>`}
79
+ <div className="absolute inset-0 flex items-center justify-center bg-background/60 rounded-xl">
80
+ <Spinner size="lg" className="text-primary" />
81
+ </div>
82
+ </div>`}
79
83
  >
80
84
  <div className="relative rounded-xl border border-border bg-card h-32 w-full max-w-sm">
81
85
  <div className="absolute inset-0 flex items-center justify-center bg-background/60 rounded-xl">