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,126 @@
|
|
|
1
|
+
import { Separator } from "../../components/micro/separator";
|
|
2
|
+
import {
|
|
3
|
+
DocsCode,
|
|
4
|
+
DocsH3,
|
|
5
|
+
DocsP,
|
|
6
|
+
ExampleSection,
|
|
7
|
+
Showcase,
|
|
8
|
+
ShowcaseDocs,
|
|
9
|
+
} from "../../dev/components/showcase";
|
|
10
|
+
|
|
11
|
+
// ──────────────────────────────────────────────────────────
|
|
12
|
+
// SECTION 1: Micro Content (Only Micro exists)
|
|
13
|
+
// ──────────────────────────────────────────────────────────
|
|
14
|
+
function SeparatorMicroShowcase() {
|
|
15
|
+
return (
|
|
16
|
+
<div className="space-y-10 mt-6">
|
|
17
|
+
<ExampleSection
|
|
18
|
+
label="Ngang (Horizontal)"
|
|
19
|
+
description="Sử dụng để phân tách các khối nội dung từ trên xuống dưới."
|
|
20
|
+
fullWidth
|
|
21
|
+
codeString={`<div className="w-full max-w-sm rounded-lg border border-border bg-card p-6">
|
|
22
|
+
<div className="space-y-1">
|
|
23
|
+
<h4 className="text-sm font-medium leading-none">
|
|
24
|
+
Gladcn UI
|
|
25
|
+
</h4>
|
|
26
|
+
<p className="text-sm text-muted-foreground">
|
|
27
|
+
Bộ UI Component mã nguồn mở.
|
|
28
|
+
</p>
|
|
29
|
+
</div>
|
|
30
|
+
<Separator className="my-4" />
|
|
31
|
+
<div className="text-sm text-muted-foreground">
|
|
32
|
+
Cập nhật lần cuối: Hôm nay
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
`}
|
|
36
|
+
>
|
|
37
|
+
<div className="w-full max-w-sm rounded-lg border border-border bg-card p-6">
|
|
38
|
+
<div className="space-y-1">
|
|
39
|
+
<h4 className="text-sm font-medium leading-none">Gladcn UI</h4>
|
|
40
|
+
<p className="text-sm text-muted-foreground">
|
|
41
|
+
Bộ UI Component mã nguồn mở.
|
|
42
|
+
</p>
|
|
43
|
+
</div>
|
|
44
|
+
<Separator className="my-4" />
|
|
45
|
+
<div className="text-sm text-muted-foreground">
|
|
46
|
+
Cập nhật lần cuối: Hôm nay
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
</ExampleSection>
|
|
50
|
+
|
|
51
|
+
<ExampleSection
|
|
52
|
+
label="Dọc (Vertical)"
|
|
53
|
+
description="Sử dụng để phân tách các mục nằm ngang (như menu, thanh công cụ)."
|
|
54
|
+
codeString={`<div className="flex h-5 items-center space-x-4 text-sm">
|
|
55
|
+
<div className="font-medium hover:underline cursor-pointer">Blog</div>
|
|
56
|
+
<Separator orientation="vertical" />
|
|
57
|
+
<div className="font-medium hover:underline cursor-pointer">Tài liệu</div>
|
|
58
|
+
<Separator orientation="vertical" />
|
|
59
|
+
<div className="font-medium hover:underline cursor-pointer">Mã nguồn</div>
|
|
60
|
+
</div>
|
|
61
|
+
`}
|
|
62
|
+
>
|
|
63
|
+
<div className="flex h-5 items-center space-x-4 text-sm">
|
|
64
|
+
<div className="font-medium hover:underline cursor-pointer">Blog</div>
|
|
65
|
+
<Separator orientation="vertical" />
|
|
66
|
+
<div className="font-medium hover:underline cursor-pointer">
|
|
67
|
+
Tài liệu
|
|
68
|
+
</div>
|
|
69
|
+
<Separator orientation="vertical" />
|
|
70
|
+
<div className="font-medium hover:underline cursor-pointer">
|
|
71
|
+
Mã nguồn
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
</ExampleSection>
|
|
75
|
+
<ExampleSection
|
|
76
|
+
label="Decorative vs Semantic"
|
|
77
|
+
description='Semantic (mặc định) được screen reader đọc. Truyền aria-hidden="true" khi Separator chỉ mang tính trang trí thuần.'
|
|
78
|
+
codeString={`{/* Semantic — screen reader đọc được */}
|
|
79
|
+
<Separator />
|
|
80
|
+
|
|
81
|
+
{/* Decorative — chỉ là đường kẻ trực quan */}
|
|
82
|
+
<Separator aria-hidden="true" />`}
|
|
83
|
+
>
|
|
84
|
+
<div className="flex flex-col gap-6 w-full max-w-sm">
|
|
85
|
+
<div>
|
|
86
|
+
<p className="text-xs text-muted-foreground mb-2">
|
|
87
|
+
Semantic (mặc định — screen reader nhận ra)
|
|
88
|
+
</p>
|
|
89
|
+
<Separator />
|
|
90
|
+
</div>
|
|
91
|
+
<div>
|
|
92
|
+
<p className="text-xs text-muted-foreground mb-2">
|
|
93
|
+
Decorative — <code className="text-xs">aria-hidden="true"</code>
|
|
94
|
+
</p>
|
|
95
|
+
<Separator aria-hidden="true" />
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
</ExampleSection>
|
|
99
|
+
</div>
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// ──────────────────────────────────────────────────────────
|
|
104
|
+
// SECTION 3: Entry point
|
|
105
|
+
// ──────────────────────────────────────────────────────────
|
|
106
|
+
export default function SeparatorShowcase() {
|
|
107
|
+
return (
|
|
108
|
+
<Showcase
|
|
109
|
+
title="Separator"
|
|
110
|
+
description="Thành phần phân cách trực quan hoặc ngữ nghĩa giữa các khối nội dung (Đường kẻ)."
|
|
111
|
+
generalConcept={
|
|
112
|
+
<ShowcaseDocs>
|
|
113
|
+
<DocsH3>Separator (Phân cách)</DocsH3>
|
|
114
|
+
<DocsP>
|
|
115
|
+
<DocsCode>Separator</DocsCode> không có phiên bản Macro vì bản chất
|
|
116
|
+
nó chỉ là một đường kẻ phân tách giao diện. Mặc định là đường kẻ
|
|
117
|
+
ngang (<DocsCode>orientation="horizontal"</DocsCode>).
|
|
118
|
+
</DocsP>
|
|
119
|
+
</ShowcaseDocs>
|
|
120
|
+
}
|
|
121
|
+
tabs={[
|
|
122
|
+
{ label: "Micro (Primitive)", content: <SeparatorMicroShowcase /> },
|
|
123
|
+
]}
|
|
124
|
+
/>
|
|
125
|
+
);
|
|
126
|
+
}
|
|
@@ -0,0 +1,566 @@
|
|
|
1
|
+
import { useDevContext } from "../../dev/components/dev-context";
|
|
2
|
+
import {
|
|
3
|
+
DocsCode,
|
|
4
|
+
DocsP,
|
|
5
|
+
ExampleGrid,
|
|
6
|
+
ExampleSection,
|
|
7
|
+
Showcase,
|
|
8
|
+
ShowcaseDocs,
|
|
9
|
+
} from "../../dev/components/showcase";
|
|
10
|
+
import { FilterIcon, PanelRightIcon, SettingsIcon } from "lucide-react";
|
|
11
|
+
import { useState } from "react";
|
|
12
|
+
|
|
13
|
+
import { Button } from "../../components/micro/button";
|
|
14
|
+
import { Input } from "../../components/micro/input";
|
|
15
|
+
import { Label } from "../../components/micro/label";
|
|
16
|
+
import {
|
|
17
|
+
Sheet,
|
|
18
|
+
SheetClose,
|
|
19
|
+
SheetContent,
|
|
20
|
+
SheetDescription,
|
|
21
|
+
SheetFooter,
|
|
22
|
+
SheetHeader,
|
|
23
|
+
SheetTitle,
|
|
24
|
+
SheetTrigger,
|
|
25
|
+
SheetPortal,
|
|
26
|
+
} from "../../components/micro/sheet";
|
|
27
|
+
import { type Size } from "../../lib/types";
|
|
28
|
+
|
|
29
|
+
// ──────────────────────────────────────────────────────────
|
|
30
|
+
// SECTION 2: Micro Content (không export)
|
|
31
|
+
// ──────────────────────────────────────────────────────────
|
|
32
|
+
function SheetMicroShowcase({ globalSize }: { globalSize: Size }) {
|
|
33
|
+
const [open, setOpen] = useState(false);
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<div className="space-y-10 mt-6">
|
|
37
|
+
{/* ── Sides ── */}
|
|
38
|
+
<ExampleSection
|
|
39
|
+
label="Hướng trượt (Side)"
|
|
40
|
+
description="Sheet có thể trượt ra từ bốn cạnh: right (mặc định), left, top, bottom."
|
|
41
|
+
codeString={`<Sheet>
|
|
42
|
+
<SheetTrigger render={<Button variant="outline" className="capitalize">right</Button>} />
|
|
43
|
+
<SheetPortal><SheetContent side="right">
|
|
44
|
+
<SheetHeader>
|
|
45
|
+
<SheetTitle>Edit Profile</SheetTitle>
|
|
46
|
+
<SheetDescription>
|
|
47
|
+
Thay đổi thông tin tài khoản của bạn và nhấn Lưu.
|
|
48
|
+
</SheetDescription>
|
|
49
|
+
</SheetHeader>
|
|
50
|
+
<div className="grid gap-4 py-4 px-4">
|
|
51
|
+
<div className="grid grid-cols-4 items-center gap-4">
|
|
52
|
+
<Label htmlFor="name-right" className="text-right">
|
|
53
|
+
Tên
|
|
54
|
+
</Label>
|
|
55
|
+
<Input id="name-right" defaultValue="Pedro Duarte" className="col-span-3" />
|
|
56
|
+
</div>
|
|
57
|
+
<div className="grid grid-cols-4 items-center gap-4">
|
|
58
|
+
<Label htmlFor="username-right" className="text-right">
|
|
59
|
+
Username
|
|
60
|
+
</Label>
|
|
61
|
+
<Input id="username-right" defaultValue="@peduarte" className="col-span-3" />
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
<SheetFooter>
|
|
65
|
+
<SheetClose render={<Button variant="outline" />}>
|
|
66
|
+
Huỷ
|
|
67
|
+
</SheetClose>
|
|
68
|
+
<Button>Lưu thay đổi</Button>
|
|
69
|
+
</SheetFooter>
|
|
70
|
+
</SheetContent></SheetPortal>
|
|
71
|
+
</Sheet>`}
|
|
72
|
+
>
|
|
73
|
+
<div className="grid grid-cols-2 gap-2">
|
|
74
|
+
{/* top */}
|
|
75
|
+
<Sheet>
|
|
76
|
+
<SheetTrigger
|
|
77
|
+
render={
|
|
78
|
+
<Button
|
|
79
|
+
variant="outline"
|
|
80
|
+
size={globalSize}
|
|
81
|
+
className="w-full"
|
|
82
|
+
/>
|
|
83
|
+
}
|
|
84
|
+
>
|
|
85
|
+
top
|
|
86
|
+
</SheetTrigger>
|
|
87
|
+
|
|
88
|
+
<SheetPortal>
|
|
89
|
+
<SheetContent side="top">
|
|
90
|
+
<SheetHeader>
|
|
91
|
+
<SheetTitle>Edit Profile</SheetTitle>
|
|
92
|
+
<SheetDescription>
|
|
93
|
+
Thay đổi thông tin tài khoản của bạn và nhấn Lưu.
|
|
94
|
+
</SheetDescription>
|
|
95
|
+
</SheetHeader>
|
|
96
|
+
<div className="grid gap-4 py-4 px-4">
|
|
97
|
+
<div className="grid grid-cols-4 items-center gap-4">
|
|
98
|
+
<Label htmlFor="name-top" className="text-right">
|
|
99
|
+
Tên
|
|
100
|
+
</Label>
|
|
101
|
+
<Input
|
|
102
|
+
id="name-top"
|
|
103
|
+
defaultValue="Pedro Duarte"
|
|
104
|
+
className="col-span-3"
|
|
105
|
+
/>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
<SheetFooter>
|
|
109
|
+
<SheetClose
|
|
110
|
+
render={<Button variant="outline" size={globalSize} />}
|
|
111
|
+
>
|
|
112
|
+
Huỷ
|
|
113
|
+
</SheetClose>
|
|
114
|
+
<Button size={globalSize}>Lưu thay đổi</Button>
|
|
115
|
+
</SheetFooter>
|
|
116
|
+
</SheetContent>
|
|
117
|
+
</SheetPortal>
|
|
118
|
+
</Sheet>
|
|
119
|
+
|
|
120
|
+
{/* right */}
|
|
121
|
+
<Sheet>
|
|
122
|
+
<SheetTrigger
|
|
123
|
+
render={
|
|
124
|
+
<Button
|
|
125
|
+
variant="outline"
|
|
126
|
+
size={globalSize}
|
|
127
|
+
className="w-full"
|
|
128
|
+
/>
|
|
129
|
+
}
|
|
130
|
+
>
|
|
131
|
+
right
|
|
132
|
+
</SheetTrigger>
|
|
133
|
+
|
|
134
|
+
<SheetPortal>
|
|
135
|
+
<SheetContent side="right">
|
|
136
|
+
<SheetHeader>
|
|
137
|
+
<SheetTitle>Edit Profile</SheetTitle>
|
|
138
|
+
<SheetDescription>
|
|
139
|
+
Thay đổi thông tin tài khoản của bạn và nhấn Lưu.
|
|
140
|
+
</SheetDescription>
|
|
141
|
+
</SheetHeader>
|
|
142
|
+
<div className="grid gap-4 py-4 px-4">
|
|
143
|
+
<div className="grid grid-cols-4 items-center gap-4">
|
|
144
|
+
<Label htmlFor="name-right" className="text-right">
|
|
145
|
+
Tên
|
|
146
|
+
</Label>
|
|
147
|
+
<Input
|
|
148
|
+
id="name-right"
|
|
149
|
+
defaultValue="Pedro Duarte"
|
|
150
|
+
className="col-span-3"
|
|
151
|
+
/>
|
|
152
|
+
</div>
|
|
153
|
+
<div className="grid grid-cols-4 items-center gap-4">
|
|
154
|
+
<Label htmlFor="username-right" className="text-right">
|
|
155
|
+
Username
|
|
156
|
+
</Label>
|
|
157
|
+
<Input
|
|
158
|
+
id="username-right"
|
|
159
|
+
defaultValue="@peduarte"
|
|
160
|
+
className="col-span-3"
|
|
161
|
+
/>
|
|
162
|
+
</div>
|
|
163
|
+
</div>
|
|
164
|
+
<SheetFooter>
|
|
165
|
+
<SheetClose
|
|
166
|
+
render={<Button variant="outline" size={globalSize} />}
|
|
167
|
+
>
|
|
168
|
+
Huỷ
|
|
169
|
+
</SheetClose>
|
|
170
|
+
<Button size={globalSize}>Lưu thay đổi</Button>
|
|
171
|
+
</SheetFooter>
|
|
172
|
+
</SheetContent>
|
|
173
|
+
</SheetPortal>
|
|
174
|
+
</Sheet>
|
|
175
|
+
|
|
176
|
+
{/* bottom */}
|
|
177
|
+
<Sheet>
|
|
178
|
+
<SheetTrigger
|
|
179
|
+
render={
|
|
180
|
+
<Button
|
|
181
|
+
variant="outline"
|
|
182
|
+
size={globalSize}
|
|
183
|
+
className="w-full"
|
|
184
|
+
/>
|
|
185
|
+
}
|
|
186
|
+
>
|
|
187
|
+
bottom
|
|
188
|
+
</SheetTrigger>
|
|
189
|
+
|
|
190
|
+
<SheetPortal>
|
|
191
|
+
<SheetContent side="bottom">
|
|
192
|
+
<SheetHeader>
|
|
193
|
+
<SheetTitle>Edit Profile</SheetTitle>
|
|
194
|
+
<SheetDescription>
|
|
195
|
+
Thay đổi thông tin tài khoản của bạn và nhấn Lưu.
|
|
196
|
+
</SheetDescription>
|
|
197
|
+
</SheetHeader>
|
|
198
|
+
<div className="grid gap-4 py-4 px-4">
|
|
199
|
+
<div className="grid grid-cols-4 items-center gap-4">
|
|
200
|
+
<Label htmlFor="name-bottom" className="text-right">
|
|
201
|
+
Tên
|
|
202
|
+
</Label>
|
|
203
|
+
<Input
|
|
204
|
+
id="name-bottom"
|
|
205
|
+
defaultValue="Pedro Duarte"
|
|
206
|
+
className="col-span-3"
|
|
207
|
+
/>
|
|
208
|
+
</div>
|
|
209
|
+
</div>
|
|
210
|
+
<SheetFooter>
|
|
211
|
+
<SheetClose
|
|
212
|
+
render={<Button variant="outline" size={globalSize} />}
|
|
213
|
+
>
|
|
214
|
+
Huỷ
|
|
215
|
+
</SheetClose>
|
|
216
|
+
<Button size={globalSize}>Lưu thay đổi</Button>
|
|
217
|
+
</SheetFooter>
|
|
218
|
+
</SheetContent>
|
|
219
|
+
</SheetPortal>
|
|
220
|
+
</Sheet>
|
|
221
|
+
|
|
222
|
+
{/* left */}
|
|
223
|
+
<Sheet>
|
|
224
|
+
<SheetTrigger
|
|
225
|
+
render={
|
|
226
|
+
<Button
|
|
227
|
+
variant="outline"
|
|
228
|
+
size={globalSize}
|
|
229
|
+
className="w-full"
|
|
230
|
+
/>
|
|
231
|
+
}
|
|
232
|
+
>
|
|
233
|
+
left
|
|
234
|
+
</SheetTrigger>
|
|
235
|
+
|
|
236
|
+
<SheetPortal>
|
|
237
|
+
<SheetContent side="left">
|
|
238
|
+
<SheetHeader>
|
|
239
|
+
<SheetTitle>Edit Profile</SheetTitle>
|
|
240
|
+
<SheetDescription>
|
|
241
|
+
Thay đổi thông tin tài khoản của bạn và nhấn Lưu.
|
|
242
|
+
</SheetDescription>
|
|
243
|
+
</SheetHeader>
|
|
244
|
+
<div className="grid gap-4 py-4 px-4">
|
|
245
|
+
<div className="grid grid-cols-4 items-center gap-4">
|
|
246
|
+
<Label htmlFor="name-left" className="text-right">
|
|
247
|
+
Tên
|
|
248
|
+
</Label>
|
|
249
|
+
<Input
|
|
250
|
+
id="name-left"
|
|
251
|
+
defaultValue="Pedro Duarte"
|
|
252
|
+
className="col-span-3"
|
|
253
|
+
/>
|
|
254
|
+
</div>
|
|
255
|
+
<div className="grid grid-cols-4 items-center gap-4">
|
|
256
|
+
<Label htmlFor="username-left" className="text-right">
|
|
257
|
+
Username
|
|
258
|
+
</Label>
|
|
259
|
+
<Input
|
|
260
|
+
id="username-left"
|
|
261
|
+
defaultValue="@peduarte"
|
|
262
|
+
className="col-span-3"
|
|
263
|
+
/>
|
|
264
|
+
</div>
|
|
265
|
+
</div>
|
|
266
|
+
<SheetFooter>
|
|
267
|
+
<SheetClose
|
|
268
|
+
render={<Button variant="outline" size={globalSize} />}
|
|
269
|
+
>
|
|
270
|
+
Huỷ
|
|
271
|
+
</SheetClose>
|
|
272
|
+
<Button size={globalSize}>Lưu thay đổi</Button>
|
|
273
|
+
</SheetFooter>
|
|
274
|
+
</SheetContent>
|
|
275
|
+
</SheetPortal>
|
|
276
|
+
</Sheet>
|
|
277
|
+
</div>
|
|
278
|
+
</ExampleSection>
|
|
279
|
+
|
|
280
|
+
{/* ── showCloseButton ── */}
|
|
281
|
+
<ExampleGrid>
|
|
282
|
+
<ExampleSection
|
|
283
|
+
label="Có nút đóng (mặc định)"
|
|
284
|
+
description="showCloseButton={true} — nút X tự động hiển thị ở góc trên phải."
|
|
285
|
+
codeString={`<Sheet>
|
|
286
|
+
<SheetTrigger render={<Button variant="outline" />}>
|
|
287
|
+
<PanelRightIcon />
|
|
288
|
+
Mở Sheet
|
|
289
|
+
</SheetTrigger>
|
|
290
|
+
<SheetPortal><SheetContent side="right">
|
|
291
|
+
<SheetHeader>
|
|
292
|
+
<SheetTitle>Có nút đóng</SheetTitle>
|
|
293
|
+
<SheetDescription>Nút X xuất hiện tự động.</SheetDescription>
|
|
294
|
+
</SheetHeader>
|
|
295
|
+
</SheetContent></SheetPortal>
|
|
296
|
+
</Sheet>`}
|
|
297
|
+
>
|
|
298
|
+
<Sheet>
|
|
299
|
+
<SheetTrigger
|
|
300
|
+
render={<Button variant="outline" size={globalSize} />}
|
|
301
|
+
>
|
|
302
|
+
<PanelRightIcon aria-hidden="true" />
|
|
303
|
+
Mở Sheet
|
|
304
|
+
</SheetTrigger>
|
|
305
|
+
|
|
306
|
+
<SheetPortal>
|
|
307
|
+
<SheetContent side="right">
|
|
308
|
+
<SheetHeader>
|
|
309
|
+
<SheetTitle>Có nút đóng</SheetTitle>
|
|
310
|
+
<SheetDescription>Nút X xuất hiện tự động.</SheetDescription>
|
|
311
|
+
</SheetHeader>
|
|
312
|
+
</SheetContent>
|
|
313
|
+
</SheetPortal>
|
|
314
|
+
</Sheet>
|
|
315
|
+
</ExampleSection>
|
|
316
|
+
|
|
317
|
+
<ExampleSection
|
|
318
|
+
label="Ẩn nút đóng"
|
|
319
|
+
description="showCloseButton={false} — dùng khi muốn tự control nút đóng bên trong nội dung."
|
|
320
|
+
codeString={`<Sheet>
|
|
321
|
+
<SheetTrigger render={<Button variant="outline" />}>
|
|
322
|
+
<PanelRightIcon />
|
|
323
|
+
Không có X
|
|
324
|
+
</SheetTrigger>
|
|
325
|
+
<SheetPortal><SheetContent side="right" showCloseButton={false}>
|
|
326
|
+
<SheetHeader>
|
|
327
|
+
<SheetTitle>Ẩn nút đóng</SheetTitle>
|
|
328
|
+
<SheetDescription>
|
|
329
|
+
Consumer tự render nút đóng trong footer.
|
|
330
|
+
</SheetDescription>
|
|
331
|
+
</SheetHeader>
|
|
332
|
+
<SheetFooter>
|
|
333
|
+
<SheetClose render={<Button variant="outline" className="w-full" />}>
|
|
334
|
+
Đóng thủ công
|
|
335
|
+
</SheetClose>
|
|
336
|
+
</SheetFooter>
|
|
337
|
+
</SheetContent></SheetPortal>
|
|
338
|
+
</Sheet>`}
|
|
339
|
+
>
|
|
340
|
+
<Sheet>
|
|
341
|
+
<SheetTrigger
|
|
342
|
+
render={<Button variant="outline" size={globalSize} />}
|
|
343
|
+
>
|
|
344
|
+
<PanelRightIcon aria-hidden="true" />
|
|
345
|
+
Không có X
|
|
346
|
+
</SheetTrigger>
|
|
347
|
+
|
|
348
|
+
<SheetPortal>
|
|
349
|
+
<SheetContent side="right" showCloseButton={false}>
|
|
350
|
+
<SheetHeader>
|
|
351
|
+
<SheetTitle>Ẩn nút đóng</SheetTitle>
|
|
352
|
+
<SheetDescription>
|
|
353
|
+
Consumer tự render nút đóng trong footer.
|
|
354
|
+
</SheetDescription>
|
|
355
|
+
</SheetHeader>
|
|
356
|
+
<SheetFooter>
|
|
357
|
+
<SheetClose
|
|
358
|
+
render={
|
|
359
|
+
<Button
|
|
360
|
+
variant="outline"
|
|
361
|
+
size={globalSize}
|
|
362
|
+
className="w-full"
|
|
363
|
+
/>
|
|
364
|
+
}
|
|
365
|
+
>
|
|
366
|
+
Đóng thủ công
|
|
367
|
+
</SheetClose>
|
|
368
|
+
</SheetFooter>
|
|
369
|
+
</SheetContent>
|
|
370
|
+
</SheetPortal>
|
|
371
|
+
</Sheet>
|
|
372
|
+
</ExampleSection>
|
|
373
|
+
</ExampleGrid>
|
|
374
|
+
|
|
375
|
+
{/* ── Controlled ── */}
|
|
376
|
+
<ExampleSection
|
|
377
|
+
label="Controlled State"
|
|
378
|
+
description="Quản lý trạng thái đóng/mở qua React state với open và onOpenChange."
|
|
379
|
+
codeString={`const [open, setOpen] = useState(false);
|
|
380
|
+
|
|
381
|
+
<div className="flex items-center gap-4">
|
|
382
|
+
<Sheet open={open} onOpenChange={setOpen}>
|
|
383
|
+
<SheetTrigger render={<Button variant="outline" />}>
|
|
384
|
+
<SettingsIcon />
|
|
385
|
+
Toggle Controlled
|
|
386
|
+
</SheetTrigger>
|
|
387
|
+
<SheetPortal><SheetContent side="right">
|
|
388
|
+
<SheetHeader>
|
|
389
|
+
<SheetTitle>Controlled Mode</SheetTitle>
|
|
390
|
+
<SheetDescription>
|
|
391
|
+
Sheet được điều khiển hoàn toàn bởi React state.
|
|
392
|
+
</SheetDescription>
|
|
393
|
+
</SheetHeader>
|
|
394
|
+
<SheetFooter>
|
|
395
|
+
<Button onClick={() => setOpen(false)}>
|
|
396
|
+
Đóng bằng state
|
|
397
|
+
</Button>
|
|
398
|
+
</SheetFooter>
|
|
399
|
+
</SheetContent></SheetPortal>
|
|
400
|
+
</Sheet>
|
|
401
|
+
<p className="text-sm text-muted-foreground">
|
|
402
|
+
Trạng thái:{" "}
|
|
403
|
+
<strong
|
|
404
|
+
data-active={open ? "" : undefined}
|
|
405
|
+
className="data-active:text-primary"
|
|
406
|
+
>
|
|
407
|
+
{open ? "Mở" : "Đóng"}
|
|
408
|
+
</strong>
|
|
409
|
+
</p>
|
|
410
|
+
</div>`}
|
|
411
|
+
>
|
|
412
|
+
<div className="flex items-center gap-4">
|
|
413
|
+
<Sheet open={open} onOpenChange={setOpen}>
|
|
414
|
+
<SheetTrigger
|
|
415
|
+
render={<Button variant="outline" size={globalSize} />}
|
|
416
|
+
>
|
|
417
|
+
<SettingsIcon aria-hidden="true" />
|
|
418
|
+
Toggle Controlled
|
|
419
|
+
</SheetTrigger>
|
|
420
|
+
|
|
421
|
+
<SheetPortal>
|
|
422
|
+
<SheetContent side="right">
|
|
423
|
+
<SheetHeader>
|
|
424
|
+
<SheetTitle>Controlled Mode</SheetTitle>
|
|
425
|
+
<SheetDescription>
|
|
426
|
+
Sheet được điều khiển hoàn toàn bởi React state.
|
|
427
|
+
</SheetDescription>
|
|
428
|
+
</SheetHeader>
|
|
429
|
+
<SheetFooter>
|
|
430
|
+
<Button size={globalSize} onClick={() => setOpen(false)}>
|
|
431
|
+
Đóng bằng state
|
|
432
|
+
</Button>
|
|
433
|
+
</SheetFooter>
|
|
434
|
+
</SheetContent>
|
|
435
|
+
</SheetPortal>
|
|
436
|
+
</Sheet>
|
|
437
|
+
<p className="text-sm text-muted-foreground">
|
|
438
|
+
Trạng thái:{" "}
|
|
439
|
+
<strong
|
|
440
|
+
data-active={open ? "" : undefined}
|
|
441
|
+
className="data-active:text-primary"
|
|
442
|
+
>
|
|
443
|
+
{open ? "Mở" : "Đóng"}
|
|
444
|
+
</strong>
|
|
445
|
+
</p>
|
|
446
|
+
</div>
|
|
447
|
+
</ExampleSection>
|
|
448
|
+
|
|
449
|
+
{/* ── Real-world: Filter Panel ── */}
|
|
450
|
+
<ExampleSection
|
|
451
|
+
label="Use case — Filter Panel"
|
|
452
|
+
description="Sheet dùng làm bảng lọc dữ liệu bên phải — pattern phổ biến trong dashboard, table view."
|
|
453
|
+
codeString={`<Sheet>
|
|
454
|
+
<SheetTrigger render={<Button variant="outline" />}>
|
|
455
|
+
<FilterIcon />
|
|
456
|
+
Lọc dữ liệu
|
|
457
|
+
</SheetTrigger>
|
|
458
|
+
<SheetPortal><SheetContent side="right">
|
|
459
|
+
<SheetHeader>
|
|
460
|
+
<SheetTitle>Bộ lọc</SheetTitle>
|
|
461
|
+
<SheetDescription>
|
|
462
|
+
Tinh chỉnh kết quả hiển thị theo điều kiện.
|
|
463
|
+
</SheetDescription>
|
|
464
|
+
</SheetHeader>
|
|
465
|
+
<div className="flex flex-col gap-4 p-4">
|
|
466
|
+
<div className="flex flex-col gap-2">
|
|
467
|
+
<Label htmlFor="filter-status">Trạng thái</Label>
|
|
468
|
+
<Input id="filter-status" placeholder="Tất cả" />
|
|
469
|
+
</div>
|
|
470
|
+
<div className="flex flex-col gap-2">
|
|
471
|
+
<Label htmlFor="filter-date-from">Từ ngày</Label>
|
|
472
|
+
<Input id="filter-date-from" type="date" />
|
|
473
|
+
</div>
|
|
474
|
+
<div className="flex flex-col gap-2">
|
|
475
|
+
<Label htmlFor="filter-date-to">Đến ngày</Label>
|
|
476
|
+
<Input id="filter-date-to" type="date" />
|
|
477
|
+
</div>
|
|
478
|
+
</div>
|
|
479
|
+
<SheetFooter>
|
|
480
|
+
<SheetClose render={<Button variant="outline" />}>
|
|
481
|
+
Xoá bộ lọc
|
|
482
|
+
</SheetClose>
|
|
483
|
+
<Button>Áp dụng</Button>
|
|
484
|
+
</SheetFooter>
|
|
485
|
+
</SheetContent></SheetPortal>
|
|
486
|
+
</Sheet>`}
|
|
487
|
+
>
|
|
488
|
+
<Sheet>
|
|
489
|
+
<SheetTrigger render={<Button variant="outline" size={globalSize} />}>
|
|
490
|
+
<FilterIcon aria-hidden="true" />
|
|
491
|
+
Lọc dữ liệu
|
|
492
|
+
</SheetTrigger>
|
|
493
|
+
|
|
494
|
+
<SheetPortal>
|
|
495
|
+
<SheetContent side="right">
|
|
496
|
+
<SheetHeader>
|
|
497
|
+
<SheetTitle>Bộ lọc</SheetTitle>
|
|
498
|
+
<SheetDescription>
|
|
499
|
+
Tinh chỉnh kết quả hiển thị theo điều kiện.
|
|
500
|
+
</SheetDescription>
|
|
501
|
+
</SheetHeader>
|
|
502
|
+
<div className="flex flex-col gap-4 p-4">
|
|
503
|
+
<div className="flex flex-col gap-2">
|
|
504
|
+
<Label htmlFor="filter-status">Trạng thái</Label>
|
|
505
|
+
<Input id="filter-status" placeholder="Tất cả" />
|
|
506
|
+
</div>
|
|
507
|
+
<div className="flex flex-col gap-2">
|
|
508
|
+
<Label htmlFor="filter-date-from">Từ ngày</Label>
|
|
509
|
+
<Input id="filter-date-from" type="date" />
|
|
510
|
+
</div>
|
|
511
|
+
<div className="flex flex-col gap-2">
|
|
512
|
+
<Label htmlFor="filter-date-to">Đến ngày</Label>
|
|
513
|
+
<Input id="filter-date-to" type="date" />
|
|
514
|
+
</div>
|
|
515
|
+
</div>
|
|
516
|
+
<SheetFooter>
|
|
517
|
+
<SheetClose
|
|
518
|
+
render={<Button variant="outline" size={globalSize} />}
|
|
519
|
+
>
|
|
520
|
+
Xoá bộ lọc
|
|
521
|
+
</SheetClose>
|
|
522
|
+
<Button size={globalSize}>Áp dụng</Button>
|
|
523
|
+
</SheetFooter>
|
|
524
|
+
</SheetContent>
|
|
525
|
+
</SheetPortal>
|
|
526
|
+
</Sheet>
|
|
527
|
+
</ExampleSection>
|
|
528
|
+
</div>
|
|
529
|
+
);
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
// ──────────────────────────────────────────────────────────
|
|
533
|
+
// SECTION 3: Entry point (export default)
|
|
534
|
+
// ──────────────────────────────────────────────────────────
|
|
535
|
+
export default function SheetShowcase() {
|
|
536
|
+
const { size: globalSize } = useDevContext();
|
|
537
|
+
return (
|
|
538
|
+
<Showcase
|
|
539
|
+
title="Sheet"
|
|
540
|
+
description="Panel trượt từ cạnh màn hình — mở rộng Dialog để hiển thị nội dung bổ sung mà không rời trang."
|
|
541
|
+
generalConcept={
|
|
542
|
+
<ShowcaseDocs>
|
|
543
|
+
<DocsP>
|
|
544
|
+
<DocsCode>Sheet</DocsCode> là một variant của Dialog, nhưng thay vì
|
|
545
|
+
hiện ở giữa màn hình, nó trượt ra từ một cạnh (right, left, top,
|
|
546
|
+
bottom). Phù hợp cho navigation drawer, filter panel, settings
|
|
547
|
+
sidebar, hay form chỉnh sửa.
|
|
548
|
+
</DocsP>
|
|
549
|
+
<DocsP>
|
|
550
|
+
<DocsCode>SheetContent</DocsCode> tự tích hợp{" "}
|
|
551
|
+
<DocsCode>Portal</DocsCode> và <DocsCode>Overlay</DocsCode> bên
|
|
552
|
+
trong. Prop <DocsCode>showCloseButton</DocsCode> cho phép bật/tắt
|
|
553
|
+
nút X tự động. Dùng <DocsCode>open</DocsCode> /{" "}
|
|
554
|
+
<DocsCode>onOpenChange</DocsCode> để controlled mode.
|
|
555
|
+
</DocsP>
|
|
556
|
+
</ShowcaseDocs>
|
|
557
|
+
}
|
|
558
|
+
tabs={[
|
|
559
|
+
{
|
|
560
|
+
label: "Micro (Primitive)",
|
|
561
|
+
content: <SheetMicroShowcase globalSize={globalSize} />,
|
|
562
|
+
},
|
|
563
|
+
]}
|
|
564
|
+
/>
|
|
565
|
+
);
|
|
566
|
+
}
|