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,662 @@
1
+ import {
2
+ DocsCode,
3
+ DocsH3,
4
+ DocsP,
5
+ ExampleGrid,
6
+ ExampleSection,
7
+ Showcase,
8
+ ShowcaseDocs,
9
+ } from "../../dev/components/showcase";
10
+
11
+ import { TabsPreset } from "../../components/macro/tabs-preset";
12
+ import {
13
+ Tabs,
14
+ TabsContent,
15
+ TabsList,
16
+ TabsTrigger,
17
+ } from "../../components/micro/tabs";
18
+ import { BellIcon, CreditCardIcon, UserIcon } from "lucide-react";
19
+
20
+ // ──────────────────────────────────────────────────────────
21
+ // SECTION 1: Macro Content
22
+ // ──────────────────────────────────────────────────────────
23
+ function TabsMacroShowcase() {
24
+ return (
25
+ <div className="space-y-10 mt-6">
26
+ <ExampleGrid>
27
+ <ExampleSection
28
+ label="Tiêu chuẩn (Standard)"
29
+ description="Tabs cơ bản truyền qua mảng items."
30
+ codeString={`<TabsPreset
31
+ defaultValue="account"
32
+ className="w-full"
33
+ items={[
34
+ {
35
+ value: "account",
36
+ title: "Account",
37
+ content: (
38
+ <div className="rounded-xl border border-border bg-card p-4 mt-2">
39
+ <h4 className="font-medium">Account</h4>
40
+ <p className="text-sm text-muted-foreground">Account settings here.</p>
41
+ </div>
42
+ ),
43
+ },
44
+ {
45
+ value: "password",
46
+ title: "Password",
47
+ content: (
48
+ <div className="rounded-xl border border-border bg-card p-4 mt-2">
49
+ <h4 className="font-medium">Password</h4>
50
+ <p className="text-sm text-muted-foreground">Change your password here.</p>
51
+ </div>
52
+ ),
53
+ },
54
+ ]}
55
+ />`}
56
+ >
57
+ <TabsPreset
58
+ defaultValue="account"
59
+ className="w-full"
60
+ items={[
61
+ {
62
+ value: "account",
63
+ title: "Account",
64
+ content: (
65
+ <div className="rounded-xl border border-border bg-card p-4 mt-2">
66
+ <h4 className="font-medium">Account</h4>
67
+ <p className="text-sm text-muted-foreground">
68
+ Account settings here.
69
+ </p>
70
+ </div>
71
+ ),
72
+ },
73
+ {
74
+ value: "password",
75
+ title: "Password",
76
+ content: (
77
+ <div className="rounded-xl border border-border bg-card p-4 mt-2">
78
+ <h4 className="font-medium">Password</h4>
79
+ <p className="text-sm text-muted-foreground">
80
+ Change your password here.
81
+ </p>
82
+ </div>
83
+ ),
84
+ },
85
+ ]}
86
+ />
87
+ </ExampleSection>
88
+
89
+ <ExampleSection
90
+ label="Tab bị vô hiệu hóa (Disabled Tab)"
91
+ description="Tab không thể tương tác do thuộc tính disabled."
92
+ codeString={`<TabsPreset
93
+ defaultValue="general"
94
+ className="w-full"
95
+ items={[
96
+ {
97
+ value: "general",
98
+ title: "General",
99
+ content: (
100
+ <div className="rounded-xl border border-border bg-card p-4 mt-2">
101
+ <h4 className="font-medium">General</h4>
102
+ <p className="text-sm text-muted-foreground">General settings.</p>
103
+ </div>
104
+ ),
105
+ },
106
+ {
107
+ value: "advanced",
108
+ title: "Advanced (Pro)",
109
+ content: <></>,
110
+ disabled: true,
111
+ },
112
+ ]}
113
+ />`}
114
+ >
115
+ <TabsPreset
116
+ defaultValue="general"
117
+ className="w-full"
118
+ items={[
119
+ {
120
+ value: "general",
121
+ title: "General",
122
+ content: (
123
+ <div className="rounded-xl border border-border bg-card p-4 mt-2">
124
+ <h4 className="font-medium">General</h4>
125
+ <p className="text-sm text-muted-foreground">
126
+ General settings.
127
+ </p>
128
+ </div>
129
+ ),
130
+ },
131
+ {
132
+ value: "advanced",
133
+ title: "Advanced (Pro)",
134
+ content: <></>,
135
+ disabled: true,
136
+ },
137
+ ]}
138
+ />
139
+ </ExampleSection>
140
+ </ExampleGrid>
141
+
142
+ <ExampleSection
143
+ label="Dạng đường viền (Line Variant)"
144
+ description="Sử dụng prop variant='line' để hiển thị tabs kiểu gạch chân (phong cách thanh điều hướng)."
145
+ fullWidth
146
+ codeString={`<div className="max-w-lg">
147
+ <TabsPreset
148
+ defaultValue="overview"
149
+ variant="line"
150
+ listClassName="w-full justify-start border-b border-b-border rounded-none px-0"
151
+ className="w-full"
152
+ items={[
153
+ {
154
+ value: "overview",
155
+ title: "Overview",
156
+ content: (
157
+ <div className="pt-4">
158
+ <h4 className="font-medium">Overview</h4>
159
+ <p className="text-sm text-muted-foreground">
160
+ High-level project statistics and activity feed.
161
+ </p>
162
+ </div>
163
+ ),
164
+ },
165
+ {
166
+ value: "analytics",
167
+ title: "Analytics",
168
+ content: (
169
+ <div className="pt-4">
170
+ <h4 className="font-medium">Analytics</h4>
171
+ <p className="text-sm text-muted-foreground">
172
+ Charts and data visualizations.
173
+ </p>
174
+ </div>
175
+ ),
176
+ },
177
+ {
178
+ value: "reports",
179
+ title: "Reports",
180
+ content: (
181
+ <div className="pt-4">
182
+ <h4 className="font-medium">Reports</h4>
183
+ <p className="text-sm text-muted-foreground">
184
+ Generated reports and exports.
185
+ </p>
186
+ </div>
187
+ ),
188
+ },
189
+ ]}
190
+ />
191
+ </div>
192
+ `}
193
+ >
194
+ <div className="max-w-lg">
195
+ <TabsPreset
196
+ defaultValue="overview"
197
+ variant="line"
198
+ listClassName="w-full justify-start border-b border-b-border rounded-none px-0"
199
+ className="w-full"
200
+ items={[
201
+ {
202
+ value: "overview",
203
+ title: "Overview",
204
+ content: (
205
+ <div className="pt-4">
206
+ <h4 className="font-medium">Overview</h4>
207
+ <p className="text-sm text-muted-foreground">
208
+ High-level project statistics and activity feed.
209
+ </p>
210
+ </div>
211
+ ),
212
+ },
213
+ {
214
+ value: "analytics",
215
+ title: "Analytics",
216
+ content: (
217
+ <div className="pt-4">
218
+ <h4 className="font-medium">Analytics</h4>
219
+ <p className="text-sm text-muted-foreground">
220
+ Charts and data visualizations.
221
+ </p>
222
+ </div>
223
+ ),
224
+ },
225
+ {
226
+ value: "reports",
227
+ title: "Reports",
228
+ content: (
229
+ <div className="pt-4">
230
+ <h4 className="font-medium">Reports</h4>
231
+ <p className="text-sm text-muted-foreground">
232
+ Generated reports and exports.
233
+ </p>
234
+ </div>
235
+ ),
236
+ },
237
+ ]}
238
+ />
239
+ </div>
240
+ </ExampleSection>
241
+
242
+ <ExampleSection
243
+ label="Nội dung phức tạp (Complex Content)"
244
+ description="Hiển thị các component phức tạp như form bên trong nội dung tab."
245
+ fullWidth
246
+ codeString={`<div className="max-w-lg">
247
+ <TabsPreset
248
+ defaultValue="login"
249
+ className="w-full"
250
+ items={[
251
+ {
252
+ value: "login",
253
+ title: "Login",
254
+ content: (
255
+ <div className="rounded-xl border border-border bg-card p-6 mt-2 flex flex-col gap-4">
256
+ <div className="text-lg font-semibold">Welcome Back</div>
257
+ <div className="h-10 w-full bg-muted rounded-md" />
258
+ <div className="h-10 w-full bg-muted rounded-md" />
259
+ <button className="bg-primary text-primary-foreground h-10 rounded-md text-sm font-medium">
260
+ Sign In
261
+ </button>
262
+ </div>
263
+ ),
264
+ },
265
+ {
266
+ value: "register",
267
+ title: "Register",
268
+ content: (
269
+ <div className="rounded-xl border border-border bg-card p-6 mt-2 flex flex-col gap-4">
270
+ <div className="text-lg font-semibold">Create Account</div>
271
+ <div className="h-10 w-full bg-muted rounded-md" />
272
+ <div className="h-10 w-full bg-muted rounded-md" />
273
+ <div className="h-10 w-full bg-muted rounded-md" />
274
+ <button className="bg-primary text-primary-foreground h-10 rounded-md text-sm font-medium">
275
+ Sign Up
276
+ </button>
277
+ </div>
278
+ ),
279
+ },
280
+ ]}
281
+ />
282
+ </div>
283
+ `}
284
+ >
285
+ <div className="max-w-lg">
286
+ <TabsPreset
287
+ defaultValue="login"
288
+ className="w-full"
289
+ items={[
290
+ {
291
+ value: "login",
292
+ title: "Login",
293
+ content: (
294
+ <div className="rounded-xl border border-border bg-card p-6 mt-2 flex flex-col gap-4">
295
+ <div className="text-lg font-semibold">Welcome Back</div>
296
+ <div className="h-10 w-full bg-muted rounded-md" />
297
+ <div className="h-10 w-full bg-muted rounded-md" />
298
+ <button className="bg-primary text-primary-foreground h-10 rounded-md text-sm font-medium">
299
+ Sign In
300
+ </button>
301
+ </div>
302
+ ),
303
+ },
304
+ {
305
+ value: "register",
306
+ title: "Register",
307
+ content: (
308
+ <div className="rounded-xl border border-border bg-card p-6 mt-2 flex flex-col gap-4">
309
+ <div className="text-lg font-semibold">Create Account</div>
310
+ <div className="h-10 w-full bg-muted rounded-md" />
311
+ <div className="h-10 w-full bg-muted rounded-md" />
312
+ <div className="h-10 w-full bg-muted rounded-md" />
313
+ <button className="bg-primary text-primary-foreground h-10 rounded-md text-sm font-medium">
314
+ Sign Up
315
+ </button>
316
+ </div>
317
+ ),
318
+ },
319
+ ]}
320
+ />
321
+ </div>
322
+ </ExampleSection>
323
+ </div>
324
+ );
325
+ }
326
+
327
+ // ──────────────────────────────────────────────────────────
328
+ // SECTION 2: Micro Content
329
+ // ──────────────────────────────────────────────────────────
330
+ function TabsMicroShowcase() {
331
+ return (
332
+ <div className="space-y-10 mt-6">
333
+ <ExampleGrid>
334
+ <ExampleSection
335
+ label="Cơ bản (Default)"
336
+ description="Tabs nguyên thuỷ lắp ráp thủ công."
337
+ codeString={`<Tabs defaultValue="account" className="w-full">
338
+ <TabsList className="w-full">
339
+ <TabsTrigger value="account">Account</TabsTrigger>
340
+ <TabsTrigger value="password">Password</TabsTrigger>
341
+ </TabsList>
342
+ <TabsContent value="account">
343
+ <div className="rounded-xl border border-border bg-card p-4 mt-2">
344
+ <h4 className="font-medium">Account</h4>
345
+ <p className="text-sm text-muted-foreground">
346
+ Make changes to your account here.
347
+ </p>
348
+ </div>
349
+ </TabsContent>
350
+ <TabsContent value="password">
351
+ <div className="rounded-xl border border-border bg-card p-4 mt-2">
352
+ <h4 className="font-medium">Password</h4>
353
+ <p className="text-sm text-muted-foreground">
354
+ Change your password here.
355
+ </p>
356
+ </div>
357
+ </TabsContent>
358
+ </Tabs>
359
+ `}
360
+ >
361
+ <Tabs defaultValue="account" className="w-full">
362
+ <TabsList className="w-full">
363
+ <TabsTrigger value="account">Account</TabsTrigger>
364
+ <TabsTrigger value="password">Password</TabsTrigger>
365
+ </TabsList>
366
+ <TabsContent value="account">
367
+ <div className="rounded-xl border border-border bg-card p-4 mt-2">
368
+ <h4 className="font-medium">Account</h4>
369
+ <p className="text-sm text-muted-foreground">
370
+ Make changes to your account here.
371
+ </p>
372
+ </div>
373
+ </TabsContent>
374
+ <TabsContent value="password">
375
+ <div className="rounded-xl border border-border bg-card p-4 mt-2">
376
+ <h4 className="font-medium">Password</h4>
377
+ <p className="text-sm text-muted-foreground">
378
+ Change your password here.
379
+ </p>
380
+ </div>
381
+ </TabsContent>
382
+ </Tabs>
383
+ </ExampleSection>
384
+
385
+ <ExampleSection
386
+ label="Kèm Icon (With Icons)"
387
+ description="Thêm icon tuỳ chỉnh vào bên trong Tab Trigger."
388
+ codeString={`<Tabs defaultValue="profile" className="w-full">
389
+ <TabsList className="w-full">
390
+ <TabsTrigger value="profile">
391
+ <UserIcon data-icon="inline-start" />
392
+ Profile
393
+ </TabsTrigger>
394
+ <TabsTrigger value="notifications">
395
+ <BellIcon data-icon="inline-start" />
396
+ Notifications
397
+ </TabsTrigger>
398
+ </TabsList>
399
+ <TabsContent value="profile">
400
+ <div className="rounded-xl border border-border bg-card p-4 mt-2">
401
+ <h4 className="font-medium">Profile</h4>
402
+ <p className="text-sm text-muted-foreground">
403
+ Update your name, avatar and bio.
404
+ </p>
405
+ </div>
406
+ </TabsContent>
407
+ <TabsContent value="notifications">
408
+ <div className="rounded-xl border border-border bg-card p-4 mt-2">
409
+ <h4 className="font-medium">Notifications</h4>
410
+ <p className="text-sm text-muted-foreground">
411
+ Choose what notifications you receive.
412
+ </p>
413
+ </div>
414
+ </TabsContent>
415
+ </Tabs>
416
+ `}
417
+ >
418
+ <Tabs defaultValue="profile" className="w-full">
419
+ <TabsList className="w-full">
420
+ <TabsTrigger value="profile">
421
+ <UserIcon data-icon="inline-start" />
422
+ Profile
423
+ </TabsTrigger>
424
+ <TabsTrigger value="notifications">
425
+ <BellIcon data-icon="inline-start" />
426
+ Notifications
427
+ </TabsTrigger>
428
+ </TabsList>
429
+ <TabsContent value="profile">
430
+ <div className="rounded-xl border border-border bg-card p-4 mt-2">
431
+ <h4 className="font-medium">Profile</h4>
432
+ <p className="text-sm text-muted-foreground">
433
+ Update your name, avatar and bio.
434
+ </p>
435
+ </div>
436
+ </TabsContent>
437
+ <TabsContent value="notifications">
438
+ <div className="rounded-xl border border-border bg-card p-4 mt-2">
439
+ <h4 className="font-medium">Notifications</h4>
440
+ <p className="text-sm text-muted-foreground">
441
+ Choose what notifications you receive.
442
+ </p>
443
+ </div>
444
+ </TabsContent>
445
+ </Tabs>
446
+ </ExampleSection>
447
+ </ExampleGrid>
448
+
449
+ <ExampleSection
450
+ label="Dạng đường viền (Line Variant)"
451
+ description="Tabs có kiểu gạch chân (không nền)."
452
+ fullWidth
453
+ codeString={`<Tabs defaultValue="music" className="w-full max-w-lg">
454
+ <TabsList
455
+ variant="line"
456
+ className="w-full justify-start border-b border-b-border rounded-none px-0"
457
+ >
458
+ <TabsTrigger value="music">Music</TabsTrigger>
459
+ <TabsTrigger value="podcasts">Podcasts</TabsTrigger>
460
+ <TabsTrigger value="live">Live</TabsTrigger>
461
+ </TabsList>
462
+ <TabsContent value="music">
463
+ <div className="pt-4">
464
+ <h4 className="font-medium">Music Library</h4>
465
+ <p className="text-sm text-muted-foreground">
466
+ Your top played songs and albums.
467
+ </p>
468
+ </div>
469
+ </TabsContent>
470
+ <TabsContent value="podcasts">
471
+ <div className="pt-4">
472
+ <h4 className="font-medium">Podcasts</h4>
473
+ <p className="text-sm text-muted-foreground">
474
+ Episodes from your subscriptions.
475
+ </p>
476
+ </div>
477
+ </TabsContent>
478
+ <TabsContent value="live">
479
+ <div className="pt-4">
480
+ <h4 className="font-medium">Live Radio</h4>
481
+ <p className="text-sm text-muted-foreground">
482
+ Tune in to live broadcasts.
483
+ </p>
484
+ </div>
485
+ </TabsContent>
486
+ </Tabs>
487
+ `}
488
+ >
489
+ <Tabs defaultValue="music" className="w-full max-w-lg">
490
+ <TabsList
491
+ variant="line"
492
+ className="w-full justify-start border-b border-b-border rounded-none px-0"
493
+ >
494
+ <TabsTrigger value="music">Music</TabsTrigger>
495
+ <TabsTrigger value="podcasts">Podcasts</TabsTrigger>
496
+ <TabsTrigger value="live">Live</TabsTrigger>
497
+ </TabsList>
498
+ <TabsContent value="music">
499
+ <div className="pt-4">
500
+ <h4 className="font-medium">Music Library</h4>
501
+ <p className="text-sm text-muted-foreground">
502
+ Your top played songs and albums.
503
+ </p>
504
+ </div>
505
+ </TabsContent>
506
+ <TabsContent value="podcasts">
507
+ <div className="pt-4">
508
+ <h4 className="font-medium">Podcasts</h4>
509
+ <p className="text-sm text-muted-foreground">
510
+ Episodes from your subscriptions.
511
+ </p>
512
+ </div>
513
+ </TabsContent>
514
+ <TabsContent value="live">
515
+ <div className="pt-4">
516
+ <h4 className="font-medium">Live Radio</h4>
517
+ <p className="text-sm text-muted-foreground">
518
+ Tune in to live broadcasts.
519
+ </p>
520
+ </div>
521
+ </TabsContent>
522
+ </Tabs>
523
+ </ExampleSection>
524
+
525
+ <ExampleSection
526
+ label="Xếp dọc (Vertical Orientation)"
527
+ description="Sắp xếp danh sách tab theo chiều dọc bên trái và nội dung bên phải."
528
+ fullWidth
529
+ codeString={`<Tabs
530
+ defaultValue="profile"
531
+ orientation="vertical"
532
+ className="w-full max-w-xl"
533
+ >
534
+ <TabsList className="w-40 shrink-0">
535
+ <TabsTrigger value="profile">
536
+ <UserIcon data-icon="inline-start" />
537
+ Profile
538
+ </TabsTrigger>
539
+ <TabsTrigger value="notifications">
540
+ <BellIcon data-icon="inline-start" />
541
+ Notifications
542
+ </TabsTrigger>
543
+ <TabsTrigger value="billing">
544
+ <CreditCardIcon data-icon="inline-start" />
545
+ Billing
546
+ </TabsTrigger>
547
+ </TabsList>
548
+ <TabsContent value="profile">
549
+ <div className="rounded-xl border border-border bg-card p-4">
550
+ <h4 className="font-medium">Profile</h4>
551
+ <p className="text-sm text-muted-foreground">
552
+ Update your personal information and manage your public
553
+ profile.
554
+ </p>
555
+ </div>
556
+ </TabsContent>
557
+ <TabsContent value="notifications">
558
+ <div className="rounded-xl border border-border bg-card p-4">
559
+ <h4 className="font-medium">Notifications</h4>
560
+ <p className="text-sm text-muted-foreground">
561
+ Choose what notifications you receive and how.
562
+ </p>
563
+ </div>
564
+ </TabsContent>
565
+ <TabsContent value="billing">
566
+ <div className="rounded-xl border border-border bg-card p-4">
567
+ <h4 className="font-medium">Billing</h4>
568
+ <p className="text-sm text-muted-foreground">
569
+ Manage your subscription and payment methods.
570
+ </p>
571
+ </div>
572
+ </TabsContent>
573
+ </Tabs>
574
+ `}
575
+ >
576
+ <Tabs
577
+ defaultValue="profile"
578
+ orientation="vertical"
579
+ className="w-full max-w-xl"
580
+ >
581
+ <TabsList className="w-40 shrink-0">
582
+ <TabsTrigger value="profile">
583
+ <UserIcon data-icon="inline-start" />
584
+ Profile
585
+ </TabsTrigger>
586
+ <TabsTrigger value="notifications">
587
+ <BellIcon data-icon="inline-start" />
588
+ Notifications
589
+ </TabsTrigger>
590
+ <TabsTrigger value="billing">
591
+ <CreditCardIcon data-icon="inline-start" />
592
+ Billing
593
+ </TabsTrigger>
594
+ </TabsList>
595
+ <TabsContent value="profile">
596
+ <div className="rounded-xl border border-border bg-card p-4">
597
+ <h4 className="font-medium">Profile</h4>
598
+ <p className="text-sm text-muted-foreground">
599
+ Update your personal information and manage your public profile.
600
+ </p>
601
+ </div>
602
+ </TabsContent>
603
+ <TabsContent value="notifications">
604
+ <div className="rounded-xl border border-border bg-card p-4">
605
+ <h4 className="font-medium">Notifications</h4>
606
+ <p className="text-sm text-muted-foreground">
607
+ Choose what notifications you receive and how.
608
+ </p>
609
+ </div>
610
+ </TabsContent>
611
+ <TabsContent value="billing">
612
+ <div className="rounded-xl border border-border bg-card p-4">
613
+ <h4 className="font-medium">Billing</h4>
614
+ <p className="text-sm text-muted-foreground">
615
+ Manage your subscription and payment methods.
616
+ </p>
617
+ </div>
618
+ </TabsContent>
619
+ </Tabs>
620
+ </ExampleSection>
621
+ </div>
622
+ );
623
+ }
624
+
625
+ // ──────────────────────────────────────────────────────────
626
+ // SECTION 3: Entry point
627
+ // ──────────────────────────────────────────────────────────
628
+ export default function TabsShowcase() {
629
+ return (
630
+ <Showcase
631
+ title="Tabs"
632
+ description="Tập hợp các tab panel được hiển thị lần lượt, chuyển đổi khi click vào tab tương ứng."
633
+ generalConcept={
634
+ <div className="space-y-4">
635
+ <ShowcaseDocs>
636
+ <DocsH3>Khi nào nên dùng Macro</DocsH3>
637
+ <DocsP>
638
+ <DocsCode>TabsPreset</DocsCode> là một component đóng gói sẵn,
639
+ nhận vào mảng <DocsCode>items</DocsCode> chứa thông tin cấu hình
640
+ của các tabs (value, title, content, disabled, ...). Thích hợp cho
641
+ các tab đơn giản, render từ dữ liệu cấu hình có sẵn.
642
+ </DocsP>
643
+ </ShowcaseDocs>
644
+ <ShowcaseDocs>
645
+ <DocsH3>Khi nào nên dùng Micro</DocsH3>
646
+ <DocsP>
647
+ Dùng <DocsCode>Tabs</DocsCode> và các thành phần con (
648
+ <DocsCode>TabsList</DocsCode>, <DocsCode>TabsTrigger</DocsCode>,{" "}
649
+ <DocsCode>TabsContent</DocsCode>) khi bạn muốn tự kiểm soát cấu
650
+ trúc HTML, muốn đính kèm Icon vào Trigger, hoặc xây dựng các dạng
651
+ Tab không theo khuôn mẫu (ví dụ: đặt List dọc, List rời rạc).
652
+ </DocsP>
653
+ </ShowcaseDocs>
654
+ </div>
655
+ }
656
+ tabs={[
657
+ { label: "Micro (Primitive)", content: <TabsMicroShowcase /> },
658
+ { label: "Macro (Preset)", content: <TabsMacroShowcase /> },
659
+ ]}
660
+ />
661
+ );
662
+ }