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,756 @@
|
|
|
1
|
+
import { useDevContext } from "../../dev/components/dev-context";
|
|
2
|
+
import {
|
|
3
|
+
DocsCode,
|
|
4
|
+
DocsLi,
|
|
5
|
+
DocsP,
|
|
6
|
+
DocsUl,
|
|
7
|
+
ExampleGrid,
|
|
8
|
+
ExampleSection,
|
|
9
|
+
Showcase,
|
|
10
|
+
ShowcaseDocs,
|
|
11
|
+
} from "../../dev/components/showcase";
|
|
12
|
+
import {
|
|
13
|
+
CheckCircle2Icon,
|
|
14
|
+
InfoIcon,
|
|
15
|
+
TriangleAlertIcon,
|
|
16
|
+
XCircleIcon,
|
|
17
|
+
XIcon,
|
|
18
|
+
} from "lucide-react";
|
|
19
|
+
import { useState } from "react";
|
|
20
|
+
|
|
21
|
+
import { AlertPreset } from "../../components/macro/alert-preset";
|
|
22
|
+
import {
|
|
23
|
+
Alert,
|
|
24
|
+
AlertAction,
|
|
25
|
+
AlertDescription,
|
|
26
|
+
AlertIcon,
|
|
27
|
+
AlertTitle,
|
|
28
|
+
} from "../../components/micro/alert";
|
|
29
|
+
import { Button } from "../../components/micro/button";
|
|
30
|
+
import { type Size } from "../../lib/types";
|
|
31
|
+
|
|
32
|
+
// ──────────────────────────────────────────────────────────
|
|
33
|
+
// SECTION 1: Macro Content (không export)
|
|
34
|
+
// ──────────────────────────────────────────────────────────
|
|
35
|
+
function AlertMacroShowcase({ globalSize }: { globalSize: Size }) {
|
|
36
|
+
const [controlledOpen, setControlledOpen] = useState(true);
|
|
37
|
+
|
|
38
|
+
return (
|
|
39
|
+
<div className="space-y-10 mt-6">
|
|
40
|
+
<ExampleSection
|
|
41
|
+
label="Controlled vs Uncontrolled"
|
|
42
|
+
fullWidth
|
|
43
|
+
codeString={`<div className="space-y-4 px-2 py-4">
|
|
44
|
+
<DocsUl>
|
|
45
|
+
<DocsLi>
|
|
46
|
+
<b>Uncontrolled (Mặc định):</b> Nếu truyền{" "}
|
|
47
|
+
<DocsCode>dismissible=true</DocsCode>, component tự quản lý state
|
|
48
|
+
để tắt (ẩn) Alert khi click vào nút X.
|
|
49
|
+
</DocsLi>
|
|
50
|
+
<DocsLi>
|
|
51
|
+
<b>Controlled:</b> Có thể kiểm soát state đóng/mở thông qua React
|
|
52
|
+
state và truyền hàm vào <DocsCode>onDismiss</DocsCode>. Tuy nhiên
|
|
53
|
+
thông thường Alert chỉ bị huỷ (unmount), nên nếu bạn kiểm soát thì
|
|
54
|
+
hãy render nó có điều kiện bên ngoài.
|
|
55
|
+
</DocsLi>
|
|
56
|
+
</DocsUl>
|
|
57
|
+
</div>`}
|
|
58
|
+
>
|
|
59
|
+
<div className="space-y-4 px-2 py-4">
|
|
60
|
+
<DocsUl>
|
|
61
|
+
<DocsLi>
|
|
62
|
+
<b>Uncontrolled (Mặc định):</b> Nếu truyền{" "}
|
|
63
|
+
<DocsCode>dismissible=true</DocsCode>, component tự quản lý state
|
|
64
|
+
để tắt (ẩn) Alert khi click vào nút X.
|
|
65
|
+
</DocsLi>
|
|
66
|
+
<DocsLi>
|
|
67
|
+
<b>Controlled:</b> Có thể kiểm soát state đóng/mở thông qua React
|
|
68
|
+
state và truyền hàm vào <DocsCode>onDismiss</DocsCode>. Tuy nhiên
|
|
69
|
+
thông thường Alert chỉ bị huỷ (unmount), nên nếu bạn kiểm soát thì
|
|
70
|
+
hãy render nó có điều kiện bên ngoài.
|
|
71
|
+
</DocsLi>
|
|
72
|
+
</DocsUl>
|
|
73
|
+
</div>
|
|
74
|
+
</ExampleSection>
|
|
75
|
+
|
|
76
|
+
<ExampleGrid>
|
|
77
|
+
<ExampleSection
|
|
78
|
+
label="Tiêu chuẩn (Standard)"
|
|
79
|
+
description="Truyền props trực tiếp thay vì lồng children."
|
|
80
|
+
fullWidth
|
|
81
|
+
codeString={`<AlertPreset
|
|
82
|
+
color="info"
|
|
83
|
+
title="Có bản cập nhật mới"
|
|
84
|
+
description="Phiên bản 2.0.4 đã sẵn sàng để tải xuống."
|
|
85
|
+
icon={<InfoIcon />}
|
|
86
|
+
/>
|
|
87
|
+
`}
|
|
88
|
+
>
|
|
89
|
+
<AlertPreset
|
|
90
|
+
color="info"
|
|
91
|
+
size={globalSize}
|
|
92
|
+
title="Có bản cập nhật mới"
|
|
93
|
+
description="Phiên bản 2.0.4 đã sẵn sàng để tải xuống."
|
|
94
|
+
icon={<InfoIcon />}
|
|
95
|
+
/>
|
|
96
|
+
</ExampleSection>
|
|
97
|
+
|
|
98
|
+
<ExampleSection
|
|
99
|
+
label="Tự Đóng (Dismissible)"
|
|
100
|
+
description="Thêm dismissible=true để hiển thị nút [X]. Thử bấm vào nút X bên dưới."
|
|
101
|
+
fullWidth
|
|
102
|
+
codeString={`<AlertPreset
|
|
103
|
+
color="warning"
|
|
104
|
+
title="Phiên bản sắp hết hạn"
|
|
105
|
+
description="Phiên đăng nhập của bạn sẽ hết hạn trong 5 phút."
|
|
106
|
+
icon={<TriangleAlertIcon />}
|
|
107
|
+
dismissible
|
|
108
|
+
/>
|
|
109
|
+
`}
|
|
110
|
+
>
|
|
111
|
+
<AlertPreset
|
|
112
|
+
color="warning"
|
|
113
|
+
size={globalSize}
|
|
114
|
+
title="Phiên bản sắp hết hạn"
|
|
115
|
+
description="Phiên đăng nhập của bạn sẽ hết hạn trong 5 phút."
|
|
116
|
+
icon={<TriangleAlertIcon />}
|
|
117
|
+
dismissible
|
|
118
|
+
/>
|
|
119
|
+
</ExampleSection>
|
|
120
|
+
</ExampleGrid>
|
|
121
|
+
|
|
122
|
+
<ExampleGrid>
|
|
123
|
+
<ExampleSection
|
|
124
|
+
label="Controlled"
|
|
125
|
+
description="Quản lý trạng thái đóng mở thông qua state bên ngoài bằng React (Conditional Rendering)."
|
|
126
|
+
fullWidth
|
|
127
|
+
codeString={`const [controlledOpen, setControlledOpen] = useState(true);
|
|
128
|
+
return (
|
|
129
|
+
<>
|
|
130
|
+
<div className="mb-4">
|
|
131
|
+
<Button size="sm" variant="outline" onClick={() => setControlledOpen(true)} disabled={controlledOpen}>
|
|
132
|
+
Mở lại Alert
|
|
133
|
+
</Button>
|
|
134
|
+
</div>
|
|
135
|
+
{controlledOpen && (
|
|
136
|
+
<AlertPreset
|
|
137
|
+
color="destructive"
|
|
138
|
+
size="${globalSize}"
|
|
139
|
+
title="Bảo trì hệ thống"
|
|
140
|
+
description="Hệ thống sẽ tạm ngừng hoạt động để bảo trì vào lúc nửa đêm."
|
|
141
|
+
icon={<TriangleAlertIcon />}
|
|
142
|
+
dismissible
|
|
143
|
+
onDismiss={() => setControlledOpen(false)}
|
|
144
|
+
/>
|
|
145
|
+
)}
|
|
146
|
+
</>
|
|
147
|
+
);`}
|
|
148
|
+
>
|
|
149
|
+
<div className="flex w-full flex-col gap-3">
|
|
150
|
+
<div className="flex items-center justify-between">
|
|
151
|
+
<p className="text-xs text-muted-foreground">
|
|
152
|
+
State:{" "}
|
|
153
|
+
<code className="rounded bg-muted px-1.5 py-0.5 text-xs font-mono">
|
|
154
|
+
{controlledOpen ? "true" : "false"}
|
|
155
|
+
</code>
|
|
156
|
+
</p>
|
|
157
|
+
<Button
|
|
158
|
+
size="sm"
|
|
159
|
+
variant="outline"
|
|
160
|
+
className="h-7 text-xs"
|
|
161
|
+
onClick={() => setControlledOpen(true)}
|
|
162
|
+
disabled={controlledOpen}
|
|
163
|
+
>
|
|
164
|
+
Mở lại Alert
|
|
165
|
+
</Button>
|
|
166
|
+
</div>
|
|
167
|
+
{controlledOpen && (
|
|
168
|
+
<AlertPreset
|
|
169
|
+
color="destructive"
|
|
170
|
+
size={globalSize}
|
|
171
|
+
title="Bảo trì hệ thống"
|
|
172
|
+
description="Hệ thống sẽ tạm ngừng hoạt động để bảo trì vào lúc nửa đêm."
|
|
173
|
+
icon={<TriangleAlertIcon />}
|
|
174
|
+
dismissible
|
|
175
|
+
onDismiss={() => setControlledOpen(false)}
|
|
176
|
+
/>
|
|
177
|
+
)}
|
|
178
|
+
</div>
|
|
179
|
+
</ExampleSection>
|
|
180
|
+
|
|
181
|
+
<ExampleSection
|
|
182
|
+
label="Nội Dung Phức Tạp (Complex Content)"
|
|
183
|
+
description="Có thể truyền ReactNode hoặc thay thế toàn bộ bằng thẻ children."
|
|
184
|
+
codeString={`<div className="flex w-full flex-col gap-4 max-w-xl">
|
|
185
|
+
<AlertPreset
|
|
186
|
+
color="success"
|
|
187
|
+
title="Thanh toán thành công"
|
|
188
|
+
icon={<CheckCircle2Icon />}
|
|
189
|
+
dismissible
|
|
190
|
+
action={
|
|
191
|
+
<Button
|
|
192
|
+
size="sm"
|
|
193
|
+
variant="outline"
|
|
194
|
+
className="h-7 px-2 text-xs"
|
|
195
|
+
>
|
|
196
|
+
Xem biên lai
|
|
197
|
+
</Button>
|
|
198
|
+
}
|
|
199
|
+
>
|
|
200
|
+
<p className="text-sm mt-1 text-success/90">
|
|
201
|
+
Hoá đơn #1234 của bạn đã được thanh toán hoàn tất.
|
|
202
|
+
</p>
|
|
203
|
+
</AlertPreset>
|
|
204
|
+
</div>
|
|
205
|
+
`}
|
|
206
|
+
>
|
|
207
|
+
<div className="flex w-full flex-col gap-4 max-w-xl">
|
|
208
|
+
<AlertPreset
|
|
209
|
+
color="success"
|
|
210
|
+
size={globalSize}
|
|
211
|
+
title="Thanh toán thành công"
|
|
212
|
+
icon={<CheckCircle2Icon />}
|
|
213
|
+
dismissible
|
|
214
|
+
action={
|
|
215
|
+
<Button
|
|
216
|
+
size="sm"
|
|
217
|
+
variant="outline"
|
|
218
|
+
className="h-7 px-2 text-xs"
|
|
219
|
+
>
|
|
220
|
+
Xem biên lai
|
|
221
|
+
</Button>
|
|
222
|
+
}
|
|
223
|
+
>
|
|
224
|
+
<p className="text-sm mt-1 text-success/90">
|
|
225
|
+
Hoá đơn #1234 của bạn đã được thanh toán hoàn tất.
|
|
226
|
+
</p>
|
|
227
|
+
</AlertPreset>
|
|
228
|
+
</div>
|
|
229
|
+
</ExampleSection>
|
|
230
|
+
</ExampleGrid>
|
|
231
|
+
</div>
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// ──────────────────────────────────────────────────────────
|
|
236
|
+
// SECTION 2: Micro Content (không export)
|
|
237
|
+
// ──────────────────────────────────────────────────────────
|
|
238
|
+
function AlertMicroShowcase({ globalSize }: { globalSize: Size }) {
|
|
239
|
+
return (
|
|
240
|
+
<div className="space-y-10 mt-6">
|
|
241
|
+
{/* ── Semantic Colors ──────────────────────── */}
|
|
242
|
+
<ExampleSection
|
|
243
|
+
label="Màu Sắc Ngữ Nghĩa (Semantic Colors)"
|
|
244
|
+
description="Mỗi màu sắc truyền đạt một mức độ khẩn cấp hoặc ý nghĩa khác nhau."
|
|
245
|
+
fullWidth
|
|
246
|
+
codeString={`<Alert color="info" className="flex items-start">
|
|
247
|
+
<AlertIcon render={<InfoIcon />} className="mt-0.5 shrink-0" />
|
|
248
|
+
<div className="flex-1 space-y-0.5">
|
|
249
|
+
<AlertTitle>Có bản cập nhật mới</AlertTitle>
|
|
250
|
+
<AlertDescription>
|
|
251
|
+
Phiên bản 2.0.4 đã sẵn sàng để tải xuống. Hãy cập nhật để trải
|
|
252
|
+
nghiệm tính năng mới.
|
|
253
|
+
</AlertDescription>
|
|
254
|
+
</div>
|
|
255
|
+
</Alert>
|
|
256
|
+
|
|
257
|
+
<Alert color="success" className="flex items-start">
|
|
258
|
+
<AlertIcon
|
|
259
|
+
render={<CheckCircle2Icon />}
|
|
260
|
+
className="mt-0.5 shrink-0"
|
|
261
|
+
/>
|
|
262
|
+
<div className="flex-1 space-y-0.5">
|
|
263
|
+
<AlertTitle>Đã lưu thành công</AlertTitle>
|
|
264
|
+
<AlertDescription>
|
|
265
|
+
Các thay đổi của bạn đã được đồng bộ lên đám mây.
|
|
266
|
+
</AlertDescription>
|
|
267
|
+
</div>
|
|
268
|
+
</Alert>
|
|
269
|
+
|
|
270
|
+
<Alert color="warning" className="flex items-start">
|
|
271
|
+
<AlertIcon
|
|
272
|
+
render={<TriangleAlertIcon />}
|
|
273
|
+
className="mt-0.5 shrink-0"
|
|
274
|
+
/>
|
|
275
|
+
<div className="flex-1 space-y-0.5">
|
|
276
|
+
<AlertTitle>Phiên bản sắp hết hạn</AlertTitle>
|
|
277
|
+
<AlertDescription>
|
|
278
|
+
Phiên đăng nhập của bạn sẽ hết hạn trong 5 phút nữa. Vui lòng lưu
|
|
279
|
+
lại công việc.
|
|
280
|
+
</AlertDescription>
|
|
281
|
+
</div>
|
|
282
|
+
</Alert>
|
|
283
|
+
|
|
284
|
+
<Alert
|
|
285
|
+
color="destructive"
|
|
286
|
+
className="flex items-start"
|
|
287
|
+
>
|
|
288
|
+
<AlertIcon render={<XCircleIcon />} className="mt-0.5 shrink-0" />
|
|
289
|
+
<div className="flex-1 space-y-0.5">
|
|
290
|
+
<AlertTitle>Kết nối thất bại</AlertTitle>
|
|
291
|
+
<AlertDescription>
|
|
292
|
+
Không thể kết nối đến cơ sở dữ liệu. Vui lòng kiểm tra lại đường
|
|
293
|
+
truyền mạng.
|
|
294
|
+
</AlertDescription>
|
|
295
|
+
</div>
|
|
296
|
+
</Alert>
|
|
297
|
+
`}
|
|
298
|
+
>
|
|
299
|
+
<Alert color="info" size={globalSize} className="flex items-start">
|
|
300
|
+
<AlertIcon render={<InfoIcon />} className="mt-0.5 shrink-0" />
|
|
301
|
+
<div className="flex-1 space-y-0.5">
|
|
302
|
+
<AlertTitle>Có bản cập nhật mới</AlertTitle>
|
|
303
|
+
<AlertDescription>
|
|
304
|
+
Phiên bản 2.0.4 đã sẵn sàng để tải xuống. Hãy cập nhật để trải
|
|
305
|
+
nghiệm tính năng mới.
|
|
306
|
+
</AlertDescription>
|
|
307
|
+
</div>
|
|
308
|
+
</Alert>
|
|
309
|
+
|
|
310
|
+
<Alert color="success" size={globalSize} className="flex items-start">
|
|
311
|
+
<AlertIcon
|
|
312
|
+
render={<CheckCircle2Icon />}
|
|
313
|
+
className="mt-0.5 shrink-0"
|
|
314
|
+
/>
|
|
315
|
+
<div className="flex-1 space-y-0.5">
|
|
316
|
+
<AlertTitle>Đã lưu thành công</AlertTitle>
|
|
317
|
+
<AlertDescription>
|
|
318
|
+
Các thay đổi của bạn đã được đồng bộ lên đám mây.
|
|
319
|
+
</AlertDescription>
|
|
320
|
+
</div>
|
|
321
|
+
</Alert>
|
|
322
|
+
|
|
323
|
+
<Alert color="warning" size={globalSize} className="flex items-start">
|
|
324
|
+
<AlertIcon
|
|
325
|
+
render={<TriangleAlertIcon />}
|
|
326
|
+
className="mt-0.5 shrink-0"
|
|
327
|
+
/>
|
|
328
|
+
<div className="flex-1 space-y-0.5">
|
|
329
|
+
<AlertTitle>Phiên bản sắp hết hạn</AlertTitle>
|
|
330
|
+
<AlertDescription>
|
|
331
|
+
Phiên đăng nhập của bạn sẽ hết hạn trong 5 phút nữa. Vui lòng lưu
|
|
332
|
+
lại công việc.
|
|
333
|
+
</AlertDescription>
|
|
334
|
+
</div>
|
|
335
|
+
</Alert>
|
|
336
|
+
|
|
337
|
+
<Alert
|
|
338
|
+
color="destructive"
|
|
339
|
+
size={globalSize}
|
|
340
|
+
className="flex items-start"
|
|
341
|
+
>
|
|
342
|
+
<AlertIcon render={<XCircleIcon />} className="mt-0.5 shrink-0" />
|
|
343
|
+
<div className="flex-1 space-y-0.5">
|
|
344
|
+
<AlertTitle>Kết nối thất bại</AlertTitle>
|
|
345
|
+
<AlertDescription>
|
|
346
|
+
Không thể kết nối đến cơ sở dữ liệu. Vui lòng kiểm tra lại đường
|
|
347
|
+
truyền mạng.
|
|
348
|
+
</AlertDescription>
|
|
349
|
+
</div>
|
|
350
|
+
</Alert>
|
|
351
|
+
</ExampleSection>
|
|
352
|
+
|
|
353
|
+
<ExampleGrid>
|
|
354
|
+
{/* ── Default (no color) ───────────────────── */}
|
|
355
|
+
<ExampleSection
|
|
356
|
+
label="Cơ bản (Basic)"
|
|
357
|
+
description="Hiển thị Alert với màu sắc mặc định (info)."
|
|
358
|
+
fullWidth
|
|
359
|
+
codeString={`<Alert className="flex items-start">
|
|
360
|
+
<AlertIcon render={<InfoIcon />} className="mt-0.5 shrink-0" />
|
|
361
|
+
<div className="flex-1 space-y-0.5">
|
|
362
|
+
<AlertTitle>Chú ý!</AlertTitle>
|
|
363
|
+
<AlertDescription>
|
|
364
|
+
Bạn có thể thêm các component vào dự án bằng cách sử dụng CLI.
|
|
365
|
+
</AlertDescription>
|
|
366
|
+
</div>
|
|
367
|
+
</Alert>
|
|
368
|
+
`}
|
|
369
|
+
>
|
|
370
|
+
<Alert size={globalSize} className="flex items-start">
|
|
371
|
+
<AlertIcon render={<InfoIcon />} className="mt-0.5 shrink-0" />
|
|
372
|
+
<div className="flex-1 space-y-0.5">
|
|
373
|
+
<AlertTitle>Chú ý!</AlertTitle>
|
|
374
|
+
<AlertDescription>
|
|
375
|
+
Bạn có thể thêm các component vào dự án bằng cách sử dụng CLI.
|
|
376
|
+
</AlertDescription>
|
|
377
|
+
</div>
|
|
378
|
+
</Alert>
|
|
379
|
+
</ExampleSection>
|
|
380
|
+
|
|
381
|
+
{/* ── With Action ───────────────────── */}
|
|
382
|
+
<ExampleSection
|
|
383
|
+
label="Có Nút Hành Động (With Action)"
|
|
384
|
+
description="Alert kèm theo một nút tắt (dismiss) được đặt ở góc trên bên phải."
|
|
385
|
+
fullWidth
|
|
386
|
+
codeString={`<Alert
|
|
387
|
+
color="info"
|
|
388
|
+
className="flex items-start relative"
|
|
389
|
+
>
|
|
390
|
+
<AlertIcon render={<InfoIcon />} className="mt-0.5 shrink-0" />
|
|
391
|
+
<div className="flex-1 space-y-0.5 pr-8">
|
|
392
|
+
<AlertTitle>Tính năng mới</AlertTitle>
|
|
393
|
+
<AlertDescription>
|
|
394
|
+
Hãy khám phá trang thống kê dashboard hoàn toàn mới của chúng
|
|
395
|
+
tôi.
|
|
396
|
+
</AlertDescription>
|
|
397
|
+
</div>
|
|
398
|
+
<AlertAction className="absolute right-1 top-1">
|
|
399
|
+
<Button
|
|
400
|
+
variant="ghost"
|
|
401
|
+
size="sm"
|
|
402
|
+
className="size-6 p-0 group-data-[size=sm]/alert:size-5 group-data-[size=lg]/alert:size-7"
|
|
403
|
+
>
|
|
404
|
+
<XIcon className="size-3.5 group-data-[size=sm]/alert:size-3 group-data-[size=lg]/alert:size-4" />
|
|
405
|
+
</Button>
|
|
406
|
+
</AlertAction>
|
|
407
|
+
</Alert>
|
|
408
|
+
`}
|
|
409
|
+
>
|
|
410
|
+
<Alert
|
|
411
|
+
color="info"
|
|
412
|
+
size={globalSize}
|
|
413
|
+
className="flex items-start relative"
|
|
414
|
+
>
|
|
415
|
+
<AlertIcon render={<InfoIcon />} className="mt-0.5 shrink-0" />
|
|
416
|
+
<div className="flex-1 space-y-0.5 pr-8">
|
|
417
|
+
<AlertTitle>Tính năng mới</AlertTitle>
|
|
418
|
+
<AlertDescription>
|
|
419
|
+
Hãy khám phá trang thống kê dashboard hoàn toàn mới của chúng
|
|
420
|
+
tôi.
|
|
421
|
+
</AlertDescription>
|
|
422
|
+
</div>
|
|
423
|
+
<AlertAction className="absolute right-1 top-1">
|
|
424
|
+
<Button
|
|
425
|
+
variant="ghost"
|
|
426
|
+
size="sm"
|
|
427
|
+
className="size-6 p-0 group-data-[size=sm]/alert:size-5 group-data-[size=lg]/alert:size-7"
|
|
428
|
+
iconOnly
|
|
429
|
+
>
|
|
430
|
+
<XIcon className="size-3.5 group-data-[size=sm]/alert:size-3 group-data-[size=lg]/alert:size-4" />
|
|
431
|
+
</Button>
|
|
432
|
+
</AlertAction>
|
|
433
|
+
</Alert>
|
|
434
|
+
</ExampleSection>
|
|
435
|
+
</ExampleGrid>
|
|
436
|
+
|
|
437
|
+
{/* ── Minimal (no title) ───────────────────── */}
|
|
438
|
+
<ExampleSection
|
|
439
|
+
label="Tối Giản (Minimal)"
|
|
440
|
+
description="Alert chỉ có nội dung mô tả, không có tiêu đề."
|
|
441
|
+
fullWidth
|
|
442
|
+
codeString={`<Alert color="info" className="flex items-start">
|
|
443
|
+
<AlertIcon render={<InfoIcon />} className="mt-0.5 shrink-0" />
|
|
444
|
+
<AlertDescription className="flex-1">
|
|
445
|
+
Bạn có thể thêm các component vào dự án bằng cách sử dụng CLI.
|
|
446
|
+
</AlertDescription>
|
|
447
|
+
</Alert>
|
|
448
|
+
<Alert color="warning" className="flex items-start">
|
|
449
|
+
<AlertIcon
|
|
450
|
+
render={<TriangleAlertIcon />}
|
|
451
|
+
className="mt-0.5 shrink-0"
|
|
452
|
+
/>
|
|
453
|
+
<AlertDescription className="flex-1">
|
|
454
|
+
Bản dùng thử của bạn sẽ hết hạn trong 3 ngày nữa.
|
|
455
|
+
</AlertDescription>
|
|
456
|
+
</Alert>
|
|
457
|
+
`}
|
|
458
|
+
>
|
|
459
|
+
<Alert color="info" size={globalSize} className="flex items-start">
|
|
460
|
+
<AlertIcon render={<InfoIcon />} className="mt-0.5 shrink-0" />
|
|
461
|
+
<AlertDescription className="flex-1">
|
|
462
|
+
Bạn có thể thêm các component vào dự án bằng cách sử dụng CLI.
|
|
463
|
+
</AlertDescription>
|
|
464
|
+
</Alert>
|
|
465
|
+
<Alert color="warning" size={globalSize} className="flex items-start">
|
|
466
|
+
<AlertIcon
|
|
467
|
+
render={<TriangleAlertIcon />}
|
|
468
|
+
className="mt-0.5 shrink-0"
|
|
469
|
+
/>
|
|
470
|
+
<AlertDescription className="flex-1">
|
|
471
|
+
Bản dùng thử của bạn sẽ hết hạn trong 3 ngày nữa.
|
|
472
|
+
</AlertDescription>
|
|
473
|
+
</Alert>
|
|
474
|
+
</ExampleSection>
|
|
475
|
+
|
|
476
|
+
{/* ── Text Only (no icon) ───────────────────── */}
|
|
477
|
+
<ExampleSection
|
|
478
|
+
label="Chỉ Có Chữ (Text Only)"
|
|
479
|
+
description="Alert đơn giản không có icon — layout tự nhiên."
|
|
480
|
+
fullWidth
|
|
481
|
+
codeString={`<Alert
|
|
482
|
+
color="success"
|
|
483
|
+
className="flex flex-col gap-0.5"
|
|
484
|
+
>
|
|
485
|
+
<AlertTitle>Thanh toán thành công</AlertTitle>
|
|
486
|
+
<AlertDescription>
|
|
487
|
+
Hoá đơn #1234 của bạn đã được thanh toán hoàn tất.
|
|
488
|
+
</AlertDescription>
|
|
489
|
+
</Alert>
|
|
490
|
+
<Alert
|
|
491
|
+
color="destructive"
|
|
492
|
+
className="flex flex-col gap-0.5"
|
|
493
|
+
>
|
|
494
|
+
<AlertTitle>Tài khoản bị khoá</AlertTitle>
|
|
495
|
+
<AlertDescription>
|
|
496
|
+
Vui lòng liên hệ với bộ phận hỗ trợ để mở khoá tài khoản.
|
|
497
|
+
</AlertDescription>
|
|
498
|
+
</Alert>
|
|
499
|
+
`}
|
|
500
|
+
>
|
|
501
|
+
<Alert
|
|
502
|
+
color="success"
|
|
503
|
+
size={globalSize}
|
|
504
|
+
className="flex flex-col gap-0.5"
|
|
505
|
+
>
|
|
506
|
+
<AlertTitle>Thanh toán thành công</AlertTitle>
|
|
507
|
+
<AlertDescription>
|
|
508
|
+
Hoá đơn #1234 của bạn đã được thanh toán hoàn tất.
|
|
509
|
+
</AlertDescription>
|
|
510
|
+
</Alert>
|
|
511
|
+
<Alert
|
|
512
|
+
color="destructive"
|
|
513
|
+
size={globalSize}
|
|
514
|
+
className="flex flex-col gap-0.5"
|
|
515
|
+
>
|
|
516
|
+
<AlertTitle>Tài khoản bị khoá</AlertTitle>
|
|
517
|
+
<AlertDescription>
|
|
518
|
+
Vui lòng liên hệ với bộ phận hỗ trợ để mở khoá tài khoản.
|
|
519
|
+
</AlertDescription>
|
|
520
|
+
</Alert>
|
|
521
|
+
</ExampleSection>
|
|
522
|
+
|
|
523
|
+
{/* ── Use Case Comparison ─────────────────────── */}
|
|
524
|
+
<ExampleSection
|
|
525
|
+
label="🧭 Use Case Comparison"
|
|
526
|
+
description="Các kịch bản thực tế giúp bạn quyết định nên dùng Micro hay Macro."
|
|
527
|
+
fullWidth
|
|
528
|
+
codeString={`<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
|
|
529
|
+
{/* ── Story 1: Macro wins ── */}
|
|
530
|
+
<div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
|
|
531
|
+
<div className="flex items-start gap-3">
|
|
532
|
+
<span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
|
|
533
|
+
<CheckCircle2Icon className="size-4" aria-hidden="true" />
|
|
534
|
+
</span>
|
|
535
|
+
<div>
|
|
536
|
+
<p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
|
|
537
|
+
Story 1 · Dùng Macro
|
|
538
|
+
</p>
|
|
539
|
+
<h3 className="mt-0.5 text-sm font-semibold text-foreground">
|
|
540
|
+
Thông báo chuẩn, cho phép tự đóng
|
|
541
|
+
</h3>
|
|
542
|
+
</div>
|
|
543
|
+
</div>
|
|
544
|
+
|
|
545
|
+
<p className="text-xs text-muted-foreground leading-relaxed">
|
|
546
|
+
Phần lớn các cảnh báo trong ứng dụng đều đi kèm Icon, Tiêu đề, Nội
|
|
547
|
+
dung, và nút X để tự tắt (Dismiss). Dùng Macro sẽ tiết kiệm cực kỳ
|
|
548
|
+
nhiều code.
|
|
549
|
+
</p>
|
|
550
|
+
|
|
551
|
+
<div className="rounded-lg bg-muted/50 p-3">
|
|
552
|
+
<AlertPreset
|
|
553
|
+
color="info"
|
|
554
|
+
size="sm"
|
|
555
|
+
title="Có bản cập nhật mới"
|
|
556
|
+
description="Phiên bản 2.0.4 đã sẵn sàng để tải xuống."
|
|
557
|
+
icon={<InfoIcon />}
|
|
558
|
+
dismissible
|
|
559
|
+
/>
|
|
560
|
+
</div>
|
|
561
|
+
|
|
562
|
+
<div className="rounded-md border border-border border-green-500/20 bg-green-500/5 px-3 py-2">
|
|
563
|
+
<p className="text-xs font-medium text-green-700 dark:text-green-400">
|
|
564
|
+
✅ Dùng <code className="font-mono">AlertPreset</code> — Prop{" "}
|
|
565
|
+
<code className="font-mono">dismissible</code> tự động xử lý
|
|
566
|
+
state tắt Alert.
|
|
567
|
+
</p>
|
|
568
|
+
</div>
|
|
569
|
+
</div>
|
|
570
|
+
|
|
571
|
+
{/* ── Story 2: Micro wins ── */}
|
|
572
|
+
<div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
|
|
573
|
+
<div className="flex items-start gap-3">
|
|
574
|
+
<span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
|
|
575
|
+
<CheckCircle2Icon className="size-4" aria-hidden="true" />
|
|
576
|
+
</span>
|
|
577
|
+
<div>
|
|
578
|
+
<p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
|
|
579
|
+
Story 2 · Dùng Micro
|
|
580
|
+
</p>
|
|
581
|
+
<h3 className="mt-0.5 text-sm font-semibold text-foreground">
|
|
582
|
+
Giao diện Alert không theo chuẩn
|
|
583
|
+
</h3>
|
|
584
|
+
</div>
|
|
585
|
+
</div>
|
|
586
|
+
|
|
587
|
+
<p className="text-xs text-muted-foreground leading-relaxed">
|
|
588
|
+
Khi bạn cần tạo một Alert với layout đặc biệt, ví dụ như không có
|
|
589
|
+
icon, hoặc muốn chèn form vào giữa. Macro sẽ bị hạn chế vì đã chốt
|
|
590
|
+
sẵn layout Flexbox ngang.
|
|
591
|
+
</p>
|
|
592
|
+
|
|
593
|
+
<div className="rounded-lg bg-muted/50 p-3">
|
|
594
|
+
<Alert
|
|
595
|
+
color="warning"
|
|
596
|
+
size="sm"
|
|
597
|
+
className="flex flex-col gap-0.5"
|
|
598
|
+
>
|
|
599
|
+
<AlertTitle>Bản dùng thử hết hạn</AlertTitle>
|
|
600
|
+
<AlertDescription>
|
|
601
|
+
Chỉ còn 3 ngày nữa. Vui lòng thanh toán!
|
|
602
|
+
</AlertDescription>
|
|
603
|
+
<Button
|
|
604
|
+
variant="soft"
|
|
605
|
+
color="warning"
|
|
606
|
+
size="sm"
|
|
607
|
+
className="mt-2 w-fit"
|
|
608
|
+
>
|
|
609
|
+
Nâng Cấp Ngay
|
|
610
|
+
</Button>
|
|
611
|
+
</Alert>
|
|
612
|
+
</div>
|
|
613
|
+
|
|
614
|
+
<div className="rounded-md border border-border border-blue-500/20 bg-blue-500/5 px-3 py-2">
|
|
615
|
+
<p className="text-xs font-medium text-blue-700 dark:text-blue-400">
|
|
616
|
+
✅ Dùng <code className="font-mono">Alert</code> (Micro) — Bạn
|
|
617
|
+
tự viết class <code className="font-mono">flex-col</code>, tự
|
|
618
|
+
chèn nội dung thoải mái.
|
|
619
|
+
</p>
|
|
620
|
+
</div>
|
|
621
|
+
</div>
|
|
622
|
+
</div>
|
|
623
|
+
`}
|
|
624
|
+
>
|
|
625
|
+
<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
|
|
626
|
+
{/* ── Story 1: Macro wins ── */}
|
|
627
|
+
<div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
|
|
628
|
+
<div className="flex items-start gap-3">
|
|
629
|
+
<span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
|
|
630
|
+
<CheckCircle2Icon className="size-4" aria-hidden="true" />
|
|
631
|
+
</span>
|
|
632
|
+
<div>
|
|
633
|
+
<p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
|
|
634
|
+
Story 1 · Dùng Macro
|
|
635
|
+
</p>
|
|
636
|
+
<h3 className="mt-0.5 text-sm font-semibold text-foreground">
|
|
637
|
+
Thông báo chuẩn, cho phép tự đóng
|
|
638
|
+
</h3>
|
|
639
|
+
</div>
|
|
640
|
+
</div>
|
|
641
|
+
|
|
642
|
+
<p className="text-xs text-muted-foreground leading-relaxed">
|
|
643
|
+
Phần lớn các cảnh báo trong ứng dụng đều đi kèm Icon, Tiêu đề, Nội
|
|
644
|
+
dung, và nút X để tự tắt (Dismiss). Dùng Macro sẽ tiết kiệm cực kỳ
|
|
645
|
+
nhiều code.
|
|
646
|
+
</p>
|
|
647
|
+
|
|
648
|
+
<div className="rounded-lg bg-muted/50 p-3">
|
|
649
|
+
<AlertPreset
|
|
650
|
+
color="info"
|
|
651
|
+
size="sm"
|
|
652
|
+
title="Có bản cập nhật mới"
|
|
653
|
+
description="Phiên bản 2.0.4 đã sẵn sàng để tải xuống."
|
|
654
|
+
icon={<InfoIcon />}
|
|
655
|
+
dismissible
|
|
656
|
+
/>
|
|
657
|
+
</div>
|
|
658
|
+
|
|
659
|
+
<div className="rounded-md border border-border border-green-500/20 bg-green-500/5 px-3 py-2">
|
|
660
|
+
<p className="text-xs font-medium text-green-700 dark:text-green-400">
|
|
661
|
+
✅ Dùng <code className="font-mono">AlertPreset</code> — Prop{" "}
|
|
662
|
+
<code className="font-mono">dismissible</code> tự động xử lý
|
|
663
|
+
state tắt Alert.
|
|
664
|
+
</p>
|
|
665
|
+
</div>
|
|
666
|
+
</div>
|
|
667
|
+
|
|
668
|
+
{/* ── Story 2: Micro wins ── */}
|
|
669
|
+
<div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
|
|
670
|
+
<div className="flex items-start gap-3">
|
|
671
|
+
<span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
|
|
672
|
+
<CheckCircle2Icon className="size-4" aria-hidden="true" />
|
|
673
|
+
</span>
|
|
674
|
+
<div>
|
|
675
|
+
<p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
|
|
676
|
+
Story 2 · Dùng Micro
|
|
677
|
+
</p>
|
|
678
|
+
<h3 className="mt-0.5 text-sm font-semibold text-foreground">
|
|
679
|
+
Giao diện Alert không theo chuẩn
|
|
680
|
+
</h3>
|
|
681
|
+
</div>
|
|
682
|
+
</div>
|
|
683
|
+
|
|
684
|
+
<p className="text-xs text-muted-foreground leading-relaxed">
|
|
685
|
+
Khi bạn cần tạo một Alert với layout đặc biệt, ví dụ như không có
|
|
686
|
+
icon, hoặc muốn chèn form vào giữa. Macro sẽ bị hạn chế vì đã chốt
|
|
687
|
+
sẵn layout Flexbox ngang.
|
|
688
|
+
</p>
|
|
689
|
+
|
|
690
|
+
<div className="rounded-lg bg-muted/50 p-3">
|
|
691
|
+
<Alert
|
|
692
|
+
color="warning"
|
|
693
|
+
size="sm"
|
|
694
|
+
className="flex flex-col gap-0.5"
|
|
695
|
+
>
|
|
696
|
+
<AlertTitle>Bản dùng thử hết hạn</AlertTitle>
|
|
697
|
+
<AlertDescription>
|
|
698
|
+
Chỉ còn 3 ngày nữa. Vui lòng thanh toán!
|
|
699
|
+
</AlertDescription>
|
|
700
|
+
<Button
|
|
701
|
+
variant="soft"
|
|
702
|
+
color="warning"
|
|
703
|
+
size="sm"
|
|
704
|
+
className="mt-2 w-fit"
|
|
705
|
+
>
|
|
706
|
+
Nâng Cấp Ngay
|
|
707
|
+
</Button>
|
|
708
|
+
</Alert>
|
|
709
|
+
</div>
|
|
710
|
+
|
|
711
|
+
<div className="rounded-md border border-border border-blue-500/20 bg-blue-500/5 px-3 py-2">
|
|
712
|
+
<p className="text-xs font-medium text-blue-700 dark:text-blue-400">
|
|
713
|
+
✅ Dùng <code className="font-mono">Alert</code> (Micro) — Bạn
|
|
714
|
+
tự viết class <code className="font-mono">flex-col</code>, tự
|
|
715
|
+
chèn nội dung thoải mái.
|
|
716
|
+
</p>
|
|
717
|
+
</div>
|
|
718
|
+
</div>
|
|
719
|
+
</div>
|
|
720
|
+
</ExampleSection>
|
|
721
|
+
</div>
|
|
722
|
+
);
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
// ──────────────────────────────────────────────────────────
|
|
726
|
+
// SECTION 3: Entry point (export default)
|
|
727
|
+
// ──────────────────────────────────────────────────────────
|
|
728
|
+
export default function AlertShowcase() {
|
|
729
|
+
const { size: globalSize } = useDevContext();
|
|
730
|
+
return (
|
|
731
|
+
<Showcase
|
|
732
|
+
title="Alert"
|
|
733
|
+
description="Hiển thị một thông báo nổi bật để thu hút sự chú ý của người dùng."
|
|
734
|
+
generalConcept={
|
|
735
|
+
<ShowcaseDocs>
|
|
736
|
+
<DocsP>
|
|
737
|
+
Dùng để hiển thị một thông báo quan trọng thu hút sự chú ý của người
|
|
738
|
+
dùng (ví dụ: lỗi, cảnh báo, hoặc thông báo thành công). Không nên
|
|
739
|
+
dùng Alert cho các thông báo mang tính tạm thời tự biến mất (hãy
|
|
740
|
+
dùng Toast/Sonner).
|
|
741
|
+
</DocsP>
|
|
742
|
+
</ShowcaseDocs>
|
|
743
|
+
}
|
|
744
|
+
tabs={[
|
|
745
|
+
{
|
|
746
|
+
label: "Micro (Primitive)",
|
|
747
|
+
content: <AlertMicroShowcase globalSize={globalSize} />,
|
|
748
|
+
},
|
|
749
|
+
{
|
|
750
|
+
label: "Macro (Preset)",
|
|
751
|
+
content: <AlertMacroShowcase globalSize={globalSize} />,
|
|
752
|
+
},
|
|
753
|
+
]}
|
|
754
|
+
/>
|
|
755
|
+
);
|
|
756
|
+
}
|