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,51 @@
1
+ import { useState } from "react";
2
+
3
+ import { Button } from "../../components/micro/button";
4
+ import {
5
+ Tabs,
6
+ TabsContent,
7
+ TabsList,
8
+ TabsTrigger,
9
+ } from "../../components/micro/tabs";
10
+ import { SectionHeader, ShowcaseBlock } from "../../dev/components/showcase";
11
+
12
+ export default function InteractiveSection() {
13
+ const [tab, setTab] = useState("preview");
14
+ return (
15
+ <div className="space-y-5">
16
+ <SectionHeader title="Interactive" description="Tabs, Tooltips, Switch" />
17
+
18
+ <ShowcaseBlock title="Tabs">
19
+ <Tabs value={tab} onValueChange={setTab}>
20
+ <TabsList>
21
+ <TabsTrigger value="preview">Preview</TabsTrigger>
22
+ <TabsTrigger value="code">Code</TabsTrigger>
23
+ <TabsTrigger value="props">Props</TabsTrigger>
24
+ </TabsList>
25
+ <TabsContent value="preview" className="pt-4">
26
+ <Button color="success">Save changes</Button>
27
+ </TabsContent>
28
+ <TabsContent value="code" className="pt-4">
29
+ <pre className="text-xs bg-muted rounded-md p-3 overflow-x-auto">
30
+ {`<Button color="success">Save changes</Button>`}
31
+ </pre>
32
+ </TabsContent>
33
+ <TabsContent value="props" className="pt-4">
34
+ <div className="text-xs text-muted-foreground space-y-1">
35
+ <div>
36
+ <code>variant</code> — solid | outline | soft | ghost | link
37
+ </div>
38
+ <div>
39
+ <code>color</code> — primary | secondary | destructive | warning
40
+ | success | info | tertiary
41
+ </div>
42
+ <div>
43
+ <code>size</code> — sm | md | lg
44
+ </div>
45
+ </div>
46
+ </TabsContent>
47
+ </Tabs>
48
+ </ShowcaseBlock>
49
+ </div>
50
+ );
51
+ }
@@ -0,0 +1,396 @@
1
+ import {
2
+ BoxIcon,
3
+ CheckIcon,
4
+ ComponentIcon,
5
+ CopyIcon,
6
+ LayersIcon,
7
+ PaintbrushIcon,
8
+ PaletteIcon,
9
+ ZapIcon,
10
+ } from "lucide-react";
11
+ import { useState } from "react";
12
+ import { toast } from "sonner";
13
+
14
+ import {
15
+ Accordion,
16
+ AccordionContent,
17
+ AccordionItem,
18
+ AccordionTrigger,
19
+ } from "../../components/micro/accordion";
20
+ import { Badge } from "../../components/micro/badge";
21
+ import { Button } from "../../components/micro/button";
22
+ import {
23
+ Card,
24
+ CardContent,
25
+ CardHeader,
26
+ CardTitle,
27
+ } from "../../components/micro/card";
28
+ import { Label } from "../../components/micro/label";
29
+ import { Progress } from "../../components/micro/progress";
30
+ import {
31
+ Select,
32
+ SelectContent,
33
+ SelectItem,
34
+ SelectTrigger,
35
+ SelectValue,
36
+ } from "../../components/micro/select";
37
+ import { Switch } from "../../components/micro/switch";
38
+ import { ColorSwatch } from "../../dev/components/showcase";
39
+ import { COLORS, STATS } from "../../dev/data";
40
+
41
+ export default function OverviewSection() {
42
+ const [copied, setCopied] = useState(false);
43
+
44
+ const handleCopy = () => {
45
+ navigator.clipboard.writeText("npm i gladvn");
46
+ setCopied(true);
47
+ toast.success("Command copied to clipboard");
48
+ setTimeout(() => setCopied(false), 2000);
49
+ };
50
+
51
+ return (
52
+ <div className="space-y-6 overflow-hidden">
53
+ {/* Bento Grid */}
54
+ <div className="grid grid-cols-1 md:grid-cols-3 gap-4 md:gap-6">
55
+ {/* 🌟 Hero Banner - Span 2 cols */}
56
+ <div
57
+ className="md:col-span-2 row-span-2 relative overflow-hidden rounded-2xl border border-border bg-card/40 p-6 md:p-8 shadow-sm transition-all hover:shadow-md hover:bg-card/60 group opacity-0 animate-fade-up"
58
+ style={{ animationDelay: "0ms" }}
59
+ >
60
+ <div className="absolute inset-0 bg-gradient-to-br from-primary/10 via-transparent to-transparent opacity-50 group-hover:opacity-70 transition-opacity duration-500" />
61
+ <div
62
+ className="absolute inset-0 opacity-[0.03] group-hover:opacity-[0.05] transition-opacity duration-500"
63
+ style={{
64
+ backgroundImage:
65
+ "radial-gradient(circle at center, var(--foreground) 1px, transparent 1px)",
66
+ backgroundSize: "24px 24px",
67
+ }}
68
+ />
69
+ <div className="relative z-10 flex flex-col h-full">
70
+ <div>
71
+ <Badge color="secondary" className="mb-3 px-2.5 py-0.5 shadow-sm">
72
+ ✨ gladcn UI v0.2.1
73
+ </Badge>
74
+ <h2 className="text-3xl font-bold tracking-tight mb-2">
75
+ Crafted for Perfection
76
+ </h2>
77
+ <p className="text-muted-foreground max-w-[400px]">
78
+ A premium collection of components designed for modern,
79
+ highly-interactive web applications. Focus on building your
80
+ product, we handle the pixels.
81
+ </p>
82
+ </div>
83
+
84
+ {/* Component Collage */}
85
+ <div className="relative h-[240px] mt-8 w-full">
86
+ {/* Floating elements */}
87
+ <div className="absolute top-0 right-4 lg:right-12 hover:-translate-y-1 transition-transform duration-300 animate-float-slow">
88
+ <Card className="w-[220px] shadow-xl bg-background/80 backdrop-blur-md border-primary/20">
89
+ <CardHeader className="p-4 pb-2">
90
+ <CardTitle className="text-sm font-medium flex items-center gap-2">
91
+ <div className="size-2 rounded-full bg-success animate-pulse" />
92
+ Systems Online
93
+ </CardTitle>
94
+ </CardHeader>
95
+ <CardContent className="p-4 pt-0">
96
+ <Progress value={85} className="h-1.5" />
97
+ <p className="text-[10px] text-muted-foreground mt-2">
98
+ All services are operating normally.
99
+ </p>
100
+ </CardContent>
101
+ </Card>
102
+ </div>
103
+
104
+ <div className="absolute bottom-4 left-0 hover:-translate-y-1 transition-transform duration-300 animate-float-fast">
105
+ <div className="flex flex-col gap-3 p-4 rounded-xl border border-border bg-card/50 backdrop-blur-md shadow-lg w-[260px]">
106
+ <div className="flex items-center justify-between">
107
+ <Label className="text-sm font-medium">Dark Mode</Label>
108
+ <Switch defaultChecked />
109
+ </div>
110
+ <Select defaultValue="system">
111
+ <SelectTrigger size="sm">
112
+ <SelectValue placeholder="Theme" />
113
+ </SelectTrigger>
114
+ <SelectContent>
115
+ <SelectItem value="light">Light</SelectItem>
116
+ <SelectItem value="dark">Dark</SelectItem>
117
+ <SelectItem value="system">System</SelectItem>
118
+ </SelectContent>
119
+ </Select>
120
+ </div>
121
+ </div>
122
+
123
+ <div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 hover:scale-105 transition-transform duration-300 animate-float">
124
+ <Button size="lg" className="shadow-xl shadow-primary/20">
125
+ <ZapIcon className="size-4 mr-2" />
126
+ Get Started
127
+ </Button>
128
+ </div>
129
+ </div>
130
+ </div>
131
+ </div>
132
+
133
+ {/* 📦 Quick Example - Span 1 col */}
134
+ <div
135
+ className="md:col-span-1 rounded-2xl border border-border bg-card/40 p-6 shadow-sm transition-all hover:shadow-md hover:-translate-y-1 group flex flex-col justify-between opacity-0 animate-fade-up"
136
+ style={{ animationDelay: "100ms" }}
137
+ >
138
+ <div>
139
+ <div className="flex items-center gap-3 mb-4">
140
+ <div className="flex size-10 items-center justify-center rounded-xl bg-primary/10 text-primary transition-transform group-hover:scale-110 group-hover:rotate-3">
141
+ <BoxIcon className="size-5" />
142
+ </div>
143
+ <h3 className="font-semibold">Quick Install</h3>
144
+ </div>
145
+ <p className="text-sm text-muted-foreground mb-4">
146
+ Available on npm. Add gladcn to your project in seconds.
147
+ </p>
148
+ <div className="rounded-lg bg-muted/50 px-3 py-2.5 font-mono text-xs border border-border flex items-center justify-between">
149
+ <span className="truncate">npm i gladvn</span>
150
+ </div>
151
+ </div>
152
+ <Button
153
+ className="w-full mt-6"
154
+ color={copied ? "success" : "secondary"}
155
+ variant="soft"
156
+ onClick={handleCopy}
157
+ >
158
+ {copied ? (
159
+ <>
160
+ <CheckIcon className="size-4 mr-2" />
161
+ Copied!
162
+ </>
163
+ ) : (
164
+ <>
165
+ <CopyIcon className="size-4 mr-2" />
166
+ Copy Command
167
+ </>
168
+ )}
169
+ </Button>
170
+ </div>
171
+
172
+ {/* 📊 Stats Grid - Span 1 col, 2x2 grid inside */}
173
+ <div
174
+ className="md:col-span-1 grid grid-cols-2 gap-4 opacity-0 animate-fade-up"
175
+ style={{ animationDelay: "200ms" }}
176
+ >
177
+ {STATS.map((s, i) => {
178
+ const icons = [
179
+ <ComponentIcon />,
180
+ <LayersIcon />,
181
+ <PaintbrushIcon />,
182
+ <ZapIcon />,
183
+ ];
184
+ return (
185
+ <div
186
+ key={s.label}
187
+ className="rounded-2xl border border-border bg-card/40 p-4 flex flex-col items-center justify-center text-center shadow-sm transition-all hover:shadow-md hover:bg-muted/50 group"
188
+ >
189
+ <div className="text-muted-foreground/50 mb-2 group-hover:text-primary/50 transition-colors [&>svg]:size-5">
190
+ {icons[i % icons.length]}
191
+ </div>
192
+ <div className="text-3xl font-bold tracking-tighter group-hover:text-primary transition-colors">
193
+ {s.value}
194
+ </div>
195
+ <div className="mt-1 text-[10px] uppercase font-medium tracking-wider text-muted-foreground">
196
+ {s.label}
197
+ </div>
198
+ </div>
199
+ );
200
+ })}
201
+ </div>
202
+
203
+ {/* 🎨 Color Tokens - Span 3 cols */}
204
+ <div
205
+ className="md:col-span-3 rounded-2xl border border-border bg-card/40 p-6 shadow-sm transition-all hover:shadow-md group opacity-0 animate-fade-up"
206
+ style={{ animationDelay: "300ms" }}
207
+ >
208
+ <div className="flex items-center justify-between mb-6 border-b border-border/50 pb-4">
209
+ <div>
210
+ <h3 className="font-semibold text-lg flex items-center gap-2">
211
+ <PaletteIcon className="size-5 text-primary" />
212
+ Color Tokens
213
+ </h3>
214
+ <p className="text-sm text-muted-foreground mt-1">
215
+ Beautifully crafted semantic colors that adapt to any theme.
216
+ </p>
217
+ </div>
218
+ </div>
219
+ <div className="flex flex-wrap gap-4">
220
+ {COLORS.map((c) => (
221
+ <div
222
+ key={c}
223
+ className="transition-transform duration-200 hover:-translate-y-1 hover:scale-105"
224
+ >
225
+ <ColorSwatch color={c} />
226
+ </div>
227
+ ))}
228
+ </div>
229
+ </div>
230
+
231
+ {/* 📚 Architecture Cheatsheet - Span 3 cols */}
232
+ <div
233
+ className="md:col-span-3 rounded-2xl border border-border bg-card/40 p-6 shadow-sm transition-all hover:shadow-md group opacity-0 animate-fade-up"
234
+ style={{ animationDelay: "400ms" }}
235
+ >
236
+ <div className="flex items-center justify-between mb-6 border-b border-border/50 pb-4">
237
+ <div>
238
+ <h3 className="font-semibold text-lg flex items-center gap-2">
239
+ <LayersIcon className="size-5 text-primary" />
240
+ Design Tokens Cheat Sheet
241
+ </h3>
242
+ <p className="text-sm text-muted-foreground mt-1">
243
+ The core architectural principles behind the CSS variables
244
+ system.
245
+ </p>
246
+ </div>
247
+ </div>
248
+
249
+ <Accordion className="w-full">
250
+ <AccordionItem value="item-1">
251
+ <AccordionTrigger>
252
+ 1. Không gian màu OKLCH là gì?
253
+ </AccordionTrigger>
254
+ <AccordionContent className="text-muted-foreground space-y-2">
255
+ <p>
256
+ Hệ thống dùng <strong>oklch(L C H)</strong> thay vì RGB/HEX vì
257
+ nó bắt chước cách mắt người cảm nhận ánh sáng:
258
+ </p>
259
+ <ul className="list-disc pl-5 space-y-1">
260
+ <li>
261
+ <strong>L (Lightness):</strong> 0 (Đen) đến 1 (Trắng). Ví
262
+ dụ: oklch(0.98 ...) là xám/trắng nhạt.
263
+ </li>
264
+ <li>
265
+ <strong>C (Chroma):</strong> Độ rực rỡ. Nếu C = 0, đó là
266
+ Trắng/Đen/Xám.
267
+ </li>
268
+ <li>
269
+ <strong>H (Hue):</strong> Vòng tròn màu sắc (0 = Đỏ, 90 =
270
+ Vàng, 150 = Xanh lá, 260 = Xanh dương).
271
+ </li>
272
+ </ul>
273
+ <p>
274
+ <em>
275
+ Mẹo: Paste mã màu vào{" "}
276
+ <a
277
+ href="https://oklch.com"
278
+ target="_blank"
279
+ rel="noreferrer"
280
+ className="text-primary hover:underline"
281
+ >
282
+ oklch.com
283
+ </a>{" "}
284
+ để tinh chỉnh trực quan.
285
+ </em>
286
+ </p>
287
+ </AccordionContent>
288
+ </AccordionItem>
289
+
290
+ <AccordionItem value="item-2">
291
+ <AccordionTrigger>
292
+ 2. Bí ẩn của lớp .light (Tráng Gương)
293
+ </AccordionTrigger>
294
+ <AccordionContent className="text-muted-foreground space-y-2">
295
+ <p>
296
+ Tại sao <code>.light</code> lại giống hệt <code>:root</code>?
297
+ </p>
298
+ <p>
299
+ Kỹ thuật này gọi là <strong>Nested Themes</strong>. Nếu bạn có
300
+ một trang Dashboard tối màu (Dark mode), nhưng bạn muốn hiển
301
+ thị một tờ Hóa Đơn nền trắng ở giữa màn hình, bạn chỉ cần bọc
302
+ thẻ div đó bằng <code>class="light"</code>. Nhờ block .light
303
+ khai báo sẵn, khu vực đó sẽ render chuẩn màu sáng mà không bị
304
+ ảnh hưởng bởi bóng tối xung quanh!
305
+ </p>
306
+ </AccordionContent>
307
+ </AccordionItem>
308
+
309
+ <AccordionItem value="item-3">
310
+ <AccordionTrigger>3. Quản lý Độ Tương Phản (CR)</AccordionTrigger>
311
+ <AccordionContent className="text-muted-foreground space-y-2">
312
+ <p>
313
+ Mỗi màu nền (background) luôn đi kèm với một màu chữ
314
+ (foreground) để đảm bảo tiêu chuẩn WCAG (CR≥4.5:1).
315
+ </p>
316
+ <p>
317
+ Ví dụ: Khi sang Dark Mode, <code>--primary</code> được đẩy
318
+ sáng lên (L=0.72) để nổi trên nền đen. Lúc này{" "}
319
+ <code>--primary-foreground</code> bắt buộc phải đổi thành Đen
320
+ (L=0.145) để chữ không bị chìm vào nền.
321
+ </p>
322
+ </AccordionContent>
323
+ </AccordionItem>
324
+
325
+ <AccordionItem value="item-4">
326
+ <AccordionTrigger>
327
+ 4. Viền "Xuyên Thấu" ở Dark Mode
328
+ </AccordionTrigger>
329
+ <AccordionContent className="text-muted-foreground space-y-2">
330
+ <p>
331
+ Thay vì dùng màu xám đục cứng nhắc, Dark Mode dùng{" "}
332
+ <code>oklch(1 0 0 / 10%)</code> (Trắng với 10% opacity) cho
333
+ đường viền.
334
+ </p>
335
+ <p>
336
+ Cách này giúp viền tự động "hòa tan" (blend) với mọi mức độ
337
+ đen bên dưới nó (Card đen nhạt, Sidebar đen đậm), tạo ra viền
338
+ hoàn hảo mà không cần khai báo nhiều biến khác nhau.
339
+ </p>
340
+ </AccordionContent>
341
+ </AccordionItem>
342
+
343
+ <AccordionItem value="item-5">
344
+ <AccordionTrigger>
345
+ 5. Những cái tên "gây lú" (--input, --ring)
346
+ </AccordionTrigger>
347
+ <AccordionContent className="text-muted-foreground space-y-2">
348
+ <ul className="list-disc pl-5 space-y-1">
349
+ <li>
350
+ <strong>--border:</strong> Màu viền chung (Card, Dialog).
351
+ Map với <code>border-border</code>.
352
+ </li>
353
+ <li>
354
+ <strong>--input:</strong> CHỈ LÀ MÀU VIỀN của thẻ input. Nền
355
+ input thường dùng bg-transparent. Map với{" "}
356
+ <code>border-input</code>.
357
+ </li>
358
+ <li>
359
+ <strong>--ring:</strong> Màu của viền highlight phát sáng
360
+ khi focus. Map với <code>ring-ring</code>.
361
+ </li>
362
+ </ul>
363
+ </AccordionContent>
364
+ </AccordionItem>
365
+
366
+ <AccordionItem value="item-6">
367
+ <AccordionTrigger>6. Tách biệt Variant và Color</AccordionTrigger>
368
+ <AccordionContent className="text-muted-foreground space-y-2">
369
+ <p>
370
+ Điểm sáng giá nhất của hệ thống này so với Shadcn gốc là việc
371
+ tách đôi hai trục:
372
+ </p>
373
+ <ul className="list-disc pl-5 space-y-1">
374
+ <li>
375
+ <strong>Color (Ý nghĩa):</strong> primary, secondary,
376
+ destructive, success...
377
+ </li>
378
+ <li>
379
+ <strong>Variant (Hình thức):</strong> solid, outline, ghost,
380
+ soft...
381
+ </li>
382
+ </ul>
383
+ <p>
384
+ Điều này giúp tránh bùng nổ số lượng variant (Combinatorial
385
+ Explosion). Ví dụ: Bạn có thể dễ dàng gọi{" "}
386
+ <code>variant="ghost" color="destructive"</code> mà không cần
387
+ phải viết thêm một class CSS mới nào.
388
+ </p>
389
+ </AccordionContent>
390
+ </AccordionItem>
391
+ </Accordion>
392
+ </div>
393
+ </div>
394
+ </div>
395
+ );
396
+ }