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,245 @@
1
+ import { Button } from "../../components/micro/button";
2
+ import {
3
+ Command,
4
+ CommandEmpty,
5
+ CommandGroup,
6
+ CommandInput,
7
+ CommandItem,
8
+ CommandList,
9
+ CommandSeparator,
10
+ CommandShortcut,
11
+ } from "../../components/micro/command";
12
+ import { CommandDialog } from "../../components/macro/command-preset";
13
+ import {
14
+ DocsP,
15
+ ExampleGrid,
16
+ ExampleSection,
17
+ Showcase,
18
+ ShowcaseDocs,
19
+ } from "../../dev/components/showcase";
20
+ import {
21
+ CalculatorIcon,
22
+ CalendarIcon,
23
+ CreditCardIcon,
24
+ SettingsIcon,
25
+ SmileIcon,
26
+ UserIcon,
27
+ } from "lucide-react";
28
+ import { useState } from "react";
29
+
30
+ function CommandMicroShowcase() {
31
+ const [open, setOpen] = useState(false);
32
+
33
+ return (
34
+ <div className="space-y-10 mt-6">
35
+ <ExampleGrid>
36
+ <ExampleSection
37
+ label="Default"
38
+ description="Bảng lệnh có thể tìm kiếm với các mục được nhóm."
39
+ codeString={`<Command className="border border-border rounded-xl shadow-sm overflow-hidden bg-background w-full">
40
+ <CommandInput placeholder="Type a command or search..." />
41
+ <CommandList>
42
+ <CommandEmpty>No results found.</CommandEmpty>
43
+ <CommandGroup heading="Suggestions">
44
+ <CommandItem>
45
+ <CalendarIcon className="mr-2 h-4 w-4" />
46
+ <span>Calendar</span>
47
+ </CommandItem>
48
+ <CommandItem>
49
+ <SmileIcon className="mr-2 h-4 w-4" />
50
+ <span>Search Emoji</span>
51
+ </CommandItem>
52
+ <CommandItem disabled>
53
+ <CalculatorIcon className="mr-2 h-4 w-4" />
54
+ <span>Calculator</span>
55
+ </CommandItem>
56
+ </CommandGroup>
57
+ <CommandSeparator />
58
+ <CommandGroup heading="Settings">
59
+ <CommandItem>
60
+ <UserIcon className="mr-2 h-4 w-4" />
61
+ <span>Profile</span>
62
+ <CommandShortcut>⌘P</CommandShortcut>
63
+ </CommandItem>
64
+ <CommandItem>
65
+ <CreditCardIcon className="mr-2 h-4 w-4" />
66
+ <span>Billing</span>
67
+ <CommandShortcut>⌘B</CommandShortcut>
68
+ </CommandItem>
69
+ <CommandItem>
70
+ <SettingsIcon className="mr-2 h-4 w-4" />
71
+ <span>Settings</span>
72
+ <CommandShortcut>⌘S</CommandShortcut>
73
+ </CommandItem>
74
+ </CommandGroup>
75
+ </CommandList>
76
+ </Command>
77
+ `}
78
+ >
79
+ <Command className="border border-border rounded-xl shadow-sm overflow-hidden bg-background w-full">
80
+ <CommandInput placeholder="Type a command or search..." />
81
+ <CommandList>
82
+ <CommandEmpty>No results found.</CommandEmpty>
83
+ <CommandGroup heading="Suggestions">
84
+ <CommandItem>
85
+ <CalendarIcon className="mr-2 h-4 w-4" />
86
+ <span>Calendar</span>
87
+ </CommandItem>
88
+ <CommandItem>
89
+ <SmileIcon className="mr-2 h-4 w-4" />
90
+ <span>Search Emoji</span>
91
+ </CommandItem>
92
+ <CommandItem disabled>
93
+ <CalculatorIcon className="mr-2 h-4 w-4" />
94
+ <span>Calculator</span>
95
+ </CommandItem>
96
+ </CommandGroup>
97
+ <CommandSeparator />
98
+ <CommandGroup heading="Settings">
99
+ <CommandItem>
100
+ <UserIcon className="mr-2 h-4 w-4" />
101
+ <span>Profile</span>
102
+ <CommandShortcut>⌘P</CommandShortcut>
103
+ </CommandItem>
104
+ <CommandItem>
105
+ <CreditCardIcon className="mr-2 h-4 w-4" />
106
+ <span>Billing</span>
107
+ <CommandShortcut>⌘B</CommandShortcut>
108
+ </CommandItem>
109
+ <CommandItem>
110
+ <SettingsIcon className="mr-2 h-4 w-4" />
111
+ <span>Settings</span>
112
+ <CommandShortcut>⌘S</CommandShortcut>
113
+ </CommandItem>
114
+ </CommandGroup>
115
+ </CommandList>
116
+ </Command>
117
+ </ExampleSection>
118
+
119
+ <ExampleSection
120
+ label="Flat List"
121
+ description="Nhóm duy nhất không có tiêu đề."
122
+ codeString={`<Command className="border border-border rounded-xl shadow-sm overflow-hidden bg-background w-full">
123
+ <CommandInput placeholder="Search actions..." />
124
+ <CommandList>
125
+ <CommandEmpty>No actions found.</CommandEmpty>
126
+ <CommandGroup>
127
+ <CommandItem>
128
+ <UserIcon className="mr-2 h-4 w-4" />
129
+ <span>View Profile</span>
130
+ </CommandItem>
131
+ <CommandItem>
132
+ <SettingsIcon className="mr-2 h-4 w-4" />
133
+ <span>Open Settings</span>
134
+ </CommandItem>
135
+ <CommandItem>
136
+ <CalendarIcon className="mr-2 h-4 w-4" />
137
+ <span>Schedule Meeting</span>
138
+ </CommandItem>
139
+ <CommandItem>
140
+ <CreditCardIcon className="mr-2 h-4 w-4" />
141
+ <span>Manage Billing</span>
142
+ </CommandItem>
143
+ </CommandGroup>
144
+ </CommandList>
145
+ </Command>
146
+ `}
147
+ >
148
+ <Command className="border border-border rounded-xl shadow-sm overflow-hidden bg-background w-full">
149
+ <CommandInput placeholder="Search actions..." />
150
+ <CommandList>
151
+ <CommandEmpty>No actions found.</CommandEmpty>
152
+ <CommandGroup>
153
+ <CommandItem>
154
+ <UserIcon className="mr-2 h-4 w-4" />
155
+ <span>View Profile</span>
156
+ </CommandItem>
157
+ <CommandItem>
158
+ <SettingsIcon className="mr-2 h-4 w-4" />
159
+ <span>Open Settings</span>
160
+ </CommandItem>
161
+ <CommandItem>
162
+ <CalendarIcon className="mr-2 h-4 w-4" />
163
+ <span>Schedule Meeting</span>
164
+ </CommandItem>
165
+ <CommandItem>
166
+ <CreditCardIcon className="mr-2 h-4 w-4" />
167
+ <span>Manage Billing</span>
168
+ </CommandItem>
169
+ </CommandGroup>
170
+ </CommandList>
171
+ </Command>
172
+ </ExampleSection>
173
+ </ExampleGrid>
174
+
175
+ <ExampleSection
176
+ label="Dialog Menu"
177
+ description="Menu lệnh được hiển thị bên trong dialog."
178
+ codeString={`<Button onClick={() => setOpen(true)}>Open Command Palette</Button>
179
+ <CommandDialog open={open} onOpenChange={setOpen}>
180
+ <CommandInput placeholder="Type a command or search..." />
181
+ <CommandList>
182
+ <CommandEmpty>No results found.</CommandEmpty>
183
+ <CommandGroup heading="Suggestions">
184
+ <CommandItem>
185
+ <CalendarIcon className="mr-2 h-4 w-4" />
186
+ <span>Calendar</span>
187
+ </CommandItem>
188
+ <CommandItem>
189
+ <SmileIcon className="mr-2 h-4 w-4" />
190
+ <span>Search Emoji</span>
191
+ </CommandItem>
192
+ </CommandGroup>
193
+ </CommandList>
194
+ </CommandDialog>
195
+ `}
196
+ >
197
+ <Button onClick={() => setOpen(true)}>Open Command Palette</Button>
198
+ <CommandDialog open={open} onOpenChange={setOpen}>
199
+ <CommandInput placeholder="Type a command or search..." />
200
+ <CommandList>
201
+ <CommandEmpty>No results found.</CommandEmpty>
202
+ <CommandGroup heading="Suggestions">
203
+ <CommandItem>
204
+ <CalendarIcon className="mr-2 h-4 w-4" />
205
+ <span>Calendar</span>
206
+ </CommandItem>
207
+ <CommandItem>
208
+ <SmileIcon className="mr-2 h-4 w-4" />
209
+ <span>Search Emoji</span>
210
+ </CommandItem>
211
+ </CommandGroup>
212
+ </CommandList>
213
+ </CommandDialog>
214
+ </ExampleSection>
215
+ </div>
216
+ );
217
+ }
218
+
219
+ // ──────────────────────────────────────────────────────────
220
+ // SECTION 3: Entry point
221
+ // ──────────────────────────────────────────────────────────
222
+ export default function CommandShowcase() {
223
+ return (
224
+ <Showcase
225
+ title="Command"
226
+ description="Command palette có tìm kiếm, kích hoạt bằng phím tắt (⌘K)."
227
+ generalConcept={
228
+ <ShowcaseDocs>
229
+ <DocsP>
230
+ Dùng để tạo các bảng lệnh (command palette) hoặc menu chọn có khả
231
+ năng tìm kiếm nhanh, thường kích hoạt bằng phím tắt (như Cmd+K).
232
+ Thích hợp cho các ứng dụng có nhiều chức năng phức tạp cần điều
233
+ hướng nhanh.
234
+ </DocsP>
235
+ </ShowcaseDocs>
236
+ }
237
+ tabs={[
238
+ {
239
+ label: "Micro (Primitive)",
240
+ content: <CommandMicroShowcase />,
241
+ },
242
+ ]}
243
+ />
244
+ );
245
+ }
@@ -0,0 +1,239 @@
1
+ import {
2
+ ContextMenu,
3
+ ContextMenuCheckboxItem,
4
+ ContextMenuContent,
5
+ ContextMenuGroup,
6
+ ContextMenuItem,
7
+ ContextMenuLabel,
8
+ ContextMenuRadioGroup,
9
+ ContextMenuRadioItem,
10
+ ContextMenuSeparator,
11
+ ContextMenuShortcut,
12
+ ContextMenuSub,
13
+ ContextMenuSubContent,
14
+ ContextMenuSubTrigger,
15
+ ContextMenuTrigger,
16
+ ContextMenuPortal,
17
+ } from "../../components/micro/context-menu";
18
+ import {
19
+ DocsP,
20
+ ExampleSection,
21
+ Showcase,
22
+ ShowcaseDocs,
23
+ } from "../../dev/components/showcase";
24
+
25
+ import { useState } from "react";
26
+
27
+ // ──────────────────────────────────────────────────────────
28
+ // SECTION 2: Micro Content (không export)
29
+ // ──────────────────────────────────────────────────────────
30
+ function ContextMenuMicroShowcase() {
31
+ const [showBookmarks, setShowBookmarks] = useState(true);
32
+ const [showFullUrls, setShowFullUrls] = useState(false);
33
+ const [person, setPerson] = useState("pedro");
34
+
35
+ return (
36
+ <div className="space-y-10 mt-6">
37
+ <ExampleSection
38
+ label="Full Context Menu"
39
+ description="Nhấp chuột phải vào khu vực bên dưới để mở."
40
+ codeString={`<ContextMenu>
41
+ <ContextMenuTrigger className="flex h-[150px] w-full max-w-[400px] items-center justify-center rounded-md border border-border border-dashed text-sm">
42
+ Right click here
43
+ </ContextMenuTrigger>
44
+ <ContextMenuPortal><ContextMenuContent className="w-64">
45
+ <ContextMenuItem inset>
46
+ Back
47
+ <ContextMenuShortcut>⌘[</ContextMenuShortcut>
48
+ </ContextMenuItem>
49
+ <ContextMenuItem inset disabled>
50
+ Forward
51
+ <ContextMenuShortcut>⌘]</ContextMenuShortcut>
52
+ </ContextMenuItem>
53
+ <ContextMenuItem inset>
54
+ Reload
55
+ <ContextMenuShortcut>⌘R</ContextMenuShortcut>
56
+ </ContextMenuItem>
57
+ <ContextMenuSub>
58
+ <ContextMenuSubTrigger inset>More Tools</ContextMenuSubTrigger>
59
+ <ContextMenuPortal><ContextMenuSubContent className="w-48">
60
+ <ContextMenuItem>
61
+ Save Page As...
62
+ <ContextMenuShortcut>⇧⌘S</ContextMenuShortcut>
63
+ </ContextMenuItem>
64
+ <ContextMenuItem>Create Shortcut...</ContextMenuItem>
65
+ <ContextMenuItem>Name Window...</ContextMenuItem>
66
+ <ContextMenuSeparator />
67
+ <ContextMenuItem>Developer Tools</ContextMenuItem>
68
+ </ContextMenuSubContent></ContextMenuPortal>
69
+ </ContextMenuSub>
70
+ <ContextMenuSeparator />
71
+ <ContextMenuCheckboxItem
72
+ checked={showBookmarks}
73
+ onCheckedChange={setShowBookmarks}
74
+ >
75
+ Show Bookmarks Bar
76
+ <ContextMenuShortcut>⌘⇧B</ContextMenuShortcut>
77
+ </ContextMenuCheckboxItem>
78
+ <ContextMenuCheckboxItem
79
+ checked={showFullUrls}
80
+ onCheckedChange={setShowFullUrls}
81
+ >
82
+ Show Full URLs
83
+ </ContextMenuCheckboxItem>
84
+ <ContextMenuSeparator />
85
+ <ContextMenuGroup>
86
+ <ContextMenuLabel inset>People</ContextMenuLabel>
87
+ <ContextMenuSeparator />
88
+ <ContextMenuRadioGroup value={person} onValueChange={setPerson}>
89
+ <ContextMenuRadioItem value="pedro">
90
+ Pedro Duarte
91
+ </ContextMenuRadioItem>
92
+ <ContextMenuRadioItem value="colm">
93
+ Colm Tuite
94
+ </ContextMenuRadioItem>
95
+ </ContextMenuRadioGroup>
96
+ </ContextMenuGroup>
97
+ </ContextMenuContent></ContextMenuPortal>
98
+ </ContextMenu>
99
+ `}
100
+ >
101
+ <ContextMenu>
102
+ <ContextMenuTrigger className="flex h-[150px] w-full max-w-[400px] items-center justify-center rounded-md border border-border border-dashed text-sm">
103
+ Right click here
104
+ </ContextMenuTrigger>
105
+
106
+ <ContextMenuPortal>
107
+ <ContextMenuContent className="w-64">
108
+ <ContextMenuItem inset>
109
+ Back
110
+ <ContextMenuShortcut>⌘[</ContextMenuShortcut>
111
+ </ContextMenuItem>
112
+ <ContextMenuItem inset disabled>
113
+ Forward
114
+ <ContextMenuShortcut>⌘]</ContextMenuShortcut>
115
+ </ContextMenuItem>
116
+ <ContextMenuItem inset>
117
+ Reload
118
+ <ContextMenuShortcut>⌘R</ContextMenuShortcut>
119
+ </ContextMenuItem>
120
+ <ContextMenuSub>
121
+ <ContextMenuSubTrigger inset>More Tools</ContextMenuSubTrigger>
122
+
123
+ <ContextMenuPortal>
124
+ <ContextMenuSubContent className="w-48">
125
+ <ContextMenuItem>
126
+ Save Page As...
127
+ <ContextMenuShortcut>⇧⌘S</ContextMenuShortcut>
128
+ </ContextMenuItem>
129
+ <ContextMenuItem>Create Shortcut...</ContextMenuItem>
130
+ <ContextMenuItem>Name Window...</ContextMenuItem>
131
+ <ContextMenuSeparator />
132
+ <ContextMenuItem>Developer Tools</ContextMenuItem>
133
+ </ContextMenuSubContent>
134
+ </ContextMenuPortal>
135
+ </ContextMenuSub>
136
+ <ContextMenuSeparator />
137
+ <ContextMenuCheckboxItem
138
+ checked={showBookmarks}
139
+ onCheckedChange={setShowBookmarks}
140
+ >
141
+ Show Bookmarks Bar
142
+ <ContextMenuShortcut>⌘⇧B</ContextMenuShortcut>
143
+ </ContextMenuCheckboxItem>
144
+ <ContextMenuCheckboxItem
145
+ checked={showFullUrls}
146
+ onCheckedChange={setShowFullUrls}
147
+ >
148
+ Show Full URLs
149
+ </ContextMenuCheckboxItem>
150
+ <ContextMenuSeparator />
151
+ <ContextMenuGroup>
152
+ <ContextMenuLabel inset>People</ContextMenuLabel>
153
+ <ContextMenuSeparator />
154
+ <ContextMenuRadioGroup value={person} onValueChange={setPerson}>
155
+ <ContextMenuRadioItem value="pedro">
156
+ Pedro Duarte
157
+ </ContextMenuRadioItem>
158
+ <ContextMenuRadioItem value="colm">
159
+ Colm Tuite
160
+ </ContextMenuRadioItem>
161
+ </ContextMenuRadioGroup>
162
+ </ContextMenuGroup>
163
+ </ContextMenuContent>
164
+ </ContextMenuPortal>
165
+ </ContextMenu>
166
+ </ExampleSection>
167
+
168
+ <ExampleSection
169
+ label="Destructive Variant"
170
+ description="Context menu với các action nguy hiểm hiển thị màu destructive."
171
+ codeString={`<ContextMenu>
172
+ <ContextMenuTrigger className="flex h-[100px] w-full max-w-[300px] items-center justify-center rounded-md border border-border border-dashed text-sm">
173
+ Right click here
174
+ </ContextMenuTrigger>
175
+ <ContextMenuPortal><ContextMenuContent className="w-52">
176
+ <ContextMenuItem>
177
+ Rename
178
+ <ContextMenuShortcut>⌘R</ContextMenuShortcut>
179
+ </ContextMenuItem>
180
+ <ContextMenuItem>Duplicate</ContextMenuItem>
181
+ <ContextMenuSeparator />
182
+ <ContextMenuItem variant="destructive">
183
+ Delete
184
+ <ContextMenuShortcut>⌫</ContextMenuShortcut>
185
+ </ContextMenuItem>
186
+ </ContextMenuContent></ContextMenuPortal>
187
+ </ContextMenu>
188
+ `}
189
+ >
190
+ <ContextMenu>
191
+ <ContextMenuTrigger className="flex h-[100px] w-full max-w-[300px] items-center justify-center rounded-md border border-border border-dashed text-sm">
192
+ Right click here
193
+ </ContextMenuTrigger>
194
+
195
+ <ContextMenuPortal>
196
+ <ContextMenuContent className="w-52">
197
+ <ContextMenuItem>
198
+ Rename
199
+ <ContextMenuShortcut>⌘R</ContextMenuShortcut>
200
+ </ContextMenuItem>
201
+ <ContextMenuItem>Duplicate</ContextMenuItem>
202
+ <ContextMenuSeparator />
203
+ <ContextMenuItem variant="destructive">
204
+ Delete
205
+ <ContextMenuShortcut>⌫</ContextMenuShortcut>
206
+ </ContextMenuItem>
207
+ </ContextMenuContent>
208
+ </ContextMenuPortal>
209
+ </ContextMenu>
210
+ </ExampleSection>
211
+ </div>
212
+ );
213
+ }
214
+
215
+ // ──────────────────────────────────────────────────────────
216
+ // SECTION 3: Entry point (export default)
217
+ // ──────────────────────────────────────────────────────────
218
+ export default function ContextMenuShowcase() {
219
+ return (
220
+ <Showcase
221
+ title="Context Menu"
222
+ description="Menu ngữ cảnh hiển thị khi click chuột phải — dùng cho các hành động nhanh."
223
+ generalConcept={
224
+ <ShowcaseDocs>
225
+ <DocsP>
226
+ Dùng để hiển thị danh sách các tuỳ chọn hoặc hành động liên quan tới
227
+ phần tử mà người dùng vừa nhấp chuột phải vào.
228
+ </DocsP>
229
+ </ShowcaseDocs>
230
+ }
231
+ tabs={[
232
+ {
233
+ label: "Micro (Primitive)",
234
+ content: <ContextMenuMicroShowcase />,
235
+ },
236
+ ]}
237
+ />
238
+ );
239
+ }