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,295 @@
1
+ import { useDevContext } from "../../dev/components/dev-context";
2
+ import { useState } from "react";
3
+ import { CheckIcon, HeartIcon, MoreVerticalIcon, UserIcon } from "lucide-react";
4
+
5
+ import { Button } from "../../components/micro/button";
6
+ import {
7
+ Item,
8
+ ItemActions,
9
+ ItemContent,
10
+ ItemDescription,
11
+ ItemFooter,
12
+ ItemGroup,
13
+ ItemHeader,
14
+ ItemMedia,
15
+ ItemSeparator,
16
+ ItemTitle,
17
+ } from "../../components/micro/item";
18
+ import { type Size } from "../../lib/types";
19
+ import {
20
+ DocsH3,
21
+ DocsP,
22
+ ExampleGrid,
23
+ ExampleSection,
24
+ Showcase,
25
+ ShowcaseDocs,
26
+ } from "../../dev/components/showcase";
27
+
28
+ function ItemMicroShowcase({ globalSize }: { globalSize: Size }) {
29
+ return (
30
+ <div className="space-y-10 mt-6">
31
+ <ExampleGrid>
32
+ <ExampleSection
33
+ label="Basic Content"
34
+ description="Item cơ bản với tiêu đề và mô tả."
35
+ codeString={`<Item className="w-full">
36
+ <ItemContent>
37
+ <ItemTitle>Basic Item Content</ItemTitle>
38
+ <ItemDescription>
39
+ This item shows structured text.
40
+ </ItemDescription>
41
+ </ItemContent>
42
+ </Item>
43
+ `}
44
+ >
45
+ <Item size={globalSize} className="w-full">
46
+ <ItemContent>
47
+ <ItemTitle>Basic Item Content</ItemTitle>
48
+ <ItemDescription>
49
+ This item shows structured text.
50
+ </ItemDescription>
51
+ </ItemContent>
52
+ </Item>
53
+ </ExampleSection>
54
+
55
+ <ExampleSection
56
+ label="With Media"
57
+ description="Item kèm icon hoặc avatar."
58
+ codeString={`<Item className="w-full">
59
+ <ItemMedia className="bg-primary/10 text-primary rounded-md p-2">
60
+ <UserIcon className="size-4" />
61
+ </ItemMedia>
62
+ <ItemContent>
63
+ <ItemTitle>User Profile</ItemTitle>
64
+ <ItemDescription>Manage your account</ItemDescription>
65
+ </ItemContent>
66
+ </Item>
67
+ `}
68
+ >
69
+ <Item size={globalSize} className="w-full">
70
+ <ItemMedia className="bg-primary/10 text-primary rounded-md p-2">
71
+ <UserIcon className="size-4" />
72
+ </ItemMedia>
73
+ <ItemContent>
74
+ <ItemTitle>User Profile</ItemTitle>
75
+ <ItemDescription>Manage your account</ItemDescription>
76
+ </ItemContent>
77
+ </Item>
78
+ </ExampleSection>
79
+ </ExampleGrid>
80
+
81
+ <ExampleGrid>
82
+ <ExampleSection
83
+ label="Variants"
84
+ description="Các variant khác nhau: outline, muted."
85
+ codeString={`<div className="flex flex-col gap-3 w-full">
86
+ <Item variant="outline">
87
+ <ItemContent>
88
+ <ItemTitle>Outline Variant</ItemTitle>
89
+ </ItemContent>
90
+ </Item>
91
+ <Item variant="muted">
92
+ <ItemContent>
93
+ <ItemTitle>Muted Variant</ItemTitle>
94
+ </ItemContent>
95
+ </Item>
96
+ </div>
97
+ `}
98
+ >
99
+ <div className="flex flex-col gap-3 w-full">
100
+ <Item variant="outline" size={globalSize}>
101
+ <ItemContent>
102
+ <ItemTitle>Outline Variant</ItemTitle>
103
+ </ItemContent>
104
+ </Item>
105
+ <Item variant="muted" size={globalSize}>
106
+ <ItemContent>
107
+ <ItemTitle>Muted Variant</ItemTitle>
108
+ </ItemContent>
109
+ </Item>
110
+ </div>
111
+ </ExampleSection>
112
+
113
+ <ExampleSection
114
+ label="Media Variants"
115
+ description="ItemMedia hỗ trợ các variant riêng: icon và image."
116
+ codeString={`<div className="flex flex-col gap-3 w-full">
117
+ <Item>
118
+ <ItemMedia variant="icon" className="bg-primary/10 text-primary">
119
+ <CheckIcon className="size-4" />
120
+ </ItemMedia>
121
+ <ItemContent>
122
+ <ItemTitle>Icon Variant</ItemTitle>
123
+ </ItemContent>
124
+ </Item>
125
+ <Item>
126
+ <ItemMedia variant="image" className="bg-muted">
127
+ <UserIcon className="size-4 text-muted-foreground" />
128
+ </ItemMedia>
129
+ <ItemContent>
130
+ <ItemTitle>Image Variant</ItemTitle>
131
+ </ItemContent>
132
+ </Item>
133
+ </div>
134
+ `}
135
+ >
136
+ <div className="flex flex-col gap-3 w-full">
137
+ <Item size={globalSize}>
138
+ <ItemMedia variant="icon" className="bg-primary/10 text-primary">
139
+ <CheckIcon className="size-4" />
140
+ </ItemMedia>
141
+ <ItemContent>
142
+ <ItemTitle>Icon Variant</ItemTitle>
143
+ </ItemContent>
144
+ </Item>
145
+ <Item size={globalSize}>
146
+ <ItemMedia variant="image" className="bg-muted">
147
+ <UserIcon className="size-4 text-muted-foreground" />
148
+ </ItemMedia>
149
+ <ItemContent>
150
+ <ItemTitle>Image Variant</ItemTitle>
151
+ </ItemContent>
152
+ </Item>
153
+ </div>
154
+ </ExampleSection>
155
+
156
+ <ExampleSection
157
+ label="With Actions"
158
+ description="Item có các nút hành động ở cuối (ItemActions)."
159
+ codeString={`<Item className="w-full">
160
+ <ItemContent>
161
+ <ItemTitle>Actionable Item</ItemTitle>
162
+ </ItemContent>
163
+ <ItemActions>
164
+ <Button variant="ghost" size="sm" className="size-8 p-0">
165
+ <HeartIcon className="size-4" />
166
+ </Button>
167
+ <Button variant="ghost" size="sm" className="size-8 p-0">
168
+ <MoreVerticalIcon className="size-4" />
169
+ </Button>
170
+ </ItemActions>
171
+ </Item>
172
+ `}
173
+ >
174
+ <Item size={globalSize} className="w-full">
175
+ <ItemContent>
176
+ <ItemTitle>Actionable Item</ItemTitle>
177
+ </ItemContent>
178
+ <ItemActions>
179
+ <Button variant="ghost" size="sm" className="size-8 p-0" iconOnly>
180
+ <HeartIcon className="size-4" />
181
+ </Button>
182
+ <Button variant="ghost" size="sm" className="size-8 p-0" iconOnly>
183
+ <MoreVerticalIcon className="size-4" />
184
+ </Button>
185
+ </ItemActions>
186
+ </Item>
187
+ </ExampleSection>
188
+ </ExampleGrid>
189
+
190
+ <ExampleSection
191
+ label="Item Group"
192
+ description="Nhóm các Item và phân cách bằng ItemSeparator."
193
+ codeString={`<ItemGroup className="w-full max-w-sm mx-auto">
194
+ <Item>
195
+ <ItemContent>
196
+ <ItemTitle>Account Settings</ItemTitle>
197
+ </ItemContent>
198
+ </Item>
199
+ <ItemSeparator />
200
+ <Item>
201
+ <ItemContent>
202
+ <ItemTitle>Notification Preferences</ItemTitle>
203
+ </ItemContent>
204
+ </Item>
205
+ <ItemSeparator />
206
+ <Item>
207
+ <ItemContent>
208
+ <ItemTitle className="text-destructive">Delete Account</ItemTitle>
209
+ </ItemContent>
210
+ </Item>
211
+ </ItemGroup>
212
+ `}
213
+ >
214
+ <ItemGroup className="w-full max-w-sm mx-auto">
215
+ <Item size={globalSize}>
216
+ <ItemContent>
217
+ <ItemTitle>Account Settings</ItemTitle>
218
+ </ItemContent>
219
+ </Item>
220
+ <ItemSeparator />
221
+ <Item size={globalSize}>
222
+ <ItemContent>
223
+ <ItemTitle>Notification Preferences</ItemTitle>
224
+ </ItemContent>
225
+ </Item>
226
+ <ItemSeparator />
227
+ <Item size={globalSize}>
228
+ <ItemContent>
229
+ <ItemTitle className="text-destructive">Delete Account</ItemTitle>
230
+ </ItemContent>
231
+ </Item>
232
+ </ItemGroup>
233
+ </ExampleSection>
234
+
235
+ <ExampleSection
236
+ label="With Header and Footer"
237
+ description="Item phức tạp với ItemHeader và ItemFooter."
238
+ codeString={`<Item
239
+ className="w-full max-w-sm mx-auto flex-col items-start gap-2"
240
+ >
241
+ <ItemHeader className="text-xs text-muted-foreground">
242
+ Order #12345
243
+ </ItemHeader>
244
+ <ItemContent>
245
+ <ItemTitle>Mechanical Keyboard v2</ItemTitle>
246
+ </ItemContent>
247
+ <ItemFooter className="text-xs text-success flex items-center gap-1">
248
+ <CheckIcon className="size-3" /> Delivered
249
+ </ItemFooter>
250
+ </Item>
251
+ `}
252
+ >
253
+ <Item
254
+ size={globalSize}
255
+ className="w-full max-w-sm mx-auto flex-col items-start gap-2"
256
+ >
257
+ <ItemHeader className="text-xs text-muted-foreground">
258
+ Order #12345
259
+ </ItemHeader>
260
+ <ItemContent>
261
+ <ItemTitle>Mechanical Keyboard v2</ItemTitle>
262
+ </ItemContent>
263
+ <ItemFooter className="text-xs text-success flex items-center gap-1">
264
+ <CheckIcon className="size-3" /> Delivered
265
+ </ItemFooter>
266
+ </Item>
267
+ </ExampleSection>
268
+ </div>
269
+ );
270
+ }
271
+
272
+ export default function ItemShowcase() {
273
+ const { size: globalSize } = useDevContext();
274
+ return (
275
+ <Showcase
276
+ title="Item"
277
+ description="Container linh hoạt cho danh sách hoặc khối nội dung có cấu trúc."
278
+ generalConcept={
279
+ <ShowcaseDocs>
280
+ <DocsH3>Item</DocsH3>
281
+ <DocsP>
282
+ Sử dụng để tạo danh sách hoặc khối nội dung có icon, tiêu đề,
283
+ mô tả và hành động.
284
+ </DocsP>
285
+ </ShowcaseDocs>
286
+ }
287
+ tabs={[
288
+ {
289
+ label: "Micro (Primitive)",
290
+ content: <ItemMicroShowcase globalSize={globalSize} />,
291
+ },
292
+ ]}
293
+ />
294
+ );
295
+ }
@@ -0,0 +1,276 @@
1
+ import {
2
+ DocsCode,
3
+ DocsP,
4
+ ExampleGrid,
5
+ ExampleSection,
6
+ Showcase,
7
+ ShowcaseDocs,
8
+ } from "../../dev/components/showcase";
9
+ import {
10
+ CopyIcon,
11
+ FileIcon,
12
+ FilePlusIcon,
13
+ FolderOpenIcon,
14
+ SaveIcon,
15
+ } from "lucide-react";
16
+
17
+ import { Button } from "../../components/micro/button";
18
+ import {
19
+ DropdownMenu,
20
+ DropdownMenuContent,
21
+ DropdownMenuItem,
22
+ DropdownMenuSeparator,
23
+ DropdownMenuTrigger,
24
+ DropdownMenuPortal,
25
+ } from "../../components/micro/dropdown-menu";
26
+ import { Kbd, KbdGroup } from "../../components/micro/kbd";
27
+ import {
28
+ Tooltip,
29
+ TooltipContent,
30
+ TooltipProvider,
31
+ TooltipTrigger, TooltipPortal } from "../../components/micro/tooltip";
32
+
33
+ // ──────────────────────────────────────────────────────────
34
+ // SECTION 2: Micro Content (không export)
35
+ // ──────────────────────────────────────────────────────────
36
+ function KbdMicroShowcase() {
37
+ return (
38
+ <div className="space-y-10 mt-6">
39
+ {/* ── Kbd đơn ── */}
40
+ <ExampleGrid>
41
+ <ExampleSection
42
+ label="Kbd — Phím đơn"
43
+ description="Hiển thị một phím bàn phím riêng lẻ dùng thẻ <kbd> semantic."
44
+ codeString={`<p className="text-sm text-muted-foreground">
45
+ Press <Kbd>⌘</Kbd> <Kbd>K</Kbd> to open search.
46
+ </p>`}
47
+ >
48
+ <p className="text-sm text-muted-foreground">
49
+ Press <Kbd>⌘</Kbd> <Kbd>K</Kbd> to open search.
50
+ </p>
51
+ </ExampleSection>
52
+
53
+ <ExampleSection
54
+ label="KbdGroup — Tổ hợp phím"
55
+ description="Nhóm nhiều phím cạnh nhau với khoảng cách đều. Dùng khi biểu diễn tổ hợp phím như Ctrl+Shift+P."
56
+ codeString={`<p className="text-sm text-muted-foreground flex items-center gap-2">
57
+ Open Command Palette
58
+ <KbdGroup>
59
+ <Kbd>⌘</Kbd>
60
+ <Kbd>⇧</Kbd>
61
+ <Kbd>P</Kbd>
62
+ </KbdGroup>
63
+ </p>`}
64
+ >
65
+ <p className="text-sm text-muted-foreground flex items-center gap-2">
66
+ Open Command Palette
67
+ <KbdGroup>
68
+ <Kbd>⌘</Kbd>
69
+ <Kbd>⇧</Kbd>
70
+ <Kbd>P</Kbd>
71
+ </KbdGroup>
72
+ </p>
73
+ </ExampleSection>
74
+ </ExampleGrid>
75
+
76
+ {/* ── Ký tự & Symbols ── */}
77
+ <ExampleSection
78
+ label="Ký tự & Symbols"
79
+ description="Kbd có thể chứa ký tự Unicode, chữ cái, số hoặc tên phím dài."
80
+ codeString={`<div className="flex flex-wrap items-center gap-2">
81
+ <Kbd>Ctrl</Kbd>
82
+ <Kbd>Alt</Kbd>
83
+ <Kbd>⌘</Kbd>
84
+ <Kbd>⇧</Kbd>
85
+ <Kbd>⌫</Kbd>
86
+ <Kbd>↵</Kbd>
87
+ <Kbd>Tab</Kbd>
88
+ <Kbd>Esc</Kbd>
89
+ <Kbd>F1</Kbd>
90
+ <Kbd>→</Kbd>
91
+ </div>`}
92
+ >
93
+ <div className="flex flex-wrap items-center gap-2">
94
+ <Kbd>Ctrl</Kbd>
95
+ <Kbd>Alt</Kbd>
96
+ <Kbd>⌘</Kbd>
97
+ <Kbd>⇧</Kbd>
98
+ <Kbd>⌫</Kbd>
99
+ <Kbd>↵</Kbd>
100
+ <Kbd>Tab</Kbd>
101
+ <Kbd>Esc</Kbd>
102
+ <Kbd>F1</Kbd>
103
+ <Kbd>→</Kbd>
104
+ </div>
105
+ </ExampleSection>
106
+
107
+ {/* ── Kbd trong Tooltip ── */}
108
+ <ExampleSection
109
+ label="Kbd trong Tooltip"
110
+ description="Kbd tự đổi màu khi nằm trong TooltipContent — màu nền sáng trên nền tối của tooltip, không cần thêm class."
111
+ codeString={`<TooltipProvider>
112
+ <Tooltip>
113
+ <TooltipTrigger render={<Button variant="outline" iconOnly><SaveIcon /></Button>} />
114
+ <TooltipContent>
115
+ Lưu tài liệu <Kbd>⌘</Kbd><Kbd>S</Kbd>
116
+ </TooltipContent>
117
+ </Tooltip>
118
+ </TooltipProvider>`}
119
+ >
120
+ <div className="flex items-center gap-3">
121
+ <TooltipProvider>
122
+ <Tooltip>
123
+ <TooltipTrigger
124
+ render={
125
+ <Button variant="outline" iconOnly>
126
+ <SaveIcon aria-hidden="true" />
127
+ </Button>
128
+ }
129
+ />
130
+ <TooltipPortal>
131
+ <TooltipContent>
132
+ Lưu tài liệu <Kbd>⌘</Kbd>
133
+ <Kbd>S</Kbd>
134
+ </TooltipContent>
135
+ </TooltipPortal>
136
+ </Tooltip>
137
+ </TooltipProvider>
138
+
139
+ <TooltipProvider>
140
+ <Tooltip>
141
+ <TooltipTrigger
142
+ render={
143
+ <Button variant="outline" iconOnly>
144
+ <CopyIcon aria-hidden="true" />
145
+ </Button>
146
+ }
147
+ />
148
+ <TooltipPortal>
149
+ <TooltipContent>
150
+ Sao chép <Kbd>⌘</Kbd>
151
+ <Kbd>C</Kbd>
152
+ </TooltipContent>
153
+ </TooltipPortal>
154
+ </Tooltip>
155
+ </TooltipProvider>
156
+ </div>
157
+ </ExampleSection>
158
+
159
+ {/* ── Use case thực tế: Menu với shortcuts ── */}
160
+ <ExampleSection
161
+ label="Use case — Menu với Keyboard Shortcut"
162
+ description="Kbd dùng trong DropdownMenuItem để hiển thị phím tắt bên cạnh label — pattern phổ biến trong text editor, IDE, Figma."
163
+ codeString={`<DropdownMenuItem>
164
+ <FileIcon />
165
+ New File
166
+ <KbdGroup className="ml-auto">
167
+ <Kbd>⌘</Kbd><Kbd>N</Kbd>
168
+ </KbdGroup>
169
+ </DropdownMenuItem>
170
+
171
+ <DropdownMenuItem>
172
+ <SaveIcon />
173
+ Save
174
+ <KbdGroup className="ml-auto">
175
+ <Kbd>⌘</Kbd><Kbd>S</Kbd>
176
+ </KbdGroup>
177
+ </DropdownMenuItem>`}
178
+ >
179
+ <DropdownMenu>
180
+ <DropdownMenuTrigger
181
+ render={<Button variant="outline">File menu</Button>}
182
+ />
183
+ <DropdownMenuPortal>
184
+ <DropdownMenuContent className="w-56">
185
+ <DropdownMenuItem>
186
+ <FilePlusIcon aria-hidden="true" />
187
+ New File
188
+ <KbdGroup className="ml-auto">
189
+ <Kbd>⌘</Kbd>
190
+ <Kbd>N</Kbd>
191
+ </KbdGroup>
192
+ </DropdownMenuItem>
193
+ <DropdownMenuItem>
194
+ <FolderOpenIcon aria-hidden="true" />
195
+ Open...
196
+ <KbdGroup className="ml-auto">
197
+ <Kbd>⌘</Kbd>
198
+ <Kbd>O</Kbd>
199
+ </KbdGroup>
200
+ </DropdownMenuItem>
201
+ <DropdownMenuSeparator />
202
+ <DropdownMenuItem>
203
+ <SaveIcon aria-hidden="true" />
204
+ Save
205
+ <KbdGroup className="ml-auto">
206
+ <Kbd>⌘</Kbd>
207
+ <Kbd>S</Kbd>
208
+ </KbdGroup>
209
+ </DropdownMenuItem>
210
+ <DropdownMenuItem>
211
+ <FileIcon aria-hidden="true" />
212
+ Save As...
213
+ <KbdGroup className="ml-auto">
214
+ <Kbd>⌘</Kbd>
215
+ <Kbd>⇧</Kbd>
216
+ <Kbd>S</Kbd>
217
+ </KbdGroup>
218
+ </DropdownMenuItem>
219
+ </DropdownMenuContent>
220
+ </DropdownMenuPortal>
221
+ </DropdownMenu>
222
+ </ExampleSection>
223
+
224
+ {/* ── Gợi ý inline trong form ── */}
225
+ <ExampleSection
226
+ label="Gợi ý inline trong văn bản"
227
+ description="Kbd dùng inline trong đoạn văn bản để gợi ý phím tắt — phổ biến trong help text, onboarding, documentation."
228
+ codeString={`<p className="text-sm text-muted-foreground">
229
+ Nhấn <Kbd>Enter</Kbd> để gửi, hoặc <KbdGroup><Kbd>⇧</Kbd><Kbd>Enter</Kbd></KbdGroup> để xuống dòng.
230
+ </p>`}
231
+ >
232
+ <div className="space-y-3">
233
+ <p className="text-sm text-muted-foreground">
234
+ Nhấn <Kbd>Enter</Kbd> để gửi, hoặc{" "}
235
+ <KbdGroup>
236
+ <Kbd>⇧</Kbd>
237
+ <Kbd>Enter</Kbd>
238
+ </KbdGroup>{" "}
239
+ để xuống dòng.
240
+ </p>
241
+ <p className="text-sm text-muted-foreground">
242
+ Dùng <Kbd>Tab</Kbd> để chuyển trường, <Kbd>Esc</Kbd> để huỷ.
243
+ </p>
244
+ </div>
245
+ </ExampleSection>
246
+ </div>
247
+ );
248
+ }
249
+
250
+ // ──────────────────────────────────────────────────────────
251
+ // SECTION 3: Entry point (export default)
252
+ // ──────────────────────────────────────────────────────────
253
+ export default function KbdShowcase() {
254
+ return (
255
+ <Showcase
256
+ title="Keyboard Shortcut"
257
+ description="Hiển thị phím tắt bàn phím dạng inline với thẻ HTML semantic <kbd>."
258
+ generalConcept={
259
+ <ShowcaseDocs>
260
+ <DocsP>
261
+ <DocsCode>Kbd</DocsCode> dùng thẻ HTML semantic{" "}
262
+ <DocsCode>&lt;kbd&gt;</DocsCode> để biểu diễn một phím bàn phím.
263
+ Screen reader nhận ra đây là keyboard input thay vì văn bản thường.
264
+ </DocsP>
265
+ <DocsP>
266
+ <DocsCode>KbdGroup</DocsCode> nhóm nhiều <DocsCode>Kbd</DocsCode>{" "}
267
+ lại để tạo tổ hợp phím (ví dụ: ⌘ + ⇧ + P). Kbd tự thích nghi màu sắc
268
+ khi nằm trong <DocsCode>TooltipContent</DocsCode> nhờ data-slot
269
+ context.
270
+ </DocsP>
271
+ </ShowcaseDocs>
272
+ }
273
+ tabs={[{ label: "Micro (Primitive)", content: <KbdMicroShowcase /> }]}
274
+ />
275
+ );
276
+ }
@@ -0,0 +1,121 @@
1
+ import { useDevContext } from "../../dev/components/dev-context";
2
+ import {
3
+ DocsCode,
4
+ DocsP,
5
+ ExampleSection,
6
+ Showcase,
7
+ ShowcaseDocs,
8
+ } from "../../dev/components/showcase";
9
+ import { useState } from "react";
10
+
11
+ import { Label } from "../../components/micro/label";
12
+ import { type Size } from "../../lib/types";
13
+
14
+ // ──────────────────────────────────────────────────────────
15
+ // SECTION 2: Micro Content (không export)
16
+ // ──────────────────────────────────────────────────────────
17
+ function LabelMicroShowcase({ globalSize }: { globalSize: Size }) {
18
+ return (
19
+ <div className="space-y-10 mt-6">
20
+ <ExampleSection
21
+ label="Default"
22
+ description="Cách sử dụng nhãn tiêu chuẩn."
23
+ codeString={`<Label htmlFor="terms">
24
+ Accept terms and conditions
25
+ </Label>
26
+ `}
27
+ >
28
+ <Label htmlFor="terms" size={globalSize}>
29
+ Accept terms and conditions
30
+ </Label>
31
+ </ExampleSection>
32
+
33
+ <ExampleSection
34
+ label="Disabled"
35
+ description="Trạng thái bị vô hiệu hóa khi nằm trong group bị vô hiệu."
36
+ codeString={`<div data-disabled="true" className="group">
37
+ <Label htmlFor="disabled">
38
+ This label is disabled
39
+ </Label>
40
+ </div>
41
+ `}
42
+ >
43
+ <div data-disabled="true" className="group">
44
+ <Label htmlFor="disabled" size={globalSize}>
45
+ This label is disabled
46
+ </Label>
47
+ </div>
48
+ </ExampleSection>
49
+
50
+ <ExampleSection
51
+ label="Error State"
52
+ description="Hiển thị màu đỏ khi nằm trong group bị lỗi (data-invalid)."
53
+ codeString={`<div data-invalid="true" className="group">
54
+ <Label htmlFor="error">
55
+ Email is required
56
+ </Label>
57
+ </div>
58
+ `}
59
+ >
60
+ <div data-invalid="true" className="group">
61
+ <Label htmlFor="error" size={globalSize}>
62
+ Email is required
63
+ </Label>
64
+ </div>
65
+ </ExampleSection>
66
+
67
+ <ExampleSection
68
+ label="With Peer Input"
69
+ description="Phản hồi trạng thái disabled của input liền kề (dùng class peer)."
70
+ codeString={`<div className="flex items-center gap-2">
71
+ <input type="checkbox" disabled id="peer-disabled" className="peer w-4 h-4" />
72
+ <Label htmlFor="peer-disabled">
73
+ Disabled by peer checkbox
74
+ </Label>
75
+ </div>
76
+ `}
77
+ >
78
+ <div className="flex items-center gap-2">
79
+ <input
80
+ type="checkbox"
81
+ disabled
82
+ id="peer-disabled"
83
+ className="peer w-4 h-4"
84
+ />
85
+ <Label htmlFor="peer-disabled" size={globalSize}>
86
+ Disabled by peer checkbox
87
+ </Label>
88
+ </div>
89
+ </ExampleSection>
90
+ </div>
91
+ );
92
+ }
93
+
94
+ // ──────────────────────────────────────────────────────────
95
+ // SECTION 3: Entry point (export default)
96
+ // ──────────────────────────────────────────────────────────
97
+ export default function LabelShowcase() {
98
+ const { size: globalSize } = useDevContext();
99
+ return (
100
+ <Showcase
101
+ title="Label"
102
+ description="Nhãn gắn với form control, cải thiện accessibility."
103
+ generalConcept={
104
+ <ShowcaseDocs>
105
+ <DocsP>
106
+ Label được sử dụng để gắn nhãn cho các trường nhập liệu form. Nó cải
107
+ thiện khả năng truy cập (accessibility) bằng cách liên kết văn bản
108
+ với một form control cụ thể (thông qua thuộc tính{" "}
109
+ <DocsCode>htmlFor</DocsCode>).
110
+ </DocsP>
111
+ </ShowcaseDocs>
112
+ }
113
+ tabs={[
114
+ {
115
+ label: "Micro (Primitive)",
116
+ content: <LabelMicroShowcase globalSize={globalSize} />,
117
+ },
118
+ ]}
119
+ />
120
+ );
121
+ }