gladvn 0.2.14

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 (500) hide show
  1. package/README.md +112 -0
  2. package/bin/cli.js +326 -0
  3. package/dist/components/macro/accordion-preset.d.ts +14 -0
  4. package/dist/components/macro/accordion-preset.d.ts.map +1 -0
  5. package/dist/components/macro/alert-dialog-preset.d.ts +26 -0
  6. package/dist/components/macro/alert-dialog-preset.d.ts.map +1 -0
  7. package/dist/components/macro/alert-preset.d.ts +14 -0
  8. package/dist/components/macro/alert-preset.d.ts.map +1 -0
  9. package/dist/components/macro/avatar-preset.d.ts +11 -0
  10. package/dist/components/macro/avatar-preset.d.ts.map +1 -0
  11. package/dist/components/macro/breadcrumb-preset.d.ts +12 -0
  12. package/dist/components/macro/breadcrumb-preset.d.ts.map +1 -0
  13. package/dist/components/macro/card-preset.d.ts +10 -0
  14. package/dist/components/macro/card-preset.d.ts.map +1 -0
  15. package/dist/components/macro/carousel-preset.d.ts +18 -0
  16. package/dist/components/macro/carousel-preset.d.ts.map +1 -0
  17. package/dist/components/macro/checkbox-preset.d.ts +14 -0
  18. package/dist/components/macro/checkbox-preset.d.ts.map +1 -0
  19. package/dist/components/macro/combobox-preset.d.ts +27 -0
  20. package/dist/components/macro/combobox-preset.d.ts.map +1 -0
  21. package/dist/components/macro/command-preset.d.ts +16 -0
  22. package/dist/components/macro/command-preset.d.ts.map +1 -0
  23. package/dist/components/macro/date-picker.d.ts +62 -0
  24. package/dist/components/macro/date-picker.d.ts.map +1 -0
  25. package/dist/components/macro/dialog-preset.d.ts +24 -0
  26. package/dist/components/macro/dialog-preset.d.ts.map +1 -0
  27. package/dist/components/macro/empty-preset.d.ts +15 -0
  28. package/dist/components/macro/empty-preset.d.ts.map +1 -0
  29. package/dist/components/macro/field-preset.d.ts +15 -0
  30. package/dist/components/macro/field-preset.d.ts.map +1 -0
  31. package/dist/components/macro/index.d.ts +22 -0
  32. package/dist/components/macro/index.d.ts.map +1 -0
  33. package/dist/components/macro/input-otp-preset.d.ts +13 -0
  34. package/dist/components/macro/input-otp-preset.d.ts.map +1 -0
  35. package/dist/components/macro/input-preset.d.ts +21 -0
  36. package/dist/components/macro/input-preset.d.ts.map +1 -0
  37. package/dist/components/macro/pagination-preset.d.ts +13 -0
  38. package/dist/components/macro/pagination-preset.d.ts.map +1 -0
  39. package/dist/components/macro/progress-preset.d.ts +10 -0
  40. package/dist/components/macro/progress-preset.d.ts.map +1 -0
  41. package/dist/components/macro/radio-group-preset.d.ts +22 -0
  42. package/dist/components/macro/radio-group-preset.d.ts.map +1 -0
  43. package/dist/components/macro/select-preset.d.ts +42 -0
  44. package/dist/components/macro/select-preset.d.ts.map +1 -0
  45. package/dist/components/macro/slider-preset.d.ts +12 -0
  46. package/dist/components/macro/slider-preset.d.ts.map +1 -0
  47. package/dist/components/macro/switch-preset.d.ts +12 -0
  48. package/dist/components/macro/switch-preset.d.ts.map +1 -0
  49. package/dist/components/macro/tabs-preset.d.ts +17 -0
  50. package/dist/components/macro/tabs-preset.d.ts.map +1 -0
  51. package/dist/components/macro/textarea-preset.d.ts +17 -0
  52. package/dist/components/macro/textarea-preset.d.ts.map +1 -0
  53. package/dist/components/micro/accordion.d.ts +8 -0
  54. package/dist/components/micro/accordion.d.ts.map +1 -0
  55. package/dist/components/micro/alert-dialog.d.ts +33 -0
  56. package/dist/components/micro/alert-dialog.d.ts.map +1 -0
  57. package/dist/components/micro/alert.d.ts +28 -0
  58. package/dist/components/micro/alert.d.ts.map +1 -0
  59. package/dist/components/micro/aspect-ratio.d.ts +13 -0
  60. package/dist/components/micro/aspect-ratio.d.ts.map +1 -0
  61. package/dist/components/micro/avatar.d.ts +23 -0
  62. package/dist/components/micro/avatar.d.ts.map +1 -0
  63. package/dist/components/micro/badge.d.ts +16 -0
  64. package/dist/components/micro/badge.d.ts.map +1 -0
  65. package/dist/components/micro/breadcrumb.d.ts +24 -0
  66. package/dist/components/micro/breadcrumb.d.ts.map +1 -0
  67. package/dist/components/micro/button.d.ts +39 -0
  68. package/dist/components/micro/button.d.ts.map +1 -0
  69. package/dist/components/micro/calendar.d.ts +28 -0
  70. package/dist/components/micro/calendar.d.ts.map +1 -0
  71. package/dist/components/micro/card.d.ts +28 -0
  72. package/dist/components/micro/card.d.ts.map +1 -0
  73. package/dist/components/micro/carousel.d.ts +29 -0
  74. package/dist/components/micro/carousel.d.ts.map +1 -0
  75. package/dist/components/micro/chart.d.ts +49 -0
  76. package/dist/components/micro/chart.d.ts.map +1 -0
  77. package/dist/components/micro/checkbox.d.ts +17 -0
  78. package/dist/components/micro/checkbox.d.ts.map +1 -0
  79. package/dist/components/micro/collapsible.d.ts +15 -0
  80. package/dist/components/micro/collapsible.d.ts.map +1 -0
  81. package/dist/components/micro/combobox.d.ts +33 -0
  82. package/dist/components/micro/combobox.d.ts.map +1 -0
  83. package/dist/components/micro/command.d.ts +79 -0
  84. package/dist/components/micro/command.d.ts.map +1 -0
  85. package/dist/components/micro/context-menu.d.ts +60 -0
  86. package/dist/components/micro/context-menu.d.ts.map +1 -0
  87. package/dist/components/micro/dialog.d.ts +14 -0
  88. package/dist/components/micro/dialog.d.ts.map +1 -0
  89. package/dist/components/micro/direction.d.ts +2 -0
  90. package/dist/components/micro/direction.d.ts.map +1 -0
  91. package/dist/components/micro/drawer.d.ts +17 -0
  92. package/dist/components/micro/drawer.d.ts.map +1 -0
  93. package/dist/components/micro/dropdown-menu.d.ts +37 -0
  94. package/dist/components/micro/dropdown-menu.d.ts.map +1 -0
  95. package/dist/components/micro/empty.d.ts +23 -0
  96. package/dist/components/micro/empty.d.ts.map +1 -0
  97. package/dist/components/micro/field.d.ts +29 -0
  98. package/dist/components/micro/field.d.ts.map +1 -0
  99. package/dist/components/micro/hover-card.d.ts +17 -0
  100. package/dist/components/micro/hover-card.d.ts.map +1 -0
  101. package/dist/components/micro/input-group.d.ts +17 -0
  102. package/dist/components/micro/input-group.d.ts.map +1 -0
  103. package/dist/components/micro/input-otp.d.ts +44 -0
  104. package/dist/components/micro/input-otp.d.ts.map +1 -0
  105. package/dist/components/micro/input.d.ts +22 -0
  106. package/dist/components/micro/input.d.ts.map +1 -0
  107. package/dist/components/micro/item.d.ts +31 -0
  108. package/dist/components/micro/item.d.ts.map +1 -0
  109. package/dist/components/micro/kbd.d.ts +9 -0
  110. package/dist/components/micro/kbd.d.ts.map +1 -0
  111. package/dist/components/micro/label.d.ts +15 -0
  112. package/dist/components/micro/label.d.ts.map +1 -0
  113. package/dist/components/micro/menubar.d.ts +41 -0
  114. package/dist/components/micro/menubar.d.ts.map +1 -0
  115. package/dist/components/micro/navigation-menu.d.ts +18 -0
  116. package/dist/components/micro/navigation-menu.d.ts.map +1 -0
  117. package/dist/components/micro/pagination.d.ts +33 -0
  118. package/dist/components/micro/pagination.d.ts.map +1 -0
  119. package/dist/components/micro/popover.d.ts +23 -0
  120. package/dist/components/micro/popover.d.ts.map +1 -0
  121. package/dist/components/micro/progress.d.ts +19 -0
  122. package/dist/components/micro/progress.d.ts.map +1 -0
  123. package/dist/components/micro/radio-group.d.ts +13 -0
  124. package/dist/components/micro/radio-group.d.ts.map +1 -0
  125. package/dist/components/micro/resizable.d.ts +12 -0
  126. package/dist/components/micro/resizable.d.ts.map +1 -0
  127. package/dist/components/micro/scroll-area.d.ts +12 -0
  128. package/dist/components/micro/scroll-area.d.ts.map +1 -0
  129. package/dist/components/micro/select.d.ts +21 -0
  130. package/dist/components/micro/select.d.ts.map +1 -0
  131. package/dist/components/micro/separator.d.ts +9 -0
  132. package/dist/components/micro/separator.d.ts.map +1 -0
  133. package/dist/components/micro/sheet.d.ts +17 -0
  134. package/dist/components/micro/sheet.d.ts.map +1 -0
  135. package/dist/components/micro/sidebar.d.ts +28 -0
  136. package/dist/components/micro/sidebar.d.ts.map +1 -0
  137. package/dist/components/micro/skeleton.d.ts +9 -0
  138. package/dist/components/micro/skeleton.d.ts.map +1 -0
  139. package/dist/components/micro/slider.d.ts +14 -0
  140. package/dist/components/micro/slider.d.ts.map +1 -0
  141. package/dist/components/micro/sonner.d.ts +5 -0
  142. package/dist/components/micro/sonner.d.ts.map +1 -0
  143. package/dist/components/micro/spinner.d.ts +21 -0
  144. package/dist/components/micro/spinner.d.ts.map +1 -0
  145. package/dist/components/micro/switch.d.ts +13 -0
  146. package/dist/components/micro/switch.d.ts.map +1 -0
  147. package/dist/components/micro/table.d.ts +17 -0
  148. package/dist/components/micro/table.d.ts.map +1 -0
  149. package/dist/components/micro/tabs.d.ts +13 -0
  150. package/dist/components/micro/tabs.d.ts.map +1 -0
  151. package/dist/components/micro/textarea.d.ts +17 -0
  152. package/dist/components/micro/textarea.d.ts.map +1 -0
  153. package/dist/components/micro/theme-provider.d.ts +76 -0
  154. package/dist/components/micro/theme-provider.d.ts.map +1 -0
  155. package/dist/components/micro/toggle-group.d.ts +22 -0
  156. package/dist/components/micro/toggle-group.d.ts.map +1 -0
  157. package/dist/components/micro/toggle.d.ts +16 -0
  158. package/dist/components/micro/toggle.d.ts.map +1 -0
  159. package/dist/components/micro/tooltip.d.ts +20 -0
  160. package/dist/components/micro/tooltip.d.ts.map +1 -0
  161. package/dist/dev/App.d.ts +3 -0
  162. package/dist/dev/App.d.ts.map +1 -0
  163. package/dist/dev/components/GladcnLogo.d.ts +10 -0
  164. package/dist/dev/components/GladcnLogo.d.ts.map +1 -0
  165. package/dist/dev/components/code-highlighter.d.ts +5 -0
  166. package/dist/dev/components/code-highlighter.d.ts.map +1 -0
  167. package/dist/dev/components/dev-context.d.ts +12 -0
  168. package/dist/dev/components/dev-context.d.ts.map +1 -0
  169. package/dist/dev/components/showcase.d.ts +72 -0
  170. package/dist/dev/components/showcase.d.ts.map +1 -0
  171. package/dist/dev/data.d.ts +68 -0
  172. package/dist/dev/data.d.ts.map +1 -0
  173. package/dist/dev/main.d.ts +1 -0
  174. package/dist/dev/main.d.ts.map +1 -0
  175. package/dist/dev/sections/buttons.d.ts +2 -0
  176. package/dist/dev/sections/buttons.d.ts.map +1 -0
  177. package/dist/dev/sections/display.d.ts +2 -0
  178. package/dist/dev/sections/display.d.ts.map +1 -0
  179. package/dist/dev/sections/feedback.d.ts +2 -0
  180. package/dist/dev/sections/feedback.d.ts.map +1 -0
  181. package/dist/dev/sections/forms.d.ts +2 -0
  182. package/dist/dev/sections/forms.d.ts.map +1 -0
  183. package/dist/dev/sections/interactive.d.ts +2 -0
  184. package/dist/dev/sections/interactive.d.ts.map +1 -0
  185. package/dist/dev/sections/overview.d.ts +2 -0
  186. package/dist/dev/sections/overview.d.ts.map +1 -0
  187. package/dist/dev/showcase/accordion.d.ts +2 -0
  188. package/dist/dev/showcase/accordion.d.ts.map +1 -0
  189. package/dist/dev/showcase/alert-dialog.d.ts +2 -0
  190. package/dist/dev/showcase/alert-dialog.d.ts.map +1 -0
  191. package/dist/dev/showcase/alert.d.ts +2 -0
  192. package/dist/dev/showcase/alert.d.ts.map +1 -0
  193. package/dist/dev/showcase/aspect-ratio.d.ts +2 -0
  194. package/dist/dev/showcase/aspect-ratio.d.ts.map +1 -0
  195. package/dist/dev/showcase/avatar.d.ts +2 -0
  196. package/dist/dev/showcase/avatar.d.ts.map +1 -0
  197. package/dist/dev/showcase/badge.d.ts +2 -0
  198. package/dist/dev/showcase/badge.d.ts.map +1 -0
  199. package/dist/dev/showcase/breadcrumb.d.ts +2 -0
  200. package/dist/dev/showcase/breadcrumb.d.ts.map +1 -0
  201. package/dist/dev/showcase/button.d.ts +2 -0
  202. package/dist/dev/showcase/button.d.ts.map +1 -0
  203. package/dist/dev/showcase/calendar.d.ts +2 -0
  204. package/dist/dev/showcase/calendar.d.ts.map +1 -0
  205. package/dist/dev/showcase/card.d.ts +2 -0
  206. package/dist/dev/showcase/card.d.ts.map +1 -0
  207. package/dist/dev/showcase/carousel.d.ts +2 -0
  208. package/dist/dev/showcase/carousel.d.ts.map +1 -0
  209. package/dist/dev/showcase/chart.d.ts +2 -0
  210. package/dist/dev/showcase/chart.d.ts.map +1 -0
  211. package/dist/dev/showcase/checkbox.d.ts +2 -0
  212. package/dist/dev/showcase/checkbox.d.ts.map +1 -0
  213. package/dist/dev/showcase/collapsible.d.ts +3 -0
  214. package/dist/dev/showcase/collapsible.d.ts.map +1 -0
  215. package/dist/dev/showcase/combobox.d.ts +2 -0
  216. package/dist/dev/showcase/combobox.d.ts.map +1 -0
  217. package/dist/dev/showcase/command.d.ts +2 -0
  218. package/dist/dev/showcase/command.d.ts.map +1 -0
  219. package/dist/dev/showcase/context-menu.d.ts +2 -0
  220. package/dist/dev/showcase/context-menu.d.ts.map +1 -0
  221. package/dist/dev/showcase/dialog.d.ts +2 -0
  222. package/dist/dev/showcase/dialog.d.ts.map +1 -0
  223. package/dist/dev/showcase/drawer.d.ts +2 -0
  224. package/dist/dev/showcase/drawer.d.ts.map +1 -0
  225. package/dist/dev/showcase/dropdown-menu.d.ts +2 -0
  226. package/dist/dev/showcase/dropdown-menu.d.ts.map +1 -0
  227. package/dist/dev/showcase/empty.d.ts +2 -0
  228. package/dist/dev/showcase/empty.d.ts.map +1 -0
  229. package/dist/dev/showcase/hover-card.d.ts +2 -0
  230. package/dist/dev/showcase/hover-card.d.ts.map +1 -0
  231. package/dist/dev/showcase/input-group.d.ts +2 -0
  232. package/dist/dev/showcase/input-group.d.ts.map +1 -0
  233. package/dist/dev/showcase/input-otp.d.ts +2 -0
  234. package/dist/dev/showcase/input-otp.d.ts.map +1 -0
  235. package/dist/dev/showcase/input.d.ts +2 -0
  236. package/dist/dev/showcase/input.d.ts.map +1 -0
  237. package/dist/dev/showcase/item.d.ts +2 -0
  238. package/dist/dev/showcase/item.d.ts.map +1 -0
  239. package/dist/dev/showcase/kbd.d.ts +2 -0
  240. package/dist/dev/showcase/kbd.d.ts.map +1 -0
  241. package/dist/dev/showcase/label.d.ts +2 -0
  242. package/dist/dev/showcase/label.d.ts.map +1 -0
  243. package/dist/dev/showcase/menubar.d.ts +2 -0
  244. package/dist/dev/showcase/menubar.d.ts.map +1 -0
  245. package/dist/dev/showcase/navigation-menu.d.ts +3 -0
  246. package/dist/dev/showcase/navigation-menu.d.ts.map +1 -0
  247. package/dist/dev/showcase/overview.d.ts +2 -0
  248. package/dist/dev/showcase/overview.d.ts.map +1 -0
  249. package/dist/dev/showcase/pagination.d.ts +2 -0
  250. package/dist/dev/showcase/pagination.d.ts.map +1 -0
  251. package/dist/dev/showcase/popover.d.ts +2 -0
  252. package/dist/dev/showcase/popover.d.ts.map +1 -0
  253. package/dist/dev/showcase/progress.d.ts +2 -0
  254. package/dist/dev/showcase/progress.d.ts.map +1 -0
  255. package/dist/dev/showcase/radio-group.d.ts +2 -0
  256. package/dist/dev/showcase/radio-group.d.ts.map +1 -0
  257. package/dist/dev/showcase/resizable.d.ts +2 -0
  258. package/dist/dev/showcase/resizable.d.ts.map +1 -0
  259. package/dist/dev/showcase/scroll-area.d.ts +2 -0
  260. package/dist/dev/showcase/scroll-area.d.ts.map +1 -0
  261. package/dist/dev/showcase/select.d.ts +2 -0
  262. package/dist/dev/showcase/select.d.ts.map +1 -0
  263. package/dist/dev/showcase/separator.d.ts +2 -0
  264. package/dist/dev/showcase/separator.d.ts.map +1 -0
  265. package/dist/dev/showcase/sheet.d.ts +2 -0
  266. package/dist/dev/showcase/sheet.d.ts.map +1 -0
  267. package/dist/dev/showcase/sidebar.d.ts +2 -0
  268. package/dist/dev/showcase/sidebar.d.ts.map +1 -0
  269. package/dist/dev/showcase/skeleton.d.ts +2 -0
  270. package/dist/dev/showcase/skeleton.d.ts.map +1 -0
  271. package/dist/dev/showcase/slider.d.ts +2 -0
  272. package/dist/dev/showcase/slider.d.ts.map +1 -0
  273. package/dist/dev/showcase/sonner.d.ts +2 -0
  274. package/dist/dev/showcase/sonner.d.ts.map +1 -0
  275. package/dist/dev/showcase/spinner.d.ts +2 -0
  276. package/dist/dev/showcase/spinner.d.ts.map +1 -0
  277. package/dist/dev/showcase/switch.d.ts +2 -0
  278. package/dist/dev/showcase/switch.d.ts.map +1 -0
  279. package/dist/dev/showcase/table.d.ts +2 -0
  280. package/dist/dev/showcase/table.d.ts.map +1 -0
  281. package/dist/dev/showcase/tabs.d.ts +2 -0
  282. package/dist/dev/showcase/tabs.d.ts.map +1 -0
  283. package/dist/dev/showcase/textarea.d.ts +2 -0
  284. package/dist/dev/showcase/textarea.d.ts.map +1 -0
  285. package/dist/dev/showcase/theme-provider.d.ts +2 -0
  286. package/dist/dev/showcase/theme-provider.d.ts.map +1 -0
  287. package/dist/dev/showcase/toast.d.ts +2 -0
  288. package/dist/dev/showcase/toast.d.ts.map +1 -0
  289. package/dist/dev/showcase/toggle-group.d.ts +2 -0
  290. package/dist/dev/showcase/toggle-group.d.ts.map +1 -0
  291. package/dist/dev/showcase/toggle.d.ts +2 -0
  292. package/dist/dev/showcase/toggle.d.ts.map +1 -0
  293. package/dist/dev/showcase/tooltip.d.ts +2 -0
  294. package/dist/dev/showcase/tooltip.d.ts.map +1 -0
  295. package/dist/hooks/use-controllable-state.d.ts +14 -0
  296. package/dist/hooks/use-controllable-state.d.ts.map +1 -0
  297. package/dist/hooks/use-mobile.d.ts +2 -0
  298. package/dist/hooks/use-mobile.d.ts.map +1 -0
  299. package/dist/index.cjs +5099 -0
  300. package/dist/index.cjs.map +1 -0
  301. package/dist/index.d.ts +58 -0
  302. package/dist/index.d.ts.map +1 -0
  303. package/dist/index.js +4740 -0
  304. package/dist/index.js.map +1 -0
  305. package/dist/lib/types.d.ts +4 -0
  306. package/dist/lib/types.d.ts.map +1 -0
  307. package/dist/lib/utils.d.ts +3 -0
  308. package/dist/lib/utils.d.ts.map +1 -0
  309. package/dist/preset.d.ts +18 -0
  310. package/dist/preset.d.ts.map +1 -0
  311. package/dist/test/setup.d.ts +1 -0
  312. package/dist/test/setup.d.ts.map +1 -0
  313. package/llms.txt +74 -0
  314. package/package.json +117 -0
  315. package/scripts/add-icononly-prop.ts +84 -0
  316. package/scripts/audit-best-practices.ts +114 -0
  317. package/scripts/audit-showcase.ts +262 -0
  318. package/scripts/audit-showcases.ts +83 -0
  319. package/scripts/clean-imports.ts +21 -0
  320. package/scripts/count_missing.ts +24 -0
  321. package/scripts/find-css-vars.ts +62 -0
  322. package/scripts/fix-portals.ts +90 -0
  323. package/scripts/full-audit.ts +89 -0
  324. package/scripts/merge-components.cjs +65 -0
  325. package/scripts/merge-components.js +64 -0
  326. package/scripts/optimize-barrel.ts +116 -0
  327. package/scripts/postinstall.cjs +228 -0
  328. package/scripts/refactor_divs.ts +39 -0
  329. package/scripts/remove_div_wrappers.ts +17 -0
  330. package/scripts/update-gaps.ts +83 -0
  331. package/scripts/update_showcase_codestrings.ts +87 -0
  332. package/src/components/macro/accordion-preset.test.tsx +37 -0
  333. package/src/components/macro/accordion-preset.tsx +41 -0
  334. package/src/components/macro/alert-dialog-preset.tsx +116 -0
  335. package/src/components/macro/alert-preset.tsx +94 -0
  336. package/src/components/macro/avatar-preset.tsx +54 -0
  337. package/src/components/macro/breadcrumb-preset.tsx +50 -0
  338. package/src/components/macro/card-preset.tsx +44 -0
  339. package/src/components/macro/carousel-preset.tsx +150 -0
  340. package/src/components/macro/checkbox-preset.test.tsx +49 -0
  341. package/src/components/macro/checkbox-preset.tsx +84 -0
  342. package/src/components/macro/combobox-preset.tsx +171 -0
  343. package/src/components/macro/command-preset.tsx +74 -0
  344. package/src/components/macro/date-picker.tsx +289 -0
  345. package/src/components/macro/dialog-preset.tsx +105 -0
  346. package/src/components/macro/empty-preset.tsx +46 -0
  347. package/src/components/macro/field-preset.test.tsx +69 -0
  348. package/src/components/macro/field-preset.tsx +65 -0
  349. package/src/components/macro/index.ts +21 -0
  350. package/src/components/macro/input-otp-preset.tsx +98 -0
  351. package/src/components/macro/input-preset.test.tsx +52 -0
  352. package/src/components/macro/input-preset.tsx +139 -0
  353. package/src/components/macro/pagination-preset.tsx +153 -0
  354. package/src/components/macro/progress-preset.test.tsx +65 -0
  355. package/src/components/macro/progress-preset.tsx +45 -0
  356. package/src/components/macro/radio-group-preset.tsx +115 -0
  357. package/src/components/macro/select-preset.tsx +168 -0
  358. package/src/components/macro/slider-preset.test.tsx +43 -0
  359. package/src/components/macro/slider-preset.tsx +86 -0
  360. package/src/components/macro/switch-preset.test.tsx +53 -0
  361. package/src/components/macro/switch-preset.tsx +70 -0
  362. package/src/components/macro/tabs-preset.test.tsx +31 -0
  363. package/src/components/macro/tabs-preset.tsx +51 -0
  364. package/src/components/macro/textarea-preset.test.tsx +39 -0
  365. package/src/components/macro/textarea-preset.tsx +55 -0
  366. package/src/components/micro/accordion.tsx +76 -0
  367. package/src/components/micro/alert-dialog.tsx +213 -0
  368. package/src/components/micro/alert.tsx +146 -0
  369. package/src/components/micro/aspect-ratio.tsx +38 -0
  370. package/src/components/micro/avatar.tsx +143 -0
  371. package/src/components/micro/badge.tsx +207 -0
  372. package/src/components/micro/breadcrumb.tsx +162 -0
  373. package/src/components/micro/button.test.tsx +25 -0
  374. package/src/components/micro/button.tsx +361 -0
  375. package/src/components/micro/calendar.tsx +383 -0
  376. package/src/components/micro/card.tsx +112 -0
  377. package/src/components/micro/carousel.tsx +341 -0
  378. package/src/components/micro/chart.tsx +392 -0
  379. package/src/components/micro/checkbox.tsx +74 -0
  380. package/src/components/micro/collapsible.tsx +65 -0
  381. package/src/components/micro/combobox.tsx +349 -0
  382. package/src/components/micro/command.tsx +238 -0
  383. package/src/components/micro/context-menu.tsx +285 -0
  384. package/src/components/micro/dialog.tsx +143 -0
  385. package/src/components/micro/direction.tsx +13 -0
  386. package/src/components/micro/drawer.tsx +149 -0
  387. package/src/components/micro/dropdown-menu.tsx +305 -0
  388. package/src/components/micro/empty.tsx +144 -0
  389. package/src/components/micro/field.tsx +311 -0
  390. package/src/components/micro/hover-card.tsx +86 -0
  391. package/src/components/micro/input-group.tsx +269 -0
  392. package/src/components/micro/input-otp.tsx +130 -0
  393. package/src/components/micro/input.tsx +56 -0
  394. package/src/components/micro/item.tsx +206 -0
  395. package/src/components/micro/kbd.tsx +38 -0
  396. package/src/components/micro/label.tsx +48 -0
  397. package/src/components/micro/menubar.tsx +302 -0
  398. package/src/components/micro/navigation-menu.tsx +197 -0
  399. package/src/components/micro/pagination.tsx +162 -0
  400. package/src/components/micro/popover.tsx +131 -0
  401. package/src/components/micro/progress.tsx +144 -0
  402. package/src/components/micro/radio-group.tsx +73 -0
  403. package/src/components/micro/resizable.tsx +64 -0
  404. package/src/components/micro/scroll-area.tsx +68 -0
  405. package/src/components/micro/select.tsx +234 -0
  406. package/src/components/micro/separator.tsx +37 -0
  407. package/src/components/micro/sheet.tsx +144 -0
  408. package/src/components/micro/sidebar.tsx +238 -0
  409. package/src/components/micro/skeleton.tsx +29 -0
  410. package/src/components/micro/slider.tsx +135 -0
  411. package/src/components/micro/sonner.tsx +85 -0
  412. package/src/components/micro/spinner.tsx +44 -0
  413. package/src/components/micro/switch.tsx +70 -0
  414. package/src/components/micro/table.tsx +210 -0
  415. package/src/components/micro/tabs.tsx +100 -0
  416. package/src/components/micro/textarea.tsx +53 -0
  417. package/src/components/micro/theme-provider.tsx +163 -0
  418. package/src/components/micro/toggle-group.tsx +121 -0
  419. package/src/components/micro/toggle.tsx +55 -0
  420. package/src/components/micro/tooltip.tsx +105 -0
  421. package/src/dev/App.tsx +322 -0
  422. package/src/dev/_debug_select.html +29 -0
  423. package/src/dev/components/GladcnLogo.tsx +80 -0
  424. package/src/dev/components/code-highlighter.tsx +67 -0
  425. package/src/dev/components/dev-context.tsx +31 -0
  426. package/src/dev/components/showcase.tsx +413 -0
  427. package/src/dev/data.ts +341 -0
  428. package/src/dev/index.css +55 -0
  429. package/src/dev/main.tsx +30 -0
  430. package/src/dev/sections/buttons.tsx +303 -0
  431. package/src/dev/sections/display.tsx +270 -0
  432. package/src/dev/sections/feedback.tsx +371 -0
  433. package/src/dev/sections/forms.tsx +652 -0
  434. package/src/dev/sections/interactive.tsx +51 -0
  435. package/src/dev/sections/overview.tsx +396 -0
  436. package/src/dev/showcase/accordion.tsx +947 -0
  437. package/src/dev/showcase/alert-dialog.tsx +1056 -0
  438. package/src/dev/showcase/alert.tsx +756 -0
  439. package/src/dev/showcase/aspect-ratio.tsx +339 -0
  440. package/src/dev/showcase/avatar.tsx +470 -0
  441. package/src/dev/showcase/badge.tsx +227 -0
  442. package/src/dev/showcase/breadcrumb.tsx +269 -0
  443. package/src/dev/showcase/button.tsx +309 -0
  444. package/src/dev/showcase/calendar.tsx +380 -0
  445. package/src/dev/showcase/card.tsx +448 -0
  446. package/src/dev/showcase/carousel.tsx +562 -0
  447. package/src/dev/showcase/chart.tsx +130 -0
  448. package/src/dev/showcase/checkbox.tsx +611 -0
  449. package/src/dev/showcase/collapsible.tsx +298 -0
  450. package/src/dev/showcase/combobox.tsx +777 -0
  451. package/src/dev/showcase/command.tsx +245 -0
  452. package/src/dev/showcase/context-menu.tsx +239 -0
  453. package/src/dev/showcase/dialog.tsx +1141 -0
  454. package/src/dev/showcase/drawer.tsx +392 -0
  455. package/src/dev/showcase/dropdown-menu.tsx +420 -0
  456. package/src/dev/showcase/empty.tsx +493 -0
  457. package/src/dev/showcase/hover-card.tsx +336 -0
  458. package/src/dev/showcase/input-group.tsx +511 -0
  459. package/src/dev/showcase/input-otp.tsx +404 -0
  460. package/src/dev/showcase/input.tsx +530 -0
  461. package/src/dev/showcase/item.tsx +295 -0
  462. package/src/dev/showcase/kbd.tsx +276 -0
  463. package/src/dev/showcase/label.tsx +121 -0
  464. package/src/dev/showcase/menubar.tsx +392 -0
  465. package/src/dev/showcase/navigation-menu.tsx +304 -0
  466. package/src/dev/showcase/overview.tsx +1106 -0
  467. package/src/dev/showcase/pagination.tsx +312 -0
  468. package/src/dev/showcase/popover.tsx +374 -0
  469. package/src/dev/showcase/progress.tsx +299 -0
  470. package/src/dev/showcase/radio-group.tsx +612 -0
  471. package/src/dev/showcase/resizable.tsx +237 -0
  472. package/src/dev/showcase/scroll-area.tsx +157 -0
  473. package/src/dev/showcase/select.tsx +628 -0
  474. package/src/dev/showcase/separator.tsx +126 -0
  475. package/src/dev/showcase/sheet.tsx +566 -0
  476. package/src/dev/showcase/sidebar.tsx +120 -0
  477. package/src/dev/showcase/skeleton.tsx +213 -0
  478. package/src/dev/showcase/slider.tsx +506 -0
  479. package/src/dev/showcase/sonner.tsx +376 -0
  480. package/src/dev/showcase/spinner.tsx +124 -0
  481. package/src/dev/showcase/switch.tsx +602 -0
  482. package/src/dev/showcase/table.tsx +196 -0
  483. package/src/dev/showcase/tabs.tsx +662 -0
  484. package/src/dev/showcase/textarea.tsx +498 -0
  485. package/src/dev/showcase/theme-provider.tsx +894 -0
  486. package/src/dev/showcase/toast.tsx +119 -0
  487. package/src/dev/showcase/toggle-group.tsx +223 -0
  488. package/src/dev/showcase/toggle.tsx +171 -0
  489. package/src/dev/showcase/tooltip.tsx +372 -0
  490. package/src/hooks/use-controllable-state.ts +87 -0
  491. package/src/hooks/use-mobile.ts +21 -0
  492. package/src/index.ts +62 -0
  493. package/src/lib/types.ts +14 -0
  494. package/src/lib/utils.test.ts +14 -0
  495. package/src/lib/utils.ts +6 -0
  496. package/src/preset.ts +17 -0
  497. package/src/styles/gladcn.css +116 -0
  498. package/src/styles/tokens.css +213 -0
  499. package/src/test/setup.ts +8 -0
  500. package/src/vite-env.d.ts +1 -0
@@ -0,0 +1,530 @@
1
+ import { useDevContext } from "../../dev/components/dev-context";
2
+ import {
3
+ DocsCode,
4
+ DocsH3,
5
+ DocsLi,
6
+ DocsP,
7
+ DocsUl,
8
+ ExampleGrid,
9
+ ExampleSection,
10
+ Showcase,
11
+ ShowcaseDocs,
12
+ } from "../../dev/components/showcase";
13
+ import { LinkIcon, SearchIcon } from "lucide-react";
14
+ import { useState } from "react";
15
+
16
+ import {
17
+ Field,
18
+ FieldContent,
19
+ FieldDescription,
20
+ FieldError,
21
+ FieldLabel,
22
+ } from "../../components/micro/field";
23
+ import { Input } from "../../components/micro/input";
24
+ import {
25
+ InputGroup,
26
+ InputGroupAddon,
27
+ InputGroupInput,
28
+ InputGroupText,
29
+ } from "../../components/micro/input-group";
30
+ import { type Size } from "../../lib/types";
31
+
32
+ import { InputPreset } from "../../components/macro/input-preset";
33
+
34
+ // ──────────────────────────────────────────────────────────
35
+ // SECTION 1: Macro Content
36
+ // ──────────────────────────────────────────────────────────
37
+ function InputMacroShowcase({ globalSize }: { globalSize: Size }) {
38
+ return (
39
+ <div className="space-y-10 mt-6">
40
+ <ExampleGrid>
41
+ <ExampleSection
42
+ label="Tiêu chuẩn"
43
+ description="Trường nhập văn bản hoàn chỉnh có nhãn và mô tả."
44
+ codeString={`<InputPreset
45
+ size="${globalSize}"
46
+ label="Tên đăng nhập"
47
+ description="Đây sẽ là tên hiển thị công khai của bạn."
48
+ placeholder="johndoe"
49
+ className="w-full"
50
+ />
51
+ `}
52
+ >
53
+ <InputPreset
54
+ size={globalSize}
55
+ label="Tên đăng nhập"
56
+ description="Đây sẽ là tên hiển thị công khai của bạn."
57
+ placeholder="johndoe"
58
+ className="w-full"
59
+ />
60
+ </ExampleSection>
61
+
62
+ <ExampleSection
63
+ label="Lỗi xác thực (Validation Error)"
64
+ description="Hiển thị thông báo lỗi và viền đỏ báo hiệu khi truyền errorMessage."
65
+ codeString={`<InputPreset
66
+ size="${globalSize}"
67
+ label="Mật khẩu"
68
+ type="password"
69
+ placeholder="Nhập mật khẩu..."
70
+ errorMessage="Mật khẩu phải chứa ít nhất 8 ký tự."
71
+ className="w-full"
72
+ />
73
+ `}
74
+ >
75
+ <InputPreset
76
+ size={globalSize}
77
+ label="Mật khẩu"
78
+ type="password"
79
+ placeholder="Nhập mật khẩu..."
80
+ errorMessage="Mật khẩu phải chứa ít nhất 8 ký tự."
81
+ className="w-full"
82
+ />
83
+ </ExampleSection>
84
+ </ExampleGrid>
85
+
86
+ <ExampleGrid>
87
+ <ExampleSection
88
+ label="Với Tiền tố / Hậu tố (Adornments)"
89
+ description="Tự động bọc bằng InputGroup, có thể truyền chuỗi hoặc icon."
90
+ codeString={`<InputPreset
91
+ size="${globalSize}"
92
+ label="Website URL"
93
+ type="url"
94
+ placeholder="example"
95
+ startAdornment="https://"
96
+ endAdornment=".com"
97
+ className="w-full"
98
+ />
99
+ `}
100
+ >
101
+ <InputPreset
102
+ size={globalSize}
103
+ label="Website URL"
104
+ type="url"
105
+ placeholder="example"
106
+ startAdornment="https://"
107
+ endAdornment=".com"
108
+ className="w-full"
109
+ />
110
+ </ExampleSection>
111
+
112
+ <ExampleSection
113
+ label="Khóa / Bất hoạt (Disabled)"
114
+ description="Người dùng không thể tương tác với form."
115
+ codeString={`<InputPreset
116
+ size="${globalSize}"
117
+ label="Tên dự án"
118
+ description="Tên dự án không thể thay đổi sau khi khởi tạo."
119
+ defaultValue="my-awesome-project"
120
+ disabled
121
+ className="w-full"
122
+ />
123
+ `}
124
+ >
125
+ <InputPreset
126
+ size={globalSize}
127
+ label="Tên dự án"
128
+ description="Tên dự án không thể thay đổi sau khi khởi tạo."
129
+ defaultValue="my-awesome-project"
130
+ disabled
131
+ className="w-full"
132
+ />
133
+ </ExampleSection>
134
+ </ExampleGrid>
135
+
136
+ <ExampleSection
137
+ label="Thực tế sử dụng (Real-world Snippets)"
138
+ description="Tuỳ biến Label với ReactNode để tạo các nhãn phức tạp."
139
+ fullWidth
140
+ codeString={`<InputPreset
141
+ size="${globalSize}"
142
+ label={
143
+ <span className="flex items-center gap-2">
144
+ Mã API (API Key) <span className="rounded bg-destructive/20 px-1.5 py-0.5 text-[10px] font-semibold text-destructive uppercase">Bảo mật</span>
145
+ </span>
146
+ }
147
+ type="password"
148
+ description="Tuyệt đối không chia sẻ mã này với bất kỳ ai."
149
+ defaultValue="sk_test_1234567890abcdef"
150
+ className="w-full"
151
+ />
152
+
153
+ <InputPreset
154
+ size="${globalSize}"
155
+ label="Tìm kiếm nhanh"
156
+ placeholder="Gõ từ khoá..."
157
+ startAdornment={<SearchIcon className="size-4" />}
158
+ endAdornment={
159
+ <kbd className="pointer-events-none inline-flex h-5 select-none items-center gap-1 rounded border border-border bg-muted px-1.5 font-mono text-[10px] font-medium text-muted-foreground">
160
+ <span className="text-xs">⌘</span>K
161
+ </kbd>
162
+ }
163
+ className="w-full"
164
+ />`}
165
+ >
166
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
167
+ <InputPreset
168
+ size={globalSize}
169
+ label={
170
+ <span className="flex items-center gap-2">
171
+ Mã API (API Key){" "}
172
+ <span className="rounded bg-destructive/20 px-1.5 py-0.5 text-[10px] font-semibold text-destructive uppercase">
173
+ Bảo mật
174
+ </span>
175
+ </span>
176
+ }
177
+ type="password"
178
+ description="Tuyệt đối không chia sẻ mã này với bất kỳ ai."
179
+ defaultValue="sk_test_1234567890abcdef"
180
+ className="w-full"
181
+ />
182
+
183
+ <InputPreset
184
+ size={globalSize}
185
+ label="Tìm kiếm nhanh"
186
+ placeholder="Gõ từ khoá..."
187
+ startAdornment={<SearchIcon className="size-4" />}
188
+ endAdornment={
189
+ <kbd className="pointer-events-none inline-flex h-5 select-none items-center gap-1 rounded border border-border bg-muted px-1.5 font-mono text-[10px] font-medium text-muted-foreground">
190
+ <span className="text-xs">⌘</span>K
191
+ </kbd>
192
+ }
193
+ className="w-full"
194
+ />
195
+ </div>
196
+ </ExampleSection>
197
+ </div>
198
+ );
199
+ }
200
+
201
+ // ──────────────────────────────────────────────────────────
202
+ // SECTION 2: Micro Content
203
+ // ──────────────────────────────────────────────────────────
204
+ function InputMicroShowcase({ globalSize }: { globalSize: Size }) {
205
+ return (
206
+ <div className="space-y-10 mt-6">
207
+ <ExampleGrid>
208
+ <ExampleSection
209
+ label="Cơ bản (Primitive)"
210
+ description="Thẻ input đơn giản không có nhãn."
211
+ codeString={`<Input
212
+ size="${globalSize}"
213
+ placeholder="Nhập địa chỉ email..."
214
+ className="w-full"
215
+ />
216
+ `}
217
+ >
218
+ <Input
219
+ size={globalSize}
220
+ placeholder="Nhập địa chỉ email..."
221
+ className="w-full"
222
+ />
223
+ </ExampleSection>
224
+
225
+ <ExampleSection
226
+ label="Ghép nối với Field"
227
+ description="Lắp ráp thủ công các thành phần Field để tạo form control."
228
+ codeString={`<Field size="${globalSize}" className="w-full">
229
+ <FieldLabel htmlFor="tf-input">Email</FieldLabel>
230
+ <FieldDescription>
231
+ Chúng tôi sẽ không bao giờ chia sẻ email của bạn.
232
+ </FieldDescription>
233
+ <FieldContent>
234
+ <Input
235
+ id="tf-input"
236
+ size="${globalSize}"
237
+ placeholder="you@example.com"
238
+ />
239
+ </FieldContent>
240
+ </Field>
241
+ `}
242
+ >
243
+ <Field size={globalSize} className="w-full">
244
+ <FieldLabel htmlFor="tf-input">Email</FieldLabel>
245
+ <FieldDescription>
246
+ Chúng tôi sẽ không bao giờ chia sẻ email của bạn.
247
+ </FieldDescription>
248
+ <FieldContent>
249
+ <Input
250
+ id="tf-input"
251
+ size={globalSize}
252
+ placeholder="you@example.com"
253
+ />
254
+ </FieldContent>
255
+ </Field>
256
+ </ExampleSection>
257
+ </ExampleGrid>
258
+
259
+ <ExampleGrid>
260
+ <ExampleSection
261
+ label="Trạng thái Lỗi (Error)"
262
+ description="Sử dụng thuộc tính aria-invalid để báo lỗi."
263
+ codeString={`<Field size="${globalSize}" className="w-full">
264
+ <FieldLabel htmlFor="tf-error">Tên tài khoản</FieldLabel>
265
+ <FieldContent>
266
+ <Input
267
+ id="tf-error"
268
+ size="${globalSize}"
269
+ defaultValue="admin!@#"
270
+ aria-invalid="true"
271
+ />
272
+ </FieldContent>
273
+ <FieldError>
274
+ Tên tài khoản không được chứa ký tự đặc biệt.
275
+ </FieldError>
276
+ </Field>
277
+ `}
278
+ >
279
+ <Field size={globalSize} className="w-full">
280
+ <FieldLabel htmlFor="tf-error">Tên tài khoản</FieldLabel>
281
+ <FieldContent>
282
+ <Input
283
+ id="tf-error"
284
+ size={globalSize}
285
+ defaultValue="admin!@#"
286
+ aria-invalid="true"
287
+ />
288
+ </FieldContent>
289
+ <FieldError>
290
+ Tên tài khoản không được chứa ký tự đặc biệt.
291
+ </FieldError>
292
+ </Field>
293
+ </ExampleSection>
294
+
295
+ <ExampleSection
296
+ label="Input Group"
297
+ description="Ghép nối với các Addon linh hoạt (Slot tuỳ ý)."
298
+ codeString={`<Field size="${globalSize}" className="w-full">
299
+ <FieldLabel htmlFor="tf-group">Trang cá nhân</FieldLabel>
300
+ <FieldContent>
301
+ <InputGroup size="${globalSize}">
302
+ <InputGroupAddon>
303
+ <LinkIcon className="size-4 text-muted-foreground" />
304
+ </InputGroupAddon>
305
+ <InputGroupAddon>
306
+ <InputGroupText>github.com/</InputGroupText>
307
+ </InputGroupAddon>
308
+ <InputGroupInput id="tf-group" placeholder="username" />
309
+ </InputGroup>
310
+ </FieldContent>
311
+ </Field>
312
+ `}
313
+ >
314
+ <Field size={globalSize} className="w-full">
315
+ <FieldLabel htmlFor="tf-group">Trang cá nhân</FieldLabel>
316
+ <FieldContent>
317
+ <InputGroup size={globalSize}>
318
+ <InputGroupAddon>
319
+ <LinkIcon className="size-4 text-muted-foreground" />
320
+ </InputGroupAddon>
321
+ <InputGroupAddon>
322
+ <InputGroupText>github.com/</InputGroupText>
323
+ </InputGroupAddon>
324
+ <InputGroupInput id="tf-group" placeholder="username" />
325
+ </InputGroup>
326
+ </FieldContent>
327
+ </Field>
328
+ </ExampleSection>
329
+ </ExampleGrid>
330
+ <ExampleSection
331
+ label="Input Kiểu Tệp (File)"
332
+ description="Input có hỗ trợ style gốc cho type file."
333
+ codeString={`<Input size="${globalSize}" type="file" className="w-full pt-0.5" />
334
+ `}
335
+ >
336
+ <Input size={globalSize} type="file" className="w-full pt-0.5" />
337
+ </ExampleSection>
338
+
339
+ <ExampleSection
340
+ label="Khóa (Disabled)"
341
+ description="Trạng thái không thể tương tác."
342
+ codeString={`<Input
343
+ size="${globalSize}"
344
+ disabled
345
+ defaultValue="Chỉ đọc"
346
+ className="w-full"
347
+ />
348
+ `}
349
+ >
350
+ <Input
351
+ size={globalSize}
352
+ disabled
353
+ defaultValue="Chỉ đọc"
354
+ className="w-full"
355
+ />
356
+ </ExampleSection>
357
+ <ExampleSection
358
+ label="🧭 Use Case Comparison"
359
+ description="So sánh nhanh khi nào dùng Micro và Macro."
360
+ fullWidth
361
+ codeString={`<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
362
+ {/* Story 1: Macro wins */}
363
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
364
+ <div className="flex items-start gap-3">
365
+ <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
366
+ <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>
367
+ </span>
368
+ <div>
369
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">Story 1 · Dùng Macro</p>
370
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">Form nhập liệu tiêu chuẩn</h3>
371
+ </div>
372
+ </div>
373
+ <p className="text-xs text-muted-foreground leading-relaxed">
374
+ Khi bạn cần một trường nhập liệu đầy đủ nhãn (Label), mô tả (Description), báo lỗi (Error) mà không muốn phải lắp ráp thủ công bằng <DocsCode>Field</DocsCode>.
375
+ </p>
376
+ </div>
377
+
378
+ {/* Story 2: Micro wins */}
379
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
380
+ <div className="flex items-start gap-3">
381
+ <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
382
+ <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>
383
+ </span>
384
+ <div>
385
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">Story 2 · Dùng Micro</p>
386
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">Input nằm trong Navbar hoặc Toolbar</h3>
387
+ </div>
388
+ </div>
389
+ <p className="text-xs text-muted-foreground leading-relaxed">
390
+ Chỉ cần một thẻ <DocsCode>Input</DocsCode> đơn giản để tìm kiếm nhanh, không cần nhãn hay mô tả cầu kỳ, hoặc khi phải nhúng nó vào một component phức tạp khác.
391
+ </p>
392
+ </div>
393
+ </div>`}
394
+ >
395
+ <div className="grid grid-cols-1 gap-6 md:grid-cols-2">
396
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
397
+ <div className="flex items-start gap-3">
398
+ <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
399
+ <svg
400
+ xmlns="http://www.w3.org/2000/svg"
401
+ className="size-4"
402
+ viewBox="0 0 24 24"
403
+ fill="none"
404
+ stroke="currentColor"
405
+ strokeWidth="2"
406
+ strokeLinecap="round"
407
+ strokeLinejoin="round"
408
+ aria-hidden="true"
409
+ >
410
+ <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" />
411
+ </svg>
412
+ </span>
413
+ <div>
414
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
415
+ Story 1 · Dùng Macro
416
+ </p>
417
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
418
+ Form nhập liệu tiêu chuẩn
419
+ </h3>
420
+ </div>
421
+ </div>
422
+ <p className="text-xs text-muted-foreground leading-relaxed">
423
+ Khi bạn cần một trường nhập liệu đầy đủ nhãn (Label), mô tả
424
+ (Description), báo lỗi (Error) mà không muốn phải lắp ráp thủ công
425
+ bằng <DocsCode>Field</DocsCode>.
426
+ </p>
427
+ </div>
428
+
429
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
430
+ <div className="flex items-start gap-3">
431
+ <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
432
+ <svg
433
+ xmlns="http://www.w3.org/2000/svg"
434
+ className="size-4"
435
+ viewBox="0 0 24 24"
436
+ fill="none"
437
+ stroke="currentColor"
438
+ strokeWidth="2"
439
+ strokeLinecap="round"
440
+ strokeLinejoin="round"
441
+ aria-hidden="true"
442
+ >
443
+ <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" />
444
+ </svg>
445
+ </span>
446
+ <div>
447
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
448
+ Story 2 · Dùng Micro
449
+ </p>
450
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
451
+ Input nằm trong Navbar hoặc Toolbar
452
+ </h3>
453
+ </div>
454
+ </div>
455
+ <p className="text-xs text-muted-foreground leading-relaxed">
456
+ Chỉ cần một thẻ <DocsCode>Input</DocsCode> đơn giản để tìm kiếm
457
+ nhanh, không cần nhãn hay mô tả cầu kỳ, hoặc khi phải nhúng nó vào
458
+ một component phức tạp khác.
459
+ </p>
460
+ </div>
461
+ </div>
462
+ </ExampleSection>
463
+ </div>
464
+ );
465
+ }
466
+
467
+ // ──────────────────────────────────────────────────────────
468
+ export default function InputShowcase() {
469
+ const { size: globalSize } = useDevContext();
470
+ return (
471
+ <Showcase
472
+ title="Input"
473
+ description="Trường nhập văn bản cho phép người dùng điền dữ liệu."
474
+ generalConcept={
475
+ <ShowcaseDocs>
476
+ <DocsH3>Khi nào nên dùng Macro</DocsH3>
477
+ <DocsP>
478
+ Bản Macro (<DocsCode>InputPreset</DocsCode>) đóng gói sẵn toàn bộ
479
+ các thành phần thường thấy của một Form Control: Nhãn (Label), Mô tả
480
+ (Description), Lỗi (Error Message) và phần trang trí (Adornments).
481
+ Việc này giúp giảm thiểu lượng code lặp đi lặp lại khi xây dựng
482
+ form.
483
+ </DocsP>
484
+
485
+ <DocsH3>Tự động hoá Layout (Macro)</DocsH3>
486
+ <DocsUl>
487
+ <DocsLi>
488
+ Tự động bọc Input vào trong <DocsCode>InputGroup</DocsCode> nếu
489
+ bạn truyền <DocsCode>startAdornment</DocsCode> hoặc{" "}
490
+ <DocsCode>endAdornment</DocsCode>.
491
+ </DocsLi>
492
+ <DocsLi>
493
+ Tự động hiện Icon con mắt (Toggle ẩn/hiện) nếu{" "}
494
+ <DocsCode>type="password"</DocsCode>.
495
+ </DocsLi>
496
+ <DocsLi>
497
+ Tự động thêm class <DocsCode>aria-invalid</DocsCode> vào input nếu
498
+ bạn truyền <DocsCode>errorMessage</DocsCode>.
499
+ </DocsLi>
500
+ </DocsUl>
501
+
502
+ <DocsH3>Khi nào nên dùng Micro</DocsH3>
503
+ <DocsP>
504
+ Thành phần <DocsCode>Input</DocsCode> nguyên thuỷ chỉ là một thẻ{" "}
505
+ <DocsCode>input</DocsCode> duy nhất. Để có được một Form Control
506
+ đúng chuẩn WCAG, bạn cần phải tự bọc nó bằng{" "}
507
+ <DocsCode>Field</DocsCode>, kết nối <DocsCode>FieldLabel</DocsCode>{" "}
508
+ và <DocsCode>FieldDescription</DocsCode>.
509
+ </DocsP>
510
+ <DocsP>
511
+ Dùng Micro khi bạn cần layout form dị biệt (ví dụ: label nằm ngang
512
+ bên trái input) hoặc khi cần nhúng Input vào một component phức tạp
513
+ (như dropdown tìm kiếm).
514
+ </DocsP>
515
+ </ShowcaseDocs>
516
+ }
517
+
518
+ tabs={[
519
+ {
520
+ label: "Micro (Primitive)",
521
+ content: <InputMicroShowcase globalSize={globalSize} />,
522
+ },
523
+ {
524
+ label: "Macro (Preset)",
525
+ content: <InputMacroShowcase globalSize={globalSize} />,
526
+ },
527
+ ]}
528
+ />
529
+ );
530
+ }