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