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,506 @@
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
+ import { useState } from "react";
13
+
14
+ import { SliderPreset } from "../../components/macro/slider-preset";
15
+ import {
16
+ Field,
17
+ FieldContent,
18
+ FieldDescription,
19
+ FieldError,
20
+ FieldLabel,
21
+ } from "../../components/micro/field";
22
+ import {
23
+ Slider as CompositionalSlider,
24
+ SliderControl,
25
+ SliderIndicator,
26
+ SliderThumb,
27
+ SliderTrack,
28
+ } from "../../components/micro/slider";
29
+
30
+ // ──────────────────────────────────────────────────────────
31
+ // SECTION 1: Macro Content
32
+ // ──────────────────────────────────────────────────────────
33
+ function SliderMacroShowcase({ globalSize }: { globalSize: Size }) {
34
+ const [val, setVal] = useState([50]);
35
+ const [rangeVal, setRangeVal] = useState([20, 80]);
36
+
37
+ return (
38
+ <div className="space-y-10 mt-6">
39
+ <ExampleGrid>
40
+ <ExampleSection
41
+ label="Tiêu chuẩn"
42
+ description="Thanh trượt cơ bản có nhãn và mô tả."
43
+ codeString={`<SliderPreset className="w-full"
44
+ label="Âm lượng"
45
+ description="Điều chỉnh âm lượng hệ thống."
46
+ defaultValue={[50]}
47
+ max={100}
48
+ step={1}
49
+ />
50
+ `}
51
+ >
52
+ <SliderPreset
53
+ className="w-full"
54
+ size={globalSize}
55
+ label="Âm lượng"
56
+ description="Điều chỉnh âm lượng hệ thống."
57
+ defaultValue={[50]}
58
+ max={100}
59
+ step={1}
60
+ />
61
+ </ExampleSection>
62
+
63
+ <ExampleSection
64
+ label="Trạng thái Lỗi (Error)"
65
+ description="Báo lỗi khi giá trị không hợp lệ."
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
+ `}
76
+ >
77
+ <div className="w-full flex flex-col gap-6">
78
+ <SliderPreset
79
+ size={globalSize}
80
+ label="Mức âm lượng (Lỗi)"
81
+ defaultValue={[110]}
82
+ max={100}
83
+ step={1}
84
+ errorMessage="Mức âm lượng không được vượt quá 100."
85
+ />
86
+ </div>
87
+ </ExampleSection>
88
+ </ExampleGrid>
89
+
90
+ <ExampleGrid>
91
+ <ExampleSection
92
+ label="Thanh trượt Khoảng (Range Slider)"
93
+ 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 (
97
+ <SliderPreset
98
+ label="Khoảng giá"
99
+ value={rangeVal}
100
+ onValueChange={setRangeVal}
101
+ max={100}
102
+ step={5}
103
+ description={\`Từ $\${rangeVal[0]} đến $\${rangeVal[1]}\`}
104
+ />
105
+ );`}
106
+ >
107
+ <SliderPreset
108
+ className="w-full"
109
+ size={globalSize}
110
+ label="Khoảng giá"
111
+ description={`Hiển thị sản phẩm từ $${rangeVal[0]} đến $${rangeVal[1]}`}
112
+ value={rangeVal}
113
+ onValueChange={(v) => setRangeVal(v as number[])}
114
+ max={100}
115
+ step={5}
116
+ />
117
+ </ExampleSection>
118
+
119
+ <ExampleSection
120
+ label="Khóa / Bất hoạt (Disabled)"
121
+ description="Người dùng không thể tương tác với thanh trượt."
122
+ codeString={`<SliderPreset className="w-full"
123
+ label="Độ sáng màn hình"
124
+ description="Độ sáng đang được hệ thống điều khiển tự động (Auto-brightness)."
125
+ defaultValue={[75]}
126
+ max={100}
127
+ disabled
128
+ />
129
+ `}
130
+ >
131
+ <SliderPreset
132
+ className="w-full"
133
+ size={globalSize}
134
+ label="Độ sáng màn hình"
135
+ description="Độ sáng đang được hệ thống điều khiển tự động (Auto-brightness)."
136
+ defaultValue={[75]}
137
+ max={100}
138
+ disabled
139
+ />
140
+ </ExampleSection>
141
+ </ExampleGrid>
142
+
143
+ <ExampleGrid>
144
+ <ExampleSection
145
+ label="Controlled Mode"
146
+ description="Sử dụng biến state của React để điều khiển."
147
+ codeString={`const [val, setVal] = useState([50]);
148
+
149
+ return (
150
+ <SliderPreset
151
+ value={val}
152
+ onValueChange={setVal}
153
+ label="Giá trị có kiểm soát"
154
+ description={\`Giá trị hiện tại là: \${val[0]}\`}
155
+ />
156
+ );`}
157
+ >
158
+ <div className="w-full max-w-sm flex flex-col gap-4">
159
+ <SliderPreset
160
+ size={globalSize}
161
+ value={val}
162
+ onValueChange={(v) => setVal(v as number[])}
163
+ label="Giá trị có kiểm soát"
164
+ description={`Giá trị hiện tại là: ${val[0]}`}
165
+ />
166
+ </div>
167
+ </ExampleSection>
168
+ </ExampleGrid>
169
+ </div>
170
+ );
171
+ }
172
+
173
+ // ──────────────────────────────────────────────────────────
174
+ // SECTION 2: Micro Content
175
+ // ──────────────────────────────────────────────────────────
176
+ function SliderMicroShowcase({ globalSize }: { globalSize: Size }) {
177
+ return (
178
+ <div className="space-y-10 mt-6">
179
+ <ExampleGrid>
180
+ <ExampleSection
181
+ label="Cơ bản (Primitive)"
182
+ description="Slider đơn giản không có Field hay Label bọc ngoài."
183
+ 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
+ `}
197
+ >
198
+ <CompositionalSlider
199
+ size={globalSize}
200
+ defaultValue={[40]}
201
+ max={100}
202
+ step={1}
203
+ className="w-full"
204
+ >
205
+ <SliderControl>
206
+ <SliderTrack>
207
+ <SliderIndicator />
208
+ </SliderTrack>
209
+ <SliderThumb />
210
+ </SliderControl>
211
+ </CompositionalSlider>
212
+ </ExampleSection>
213
+
214
+ <ExampleSection
215
+ label="Nhiều Thumb (Multi-thumb)"
216
+ description="Chỉ cần render nhiều SliderThumb, hệ thống sẽ tự chia."
217
+ 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
+ `}
233
+ >
234
+ <CompositionalSlider
235
+ size={globalSize}
236
+ defaultValue={[20, 50, 80]}
237
+ max={100}
238
+ step={1}
239
+ className="w-full"
240
+ >
241
+ <SliderControl>
242
+ <SliderTrack>
243
+ <SliderIndicator />
244
+ </SliderTrack>
245
+ <SliderThumb />
246
+ <SliderThumb />
247
+ <SliderThumb />
248
+ </SliderControl>
249
+ </CompositionalSlider>
250
+ </ExampleSection>
251
+ </ExampleGrid>
252
+
253
+ <ExampleGrid>
254
+ <ExampleSection
255
+ label="Ghép nối Field thủ công"
256
+ description="Lắp ráp với Field để có nhãn và mô tả."
257
+ 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
+ `}
278
+ >
279
+ <Field size={globalSize} className="w-full">
280
+ <FieldLabel>Mật độ hiển thị</FieldLabel>
281
+ <FieldContent>
282
+ <CompositionalSlider
283
+ size={globalSize}
284
+ defaultValue={[50]}
285
+ max={100}
286
+ step={1}
287
+ >
288
+ <SliderControl>
289
+ <SliderTrack>
290
+ <SliderIndicator />
291
+ </SliderTrack>
292
+ <SliderThumb />
293
+ </SliderControl>
294
+ </CompositionalSlider>
295
+ </FieldContent>
296
+ <FieldDescription>
297
+ Điều chỉnh khoảng cách giữa các phần tử.
298
+ </FieldDescription>
299
+ </Field>
300
+ </ExampleSection>
301
+
302
+ <ExampleSection
303
+ label="Trạng thái Lỗi thủ công"
304
+ description="Tự gắn aria-invalid vào Slider và dùng FieldError."
305
+ 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
+ `}
325
+ >
326
+ <Field size={globalSize} className="w-full gap-2" data-invalid={true}>
327
+ <FieldLabel>Ngân sách tối đa</FieldLabel>
328
+ <FieldContent>
329
+ <CompositionalSlider
330
+ size={globalSize}
331
+ defaultValue={[120]}
332
+ max={100}
333
+ step={1}
334
+ aria-invalid={true}
335
+ >
336
+ <SliderControl>
337
+ <SliderTrack>
338
+ <SliderIndicator />
339
+ </SliderTrack>
340
+ <SliderThumb />
341
+ </SliderControl>
342
+ </CompositionalSlider>
343
+ </FieldContent>
344
+ <FieldError>Ngân sách của bạn chỉ còn $100.</FieldError>
345
+ </Field>
346
+ </ExampleSection>
347
+ </ExampleGrid>
348
+
349
+ <ExampleSection
350
+ label="🧭 Use Case Comparison"
351
+ description="So sánh nhanh khi nào dùng Micro và Macro."
352
+ fullWidth
353
+ 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>
363
+ </div>
364
+ </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
+
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>
379
+ </div>
380
+ </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
+ `}
387
+ >
388
+ <div className="grid grid-cols-1 gap-6 md:grid-cols-2">
389
+ {/* Story 1: Macro wins */}
390
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
391
+ <div className="flex items-start gap-3">
392
+ <span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
393
+ <svg
394
+ xmlns="http://www.w3.org/2000/svg"
395
+ className="size-4"
396
+ viewBox="0 0 24 24"
397
+ fill="none"
398
+ stroke="currentColor"
399
+ strokeWidth="2"
400
+ strokeLinecap="round"
401
+ strokeLinejoin="round"
402
+ aria-hidden="true"
403
+ >
404
+ <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" />
405
+ </svg>
406
+ </span>
407
+ <div>
408
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
409
+ Story 1 · Dùng Macro
410
+ </p>
411
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
412
+ Bộ lọc sản phẩm
413
+ </h3>
414
+ </div>
415
+ </div>
416
+ <p className="text-xs text-muted-foreground leading-relaxed">
417
+ Bạn cần làm bộ lọc "Khoảng giá" ở cột Sidebar cho trang Ecommerce.{" "}
418
+ <DocsCode>SliderPreset</DocsCode> sẽ giúp bạn tiết kiệm hàng tá
419
+ dòng code bọc Field loằng ngoằng.
420
+ </p>
421
+ </div>
422
+
423
+ {/* Story 2: Micro wins */}
424
+ <div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
425
+ <div className="flex items-start gap-3">
426
+ <span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
427
+ <svg
428
+ xmlns="http://www.w3.org/2000/svg"
429
+ className="size-4"
430
+ viewBox="0 0 24 24"
431
+ fill="none"
432
+ stroke="currentColor"
433
+ strokeWidth="2"
434
+ strokeLinecap="round"
435
+ strokeLinejoin="round"
436
+ aria-hidden="true"
437
+ >
438
+ <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" />
439
+ </svg>
440
+ </span>
441
+ <div>
442
+ <p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
443
+ Story 2 · Dùng Micro
444
+ </p>
445
+ <h3 className="mt-0.5 text-sm font-semibold text-foreground">
446
+ Thanh thời lượng Video (Video Player)
447
+ </h3>
448
+ </div>
449
+ </div>
450
+ <p className="text-xs text-muted-foreground leading-relaxed">
451
+ Bạn đang làm một trình phát Video giống Youtube. Thanh Timeline
452
+ chạy dưới đáy không hề có Label hay Description. Ở đây bạn BẮT
453
+ BUỘC dùng Micro để dựng độc lập.
454
+ </p>
455
+ </div>
456
+ </div>
457
+ </ExampleSection>
458
+ </div>
459
+ );
460
+ }
461
+
462
+ // ──────────────────────────────────────────────────────────
463
+ // SECTION 3: Entry point
464
+ // ──────────────────────────────────────────────────────────
465
+ export default function SliderShowcase() {
466
+ const { size: globalSize } = useDevContext();
467
+ return (
468
+ <Showcase
469
+ title="Slider"
470
+ description="Thành phần điều khiển cho phép người dùng chọn một hoặc nhiều giá trị trong một phạm vi (range) nhất định."
471
+ generalConcept={
472
+ <div className="space-y-4">
473
+ <ShowcaseDocs>
474
+ <DocsH3>Khi nào nên dùng Macro</DocsH3>
475
+ <DocsP>
476
+ <DocsCode>SliderPreset</DocsCode> đóng gói sẵn Slider + Label +
477
+ Description + Error Message. Nó tự động xử lý ID linking cho khả
478
+ năng truy cập (Accessibility). Dùng Macro cho 95% trường hợp làm
479
+ form lấy giá trị số hoặc bộ lọc (filter).
480
+ </DocsP>
481
+ </ShowcaseDocs>
482
+ <ShowcaseDocs>
483
+ <DocsH3>Khi nào nên dùng Micro</DocsH3>
484
+ <DocsP>
485
+ Dùng <DocsCode>CompositionalSlider</DocsCode> và các thành phần
486
+ con (<DocsCode>SliderControl</DocsCode>,{" "}
487
+ <DocsCode>SliderTrack</DocsCode>, <DocsCode>SliderThumb</DocsCode>
488
+ ) khi bạn cần tuỳ biến giao diện cực hạn (ví dụ: track đổi màu
489
+ theo giá trị, thumb có hình dáng đặc biệt) hoặc không cần label.
490
+ </DocsP>
491
+ </ShowcaseDocs>
492
+ </div>
493
+ }
494
+ tabs={[
495
+ {
496
+ label: "Micro (Primitive)",
497
+ content: <SliderMicroShowcase globalSize={globalSize} />,
498
+ },
499
+ {
500
+ label: "Macro (Preset)",
501
+ content: <SliderMacroShowcase globalSize={globalSize} />,
502
+ },
503
+ ]}
504
+ />
505
+ );
506
+ }