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,530 @@
|
|
|
1
|
+
import { useDevContext } from "../../dev/components/dev-context";
|
|
2
|
+
import {
|
|
3
|
+
DocsCode,
|
|
4
|
+
DocsH3,
|
|
5
|
+
DocsLi,
|
|
6
|
+
DocsP,
|
|
7
|
+
DocsUl,
|
|
8
|
+
ExampleGrid,
|
|
9
|
+
ExampleSection,
|
|
10
|
+
Showcase,
|
|
11
|
+
ShowcaseDocs,
|
|
12
|
+
} from "../../dev/components/showcase";
|
|
13
|
+
import { LinkIcon, SearchIcon } from "lucide-react";
|
|
14
|
+
import { useState } from "react";
|
|
15
|
+
|
|
16
|
+
import {
|
|
17
|
+
Field,
|
|
18
|
+
FieldContent,
|
|
19
|
+
FieldDescription,
|
|
20
|
+
FieldError,
|
|
21
|
+
FieldLabel,
|
|
22
|
+
} from "../../components/micro/field";
|
|
23
|
+
import { Input } from "../../components/micro/input";
|
|
24
|
+
import {
|
|
25
|
+
InputGroup,
|
|
26
|
+
InputGroupAddon,
|
|
27
|
+
InputGroupInput,
|
|
28
|
+
InputGroupText,
|
|
29
|
+
} from "../../components/micro/input-group";
|
|
30
|
+
import { type Size } from "../../lib/types";
|
|
31
|
+
|
|
32
|
+
import { InputPreset } from "../../components/macro/input-preset";
|
|
33
|
+
|
|
34
|
+
// ──────────────────────────────────────────────────────────
|
|
35
|
+
// SECTION 1: Macro Content
|
|
36
|
+
// ──────────────────────────────────────────────────────────
|
|
37
|
+
function InputMacroShowcase({ globalSize }: { globalSize: Size }) {
|
|
38
|
+
return (
|
|
39
|
+
<div className="space-y-10 mt-6">
|
|
40
|
+
<ExampleGrid>
|
|
41
|
+
<ExampleSection
|
|
42
|
+
label="Tiêu chuẩn"
|
|
43
|
+
description="Trường nhập văn bản hoàn chỉnh có nhãn và mô tả."
|
|
44
|
+
codeString={`<InputPreset
|
|
45
|
+
size="${globalSize}"
|
|
46
|
+
label="Tên đăng nhập"
|
|
47
|
+
description="Đây sẽ là tên hiển thị công khai của bạn."
|
|
48
|
+
placeholder="johndoe"
|
|
49
|
+
className="w-full"
|
|
50
|
+
/>
|
|
51
|
+
`}
|
|
52
|
+
>
|
|
53
|
+
<InputPreset
|
|
54
|
+
size={globalSize}
|
|
55
|
+
label="Tên đăng nhập"
|
|
56
|
+
description="Đây sẽ là tên hiển thị công khai của bạn."
|
|
57
|
+
placeholder="johndoe"
|
|
58
|
+
className="w-full"
|
|
59
|
+
/>
|
|
60
|
+
</ExampleSection>
|
|
61
|
+
|
|
62
|
+
<ExampleSection
|
|
63
|
+
label="Lỗi xác thực (Validation Error)"
|
|
64
|
+
description="Hiển thị thông báo lỗi và viền đỏ báo hiệu khi truyền errorMessage."
|
|
65
|
+
codeString={`<InputPreset
|
|
66
|
+
size="${globalSize}"
|
|
67
|
+
label="Mật khẩu"
|
|
68
|
+
type="password"
|
|
69
|
+
placeholder="Nhập mật khẩu..."
|
|
70
|
+
errorMessage="Mật khẩu phải chứa ít nhất 8 ký tự."
|
|
71
|
+
className="w-full"
|
|
72
|
+
/>
|
|
73
|
+
`}
|
|
74
|
+
>
|
|
75
|
+
<InputPreset
|
|
76
|
+
size={globalSize}
|
|
77
|
+
label="Mật khẩu"
|
|
78
|
+
type="password"
|
|
79
|
+
placeholder="Nhập mật khẩu..."
|
|
80
|
+
errorMessage="Mật khẩu phải chứa ít nhất 8 ký tự."
|
|
81
|
+
className="w-full"
|
|
82
|
+
/>
|
|
83
|
+
</ExampleSection>
|
|
84
|
+
</ExampleGrid>
|
|
85
|
+
|
|
86
|
+
<ExampleGrid>
|
|
87
|
+
<ExampleSection
|
|
88
|
+
label="Với Tiền tố / Hậu tố (Adornments)"
|
|
89
|
+
description="Tự động bọc bằng InputGroup, có thể truyền chuỗi hoặc icon."
|
|
90
|
+
codeString={`<InputPreset
|
|
91
|
+
size="${globalSize}"
|
|
92
|
+
label="Website URL"
|
|
93
|
+
type="url"
|
|
94
|
+
placeholder="example"
|
|
95
|
+
startAdornment="https://"
|
|
96
|
+
endAdornment=".com"
|
|
97
|
+
className="w-full"
|
|
98
|
+
/>
|
|
99
|
+
`}
|
|
100
|
+
>
|
|
101
|
+
<InputPreset
|
|
102
|
+
size={globalSize}
|
|
103
|
+
label="Website URL"
|
|
104
|
+
type="url"
|
|
105
|
+
placeholder="example"
|
|
106
|
+
startAdornment="https://"
|
|
107
|
+
endAdornment=".com"
|
|
108
|
+
className="w-full"
|
|
109
|
+
/>
|
|
110
|
+
</ExampleSection>
|
|
111
|
+
|
|
112
|
+
<ExampleSection
|
|
113
|
+
label="Khóa / Bất hoạt (Disabled)"
|
|
114
|
+
description="Người dùng không thể tương tác với form."
|
|
115
|
+
codeString={`<InputPreset
|
|
116
|
+
size="${globalSize}"
|
|
117
|
+
label="Tên dự án"
|
|
118
|
+
description="Tên dự án không thể thay đổi sau khi khởi tạo."
|
|
119
|
+
defaultValue="my-awesome-project"
|
|
120
|
+
disabled
|
|
121
|
+
className="w-full"
|
|
122
|
+
/>
|
|
123
|
+
`}
|
|
124
|
+
>
|
|
125
|
+
<InputPreset
|
|
126
|
+
size={globalSize}
|
|
127
|
+
label="Tên dự án"
|
|
128
|
+
description="Tên dự án không thể thay đổi sau khi khởi tạo."
|
|
129
|
+
defaultValue="my-awesome-project"
|
|
130
|
+
disabled
|
|
131
|
+
className="w-full"
|
|
132
|
+
/>
|
|
133
|
+
</ExampleSection>
|
|
134
|
+
</ExampleGrid>
|
|
135
|
+
|
|
136
|
+
<ExampleSection
|
|
137
|
+
label="Thực tế sử dụng (Real-world Snippets)"
|
|
138
|
+
description="Tuỳ biến Label với ReactNode để tạo các nhãn phức tạp."
|
|
139
|
+
fullWidth
|
|
140
|
+
codeString={`<InputPreset
|
|
141
|
+
size="${globalSize}"
|
|
142
|
+
label={
|
|
143
|
+
<span className="flex items-center gap-2">
|
|
144
|
+
Mã API (API Key) <span className="rounded bg-destructive/20 px-1.5 py-0.5 text-[10px] font-semibold text-destructive uppercase">Bảo mật</span>
|
|
145
|
+
</span>
|
|
146
|
+
}
|
|
147
|
+
type="password"
|
|
148
|
+
description="Tuyệt đối không chia sẻ mã này với bất kỳ ai."
|
|
149
|
+
defaultValue="sk_test_1234567890abcdef"
|
|
150
|
+
className="w-full"
|
|
151
|
+
/>
|
|
152
|
+
|
|
153
|
+
<InputPreset
|
|
154
|
+
size="${globalSize}"
|
|
155
|
+
label="Tìm kiếm nhanh"
|
|
156
|
+
placeholder="Gõ từ khoá..."
|
|
157
|
+
startAdornment={<SearchIcon className="size-4" />}
|
|
158
|
+
endAdornment={
|
|
159
|
+
<kbd className="pointer-events-none inline-flex h-5 select-none items-center gap-1 rounded border border-border bg-muted px-1.5 font-mono text-[10px] font-medium text-muted-foreground">
|
|
160
|
+
<span className="text-xs">⌘</span>K
|
|
161
|
+
</kbd>
|
|
162
|
+
}
|
|
163
|
+
className="w-full"
|
|
164
|
+
/>`}
|
|
165
|
+
>
|
|
166
|
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
|
167
|
+
<InputPreset
|
|
168
|
+
size={globalSize}
|
|
169
|
+
label={
|
|
170
|
+
<span className="flex items-center gap-2">
|
|
171
|
+
Mã API (API Key){" "}
|
|
172
|
+
<span className="rounded bg-destructive/20 px-1.5 py-0.5 text-[10px] font-semibold text-destructive uppercase">
|
|
173
|
+
Bảo mật
|
|
174
|
+
</span>
|
|
175
|
+
</span>
|
|
176
|
+
}
|
|
177
|
+
type="password"
|
|
178
|
+
description="Tuyệt đối không chia sẻ mã này với bất kỳ ai."
|
|
179
|
+
defaultValue="sk_test_1234567890abcdef"
|
|
180
|
+
className="w-full"
|
|
181
|
+
/>
|
|
182
|
+
|
|
183
|
+
<InputPreset
|
|
184
|
+
size={globalSize}
|
|
185
|
+
label="Tìm kiếm nhanh"
|
|
186
|
+
placeholder="Gõ từ khoá..."
|
|
187
|
+
startAdornment={<SearchIcon className="size-4" />}
|
|
188
|
+
endAdornment={
|
|
189
|
+
<kbd className="pointer-events-none inline-flex h-5 select-none items-center gap-1 rounded border border-border bg-muted px-1.5 font-mono text-[10px] font-medium text-muted-foreground">
|
|
190
|
+
<span className="text-xs">⌘</span>K
|
|
191
|
+
</kbd>
|
|
192
|
+
}
|
|
193
|
+
className="w-full"
|
|
194
|
+
/>
|
|
195
|
+
</div>
|
|
196
|
+
</ExampleSection>
|
|
197
|
+
</div>
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// ──────────────────────────────────────────────────────────
|
|
202
|
+
// SECTION 2: Micro Content
|
|
203
|
+
// ──────────────────────────────────────────────────────────
|
|
204
|
+
function InputMicroShowcase({ globalSize }: { globalSize: Size }) {
|
|
205
|
+
return (
|
|
206
|
+
<div className="space-y-10 mt-6">
|
|
207
|
+
<ExampleGrid>
|
|
208
|
+
<ExampleSection
|
|
209
|
+
label="Cơ bản (Primitive)"
|
|
210
|
+
description="Thẻ input đơn giản không có nhãn."
|
|
211
|
+
codeString={`<Input
|
|
212
|
+
size="${globalSize}"
|
|
213
|
+
placeholder="Nhập địa chỉ email..."
|
|
214
|
+
className="w-full"
|
|
215
|
+
/>
|
|
216
|
+
`}
|
|
217
|
+
>
|
|
218
|
+
<Input
|
|
219
|
+
size={globalSize}
|
|
220
|
+
placeholder="Nhập địa chỉ email..."
|
|
221
|
+
className="w-full"
|
|
222
|
+
/>
|
|
223
|
+
</ExampleSection>
|
|
224
|
+
|
|
225
|
+
<ExampleSection
|
|
226
|
+
label="Ghép nối với Field"
|
|
227
|
+
description="Lắp ráp thủ công các thành phần Field để tạo form control."
|
|
228
|
+
codeString={`<Field size="${globalSize}" className="w-full">
|
|
229
|
+
<FieldLabel htmlFor="tf-input">Email</FieldLabel>
|
|
230
|
+
<FieldDescription>
|
|
231
|
+
Chúng tôi sẽ không bao giờ chia sẻ email của bạn.
|
|
232
|
+
</FieldDescription>
|
|
233
|
+
<FieldContent>
|
|
234
|
+
<Input
|
|
235
|
+
id="tf-input"
|
|
236
|
+
size="${globalSize}"
|
|
237
|
+
placeholder="you@example.com"
|
|
238
|
+
/>
|
|
239
|
+
</FieldContent>
|
|
240
|
+
</Field>
|
|
241
|
+
`}
|
|
242
|
+
>
|
|
243
|
+
<Field size={globalSize} className="w-full">
|
|
244
|
+
<FieldLabel htmlFor="tf-input">Email</FieldLabel>
|
|
245
|
+
<FieldDescription>
|
|
246
|
+
Chúng tôi sẽ không bao giờ chia sẻ email của bạn.
|
|
247
|
+
</FieldDescription>
|
|
248
|
+
<FieldContent>
|
|
249
|
+
<Input
|
|
250
|
+
id="tf-input"
|
|
251
|
+
size={globalSize}
|
|
252
|
+
placeholder="you@example.com"
|
|
253
|
+
/>
|
|
254
|
+
</FieldContent>
|
|
255
|
+
</Field>
|
|
256
|
+
</ExampleSection>
|
|
257
|
+
</ExampleGrid>
|
|
258
|
+
|
|
259
|
+
<ExampleGrid>
|
|
260
|
+
<ExampleSection
|
|
261
|
+
label="Trạng thái Lỗi (Error)"
|
|
262
|
+
description="Sử dụng thuộc tính aria-invalid để báo lỗi."
|
|
263
|
+
codeString={`<Field size="${globalSize}" className="w-full">
|
|
264
|
+
<FieldLabel htmlFor="tf-error">Tên tài khoản</FieldLabel>
|
|
265
|
+
<FieldContent>
|
|
266
|
+
<Input
|
|
267
|
+
id="tf-error"
|
|
268
|
+
size="${globalSize}"
|
|
269
|
+
defaultValue="admin!@#"
|
|
270
|
+
aria-invalid="true"
|
|
271
|
+
/>
|
|
272
|
+
</FieldContent>
|
|
273
|
+
<FieldError>
|
|
274
|
+
Tên tài khoản không được chứa ký tự đặc biệt.
|
|
275
|
+
</FieldError>
|
|
276
|
+
</Field>
|
|
277
|
+
`}
|
|
278
|
+
>
|
|
279
|
+
<Field size={globalSize} className="w-full">
|
|
280
|
+
<FieldLabel htmlFor="tf-error">Tên tài khoản</FieldLabel>
|
|
281
|
+
<FieldContent>
|
|
282
|
+
<Input
|
|
283
|
+
id="tf-error"
|
|
284
|
+
size={globalSize}
|
|
285
|
+
defaultValue="admin!@#"
|
|
286
|
+
aria-invalid="true"
|
|
287
|
+
/>
|
|
288
|
+
</FieldContent>
|
|
289
|
+
<FieldError>
|
|
290
|
+
Tên tài khoản không được chứa ký tự đặc biệt.
|
|
291
|
+
</FieldError>
|
|
292
|
+
</Field>
|
|
293
|
+
</ExampleSection>
|
|
294
|
+
|
|
295
|
+
<ExampleSection
|
|
296
|
+
label="Input Group"
|
|
297
|
+
description="Ghép nối với các Addon linh hoạt (Slot tuỳ ý)."
|
|
298
|
+
codeString={`<Field size="${globalSize}" className="w-full">
|
|
299
|
+
<FieldLabel htmlFor="tf-group">Trang cá nhân</FieldLabel>
|
|
300
|
+
<FieldContent>
|
|
301
|
+
<InputGroup size="${globalSize}">
|
|
302
|
+
<InputGroupAddon>
|
|
303
|
+
<LinkIcon className="size-4 text-muted-foreground" />
|
|
304
|
+
</InputGroupAddon>
|
|
305
|
+
<InputGroupAddon>
|
|
306
|
+
<InputGroupText>github.com/</InputGroupText>
|
|
307
|
+
</InputGroupAddon>
|
|
308
|
+
<InputGroupInput id="tf-group" placeholder="username" />
|
|
309
|
+
</InputGroup>
|
|
310
|
+
</FieldContent>
|
|
311
|
+
</Field>
|
|
312
|
+
`}
|
|
313
|
+
>
|
|
314
|
+
<Field size={globalSize} className="w-full">
|
|
315
|
+
<FieldLabel htmlFor="tf-group">Trang cá nhân</FieldLabel>
|
|
316
|
+
<FieldContent>
|
|
317
|
+
<InputGroup size={globalSize}>
|
|
318
|
+
<InputGroupAddon>
|
|
319
|
+
<LinkIcon className="size-4 text-muted-foreground" />
|
|
320
|
+
</InputGroupAddon>
|
|
321
|
+
<InputGroupAddon>
|
|
322
|
+
<InputGroupText>github.com/</InputGroupText>
|
|
323
|
+
</InputGroupAddon>
|
|
324
|
+
<InputGroupInput id="tf-group" placeholder="username" />
|
|
325
|
+
</InputGroup>
|
|
326
|
+
</FieldContent>
|
|
327
|
+
</Field>
|
|
328
|
+
</ExampleSection>
|
|
329
|
+
</ExampleGrid>
|
|
330
|
+
<ExampleSection
|
|
331
|
+
label="Input Kiểu Tệp (File)"
|
|
332
|
+
description="Input có hỗ trợ style gốc cho type file."
|
|
333
|
+
codeString={`<Input size="${globalSize}" type="file" className="w-full pt-0.5" />
|
|
334
|
+
`}
|
|
335
|
+
>
|
|
336
|
+
<Input size={globalSize} type="file" className="w-full pt-0.5" />
|
|
337
|
+
</ExampleSection>
|
|
338
|
+
|
|
339
|
+
<ExampleSection
|
|
340
|
+
label="Khóa (Disabled)"
|
|
341
|
+
description="Trạng thái không thể tương tác."
|
|
342
|
+
codeString={`<Input
|
|
343
|
+
size="${globalSize}"
|
|
344
|
+
disabled
|
|
345
|
+
defaultValue="Chỉ đọc"
|
|
346
|
+
className="w-full"
|
|
347
|
+
/>
|
|
348
|
+
`}
|
|
349
|
+
>
|
|
350
|
+
<Input
|
|
351
|
+
size={globalSize}
|
|
352
|
+
disabled
|
|
353
|
+
defaultValue="Chỉ đọc"
|
|
354
|
+
className="w-full"
|
|
355
|
+
/>
|
|
356
|
+
</ExampleSection>
|
|
357
|
+
<ExampleSection
|
|
358
|
+
label="🧭 Use Case Comparison"
|
|
359
|
+
description="So sánh nhanh khi nào dùng Micro và Macro."
|
|
360
|
+
fullWidth
|
|
361
|
+
codeString={`<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
|
|
362
|
+
{/* Story 1: Macro wins */}
|
|
363
|
+
<div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
|
|
364
|
+
<div className="flex items-start gap-3">
|
|
365
|
+
<span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
|
|
366
|
+
<svg xmlns="http://www.w3.org/2000/svg" className="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>
|
|
367
|
+
</span>
|
|
368
|
+
<div>
|
|
369
|
+
<p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">Story 1 · Dùng Macro</p>
|
|
370
|
+
<h3 className="mt-0.5 text-sm font-semibold text-foreground">Form nhập liệu tiêu chuẩn</h3>
|
|
371
|
+
</div>
|
|
372
|
+
</div>
|
|
373
|
+
<p className="text-xs text-muted-foreground leading-relaxed">
|
|
374
|
+
Khi bạn cần một trường nhập liệu đầy đủ nhãn (Label), mô tả (Description), báo lỗi (Error) mà không muốn phải lắp ráp thủ công bằng <DocsCode>Field</DocsCode>.
|
|
375
|
+
</p>
|
|
376
|
+
</div>
|
|
377
|
+
|
|
378
|
+
{/* Story 2: Micro wins */}
|
|
379
|
+
<div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
|
|
380
|
+
<div className="flex items-start gap-3">
|
|
381
|
+
<span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
|
|
382
|
+
<svg xmlns="http://www.w3.org/2000/svg" className="size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"/></svg>
|
|
383
|
+
</span>
|
|
384
|
+
<div>
|
|
385
|
+
<p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">Story 2 · Dùng Micro</p>
|
|
386
|
+
<h3 className="mt-0.5 text-sm font-semibold text-foreground">Input nằm trong Navbar hoặc Toolbar</h3>
|
|
387
|
+
</div>
|
|
388
|
+
</div>
|
|
389
|
+
<p className="text-xs text-muted-foreground leading-relaxed">
|
|
390
|
+
Chỉ cần một thẻ <DocsCode>Input</DocsCode> đơn giản để tìm kiếm nhanh, không cần nhãn hay mô tả cầu kỳ, hoặc khi phải nhúng nó vào một component phức tạp khác.
|
|
391
|
+
</p>
|
|
392
|
+
</div>
|
|
393
|
+
</div>`}
|
|
394
|
+
>
|
|
395
|
+
<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
|
|
396
|
+
<div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
|
|
397
|
+
<div className="flex items-start gap-3">
|
|
398
|
+
<span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
|
|
399
|
+
<svg
|
|
400
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
401
|
+
className="size-4"
|
|
402
|
+
viewBox="0 0 24 24"
|
|
403
|
+
fill="none"
|
|
404
|
+
stroke="currentColor"
|
|
405
|
+
strokeWidth="2"
|
|
406
|
+
strokeLinecap="round"
|
|
407
|
+
strokeLinejoin="round"
|
|
408
|
+
aria-hidden="true"
|
|
409
|
+
>
|
|
410
|
+
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" />
|
|
411
|
+
</svg>
|
|
412
|
+
</span>
|
|
413
|
+
<div>
|
|
414
|
+
<p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
|
|
415
|
+
Story 1 · Dùng Macro
|
|
416
|
+
</p>
|
|
417
|
+
<h3 className="mt-0.5 text-sm font-semibold text-foreground">
|
|
418
|
+
Form nhập liệu tiêu chuẩn
|
|
419
|
+
</h3>
|
|
420
|
+
</div>
|
|
421
|
+
</div>
|
|
422
|
+
<p className="text-xs text-muted-foreground leading-relaxed">
|
|
423
|
+
Khi bạn cần một trường nhập liệu đầy đủ nhãn (Label), mô tả
|
|
424
|
+
(Description), báo lỗi (Error) mà không muốn phải lắp ráp thủ công
|
|
425
|
+
bằng <DocsCode>Field</DocsCode>.
|
|
426
|
+
</p>
|
|
427
|
+
</div>
|
|
428
|
+
|
|
429
|
+
<div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
|
|
430
|
+
<div className="flex items-start gap-3">
|
|
431
|
+
<span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
|
|
432
|
+
<svg
|
|
433
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
434
|
+
className="size-4"
|
|
435
|
+
viewBox="0 0 24 24"
|
|
436
|
+
fill="none"
|
|
437
|
+
stroke="currentColor"
|
|
438
|
+
strokeWidth="2"
|
|
439
|
+
strokeLinecap="round"
|
|
440
|
+
strokeLinejoin="round"
|
|
441
|
+
aria-hidden="true"
|
|
442
|
+
>
|
|
443
|
+
<path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z" />
|
|
444
|
+
</svg>
|
|
445
|
+
</span>
|
|
446
|
+
<div>
|
|
447
|
+
<p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
|
|
448
|
+
Story 2 · Dùng Micro
|
|
449
|
+
</p>
|
|
450
|
+
<h3 className="mt-0.5 text-sm font-semibold text-foreground">
|
|
451
|
+
Input nằm trong Navbar hoặc Toolbar
|
|
452
|
+
</h3>
|
|
453
|
+
</div>
|
|
454
|
+
</div>
|
|
455
|
+
<p className="text-xs text-muted-foreground leading-relaxed">
|
|
456
|
+
Chỉ cần một thẻ <DocsCode>Input</DocsCode> đơn giản để tìm kiếm
|
|
457
|
+
nhanh, không cần nhãn hay mô tả cầu kỳ, hoặc khi phải nhúng nó vào
|
|
458
|
+
một component phức tạp khác.
|
|
459
|
+
</p>
|
|
460
|
+
</div>
|
|
461
|
+
</div>
|
|
462
|
+
</ExampleSection>
|
|
463
|
+
</div>
|
|
464
|
+
);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
// ──────────────────────────────────────────────────────────
|
|
468
|
+
export default function InputShowcase() {
|
|
469
|
+
const { size: globalSize } = useDevContext();
|
|
470
|
+
return (
|
|
471
|
+
<Showcase
|
|
472
|
+
title="Input"
|
|
473
|
+
description="Trường nhập văn bản cho phép người dùng điền dữ liệu."
|
|
474
|
+
generalConcept={
|
|
475
|
+
<ShowcaseDocs>
|
|
476
|
+
<DocsH3>Khi nào nên dùng Macro</DocsH3>
|
|
477
|
+
<DocsP>
|
|
478
|
+
Bản Macro (<DocsCode>InputPreset</DocsCode>) đóng gói sẵn toàn bộ
|
|
479
|
+
các thành phần thường thấy của một Form Control: Nhãn (Label), Mô tả
|
|
480
|
+
(Description), Lỗi (Error Message) và phần trang trí (Adornments).
|
|
481
|
+
Việc này giúp giảm thiểu lượng code lặp đi lặp lại khi xây dựng
|
|
482
|
+
form.
|
|
483
|
+
</DocsP>
|
|
484
|
+
|
|
485
|
+
<DocsH3>Tự động hoá Layout (Macro)</DocsH3>
|
|
486
|
+
<DocsUl>
|
|
487
|
+
<DocsLi>
|
|
488
|
+
Tự động bọc Input vào trong <DocsCode>InputGroup</DocsCode> nếu
|
|
489
|
+
bạn truyền <DocsCode>startAdornment</DocsCode> hoặc{" "}
|
|
490
|
+
<DocsCode>endAdornment</DocsCode>.
|
|
491
|
+
</DocsLi>
|
|
492
|
+
<DocsLi>
|
|
493
|
+
Tự động hiện Icon con mắt (Toggle ẩn/hiện) nếu{" "}
|
|
494
|
+
<DocsCode>type="password"</DocsCode>.
|
|
495
|
+
</DocsLi>
|
|
496
|
+
<DocsLi>
|
|
497
|
+
Tự động thêm class <DocsCode>aria-invalid</DocsCode> vào input nếu
|
|
498
|
+
bạn truyền <DocsCode>errorMessage</DocsCode>.
|
|
499
|
+
</DocsLi>
|
|
500
|
+
</DocsUl>
|
|
501
|
+
|
|
502
|
+
<DocsH3>Khi nào nên dùng Micro</DocsH3>
|
|
503
|
+
<DocsP>
|
|
504
|
+
Thành phần <DocsCode>Input</DocsCode> nguyên thuỷ chỉ là một thẻ{" "}
|
|
505
|
+
<DocsCode>input</DocsCode> duy nhất. Để có được một Form Control
|
|
506
|
+
đúng chuẩn WCAG, bạn cần phải tự bọc nó bằng{" "}
|
|
507
|
+
<DocsCode>Field</DocsCode>, kết nối <DocsCode>FieldLabel</DocsCode>{" "}
|
|
508
|
+
và <DocsCode>FieldDescription</DocsCode>.
|
|
509
|
+
</DocsP>
|
|
510
|
+
<DocsP>
|
|
511
|
+
Dùng Micro khi bạn cần layout form dị biệt (ví dụ: label nằm ngang
|
|
512
|
+
bên trái input) hoặc khi cần nhúng Input vào một component phức tạp
|
|
513
|
+
(như dropdown tìm kiếm).
|
|
514
|
+
</DocsP>
|
|
515
|
+
</ShowcaseDocs>
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
tabs={[
|
|
519
|
+
{
|
|
520
|
+
label: "Micro (Primitive)",
|
|
521
|
+
content: <InputMicroShowcase globalSize={globalSize} />,
|
|
522
|
+
},
|
|
523
|
+
{
|
|
524
|
+
label: "Macro (Preset)",
|
|
525
|
+
content: <InputMacroShowcase globalSize={globalSize} />,
|
|
526
|
+
},
|
|
527
|
+
]}
|
|
528
|
+
/>
|
|
529
|
+
);
|
|
530
|
+
}
|