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,947 @@
|
|
|
1
|
+
import { AccordionPreset } from "../../components/macro/accordion-preset";
|
|
2
|
+
import {
|
|
3
|
+
Accordion,
|
|
4
|
+
AccordionContent,
|
|
5
|
+
AccordionItem,
|
|
6
|
+
AccordionTrigger,
|
|
7
|
+
} from "../../components/micro/accordion";
|
|
8
|
+
import {
|
|
9
|
+
DocsP,
|
|
10
|
+
ExampleGrid,
|
|
11
|
+
ExampleSection,
|
|
12
|
+
Showcase,
|
|
13
|
+
ShowcaseDocs,
|
|
14
|
+
} from "../../dev/components/showcase";
|
|
15
|
+
import { BoxIcon, SettingsIcon, SlidersHorizontalIcon } from "lucide-react";
|
|
16
|
+
import { useState } from "react";
|
|
17
|
+
|
|
18
|
+
// ──────────────────────────────────────────────────────────
|
|
19
|
+
// Shared Data
|
|
20
|
+
// ──────────────────────────────────────────────────────────
|
|
21
|
+
const faqItems = [
|
|
22
|
+
{
|
|
23
|
+
q: "Is it accessible?",
|
|
24
|
+
a: "Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
q: "Is it styled?",
|
|
28
|
+
a: "Yes. It comes with default styles that match the other components' aesthetic. You can override every token via CSS variables.",
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
q: "Is it animated?",
|
|
32
|
+
a: "Yes. It's animated by default with smooth expand/collapse transitions, but you can disable animation if you prefer.",
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
q: "Can I nest accordions?",
|
|
36
|
+
a: "Yes. You can nest accordion components inside each other to create multi-level collapsible sections.",
|
|
37
|
+
},
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
const presetItems = [
|
|
41
|
+
{
|
|
42
|
+
value: "item-1",
|
|
43
|
+
title: "Is it accessible?",
|
|
44
|
+
content:
|
|
45
|
+
"Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
value: "item-2",
|
|
49
|
+
title: "Is it styled?",
|
|
50
|
+
content:
|
|
51
|
+
"Yes. It comes with default styles that match the other components' aesthetic.",
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
value: "item-3",
|
|
55
|
+
title: "Is it animated?",
|
|
56
|
+
content: "Yes. It's animated by default with smooth transitions.",
|
|
57
|
+
},
|
|
58
|
+
];
|
|
59
|
+
|
|
60
|
+
// ──────────────────────────────────────────────────────────
|
|
61
|
+
// SECTION 1: Macro Content (không export)
|
|
62
|
+
// ──────────────────────────────────────────────────────────
|
|
63
|
+
function AccordionMacroShowcase() {
|
|
64
|
+
const [controlledValue, setControlledValue] = useState<string[]>([]);
|
|
65
|
+
|
|
66
|
+
return (
|
|
67
|
+
<div className="space-y-10 mt-6">
|
|
68
|
+
<ExampleGrid>
|
|
69
|
+
<ExampleSection
|
|
70
|
+
label="Tiêu Chuẩn (Standard)"
|
|
71
|
+
description="Accordion mở đơn cơ bản."
|
|
72
|
+
codeString={`<AccordionPreset
|
|
73
|
+
className="w-full"
|
|
74
|
+
defaultValue={["item-1"]}
|
|
75
|
+
items={[
|
|
76
|
+
{
|
|
77
|
+
value: "item-1",
|
|
78
|
+
title: "Is it accessible?",
|
|
79
|
+
content: "Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
value: "item-2",
|
|
83
|
+
title: "Is it styled?",
|
|
84
|
+
content: "Yes. It comes with default styles that match the other components' aesthetic.",
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
value: "item-3",
|
|
88
|
+
title: "Is it animated?",
|
|
89
|
+
content: "Yes. It's animated by default with smooth transitions.",
|
|
90
|
+
},
|
|
91
|
+
]}
|
|
92
|
+
/>
|
|
93
|
+
`}
|
|
94
|
+
>
|
|
95
|
+
<AccordionPreset
|
|
96
|
+
className="w-full"
|
|
97
|
+
defaultValue={["item-1"]}
|
|
98
|
+
items={[
|
|
99
|
+
{
|
|
100
|
+
value: "item-1",
|
|
101
|
+
title: "Is it accessible?",
|
|
102
|
+
content:
|
|
103
|
+
"Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
value: "item-2",
|
|
107
|
+
title: "Is it styled?",
|
|
108
|
+
content:
|
|
109
|
+
"Yes. It comes with default styles that match the other components' aesthetic.",
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
value: "item-3",
|
|
113
|
+
title: "Is it animated?",
|
|
114
|
+
content:
|
|
115
|
+
"Yes. It's animated by default with smooth transitions.",
|
|
116
|
+
},
|
|
117
|
+
]}
|
|
118
|
+
/>
|
|
119
|
+
</ExampleSection>
|
|
120
|
+
|
|
121
|
+
<ExampleSection
|
|
122
|
+
label="Mở Nhiều (Multiple Expansion)"
|
|
123
|
+
description="Cho phép mở nhiều mục cùng một lúc."
|
|
124
|
+
codeString={`<AccordionPreset
|
|
125
|
+
className="w-full"
|
|
126
|
+
multiple
|
|
127
|
+
defaultValue={["item-1", "item-2"]}
|
|
128
|
+
items={[
|
|
129
|
+
{
|
|
130
|
+
value: "item-1",
|
|
131
|
+
title: "Is it accessible?",
|
|
132
|
+
content: "Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
value: "item-2",
|
|
136
|
+
title: "Is it styled?",
|
|
137
|
+
content: "Yes. It comes with default styles that match the other components' aesthetic.",
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
value: "item-3",
|
|
141
|
+
title: "Is it animated?",
|
|
142
|
+
content: "Yes. It's animated by default with smooth transitions.",
|
|
143
|
+
},
|
|
144
|
+
]}
|
|
145
|
+
/>
|
|
146
|
+
`}
|
|
147
|
+
>
|
|
148
|
+
<AccordionPreset
|
|
149
|
+
className="w-full"
|
|
150
|
+
multiple
|
|
151
|
+
defaultValue={["item-1", "item-2"]}
|
|
152
|
+
items={[
|
|
153
|
+
{
|
|
154
|
+
value: "item-1",
|
|
155
|
+
title: "Is it accessible?",
|
|
156
|
+
content:
|
|
157
|
+
"Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
value: "item-2",
|
|
161
|
+
title: "Is it styled?",
|
|
162
|
+
content:
|
|
163
|
+
"Yes. It comes with default styles that match the other components' aesthetic.",
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
value: "item-3",
|
|
167
|
+
title: "Is it animated?",
|
|
168
|
+
content:
|
|
169
|
+
"Yes. It's animated by default with smooth transitions.",
|
|
170
|
+
},
|
|
171
|
+
]}
|
|
172
|
+
/>
|
|
173
|
+
</ExampleSection>
|
|
174
|
+
</ExampleGrid>
|
|
175
|
+
|
|
176
|
+
<ExampleGrid>
|
|
177
|
+
<ExampleSection
|
|
178
|
+
label="Controlled"
|
|
179
|
+
description="Trạng thái mở được quản lý bằng state. Click vào các mục để xem state thay đổi."
|
|
180
|
+
codeString={`const [controlledValue, setControlledValue] = useState<string[]>([]);
|
|
181
|
+
return (
|
|
182
|
+
<AccordionPreset
|
|
183
|
+
className="w-full"
|
|
184
|
+
multiple
|
|
185
|
+
value={controlledValue}
|
|
186
|
+
onValueChange={setControlledValue}
|
|
187
|
+
items={[
|
|
188
|
+
{
|
|
189
|
+
value: "item-1",
|
|
190
|
+
title: "Is it accessible?",
|
|
191
|
+
content: "Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
value: "item-2",
|
|
195
|
+
title: "Is it styled?",
|
|
196
|
+
content: "Yes. It comes with default styles that match the other components' aesthetic.",
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
value: "item-3",
|
|
200
|
+
title: "Is it animated?",
|
|
201
|
+
content: "Yes. It's animated by default with smooth transitions.",
|
|
202
|
+
},
|
|
203
|
+
]}
|
|
204
|
+
/>
|
|
205
|
+
);`}
|
|
206
|
+
>
|
|
207
|
+
<div className="flex w-full flex-col gap-3">
|
|
208
|
+
<p className="text-xs text-muted-foreground">
|
|
209
|
+
Open:{" "}
|
|
210
|
+
<code className="rounded bg-muted px-1.5 py-0.5 text-xs font-mono">
|
|
211
|
+
{controlledValue.length > 0
|
|
212
|
+
? controlledValue.map((v) => `"${v}"`).join(", ")
|
|
213
|
+
: "(none)"}
|
|
214
|
+
</code>
|
|
215
|
+
</p>
|
|
216
|
+
<AccordionPreset
|
|
217
|
+
className="w-full"
|
|
218
|
+
multiple
|
|
219
|
+
value={controlledValue}
|
|
220
|
+
onValueChange={setControlledValue}
|
|
221
|
+
items={[
|
|
222
|
+
{
|
|
223
|
+
value: "item-1",
|
|
224
|
+
title: "Is it accessible?",
|
|
225
|
+
content:
|
|
226
|
+
"Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
value: "item-2",
|
|
230
|
+
title: "Is it styled?",
|
|
231
|
+
content:
|
|
232
|
+
"Yes. It comes with default styles that match the other components' aesthetic.",
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
value: "item-3",
|
|
236
|
+
title: "Is it animated?",
|
|
237
|
+
content:
|
|
238
|
+
"Yes. It's animated by default with smooth transitions.",
|
|
239
|
+
},
|
|
240
|
+
]}
|
|
241
|
+
/>
|
|
242
|
+
</div>
|
|
243
|
+
</ExampleSection>
|
|
244
|
+
|
|
245
|
+
<ExampleSection
|
|
246
|
+
label="Disabled (Vô hiệu hoá)"
|
|
247
|
+
description="Từng mục riêng lẻ có thể bị vô hiệu hóa trong khi các mục khác vẫn tương tác bình thường."
|
|
248
|
+
codeString={`<AccordionPreset
|
|
249
|
+
className="w-full"
|
|
250
|
+
items={[
|
|
251
|
+
{
|
|
252
|
+
value: "enabled-1",
|
|
253
|
+
title: "Available Feature",
|
|
254
|
+
content:
|
|
255
|
+
"This feature is available and can be expanded normally.",
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
value: "disabled-1",
|
|
259
|
+
title: "Premium Feature (Locked)",
|
|
260
|
+
content: "This content is hidden behind a premium plan.",
|
|
261
|
+
disabled: true,
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
value: "enabled-2",
|
|
265
|
+
title: "Another Feature",
|
|
266
|
+
content:
|
|
267
|
+
"This is another available feature you can interact with freely.",
|
|
268
|
+
},
|
|
269
|
+
]}
|
|
270
|
+
/>
|
|
271
|
+
`}
|
|
272
|
+
>
|
|
273
|
+
<AccordionPreset
|
|
274
|
+
className="w-full"
|
|
275
|
+
items={[
|
|
276
|
+
{
|
|
277
|
+
value: "enabled-1",
|
|
278
|
+
title: "Available Feature",
|
|
279
|
+
content:
|
|
280
|
+
"This feature is available and can be expanded normally.",
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
value: "disabled-1",
|
|
284
|
+
title: "Premium Feature (Locked)",
|
|
285
|
+
content: "This content is hidden behind a premium plan.",
|
|
286
|
+
disabled: true,
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
value: "enabled-2",
|
|
290
|
+
title: "Another Feature",
|
|
291
|
+
content:
|
|
292
|
+
"This is another available feature you can interact with freely.",
|
|
293
|
+
},
|
|
294
|
+
]}
|
|
295
|
+
/>
|
|
296
|
+
</ExampleSection>
|
|
297
|
+
</ExampleGrid>
|
|
298
|
+
|
|
299
|
+
<ExampleGrid>
|
|
300
|
+
<ExampleSection
|
|
301
|
+
label="Nội Dung Phức Tạp"
|
|
302
|
+
description="Render các React Node bên trong nội dung."
|
|
303
|
+
codeString={`<AccordionPreset
|
|
304
|
+
className="w-full"
|
|
305
|
+
items={[
|
|
306
|
+
{
|
|
307
|
+
value: "profile",
|
|
308
|
+
title: "User Profile Settings",
|
|
309
|
+
content: (
|
|
310
|
+
<div className="flex flex-col items-start gap-3">
|
|
311
|
+
<p className="text-sm">
|
|
312
|
+
Update your personal information and preferences.
|
|
313
|
+
</p>
|
|
314
|
+
<button className="rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground">
|
|
315
|
+
Edit Profile
|
|
316
|
+
</button>
|
|
317
|
+
</div>
|
|
318
|
+
),
|
|
319
|
+
},
|
|
320
|
+
]}
|
|
321
|
+
/>
|
|
322
|
+
`}
|
|
323
|
+
>
|
|
324
|
+
<AccordionPreset
|
|
325
|
+
className="w-full"
|
|
326
|
+
items={[
|
|
327
|
+
{
|
|
328
|
+
value: "profile",
|
|
329
|
+
title: "User Profile Settings",
|
|
330
|
+
content: (
|
|
331
|
+
<div className="flex flex-col items-start gap-3">
|
|
332
|
+
<p className="text-sm">
|
|
333
|
+
Update your personal information and preferences.
|
|
334
|
+
</p>
|
|
335
|
+
<button className="rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground">
|
|
336
|
+
Edit Profile
|
|
337
|
+
</button>
|
|
338
|
+
</div>
|
|
339
|
+
),
|
|
340
|
+
},
|
|
341
|
+
]}
|
|
342
|
+
/>
|
|
343
|
+
</ExampleSection>
|
|
344
|
+
|
|
345
|
+
<ExampleSection
|
|
346
|
+
label="Lồng Nhau (Nested Accordions)"
|
|
347
|
+
description="Nội dung bên trong có thể chứa một Accordion khác."
|
|
348
|
+
codeString={`<AccordionPreset
|
|
349
|
+
className="w-full"
|
|
350
|
+
items={[
|
|
351
|
+
{
|
|
352
|
+
value: "getting-started",
|
|
353
|
+
title: "Getting Started",
|
|
354
|
+
content: (
|
|
355
|
+
<AccordionPreset
|
|
356
|
+
className="w-full"
|
|
357
|
+
items={[
|
|
358
|
+
{
|
|
359
|
+
value: "installation",
|
|
360
|
+
title: "Installation",
|
|
361
|
+
content:
|
|
362
|
+
"Run npm install to add the component to your project.",
|
|
363
|
+
},
|
|
364
|
+
]}
|
|
365
|
+
/>
|
|
366
|
+
),
|
|
367
|
+
},
|
|
368
|
+
{
|
|
369
|
+
value: "advanced",
|
|
370
|
+
title: "Advanced Usage",
|
|
371
|
+
content: (
|
|
372
|
+
<AccordionPreset
|
|
373
|
+
className="w-full"
|
|
374
|
+
items={[
|
|
375
|
+
{
|
|
376
|
+
value: "controlled",
|
|
377
|
+
title: "Controlled Mode",
|
|
378
|
+
content:
|
|
379
|
+
"Use the value and onValueChange props to control which items are open.",
|
|
380
|
+
},
|
|
381
|
+
]}
|
|
382
|
+
/>
|
|
383
|
+
),
|
|
384
|
+
},
|
|
385
|
+
]}
|
|
386
|
+
/>
|
|
387
|
+
`}
|
|
388
|
+
>
|
|
389
|
+
<AccordionPreset
|
|
390
|
+
className="w-full"
|
|
391
|
+
items={[
|
|
392
|
+
{
|
|
393
|
+
value: "getting-started",
|
|
394
|
+
title: "Getting Started",
|
|
395
|
+
content: (
|
|
396
|
+
<AccordionPreset
|
|
397
|
+
className="w-full"
|
|
398
|
+
items={[
|
|
399
|
+
{
|
|
400
|
+
value: "installation",
|
|
401
|
+
title: "Installation",
|
|
402
|
+
content:
|
|
403
|
+
"Run npm install to add the component to your project.",
|
|
404
|
+
},
|
|
405
|
+
]}
|
|
406
|
+
/>
|
|
407
|
+
),
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
value: "advanced",
|
|
411
|
+
title: "Advanced Usage",
|
|
412
|
+
content: (
|
|
413
|
+
<AccordionPreset
|
|
414
|
+
className="w-full"
|
|
415
|
+
items={[
|
|
416
|
+
{
|
|
417
|
+
value: "controlled",
|
|
418
|
+
title: "Controlled Mode",
|
|
419
|
+
content:
|
|
420
|
+
"Use the value and onValueChange props to control which items are open.",
|
|
421
|
+
},
|
|
422
|
+
]}
|
|
423
|
+
/>
|
|
424
|
+
),
|
|
425
|
+
},
|
|
426
|
+
]}
|
|
427
|
+
/>
|
|
428
|
+
</ExampleSection>
|
|
429
|
+
</ExampleGrid>
|
|
430
|
+
</div>
|
|
431
|
+
);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
// ──────────────────────────────────────────────────────────
|
|
435
|
+
// SECTION 2: Micro Content (không export)
|
|
436
|
+
// ──────────────────────────────────────────────────────────
|
|
437
|
+
function AccordionMicroShowcase() {
|
|
438
|
+
return (
|
|
439
|
+
<div className="space-y-10 mt-6">
|
|
440
|
+
<ExampleGrid>
|
|
441
|
+
<ExampleSection
|
|
442
|
+
label="Mở Đơn (Single Expand)"
|
|
443
|
+
description="Chỉ một mục được phép mở tại một thời điểm (mặc định)."
|
|
444
|
+
codeString={`<Accordion className="w-full" defaultValue={["Is it accessible?"]}>
|
|
445
|
+
<AccordionItem value="Is it accessible?">
|
|
446
|
+
<AccordionTrigger>Is it accessible?</AccordionTrigger>
|
|
447
|
+
<AccordionContent>Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.</AccordionContent>
|
|
448
|
+
</AccordionItem>
|
|
449
|
+
<AccordionItem value="Is it styled?">
|
|
450
|
+
<AccordionTrigger>Is it styled?</AccordionTrigger>
|
|
451
|
+
<AccordionContent>Yes. It comes with default styles that match the other components' aesthetic. You can override every token via CSS variables.</AccordionContent>
|
|
452
|
+
</AccordionItem>
|
|
453
|
+
<AccordionItem value="Is it animated?">
|
|
454
|
+
<AccordionTrigger>Is it animated?</AccordionTrigger>
|
|
455
|
+
<AccordionContent>Yes. It's animated by default with smooth expand/collapse transitions, but you can disable animation if you prefer.</AccordionContent>
|
|
456
|
+
</AccordionItem>
|
|
457
|
+
</Accordion>`}
|
|
458
|
+
>
|
|
459
|
+
<Accordion className="w-full" defaultValue={["Is it accessible?"]}>
|
|
460
|
+
<AccordionItem value="Is it accessible?">
|
|
461
|
+
<AccordionTrigger>Is it accessible?</AccordionTrigger>
|
|
462
|
+
<AccordionContent>
|
|
463
|
+
Yes. It adheres to the WAI-ARIA design pattern.
|
|
464
|
+
</AccordionContent>
|
|
465
|
+
</AccordionItem>
|
|
466
|
+
<AccordionItem value="Is it styled?">
|
|
467
|
+
<AccordionTrigger>Is it styled?</AccordionTrigger>
|
|
468
|
+
<AccordionContent>
|
|
469
|
+
Yes. It comes with default styles that match the other
|
|
470
|
+
components' aesthetic.
|
|
471
|
+
</AccordionContent>
|
|
472
|
+
</AccordionItem>
|
|
473
|
+
<AccordionItem value="Is it animated?">
|
|
474
|
+
<AccordionTrigger>Is it animated?</AccordionTrigger>
|
|
475
|
+
<AccordionContent>
|
|
476
|
+
Yes. It's animated by default with smooth transitions.
|
|
477
|
+
</AccordionContent>
|
|
478
|
+
</AccordionItem>
|
|
479
|
+
</Accordion>
|
|
480
|
+
</ExampleSection>
|
|
481
|
+
|
|
482
|
+
<ExampleSection
|
|
483
|
+
label="Mở Nhiều (Multiple Expand)"
|
|
484
|
+
description="Cho phép mở nhiều mục cùng lúc."
|
|
485
|
+
codeString={`<Accordion className="w-full" multiple defaultValue={["Is it accessible?", "Is it styled?"]}>
|
|
486
|
+
<AccordionItem value="Is it accessible?">
|
|
487
|
+
<AccordionTrigger>Is it accessible?</AccordionTrigger>
|
|
488
|
+
<AccordionContent>Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.</AccordionContent>
|
|
489
|
+
</AccordionItem>
|
|
490
|
+
<AccordionItem value="Is it styled?">
|
|
491
|
+
<AccordionTrigger>Is it styled?</AccordionTrigger>
|
|
492
|
+
<AccordionContent>Yes. It comes with default styles that match the other components' aesthetic. You can override every token via CSS variables.</AccordionContent>
|
|
493
|
+
</AccordionItem>
|
|
494
|
+
<AccordionItem value="Is it animated?">
|
|
495
|
+
<AccordionTrigger>Is it animated?</AccordionTrigger>
|
|
496
|
+
<AccordionContent>Yes. It's animated by default with smooth expand/collapse transitions, but you can disable animation if you prefer.</AccordionContent>
|
|
497
|
+
</AccordionItem>
|
|
498
|
+
</Accordion>`}
|
|
499
|
+
>
|
|
500
|
+
<Accordion
|
|
501
|
+
className="w-full"
|
|
502
|
+
multiple
|
|
503
|
+
defaultValue={["Is it accessible?", "Is it styled?"]}
|
|
504
|
+
>
|
|
505
|
+
<AccordionItem value="Is it accessible?">
|
|
506
|
+
<AccordionTrigger>Is it accessible?</AccordionTrigger>
|
|
507
|
+
<AccordionContent>
|
|
508
|
+
Yes. It adheres to the WAI-ARIA design pattern.
|
|
509
|
+
</AccordionContent>
|
|
510
|
+
</AccordionItem>
|
|
511
|
+
<AccordionItem value="Is it styled?">
|
|
512
|
+
<AccordionTrigger>Is it styled?</AccordionTrigger>
|
|
513
|
+
<AccordionContent>
|
|
514
|
+
Yes. It comes with default styles that match the other
|
|
515
|
+
components' aesthetic.
|
|
516
|
+
</AccordionContent>
|
|
517
|
+
</AccordionItem>
|
|
518
|
+
<AccordionItem value="Is it animated?">
|
|
519
|
+
<AccordionTrigger>Is it animated?</AccordionTrigger>
|
|
520
|
+
<AccordionContent>
|
|
521
|
+
Yes. It's animated by default with smooth transitions.
|
|
522
|
+
</AccordionContent>
|
|
523
|
+
</AccordionItem>
|
|
524
|
+
</Accordion>
|
|
525
|
+
</ExampleSection>
|
|
526
|
+
</ExampleGrid>
|
|
527
|
+
|
|
528
|
+
<ExampleGrid>
|
|
529
|
+
<ExampleSection
|
|
530
|
+
label="Disabled (Vô hiệu hoá)"
|
|
531
|
+
description="Từng mục riêng lẻ có thể bị vô hiệu hóa trong khi các mục khác vẫn tương tác bình thường."
|
|
532
|
+
codeString={`<Accordion className="w-full">
|
|
533
|
+
<AccordionItem value="enabled-1">
|
|
534
|
+
<AccordionTrigger>Available Feature</AccordionTrigger>
|
|
535
|
+
<AccordionContent>
|
|
536
|
+
This feature is available and can be expanded normally. Click to
|
|
537
|
+
see the details.
|
|
538
|
+
</AccordionContent>
|
|
539
|
+
</AccordionItem>
|
|
540
|
+
<AccordionItem value="disabled-1" disabled>
|
|
541
|
+
<AccordionTrigger>Premium Feature (Locked)</AccordionTrigger>
|
|
542
|
+
<AccordionContent>
|
|
543
|
+
This content is hidden behind a premium plan.
|
|
544
|
+
</AccordionContent>
|
|
545
|
+
</AccordionItem>
|
|
546
|
+
<AccordionItem value="enabled-2">
|
|
547
|
+
<AccordionTrigger>Another Feature</AccordionTrigger>
|
|
548
|
+
<AccordionContent>
|
|
549
|
+
This is another available feature you can interact with freely.
|
|
550
|
+
</AccordionContent>
|
|
551
|
+
</AccordionItem>
|
|
552
|
+
</Accordion>
|
|
553
|
+
`}
|
|
554
|
+
>
|
|
555
|
+
<Accordion className="w-full">
|
|
556
|
+
<AccordionItem value="enabled-1">
|
|
557
|
+
<AccordionTrigger>Available Feature</AccordionTrigger>
|
|
558
|
+
<AccordionContent>
|
|
559
|
+
This feature is available and can be expanded normally. Click to
|
|
560
|
+
see the details.
|
|
561
|
+
</AccordionContent>
|
|
562
|
+
</AccordionItem>
|
|
563
|
+
<AccordionItem value="disabled-1" disabled>
|
|
564
|
+
<AccordionTrigger>Premium Feature (Locked)</AccordionTrigger>
|
|
565
|
+
<AccordionContent>
|
|
566
|
+
This content is hidden behind a premium plan.
|
|
567
|
+
</AccordionContent>
|
|
568
|
+
</AccordionItem>
|
|
569
|
+
<AccordionItem value="enabled-2">
|
|
570
|
+
<AccordionTrigger>Another Feature</AccordionTrigger>
|
|
571
|
+
<AccordionContent>
|
|
572
|
+
This is another available feature you can interact with freely.
|
|
573
|
+
</AccordionContent>
|
|
574
|
+
</AccordionItem>
|
|
575
|
+
</Accordion>
|
|
576
|
+
</ExampleSection>
|
|
577
|
+
|
|
578
|
+
<ExampleSection
|
|
579
|
+
label="Lồng Nhau (Nested Accordions)"
|
|
580
|
+
description="Nội dung bên trong có thể chứa một Accordion khác để tạo cấu trúc nhiều cấp."
|
|
581
|
+
codeString={`<Accordion className="w-full max-w-lg">
|
|
582
|
+
<AccordionItem value="getting-started">
|
|
583
|
+
<AccordionTrigger>Getting Started</AccordionTrigger>
|
|
584
|
+
<AccordionContent>
|
|
585
|
+
<Accordion>
|
|
586
|
+
<AccordionItem value="installation">
|
|
587
|
+
<AccordionTrigger>Installation</AccordionTrigger>
|
|
588
|
+
<AccordionContent>
|
|
589
|
+
Run npm install to add the component to your project.
|
|
590
|
+
</AccordionContent>
|
|
591
|
+
</AccordionItem>
|
|
592
|
+
<AccordionItem value="configuration">
|
|
593
|
+
<AccordionTrigger>Configuration</AccordionTrigger>
|
|
594
|
+
<AccordionContent>
|
|
595
|
+
Import and wrap your content with the Accordion component.
|
|
596
|
+
</AccordionContent>
|
|
597
|
+
</AccordionItem>
|
|
598
|
+
</Accordion>
|
|
599
|
+
</AccordionContent>
|
|
600
|
+
</AccordionItem>
|
|
601
|
+
<AccordionItem value="advanced">
|
|
602
|
+
<AccordionTrigger>Advanced Usage</AccordionTrigger>
|
|
603
|
+
<AccordionContent>
|
|
604
|
+
<Accordion>
|
|
605
|
+
<AccordionItem value="controlled">
|
|
606
|
+
<AccordionTrigger>Controlled Mode</AccordionTrigger>
|
|
607
|
+
<AccordionContent>
|
|
608
|
+
Use the value and onValueChange props to control which
|
|
609
|
+
items are open.
|
|
610
|
+
</AccordionContent>
|
|
611
|
+
</AccordionItem>
|
|
612
|
+
<AccordionItem value="animation">
|
|
613
|
+
<AccordionTrigger>Custom Animation</AccordionTrigger>
|
|
614
|
+
<AccordionContent>
|
|
615
|
+
Override transition duration and easing via className.
|
|
616
|
+
</AccordionContent>
|
|
617
|
+
</AccordionItem>
|
|
618
|
+
</Accordion>
|
|
619
|
+
</AccordionContent>
|
|
620
|
+
</AccordionItem>
|
|
621
|
+
</Accordion>
|
|
622
|
+
`}
|
|
623
|
+
>
|
|
624
|
+
<Accordion className="w-full max-w-lg">
|
|
625
|
+
<AccordionItem value="getting-started">
|
|
626
|
+
<AccordionTrigger>Getting Started</AccordionTrigger>
|
|
627
|
+
<AccordionContent>
|
|
628
|
+
<Accordion>
|
|
629
|
+
<AccordionItem value="installation">
|
|
630
|
+
<AccordionTrigger>Installation</AccordionTrigger>
|
|
631
|
+
<AccordionContent>
|
|
632
|
+
Run npm install to add the component to your project.
|
|
633
|
+
</AccordionContent>
|
|
634
|
+
</AccordionItem>
|
|
635
|
+
<AccordionItem value="configuration">
|
|
636
|
+
<AccordionTrigger>Configuration</AccordionTrigger>
|
|
637
|
+
<AccordionContent>
|
|
638
|
+
Import and wrap your content with the Accordion component.
|
|
639
|
+
</AccordionContent>
|
|
640
|
+
</AccordionItem>
|
|
641
|
+
</Accordion>
|
|
642
|
+
</AccordionContent>
|
|
643
|
+
</AccordionItem>
|
|
644
|
+
<AccordionItem value="advanced">
|
|
645
|
+
<AccordionTrigger>Advanced Usage</AccordionTrigger>
|
|
646
|
+
<AccordionContent>
|
|
647
|
+
<Accordion>
|
|
648
|
+
<AccordionItem value="controlled">
|
|
649
|
+
<AccordionTrigger>Controlled Mode</AccordionTrigger>
|
|
650
|
+
<AccordionContent>
|
|
651
|
+
Use the value and onValueChange props to control which
|
|
652
|
+
items are open.
|
|
653
|
+
</AccordionContent>
|
|
654
|
+
</AccordionItem>
|
|
655
|
+
<AccordionItem value="animation">
|
|
656
|
+
<AccordionTrigger>Custom Animation</AccordionTrigger>
|
|
657
|
+
<AccordionContent>
|
|
658
|
+
Override transition duration and easing via className.
|
|
659
|
+
</AccordionContent>
|
|
660
|
+
</AccordionItem>
|
|
661
|
+
</Accordion>
|
|
662
|
+
</AccordionContent>
|
|
663
|
+
</AccordionItem>
|
|
664
|
+
</Accordion>
|
|
665
|
+
</ExampleSection>
|
|
666
|
+
</ExampleGrid>
|
|
667
|
+
|
|
668
|
+
<ExampleSection
|
|
669
|
+
label="FAQ Hoàn Chỉnh"
|
|
670
|
+
description="Ví dụ một phần hỏi đáp FAQ hoàn chỉnh."
|
|
671
|
+
codeString={`<Accordion className="w-full max-w-lg">
|
|
672
|
+
<AccordionItem value="Is it accessible?">
|
|
673
|
+
<AccordionTrigger>Is it accessible?</AccordionTrigger>
|
|
674
|
+
<AccordionContent>Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.</AccordionContent>
|
|
675
|
+
</AccordionItem>
|
|
676
|
+
<AccordionItem value="Is it styled?">
|
|
677
|
+
<AccordionTrigger>Is it styled?</AccordionTrigger>
|
|
678
|
+
<AccordionContent>Yes. It comes with default styles that match the other components' aesthetic. You can override every token via CSS variables.</AccordionContent>
|
|
679
|
+
</AccordionItem>
|
|
680
|
+
<AccordionItem value="Is it animated?">
|
|
681
|
+
<AccordionTrigger>Is it animated?</AccordionTrigger>
|
|
682
|
+
<AccordionContent>Yes. It's animated by default with smooth expand/collapse transitions, but you can disable animation if you prefer.</AccordionContent>
|
|
683
|
+
</AccordionItem>
|
|
684
|
+
<AccordionItem value="Can I nest accordions?">
|
|
685
|
+
<AccordionTrigger>Can I nest accordions?</AccordionTrigger>
|
|
686
|
+
<AccordionContent>Yes. You can nest accordion components inside each other to create multi-level collapsible sections.</AccordionContent>
|
|
687
|
+
</AccordionItem>
|
|
688
|
+
</Accordion>`}
|
|
689
|
+
>
|
|
690
|
+
<Accordion className="w-full max-w-lg">
|
|
691
|
+
<AccordionItem value="Is it accessible?">
|
|
692
|
+
<AccordionTrigger>Is it accessible?</AccordionTrigger>
|
|
693
|
+
<AccordionContent>
|
|
694
|
+
Yes. It adheres to the WAI-ARIA design pattern.
|
|
695
|
+
</AccordionContent>
|
|
696
|
+
</AccordionItem>
|
|
697
|
+
<AccordionItem value="Is it styled?">
|
|
698
|
+
<AccordionTrigger>Is it styled?</AccordionTrigger>
|
|
699
|
+
<AccordionContent>
|
|
700
|
+
Yes. It comes with default styles that match the other components'
|
|
701
|
+
aesthetic.
|
|
702
|
+
</AccordionContent>
|
|
703
|
+
</AccordionItem>
|
|
704
|
+
<AccordionItem value="Is it animated?">
|
|
705
|
+
<AccordionTrigger>Is it animated?</AccordionTrigger>
|
|
706
|
+
<AccordionContent>
|
|
707
|
+
Yes. It's animated by default with smooth transitions.
|
|
708
|
+
</AccordionContent>
|
|
709
|
+
</AccordionItem>
|
|
710
|
+
<AccordionItem value="Can I nest accordions?">
|
|
711
|
+
<AccordionTrigger>Can I nest accordions?</AccordionTrigger>
|
|
712
|
+
<AccordionContent>
|
|
713
|
+
Yes. You can nest accordion components inside each other to create
|
|
714
|
+
multi-level collapsible sections.
|
|
715
|
+
</AccordionContent>
|
|
716
|
+
</AccordionItem>
|
|
717
|
+
</Accordion>
|
|
718
|
+
</ExampleSection>
|
|
719
|
+
|
|
720
|
+
{/* ── Use Case Comparison ─────────────────────── */}
|
|
721
|
+
<ExampleSection
|
|
722
|
+
label="🧭 Use Case Comparison"
|
|
723
|
+
description="Các kịch bản thực tế giúp bạn quyết định nên dùng Micro (Accordion) hay Macro (AccordionPreset)."
|
|
724
|
+
fullWidth
|
|
725
|
+
codeString={`<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
|
|
726
|
+
{/* ── Story 1: Macro wins ── */}
|
|
727
|
+
<div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
|
|
728
|
+
<div className="flex items-start gap-3">
|
|
729
|
+
<span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
|
|
730
|
+
<SettingsIcon className="size-4" aria-hidden="true" />
|
|
731
|
+
</span>
|
|
732
|
+
<div>
|
|
733
|
+
<p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
|
|
734
|
+
Story 1 · Dùng Macro
|
|
735
|
+
</p>
|
|
736
|
+
<h3 className="mt-0.5 text-sm font-semibold text-foreground">
|
|
737
|
+
Render danh sách FAQ từ API
|
|
738
|
+
</h3>
|
|
739
|
+
</div>
|
|
740
|
+
</div>
|
|
741
|
+
|
|
742
|
+
<p className="text-xs text-muted-foreground leading-relaxed">
|
|
743
|
+
Bạn nhận được một mảng dữ liệu FAQ (hỏi đáp) từ server. Nội dung
|
|
744
|
+
đơn giản chỉ là text. Dùng Macro để tiết kiệm code.
|
|
745
|
+
</p>
|
|
746
|
+
|
|
747
|
+
<div className="rounded-lg bg-muted/50 p-3">
|
|
748
|
+
<AccordionPreset
|
|
749
|
+
className="w-full"
|
|
750
|
+
items={[
|
|
751
|
+
{ value: "Is it accessible?", title: "Is it accessible?", content: "Yes. It adheres to the WAI-ARIA design pattern." },
|
|
752
|
+
{ value: "Is it styled?", title: "Is it styled?", content: "Yes. It comes with default styles that match the other components' aesthetic." },
|
|
753
|
+
]}
|
|
754
|
+
/>
|
|
755
|
+
</div>
|
|
756
|
+
|
|
757
|
+
<div className="rounded-md border border-border border-green-500/20 bg-green-500/5 px-3 py-2">
|
|
758
|
+
<p className="text-xs font-medium text-green-700 dark:text-green-400">
|
|
759
|
+
✅ Dùng <code className="font-mono">AccordionPreset</code> — Tự
|
|
760
|
+
động lặp qua array, không cần viết lại JSX cho từng thẻ Item.
|
|
761
|
+
</p>
|
|
762
|
+
</div>
|
|
763
|
+
</div>
|
|
764
|
+
|
|
765
|
+
{/* ── Story 2: Micro wins ── */}
|
|
766
|
+
<div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
|
|
767
|
+
<div className="flex items-start gap-3">
|
|
768
|
+
<span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
|
|
769
|
+
<BoxIcon className="size-4" aria-hidden="true" />
|
|
770
|
+
</span>
|
|
771
|
+
<div>
|
|
772
|
+
<p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
|
|
773
|
+
Story 2 · Dùng Micro
|
|
774
|
+
</p>
|
|
775
|
+
<h3 className="mt-0.5 text-sm font-semibold text-foreground">
|
|
776
|
+
Tuỳ biến Trigger / Form phức tạp
|
|
777
|
+
</h3>
|
|
778
|
+
</div>
|
|
779
|
+
</div>
|
|
780
|
+
|
|
781
|
+
<p className="text-xs text-muted-foreground leading-relaxed">
|
|
782
|
+
Trigger cần hiển thị Icon hoặc Badge. Nội dung bên trong là một
|
|
783
|
+
Form phức tạp (chứ không phải text đơn thuần). Macro không thể làm
|
|
784
|
+
được việc này.
|
|
785
|
+
</p>
|
|
786
|
+
|
|
787
|
+
<div className="rounded-lg bg-muted/50 p-3">
|
|
788
|
+
<Accordion className="w-full">
|
|
789
|
+
<AccordionItem value="settings">
|
|
790
|
+
<AccordionTrigger className="gap-3">
|
|
791
|
+
<SlidersHorizontalIcon className="size-4 text-primary" />
|
|
792
|
+
<span className="flex-1 text-left">Advanced Settings</span>
|
|
793
|
+
<span className="mr-2 rounded bg-primary/10 px-2 py-0.5 text-[10px] uppercase tracking-wider text-primary">
|
|
794
|
+
New
|
|
795
|
+
</span>
|
|
796
|
+
</AccordionTrigger>
|
|
797
|
+
<AccordionContent>
|
|
798
|
+
<div className="flex items-center gap-3 rounded border border-border p-3 text-xs text-muted-foreground">
|
|
799
|
+
<span>
|
|
800
|
+
Nội dung tuỳ biến hoàn toàn, ví dụ: Form, Toggle, v.v.
|
|
801
|
+
</span>
|
|
802
|
+
</div>
|
|
803
|
+
</AccordionContent>
|
|
804
|
+
</AccordionItem>
|
|
805
|
+
</Accordion>
|
|
806
|
+
</div>
|
|
807
|
+
|
|
808
|
+
<div className="rounded-md border border-border border-blue-500/20 bg-blue-500/5 px-3 py-2">
|
|
809
|
+
<p className="text-xs font-medium text-blue-700 dark:text-blue-400">
|
|
810
|
+
✅ Dùng <code className="font-mono">Accordion</code> (Micro) —
|
|
811
|
+
Toàn quyền kiểm soát cấu trúc HTML của Trigger và Content.
|
|
812
|
+
</p>
|
|
813
|
+
</div>
|
|
814
|
+
</div>
|
|
815
|
+
</div>
|
|
816
|
+
`}
|
|
817
|
+
>
|
|
818
|
+
<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
|
|
819
|
+
{/* ── Story 1: Macro wins ── */}
|
|
820
|
+
<div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
|
|
821
|
+
<div className="flex items-start gap-3">
|
|
822
|
+
<span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
|
|
823
|
+
<SettingsIcon className="size-4" aria-hidden="true" />
|
|
824
|
+
</span>
|
|
825
|
+
<div>
|
|
826
|
+
<p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
|
|
827
|
+
Story 1 · Dùng Macro
|
|
828
|
+
</p>
|
|
829
|
+
<h3 className="mt-0.5 text-sm font-semibold text-foreground">
|
|
830
|
+
Render danh sách FAQ từ API
|
|
831
|
+
</h3>
|
|
832
|
+
</div>
|
|
833
|
+
</div>
|
|
834
|
+
|
|
835
|
+
<p className="text-xs text-muted-foreground leading-relaxed">
|
|
836
|
+
Bạn nhận được một mảng dữ liệu FAQ (hỏi đáp) từ server. Nội dung
|
|
837
|
+
đơn giản chỉ là text. Dùng Macro để tiết kiệm code.
|
|
838
|
+
</p>
|
|
839
|
+
|
|
840
|
+
<div className="rounded-lg bg-muted/50 p-3">
|
|
841
|
+
<AccordionPreset
|
|
842
|
+
className="w-full"
|
|
843
|
+
items={[
|
|
844
|
+
{
|
|
845
|
+
value: "Is it accessible?",
|
|
846
|
+
title: "Is it accessible?",
|
|
847
|
+
content: "Yes. It adheres to the WAI-ARIA design pattern.",
|
|
848
|
+
},
|
|
849
|
+
{
|
|
850
|
+
value: "Is it styled?",
|
|
851
|
+
title: "Is it styled?",
|
|
852
|
+
content:
|
|
853
|
+
"Yes. It comes with default styles that match the other components' aesthetic.",
|
|
854
|
+
},
|
|
855
|
+
]}
|
|
856
|
+
/>
|
|
857
|
+
</div>
|
|
858
|
+
|
|
859
|
+
<div className="rounded-md border border-border border-green-500/20 bg-green-500/5 px-3 py-2">
|
|
860
|
+
<p className="text-xs font-medium text-green-700 dark:text-green-400">
|
|
861
|
+
✅ Dùng <code className="font-mono">AccordionPreset</code> — Tự
|
|
862
|
+
động lặp qua array, không cần viết lại JSX cho từng thẻ Item.
|
|
863
|
+
</p>
|
|
864
|
+
</div>
|
|
865
|
+
</div>
|
|
866
|
+
|
|
867
|
+
{/* ── Story 2: Micro wins ── */}
|
|
868
|
+
<div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
|
|
869
|
+
<div className="flex items-start gap-3">
|
|
870
|
+
<span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
|
|
871
|
+
<BoxIcon className="size-4" aria-hidden="true" />
|
|
872
|
+
</span>
|
|
873
|
+
<div>
|
|
874
|
+
<p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
|
|
875
|
+
Story 2 · Dùng Micro
|
|
876
|
+
</p>
|
|
877
|
+
<h3 className="mt-0.5 text-sm font-semibold text-foreground">
|
|
878
|
+
Tuỳ biến Trigger / Form phức tạp
|
|
879
|
+
</h3>
|
|
880
|
+
</div>
|
|
881
|
+
</div>
|
|
882
|
+
|
|
883
|
+
<p className="text-xs text-muted-foreground leading-relaxed">
|
|
884
|
+
Trigger cần hiển thị Icon hoặc Badge. Nội dung bên trong là một
|
|
885
|
+
Form phức tạp (chứ không phải text đơn thuần). Macro không thể làm
|
|
886
|
+
được việc này.
|
|
887
|
+
</p>
|
|
888
|
+
|
|
889
|
+
<div className="rounded-lg bg-muted/50 p-3">
|
|
890
|
+
<Accordion className="w-full">
|
|
891
|
+
<AccordionItem value="settings">
|
|
892
|
+
<AccordionTrigger className="gap-3">
|
|
893
|
+
<SlidersHorizontalIcon className="size-4 text-primary" />
|
|
894
|
+
<span className="flex-1 text-left">Advanced Settings</span>
|
|
895
|
+
<span className="mr-2 rounded bg-primary/10 px-2 py-0.5 text-[10px] uppercase tracking-wider text-primary">
|
|
896
|
+
New
|
|
897
|
+
</span>
|
|
898
|
+
</AccordionTrigger>
|
|
899
|
+
<AccordionContent>
|
|
900
|
+
<div className="flex items-center gap-3 rounded border border-border p-3 text-xs text-muted-foreground">
|
|
901
|
+
<span>
|
|
902
|
+
Nội dung tuỳ biến hoàn toàn, ví dụ: Form, Toggle, v.v.
|
|
903
|
+
</span>
|
|
904
|
+
</div>
|
|
905
|
+
</AccordionContent>
|
|
906
|
+
</AccordionItem>
|
|
907
|
+
</Accordion>
|
|
908
|
+
</div>
|
|
909
|
+
|
|
910
|
+
<div className="rounded-md border border-border border-blue-500/20 bg-blue-500/5 px-3 py-2">
|
|
911
|
+
<p className="text-xs font-medium text-blue-700 dark:text-blue-400">
|
|
912
|
+
✅ Dùng <code className="font-mono">Accordion</code> (Micro) —
|
|
913
|
+
Toàn quyền kiểm soát cấu trúc HTML của Trigger và Content.
|
|
914
|
+
</p>
|
|
915
|
+
</div>
|
|
916
|
+
</div>
|
|
917
|
+
</div>
|
|
918
|
+
</ExampleSection>
|
|
919
|
+
</div>
|
|
920
|
+
);
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
// ──────────────────────────────────────────────────────────
|
|
924
|
+
// SECTION 3: Entry point (export default)
|
|
925
|
+
// ──────────────────────────────────────────────────────────
|
|
926
|
+
export default function AccordionShowcase() {
|
|
927
|
+
return (
|
|
928
|
+
<Showcase
|
|
929
|
+
title="Accordion"
|
|
930
|
+
description="Tập hợp các tiêu đề có thể tương tác xếp chồng lên nhau theo chiều dọc, mỗi tiêu đề sẽ mở ra một phần nội dung."
|
|
931
|
+
generalConcept={
|
|
932
|
+
<ShowcaseDocs>
|
|
933
|
+
<DocsP>
|
|
934
|
+
Dùng để gom nhóm các khối nội dung lớn nhằm tiết kiệm không gian
|
|
935
|
+
hiển thị (ví dụ: FAQ, Advanced Settings). Không nên dùng Accordion
|
|
936
|
+
nếu nội dung bên trong quá quan trọng và cần user phải nhìn thấy
|
|
937
|
+
ngay lập tức.
|
|
938
|
+
</DocsP>
|
|
939
|
+
</ShowcaseDocs>
|
|
940
|
+
}
|
|
941
|
+
tabs={[
|
|
942
|
+
{ label: "Micro (Primitive)", content: <AccordionMicroShowcase /> },
|
|
943
|
+
{ label: "Macro (Preset)", content: <AccordionMacroShowcase /> },
|
|
944
|
+
]}
|
|
945
|
+
/>
|
|
946
|
+
);
|
|
947
|
+
}
|