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,4 +1,5 @@
1
- import { useDevContext } from "../../dev/components/dev-context";
1
+ import { useState } from "react";
2
+
2
3
  import { TextareaPreset } from "../../components/macro/textarea-preset";
3
4
  import {
4
5
  Field,
@@ -13,6 +14,7 @@ import {
13
14
  InputGroupTextarea,
14
15
  } from "../../components/micro/input-group";
15
16
  import { Textarea } from "../../components/micro/textarea";
17
+ import { useDevContext } from "../../dev/components/dev-context";
16
18
  import {
17
19
  DocsCode,
18
20
  DocsH3,
@@ -23,7 +25,6 @@ import {
23
25
  ShowcaseDocs,
24
26
  } from "../../dev/components/showcase";
25
27
  import { type Size } from "../../lib/types";
26
- import { useState } from "react";
27
28
 
28
29
  // ──────────────────────────────────────────────────────────
29
30
  // SECTION 1: Macro Content
@@ -39,12 +40,11 @@ function TextareaMacroShowcase({ globalSize }: { globalSize: Size }) {
39
40
  label="Tiêu chuẩn"
40
41
  description="Trường văn bản nhiều dòng với nhãn và mô tả."
41
42
  codeString={`<TextareaPreset
42
- label="Phản hồi (Feedback)"
43
- description="Đóng góp ý kiến của bạn về sản phẩm."
44
- placeholder="Viết phản hồi..."
45
- className="w-full"
46
- />
47
- `}
43
+ label="Phản hồi (Feedback)"
44
+ description="Đóng góp ý kiến của bạn về sản phẩm."
45
+ placeholder="Viết phản hồi..."
46
+ className="w-full"
47
+ />`}
48
48
  >
49
49
  <TextareaPreset
50
50
  label="Phản hồi (Feedback)"
@@ -59,13 +59,12 @@ function TextareaMacroShowcase({ globalSize }: { globalSize: Size }) {
59
59
  label="Lỗi xác thực (Validation Error)"
60
60
  description="Hiển thị thông báo lỗi khi đầu vào không hợp lệ."
61
61
  codeString={`<TextareaPreset
62
- label="Khiếu nại"
63
- placeholder="Mô tả vấn đề..."
64
- errorMessage="Vui lòng cung cấp ít nhất 20 ký tự để chúng tôi hỗ trợ tốt hơn."
65
- className="w-full"
66
- rows={3}
67
- />
68
- `}
62
+ label="Khiếu nại"
63
+ placeholder="Mô tả vấn đề..."
64
+ errorMessage="Vui lòng cung cấp ít nhất 20 ký tự để chúng tôi hỗ trợ tốt hơn."
65
+ className="w-full"
66
+ rows={3}
67
+ />`}
69
68
  >
70
69
  <TextareaPreset
71
70
  label="Khiếu nại"
@@ -82,18 +81,18 @@ function TextareaMacroShowcase({ globalSize }: { globalSize: Size }) {
82
81
  <ExampleSection
83
82
  label="Giới hạn ký tự (Character Count)"
84
83
  description="Sử dụng React state và slot description để đếm ngược số ký tự."
85
- codeString={`const [bio, setBio] = useState("");
86
- const maxLength = 280;
87
-
88
- return (
84
+ codeString={`const [bio, setBio] = useState(""); const maxLength = 280;
85
+ return (
89
86
  <TextareaPreset
90
87
  label="Tiểu sử"
91
88
  size="\${globalSize}"
92
89
  description={
93
90
  <span className="flex justify-between">
94
91
  <span>Mô tả ngắn gọn về bản thân bạn.</span>
95
- <span
96
- data-invalid={bio.length > maxLength ? "" : undefined}
92
+ <span
93
+ data-invalid={
94
+ bio.length > maxLength ? "" : undefined
95
+ }
97
96
  className="data-invalid:text-destructive data-invalid:font-medium"
98
97
  >
99
98
  {bio.length}/{maxLength}
@@ -104,10 +103,14 @@ return (
104
103
  value={bio}
105
104
  onChange={(e) => setBio(e.target.value)}
106
105
  maxLength={maxLength}
107
- errorMessage={bio.length > maxLength ? \`Vượt quá \${bio.length - maxLength} ký tự.\` : undefined}
106
+ errorMessage={
107
+ bio.length > maxLength
108
+ ? \`Vượt quá \${bio.length - maxLength} ký tự.\`
109
+ : undefined
110
+ }
108
111
  rows={4}
109
112
  />
110
- );`}
113
+ );`}
111
114
  >
112
115
  <TextareaPreset
113
116
  label="Tiểu sử"
@@ -141,14 +144,13 @@ return (
141
144
  label="Khóa / Bất hoạt (Disabled)"
142
145
  description="Trường văn bản không thể tương tác."
143
146
  codeString={`<TextareaPreset
144
- label="Ghi chú lưu trữ"
145
- description="Những ghi chú này ở dạng chỉ đọc."
146
- defaultValue="Dự án này đã hoàn thành vào năm 2023. Không thể thay đổi nội dung."
147
- disabled
148
- className="w-full"
149
- rows={4}
150
- />
151
- `}
147
+ label="Ghi chú lưu trữ"
148
+ description="Những ghi chú này ở dạng chỉ đọc."
149
+ defaultValue="Dự án này đã hoàn thành vào năm 2023. Không thể thay đổi nội dung."
150
+ disabled
151
+ className="w-full"
152
+ rows={4}
153
+ />`}
152
154
  >
153
155
  <TextareaPreset
154
156
  label="Ghi chú lưu trữ"
@@ -167,16 +169,17 @@ return (
167
169
  description="Bố cục thực tế trong một form hoàn chỉnh."
168
170
  fullWidth
169
171
  codeString={`<div className="w-full max-w-lg rounded-xl border border-border bg-card p-5 shadow-sm">
170
- <h3 className="mb-4 font-semibold">Tạo Ticket Hỗ Trợ</h3>
171
- <TextareaPreset
172
- label="Mô tả sự cố"
173
- description="Vui lòng cung cấp chi tiết lỗi, các bước tái hiện và cấu hình môi trường."
174
- placeholder=" dụ: Khi tôi click vào nút Submit, hệ thống báo lỗi 500..."
175
- className="w-full"
176
- rows={6}
177
- />
178
- </div>
179
- `}
172
+ <h3 className="mb-4 font-semibold">
173
+ Tạo Ticket Hỗ Trợ
174
+ </h3>
175
+ <TextareaPreset
176
+ label=" tả sự cố"
177
+ description="Vui lòng cung cấp chi tiết lỗi, các bước tái hiện và cấu hình môi trường."
178
+ placeholder="Ví dụ: Khi tôi click vào nút Submit, hệ thống báo lỗi 500..."
179
+ className="w-full"
180
+ rows={6}
181
+ />
182
+ </div>`}
180
183
  >
181
184
  <div className="w-full max-w-lg rounded-xl border border-border bg-card p-5 shadow-sm">
182
185
  <h3 className="mb-4 font-semibold">Tạo Ticket Hỗ Trợ</h3>
@@ -205,11 +208,10 @@ function TextareaMicroShowcase({ globalSize }: { globalSize: Size }) {
205
208
  label="Cơ bản (Primitive)"
206
209
  description="Khung nhập văn bản nhiều dòng không có nhãn."
207
210
  codeString={`<Textarea
208
- rows={4}
209
- placeholder="Viết một đoạn văn dài ở đây..."
210
- className="w-full"
211
- />
212
- `}
211
+ rows={4}
212
+ placeholder="Viết một đoạn văn dài ở đây..."
213
+ className="w-full"
214
+ />`}
213
215
  >
214
216
  <Textarea
215
217
  size={globalSize}
@@ -243,21 +245,22 @@ function TextareaMicroShowcase({ globalSize }: { globalSize: Size }) {
243
245
  label="InputGroup + Textarea"
244
246
  description="Textarea bên trong InputGroup với Addon. Sử dụng InputGroupTextarea."
245
247
  codeString={`<Field className="w-full">
246
- <FieldLabel htmlFor="tf-group-textarea">Bình luận</FieldLabel>
247
- <FieldContent>
248
- <InputGroup className="items-start">
249
- <InputGroupAddon align="start" className="mt-2">
250
- <InputGroupText>💬</InputGroupText>
251
- </InputGroupAddon>
252
- <InputGroupTextarea
253
- id="tf-group-textarea"
254
- rows={3}
255
- placeholder="Để lại bình luận của bạn..."
256
- />
257
- </InputGroup>
258
- </FieldContent>
259
- </Field>
260
- `}
248
+ <FieldLabel htmlFor="tf-group-textarea">
249
+ Bình luận
250
+ </FieldLabel>
251
+ <FieldContent>
252
+ <InputGroup className="items-start">
253
+ <InputGroupAddon align="start" className="mt-2">
254
+ <InputGroupText>💬</InputGroupText>
255
+ </InputGroupAddon>
256
+ <InputGroupTextarea
257
+ id="tf-group-textarea"
258
+ rows={3}
259
+ placeholder="Để lại bình luận của bạn..."
260
+ />
261
+ </InputGroup>
262
+ </FieldContent>
263
+ </Field>`}
261
264
  >
262
265
  <Field size={globalSize} className="w-full">
263
266
  <FieldLabel htmlFor="tf-group-textarea">Bình luận</FieldLabel>
@@ -280,19 +283,22 @@ function TextareaMicroShowcase({ globalSize }: { globalSize: Size }) {
280
283
  label="Trạng thái Lỗi thủ công"
281
284
  description="Tự gắn aria-invalid vào Textarea và dùng FieldError."
282
285
  codeString={`<Field className="w-full">
283
- <FieldLabel htmlFor="tf-invalid">Mô tả hệ thống</FieldLabel>
284
- <FieldContent>
285
- <Textarea
286
- id="tf-invalid"
287
- rows={3}
288
- aria-invalid
289
- placeholder="Mô tả..."
290
- defaultValue="Quá ngắn"
291
- />
292
- </FieldContent>
293
- <FieldError>Mô tả không đạt đủ độ dài tối thiểu.</FieldError>
294
- </Field>
295
- `}
286
+ <FieldLabel htmlFor="tf-invalid">
287
+ Mô tả hệ thống
288
+ </FieldLabel>
289
+ <FieldContent>
290
+ <Textarea
291
+ id="tf-invalid"
292
+ rows={3}
293
+ aria-invalid
294
+ placeholder="Mô tả..."
295
+ defaultValue="Quá ngắn"
296
+ />
297
+ </FieldContent>
298
+ <FieldError>
299
+ Mô tả không đạt đủ độ dài tối thiểu.
300
+ </FieldError>
301
+ </Field>`}
296
302
  >
297
303
  <Field size={globalSize} className="w-full">
298
304
  <FieldLabel htmlFor="tf-invalid">Mô tả hệ thống</FieldLabel>
@@ -316,53 +322,93 @@ function TextareaMicroShowcase({ globalSize }: { globalSize: Size }) {
316
322
  description="So sánh nhanh khi nào dùng Micro và Macro."
317
323
  fullWidth
318
324
  codeString={`<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
319
- {/* Story 1: Macro wins */}
320
- <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
321
- <div className="flex items-start gap-3">
322
- <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
323
- <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>
324
- </span>
325
- <div>
326
- <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">Story 1 · Dùng Macro</p>
327
- <h3 className="mt-0.5 text-sm font-semibold text-foreground">Form lấy thông tin thông thường</h3>
325
+ {/* Story 1: Macro wins */}
326
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
327
+ <div className="flex items-start gap-3">
328
+ <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
329
+ <svg
330
+ xmlns="http://www.w3.org/2000/svg"
331
+ className="size-4"
332
+ viewBox="0 0 24 24"
333
+ fill="none"
334
+ stroke="currentColor"
335
+ strokeWidth="2"
336
+ strokeLinecap="round"
337
+ strokeLinejoin="round"
338
+ aria-hidden="true"
339
+ >
340
+ <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" />
341
+ </svg>
342
+ </span>
343
+ <div>
344
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
345
+ Story 1 · Dùng Macro
346
+ </p>
347
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
348
+ Form lấy thông tin thông thường
349
+ </h3>
350
+ </div>
351
+ </div>
352
+ <p className="text-xs text-muted-foreground leading-relaxed">
353
+ Bạn cần ô nhập có tên trường rõ ràng, có gợi ý nhập
354
+ liệu. Chỉ việc truyền props vào{" "}
355
+ <DocsCode>TextareaPreset</DocsCode> là xong.
356
+ </p>
357
+ <div className="rounded-lg bg-muted/50 p-3">
358
+ <TextareaPreset
359
+ size="sm"
360
+ label="Mục tiêu nghề nghiệp"
361
+ description="Tối đa 500 từ."
362
+ className="w-full"
363
+ />
328
364
  </div>
329
365
  </div>
330
- <p className="text-xs text-muted-foreground leading-relaxed">
331
- Bạn cần ô nhập có tên trường rõ ràng, có gợi ý nhập liệu. Chỉ việc truyền props vào <DocsCode>TextareaPreset</DocsCode> là xong.
332
- </p>
333
- <div className="rounded-lg bg-muted/50 p-3">
334
- <TextareaPreset
335
- size="sm"
336
- label="Mục tiêu nghề nghiệp"
337
- description="Tối đa 500 từ."
338
- className="w-full"
339
- />
340
- </div>
341
- </div>
342
366
 
343
- {/* Story 2: Micro wins */}
344
- <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
345
- <div className="flex items-start gap-3">
346
- <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
347
- <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>
348
- </span>
349
- <div>
350
- <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">Story 2 · Dùng Micro</p>
351
- <h3 className="mt-0.5 text-sm font-semibold text-foreground">Layout kết hợp Addon đặc thù</h3>
367
+ {/* Story 2: Micro wins */}
368
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
369
+ <div className="flex items-start gap-3">
370
+ <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
371
+ <svg
372
+ xmlns="http://www.w3.org/2000/svg"
373
+ className="size-4"
374
+ viewBox="0 0 24 24"
375
+ fill="none"
376
+ stroke="currentColor"
377
+ strokeWidth="2"
378
+ strokeLinecap="round"
379
+ strokeLinejoin="round"
380
+ aria-hidden="true"
381
+ >
382
+ <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" />
383
+ </svg>
384
+ </span>
385
+ <div>
386
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
387
+ Story 2 · Dùng Micro
388
+ </p>
389
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
390
+ Layout kết hợp Addon đặc thù
391
+ </h3>
392
+ </div>
393
+ </div>
394
+ <p className="text-xs text-muted-foreground leading-relaxed">
395
+ Khi bạn cần nối một icon vào ngay bên cạnh khung
396
+ textarea giống như giao diện chat. Macro không hỗ
397
+ trợ layout này cho Textarea.
398
+ </p>
399
+ <div className="rounded-lg bg-muted/50 p-3">
400
+ <InputGroup size="sm" className="items-end w-full">
401
+ <InputGroupTextarea
402
+ rows={2}
403
+ placeholder="Tin nhắn..."
404
+ />
405
+ <button className="h-full px-3 shrink-0 rounded-r-md border-l border-input bg-muted/50 text-xs font-semibold text-primary transition-colors hover:bg-muted">
406
+ GỬI
407
+ </button>
408
+ </InputGroup>
352
409
  </div>
353
410
  </div>
354
- <p className="text-xs text-muted-foreground leading-relaxed">
355
- Khi bạn cần nối một icon vào ngay bên cạnh khung textarea giống như giao diện chat. Macro không hỗ trợ layout này cho Textarea.
356
- </p>
357
- <div className="rounded-lg bg-muted/50 p-3">
358
- <InputGroup size="sm" className="items-end w-full">
359
- <InputGroupTextarea rows={2} placeholder="Tin nhắn..." />
360
- <button className="h-full px-3 shrink-0 rounded-r-md border-l border-input bg-muted/50 text-xs font-semibold text-primary transition-colors hover:bg-muted">GỬI</button>
361
- </InputGroup>
362
- </div>
363
- </div>
364
- </div>
365
- `}
411
+ </div>`}
366
412
  >
367
413
  <div className="grid grid-cols-1 gap-6 md:grid-cols-2">
368
414
  {/* Story 1: Macro wins */}