gladvn 0.2.22 → 0.2.27
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/LICENSE +21 -0
- package/README.md +70 -58
- package/bin/cli.js +352 -150
- package/llms.txt +7 -5
- package/package.json +14 -26
- package/src/blocks/auth-card.tsx +104 -0
- package/src/blocks/auth-dialog.tsx +116 -0
- package/src/blocks/auth-recovery.tsx +61 -0
- package/src/blocks/auth-split.tsx +132 -0
- package/src/blocks/dashboard.tsx +182 -0
- package/src/blocks/settings.tsx +104 -0
- package/src/components/macro/accordion-preset.tsx +2 -1
- package/src/components/macro/alert-dialog-preset.tsx +3 -2
- package/src/components/macro/alert-preset.tsx +2 -1
- package/src/components/macro/avatar-preset.tsx +2 -1
- package/src/components/macro/breadcrumb-preset.tsx +2 -1
- package/src/components/macro/card-preset.tsx +2 -1
- package/src/components/macro/carousel-preset.tsx +2 -1
- package/src/components/macro/checkbox-preset.tsx +2 -1
- package/src/components/macro/combobox-preset.tsx +5 -3
- package/src/components/macro/command-preset.tsx +7 -4
- package/src/components/macro/date-picker.tsx +3 -2
- package/src/components/macro/dialog-preset.tsx +3 -2
- package/src/components/macro/empty-preset.tsx +2 -1
- package/src/components/macro/field-preset.tsx +2 -1
- package/src/components/macro/input-otp-preset.tsx +2 -1
- package/src/components/macro/input-preset.tsx +2 -1
- package/src/components/macro/pagination-preset.tsx +2 -1
- package/src/components/macro/progress-preset.tsx +2 -1
- package/src/components/macro/select-preset.tsx +3 -2
- package/src/components/macro/slider-preset.tsx +2 -1
- package/src/components/macro/switch-preset.tsx +2 -1
- package/src/components/macro/tabs-preset.tsx +2 -1
- package/src/components/micro/accordion.test.tsx +96 -0
- package/src/components/micro/alert-dialog.tsx +1 -1
- package/src/components/micro/alert.test.tsx +77 -0
- package/src/components/micro/avatar.tsx +1 -1
- package/src/components/micro/badge.test.tsx +57 -0
- package/src/components/micro/breadcrumb.tsx +1 -1
- package/src/components/micro/button.test.tsx +101 -4
- package/src/components/micro/card.test.tsx +54 -0
- package/src/components/micro/card.tsx +1 -1
- package/src/components/micro/carousel.tsx +1 -1
- package/src/components/micro/chart.tsx +1 -1
- package/src/components/micro/checkbox.test.tsx +92 -0
- package/src/components/micro/combobox.tsx +1 -1
- package/src/components/micro/command.tsx +1 -1
- package/src/components/micro/context-menu.tsx +1 -1
- package/src/components/micro/dialog.test.tsx +127 -0
- package/src/components/micro/dialog.tsx +1 -1
- package/src/components/micro/direction.tsx +1 -1
- package/src/components/micro/drawer.tsx +2 -2
- package/src/components/micro/dropdown-menu.test.tsx +132 -0
- package/src/components/micro/dropdown-menu.tsx +1 -1
- package/src/components/micro/empty.tsx +1 -1
- package/src/components/micro/field.tsx +1 -1
- package/src/components/micro/input-group.tsx +1 -1
- package/src/components/micro/input.test.tsx +95 -0
- package/src/components/micro/item.tsx +1 -1
- package/src/components/micro/menubar.tsx +1 -1
- package/src/components/micro/navigation-menu.tsx +1 -1
- package/src/components/micro/pagination.tsx +1 -1
- package/src/components/micro/popover.test.tsx +83 -0
- package/src/components/micro/popover.tsx +1 -1
- package/src/components/micro/progress.tsx +1 -1
- package/src/components/micro/select.test.tsx +122 -0
- package/src/components/micro/select.tsx +1 -1
- package/src/components/micro/sheet.test.tsx +122 -0
- package/src/components/micro/sheet.tsx +1 -1
- package/src/components/micro/sidebar.tsx +1 -1
- package/src/components/micro/switch.test.tsx +108 -0
- package/src/components/micro/table.tsx +1 -1
- package/src/components/micro/tabs.test.tsx +90 -0
- package/src/components/micro/tooltip.test.tsx +107 -0
- package/src/components/micro/tooltip.tsx +1 -1
- package/src/dev/data.ts +8 -0
- package/src/dev/main.tsx +4 -0
- package/src/dev/showcase/accordion.tsx +4 -2
- package/src/dev/showcase/alert-dialog.tsx +7 -4
- package/src/dev/showcase/alert.tsx +6 -3
- package/src/dev/showcase/aspect-ratio.tsx +2 -1
- package/src/dev/showcase/avatar.tsx +6 -3
- package/src/dev/showcase/badge.tsx +2 -1
- package/src/dev/showcase/breadcrumb.tsx +7 -4
- package/src/dev/showcase/button.tsx +2 -1
- package/src/dev/showcase/calendar.tsx +2 -1
- package/src/dev/showcase/card.tsx +4 -2
- package/src/dev/showcase/carousel.tsx +4 -2
- package/src/dev/showcase/chart.tsx +4 -2
- package/src/dev/showcase/checkbox.tsx +4 -2
- package/src/dev/showcase/collapsible.tsx +4 -2
- package/src/dev/showcase/combobox.tsx +9 -5
- package/src/dev/showcase/command.tsx +6 -3
- package/src/dev/showcase/context-menu.tsx +5 -3
- package/src/dev/showcase/dialog.tsx +5 -3
- package/src/dev/showcase/drawer.tsx +5 -3
- package/src/dev/showcase/dropdown-menu.tsx +7 -4
- package/src/dev/showcase/empty.tsx +6 -3
- package/src/dev/showcase/hover-card.tsx +7 -4
- package/src/dev/showcase/input-group.tsx +6 -3
- package/src/dev/showcase/input-otp.tsx +6 -3
- package/src/dev/showcase/input.tsx +6 -3
- package/src/dev/showcase/item.tsx +4 -2
- package/src/dev/showcase/kbd.tsx +10 -6
- package/src/dev/showcase/label.tsx +2 -1
- package/src/dev/showcase/menubar.tsx +5 -3
- package/src/dev/showcase/navigation-menu.tsx +5 -3
- package/src/dev/showcase/overview.tsx +9 -5
- package/src/dev/showcase/pagination.tsx +4 -2
- package/src/dev/showcase/popover.tsx +5 -3
- package/src/dev/showcase/progress.tsx +4 -2
- package/src/dev/showcase/radio-group.tsx +2 -1
- package/src/dev/showcase/resizable.tsx +4 -2
- package/src/dev/showcase/scroll-area.tsx +2 -1
- package/src/dev/showcase/select.tsx +7 -4
- package/src/dev/showcase/separator.tsx +2 -1
- package/src/dev/showcase/sheet.tsx +5 -3
- package/src/dev/showcase/sidebar.tsx +4 -2
- package/src/dev/showcase/skeleton.tsx +2 -1
- package/src/dev/showcase/slider.tsx +6 -3
- package/src/dev/showcase/sonner.tsx +2 -1
- package/src/dev/showcase/spinner.tsx +2 -1
- package/src/dev/showcase/switch.tsx +2 -1
- package/src/dev/showcase/table.tsx +4 -2
- package/src/dev/showcase/tabs.tsx +4 -2
- package/src/dev/showcase/textarea.tsx +6 -3
- package/src/dev/showcase/toast.tsx +2 -1
- package/src/dev/showcase/toggle-group.tsx +6 -3
- package/src/dev/showcase/toggle.tsx +2 -1
- package/src/dev/showcase/tooltip.tsx +5 -3
- package/src/dev/showcase/why.tsx +271 -0
- package/src/hooks/use-mobile.test.ts +72 -0
- package/src/lib/utils.test.ts +26 -10
- package/src/styles/gladvn.css +0 -1
- package/src/styles/tokens.css +4 -0
- package/dist/components/macro/accordion-preset.d.ts +0 -14
- package/dist/components/macro/accordion-preset.d.ts.map +0 -1
- package/dist/components/macro/alert-dialog-preset.d.ts +0 -26
- package/dist/components/macro/alert-dialog-preset.d.ts.map +0 -1
- package/dist/components/macro/alert-preset.d.ts +0 -14
- package/dist/components/macro/alert-preset.d.ts.map +0 -1
- package/dist/components/macro/avatar-preset.d.ts +0 -11
- package/dist/components/macro/avatar-preset.d.ts.map +0 -1
- package/dist/components/macro/breadcrumb-preset.d.ts +0 -12
- package/dist/components/macro/breadcrumb-preset.d.ts.map +0 -1
- package/dist/components/macro/card-preset.d.ts +0 -10
- package/dist/components/macro/card-preset.d.ts.map +0 -1
- package/dist/components/macro/carousel-preset.d.ts +0 -18
- package/dist/components/macro/carousel-preset.d.ts.map +0 -1
- package/dist/components/macro/checkbox-preset.d.ts +0 -14
- package/dist/components/macro/checkbox-preset.d.ts.map +0 -1
- package/dist/components/macro/combobox-preset.d.ts +0 -27
- package/dist/components/macro/combobox-preset.d.ts.map +0 -1
- package/dist/components/macro/command-preset.d.ts +0 -16
- package/dist/components/macro/command-preset.d.ts.map +0 -1
- package/dist/components/macro/date-picker.d.ts +0 -62
- package/dist/components/macro/date-picker.d.ts.map +0 -1
- package/dist/components/macro/dialog-preset.d.ts +0 -24
- package/dist/components/macro/dialog-preset.d.ts.map +0 -1
- package/dist/components/macro/empty-preset.d.ts +0 -15
- package/dist/components/macro/empty-preset.d.ts.map +0 -1
- package/dist/components/macro/field-preset.d.ts +0 -15
- package/dist/components/macro/field-preset.d.ts.map +0 -1
- package/dist/components/macro/index.d.ts +0 -22
- package/dist/components/macro/index.d.ts.map +0 -1
- package/dist/components/macro/input-otp-preset.d.ts +0 -19
- package/dist/components/macro/input-otp-preset.d.ts.map +0 -1
- package/dist/components/macro/input-preset.d.ts +0 -21
- package/dist/components/macro/input-preset.d.ts.map +0 -1
- package/dist/components/macro/pagination-preset.d.ts +0 -13
- package/dist/components/macro/pagination-preset.d.ts.map +0 -1
- package/dist/components/macro/progress-preset.d.ts +0 -10
- package/dist/components/macro/progress-preset.d.ts.map +0 -1
- package/dist/components/macro/radio-group-preset.d.ts +0 -22
- package/dist/components/macro/radio-group-preset.d.ts.map +0 -1
- package/dist/components/macro/select-preset.d.ts +0 -42
- package/dist/components/macro/select-preset.d.ts.map +0 -1
- package/dist/components/macro/slider-preset.d.ts +0 -12
- package/dist/components/macro/slider-preset.d.ts.map +0 -1
- package/dist/components/macro/switch-preset.d.ts +0 -12
- package/dist/components/macro/switch-preset.d.ts.map +0 -1
- package/dist/components/macro/tabs-preset.d.ts +0 -17
- package/dist/components/macro/tabs-preset.d.ts.map +0 -1
- package/dist/components/macro/textarea-preset.d.ts +0 -17
- package/dist/components/macro/textarea-preset.d.ts.map +0 -1
- package/dist/components/micro/accordion.d.ts +0 -15
- package/dist/components/micro/accordion.d.ts.map +0 -1
- package/dist/components/micro/alert-dialog.d.ts +0 -33
- package/dist/components/micro/alert-dialog.d.ts.map +0 -1
- package/dist/components/micro/alert.d.ts +0 -35
- package/dist/components/micro/alert.d.ts.map +0 -1
- package/dist/components/micro/aspect-ratio.d.ts +0 -20
- package/dist/components/micro/aspect-ratio.d.ts.map +0 -1
- package/dist/components/micro/avatar.d.ts +0 -23
- package/dist/components/micro/avatar.d.ts.map +0 -1
- package/dist/components/micro/badge.d.ts +0 -23
- package/dist/components/micro/badge.d.ts.map +0 -1
- package/dist/components/micro/breadcrumb.d.ts +0 -31
- package/dist/components/micro/breadcrumb.d.ts.map +0 -1
- package/dist/components/micro/button.d.ts +0 -46
- package/dist/components/micro/button.d.ts.map +0 -1
- package/dist/components/micro/calendar.d.ts +0 -28
- package/dist/components/micro/calendar.d.ts.map +0 -1
- package/dist/components/micro/card.d.ts +0 -28
- package/dist/components/micro/card.d.ts.map +0 -1
- package/dist/components/micro/carousel.d.ts +0 -29
- package/dist/components/micro/carousel.d.ts.map +0 -1
- package/dist/components/micro/chart.d.ts +0 -49
- package/dist/components/micro/chart.d.ts.map +0 -1
- package/dist/components/micro/checkbox.d.ts +0 -17
- package/dist/components/micro/checkbox.d.ts.map +0 -1
- package/dist/components/micro/collapsible.d.ts +0 -15
- package/dist/components/micro/collapsible.d.ts.map +0 -1
- package/dist/components/micro/combobox.d.ts +0 -34
- package/dist/components/micro/combobox.d.ts.map +0 -1
- package/dist/components/micro/command.d.ts +0 -79
- package/dist/components/micro/command.d.ts.map +0 -1
- package/dist/components/micro/context-menu.d.ts +0 -58
- package/dist/components/micro/context-menu.d.ts.map +0 -1
- package/dist/components/micro/dialog.d.ts +0 -15
- package/dist/components/micro/dialog.d.ts.map +0 -1
- package/dist/components/micro/direction.d.ts +0 -2
- package/dist/components/micro/direction.d.ts.map +0 -1
- package/dist/components/micro/drawer.d.ts +0 -18
- package/dist/components/micro/drawer.d.ts.map +0 -1
- package/dist/components/micro/dropdown-menu.d.ts +0 -40
- package/dist/components/micro/dropdown-menu.d.ts.map +0 -1
- package/dist/components/micro/empty.d.ts +0 -30
- package/dist/components/micro/empty.d.ts.map +0 -1
- package/dist/components/micro/field.d.ts +0 -29
- package/dist/components/micro/field.d.ts.map +0 -1
- package/dist/components/micro/hover-card.d.ts +0 -18
- package/dist/components/micro/hover-card.d.ts.map +0 -1
- package/dist/components/micro/input-group.d.ts +0 -17
- package/dist/components/micro/input-group.d.ts.map +0 -1
- package/dist/components/micro/input-otp.d.ts +0 -44
- package/dist/components/micro/input-otp.d.ts.map +0 -1
- package/dist/components/micro/input.d.ts +0 -29
- package/dist/components/micro/input.d.ts.map +0 -1
- package/dist/components/micro/item.d.ts +0 -31
- package/dist/components/micro/item.d.ts.map +0 -1
- package/dist/components/micro/kbd.d.ts +0 -9
- package/dist/components/micro/kbd.d.ts.map +0 -1
- package/dist/components/micro/label.d.ts +0 -15
- package/dist/components/micro/label.d.ts.map +0 -1
- package/dist/components/micro/menubar.d.ts +0 -40
- package/dist/components/micro/menubar.d.ts.map +0 -1
- package/dist/components/micro/navigation-menu.d.ts +0 -26
- package/dist/components/micro/navigation-menu.d.ts.map +0 -1
- package/dist/components/micro/pagination.d.ts +0 -33
- package/dist/components/micro/pagination.d.ts.map +0 -1
- package/dist/components/micro/popover.d.ts +0 -24
- package/dist/components/micro/popover.d.ts.map +0 -1
- package/dist/components/micro/progress.d.ts +0 -19
- package/dist/components/micro/progress.d.ts.map +0 -1
- package/dist/components/micro/radio-group.d.ts +0 -13
- package/dist/components/micro/radio-group.d.ts.map +0 -1
- package/dist/components/micro/resizable.d.ts +0 -12
- package/dist/components/micro/resizable.d.ts.map +0 -1
- package/dist/components/micro/scroll-area.d.ts +0 -12
- package/dist/components/micro/scroll-area.d.ts.map +0 -1
- package/dist/components/micro/select.d.ts +0 -22
- package/dist/components/micro/select.d.ts.map +0 -1
- package/dist/components/micro/separator.d.ts +0 -9
- package/dist/components/micro/separator.d.ts.map +0 -1
- package/dist/components/micro/sheet.d.ts +0 -17
- package/dist/components/micro/sheet.d.ts.map +0 -1
- package/dist/components/micro/sidebar.d.ts +0 -28
- package/dist/components/micro/sidebar.d.ts.map +0 -1
- package/dist/components/micro/skeleton.d.ts +0 -16
- package/dist/components/micro/skeleton.d.ts.map +0 -1
- package/dist/components/micro/slider.d.ts +0 -21
- package/dist/components/micro/slider.d.ts.map +0 -1
- package/dist/components/micro/sonner.d.ts +0 -5
- package/dist/components/micro/sonner.d.ts.map +0 -1
- package/dist/components/micro/spinner.d.ts +0 -21
- package/dist/components/micro/spinner.d.ts.map +0 -1
- package/dist/components/micro/switch.d.ts +0 -13
- package/dist/components/micro/switch.d.ts.map +0 -1
- package/dist/components/micro/table.d.ts +0 -17
- package/dist/components/micro/table.d.ts.map +0 -1
- package/dist/components/micro/tabs.d.ts +0 -13
- package/dist/components/micro/tabs.d.ts.map +0 -1
- package/dist/components/micro/textarea.d.ts +0 -24
- package/dist/components/micro/textarea.d.ts.map +0 -1
- package/dist/components/micro/theme-provider.d.ts +0 -76
- package/dist/components/micro/theme-provider.d.ts.map +0 -1
- package/dist/components/micro/toggle-group.d.ts +0 -22
- package/dist/components/micro/toggle-group.d.ts.map +0 -1
- package/dist/components/micro/toggle.d.ts +0 -16
- package/dist/components/micro/toggle.d.ts.map +0 -1
- package/dist/components/micro/tooltip.d.ts +0 -21
- package/dist/components/micro/tooltip.d.ts.map +0 -1
- package/dist/dev/App.d.ts +0 -3
- package/dist/dev/App.d.ts.map +0 -1
- package/dist/dev/components/GladvnLogo.d.ts +0 -10
- package/dist/dev/components/GladvnLogo.d.ts.map +0 -1
- package/dist/dev/components/code-highlighter.d.ts +0 -5
- package/dist/dev/components/code-highlighter.d.ts.map +0 -1
- package/dist/dev/components/dev-context.d.ts +0 -12
- package/dist/dev/components/dev-context.d.ts.map +0 -1
- package/dist/dev/components/showcase.d.ts +0 -72
- package/dist/dev/components/showcase.d.ts.map +0 -1
- package/dist/dev/data.d.ts +0 -68
- package/dist/dev/data.d.ts.map +0 -1
- package/dist/dev/main.d.ts +0 -1
- package/dist/dev/main.d.ts.map +0 -1
- package/dist/dev/sections/buttons.d.ts +0 -2
- package/dist/dev/sections/buttons.d.ts.map +0 -1
- package/dist/dev/sections/display.d.ts +0 -2
- package/dist/dev/sections/display.d.ts.map +0 -1
- package/dist/dev/sections/feedback.d.ts +0 -2
- package/dist/dev/sections/feedback.d.ts.map +0 -1
- package/dist/dev/sections/forms.d.ts +0 -2
- package/dist/dev/sections/forms.d.ts.map +0 -1
- package/dist/dev/sections/interactive.d.ts +0 -2
- package/dist/dev/sections/interactive.d.ts.map +0 -1
- package/dist/dev/sections/overview.d.ts +0 -2
- package/dist/dev/sections/overview.d.ts.map +0 -1
- package/dist/dev/showcase/accordion.d.ts +0 -2
- package/dist/dev/showcase/accordion.d.ts.map +0 -1
- package/dist/dev/showcase/alert-dialog.d.ts +0 -2
- package/dist/dev/showcase/alert-dialog.d.ts.map +0 -1
- package/dist/dev/showcase/alert.d.ts +0 -2
- package/dist/dev/showcase/alert.d.ts.map +0 -1
- package/dist/dev/showcase/aspect-ratio.d.ts +0 -2
- package/dist/dev/showcase/aspect-ratio.d.ts.map +0 -1
- package/dist/dev/showcase/avatar.d.ts +0 -2
- package/dist/dev/showcase/avatar.d.ts.map +0 -1
- package/dist/dev/showcase/badge.d.ts +0 -2
- package/dist/dev/showcase/badge.d.ts.map +0 -1
- package/dist/dev/showcase/breadcrumb.d.ts +0 -2
- package/dist/dev/showcase/breadcrumb.d.ts.map +0 -1
- package/dist/dev/showcase/button.d.ts +0 -2
- package/dist/dev/showcase/button.d.ts.map +0 -1
- package/dist/dev/showcase/calendar.d.ts +0 -2
- package/dist/dev/showcase/calendar.d.ts.map +0 -1
- package/dist/dev/showcase/card.d.ts +0 -2
- package/dist/dev/showcase/card.d.ts.map +0 -1
- package/dist/dev/showcase/carousel.d.ts +0 -2
- package/dist/dev/showcase/carousel.d.ts.map +0 -1
- package/dist/dev/showcase/chart.d.ts +0 -2
- package/dist/dev/showcase/chart.d.ts.map +0 -1
- package/dist/dev/showcase/checkbox.d.ts +0 -2
- package/dist/dev/showcase/checkbox.d.ts.map +0 -1
- package/dist/dev/showcase/collapsible.d.ts +0 -3
- package/dist/dev/showcase/collapsible.d.ts.map +0 -1
- package/dist/dev/showcase/combobox.d.ts +0 -2
- package/dist/dev/showcase/combobox.d.ts.map +0 -1
- package/dist/dev/showcase/command.d.ts +0 -2
- package/dist/dev/showcase/command.d.ts.map +0 -1
- package/dist/dev/showcase/context-menu.d.ts +0 -2
- package/dist/dev/showcase/context-menu.d.ts.map +0 -1
- package/dist/dev/showcase/dialog.d.ts +0 -2
- package/dist/dev/showcase/dialog.d.ts.map +0 -1
- package/dist/dev/showcase/drawer.d.ts +0 -2
- package/dist/dev/showcase/drawer.d.ts.map +0 -1
- package/dist/dev/showcase/dropdown-menu.d.ts +0 -2
- package/dist/dev/showcase/dropdown-menu.d.ts.map +0 -1
- package/dist/dev/showcase/empty.d.ts +0 -2
- package/dist/dev/showcase/empty.d.ts.map +0 -1
- package/dist/dev/showcase/hover-card.d.ts +0 -2
- package/dist/dev/showcase/hover-card.d.ts.map +0 -1
- package/dist/dev/showcase/input-group.d.ts +0 -2
- package/dist/dev/showcase/input-group.d.ts.map +0 -1
- package/dist/dev/showcase/input-otp.d.ts +0 -2
- package/dist/dev/showcase/input-otp.d.ts.map +0 -1
- package/dist/dev/showcase/input.d.ts +0 -2
- package/dist/dev/showcase/input.d.ts.map +0 -1
- package/dist/dev/showcase/item.d.ts +0 -2
- package/dist/dev/showcase/item.d.ts.map +0 -1
- package/dist/dev/showcase/kbd.d.ts +0 -2
- package/dist/dev/showcase/kbd.d.ts.map +0 -1
- package/dist/dev/showcase/label.d.ts +0 -2
- package/dist/dev/showcase/label.d.ts.map +0 -1
- package/dist/dev/showcase/menubar.d.ts +0 -2
- package/dist/dev/showcase/menubar.d.ts.map +0 -1
- package/dist/dev/showcase/navigation-menu.d.ts +0 -3
- package/dist/dev/showcase/navigation-menu.d.ts.map +0 -1
- package/dist/dev/showcase/overview.d.ts +0 -2
- package/dist/dev/showcase/overview.d.ts.map +0 -1
- package/dist/dev/showcase/pagination.d.ts +0 -2
- package/dist/dev/showcase/pagination.d.ts.map +0 -1
- package/dist/dev/showcase/popover.d.ts +0 -2
- package/dist/dev/showcase/popover.d.ts.map +0 -1
- package/dist/dev/showcase/progress.d.ts +0 -2
- package/dist/dev/showcase/progress.d.ts.map +0 -1
- package/dist/dev/showcase/radio-group.d.ts +0 -2
- package/dist/dev/showcase/radio-group.d.ts.map +0 -1
- package/dist/dev/showcase/resizable.d.ts +0 -2
- package/dist/dev/showcase/resizable.d.ts.map +0 -1
- package/dist/dev/showcase/scroll-area.d.ts +0 -2
- package/dist/dev/showcase/scroll-area.d.ts.map +0 -1
- package/dist/dev/showcase/select.d.ts +0 -2
- package/dist/dev/showcase/select.d.ts.map +0 -1
- package/dist/dev/showcase/separator.d.ts +0 -2
- package/dist/dev/showcase/separator.d.ts.map +0 -1
- package/dist/dev/showcase/sheet.d.ts +0 -2
- package/dist/dev/showcase/sheet.d.ts.map +0 -1
- package/dist/dev/showcase/sidebar.d.ts +0 -2
- package/dist/dev/showcase/sidebar.d.ts.map +0 -1
- package/dist/dev/showcase/skeleton.d.ts +0 -2
- package/dist/dev/showcase/skeleton.d.ts.map +0 -1
- package/dist/dev/showcase/slider.d.ts +0 -2
- package/dist/dev/showcase/slider.d.ts.map +0 -1
- package/dist/dev/showcase/sonner.d.ts +0 -2
- package/dist/dev/showcase/sonner.d.ts.map +0 -1
- package/dist/dev/showcase/spinner.d.ts +0 -2
- package/dist/dev/showcase/spinner.d.ts.map +0 -1
- package/dist/dev/showcase/switch.d.ts +0 -2
- package/dist/dev/showcase/switch.d.ts.map +0 -1
- package/dist/dev/showcase/table.d.ts +0 -2
- package/dist/dev/showcase/table.d.ts.map +0 -1
- package/dist/dev/showcase/tabs.d.ts +0 -2
- package/dist/dev/showcase/tabs.d.ts.map +0 -1
- package/dist/dev/showcase/textarea.d.ts +0 -2
- package/dist/dev/showcase/textarea.d.ts.map +0 -1
- package/dist/dev/showcase/toast.d.ts +0 -2
- package/dist/dev/showcase/toast.d.ts.map +0 -1
- package/dist/dev/showcase/toggle-group.d.ts +0 -2
- package/dist/dev/showcase/toggle-group.d.ts.map +0 -1
- package/dist/dev/showcase/toggle.d.ts +0 -2
- package/dist/dev/showcase/toggle.d.ts.map +0 -1
- package/dist/dev/showcase/tooltip.d.ts +0 -2
- package/dist/dev/showcase/tooltip.d.ts.map +0 -1
- package/dist/hooks/use-controllable-state.d.ts +0 -14
- package/dist/hooks/use-controllable-state.d.ts.map +0 -1
- package/dist/hooks/use-mobile.d.ts +0 -2
- package/dist/hooks/use-mobile.d.ts.map +0 -1
- package/dist/index.cjs +0 -5099
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.ts +0 -58
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -4753
- package/dist/index.js.map +0 -1
- package/dist/lib/types.d.ts +0 -4
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/utils.d.ts +0 -3
- package/dist/lib/utils.d.ts.map +0 -1
- package/dist/preset.d.ts +0 -18
- package/dist/preset.d.ts.map +0 -1
- package/dist/test/setup.d.ts +0 -1
- package/dist/test/setup.d.ts.map +0 -1
- package/scripts/add-icononly-prop.ts +0 -84
- package/scripts/audit-best-practices.ts +0 -114
- package/scripts/audit-showcase.ts +0 -262
- package/scripts/audit-showcases.ts +0 -83
- package/scripts/clean-imports.ts +0 -21
- package/scripts/count_missing.ts +0 -24
- package/scripts/find-css-vars.ts +0 -62
- package/scripts/fix-portals.ts +0 -90
- package/scripts/format-codestrings.ts +0 -87
- package/scripts/full-audit.ts +0 -89
- package/scripts/merge-components.cjs +0 -65
- package/scripts/merge-components.js +0 -64
- package/scripts/optimize-barrel.ts +0 -116
- package/scripts/organize-imports.ts +0 -21
- package/scripts/refactor_divs.ts +0 -39
- package/scripts/regex-format.cjs +0 -67
- package/scripts/remove_div_wrappers.ts +0 -17
- package/scripts/tmp.tsx +0 -25
- package/scripts/update-gaps.ts +0 -83
- package/scripts/update_showcase_codestrings.ts +0 -87
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
|
|
2
|
+
import { render, screen, waitFor } from "@testing-library/react";
|
|
3
|
+
import userEvent from "@testing-library/user-event";
|
|
4
|
+
import { describe, expect, it } from "vitest";
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
Accordion,
|
|
8
|
+
AccordionContent,
|
|
9
|
+
AccordionItem,
|
|
10
|
+
AccordionTrigger,
|
|
11
|
+
} from "./accordion";
|
|
12
|
+
|
|
13
|
+
describe("Accordion", () => {
|
|
14
|
+
it("[3C.13-01] [P1] renders correctly and is closed by default", () => {
|
|
15
|
+
// Given
|
|
16
|
+
render(
|
|
17
|
+
<Accordion>
|
|
18
|
+
<AccordionItem value="item-1">
|
|
19
|
+
<AccordionTrigger>Section 1</AccordionTrigger>
|
|
20
|
+
<AccordionContent>Content 1</AccordionContent>
|
|
21
|
+
</AccordionItem>
|
|
22
|
+
</Accordion>,
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
const trigger = screen.getByRole("button", { name: "Section 1" });
|
|
26
|
+
// Then
|
|
27
|
+
expect(trigger).toBeInTheDocument();
|
|
28
|
+
expect(trigger).toHaveAttribute("aria-expanded", "false");
|
|
29
|
+
|
|
30
|
+
// Content is either not in document or hidden based on Base UI implementation
|
|
31
|
+
const content = screen.queryByText("Content 1");
|
|
32
|
+
if (content) {
|
|
33
|
+
expect(content).not.toBeVisible();
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it("[3C.13-02] [P1] expands the content when trigger is clicked", async () => {
|
|
38
|
+
// Given
|
|
39
|
+
const user = userEvent.setup();
|
|
40
|
+
render(
|
|
41
|
+
<Accordion>
|
|
42
|
+
<AccordionItem value="item-1">
|
|
43
|
+
<AccordionTrigger>Section 1</AccordionTrigger>
|
|
44
|
+
<AccordionContent>Content 1</AccordionContent>
|
|
45
|
+
</AccordionItem>
|
|
46
|
+
</Accordion>,
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const trigger = screen.getByRole("button", { name: "Section 1" });
|
|
50
|
+
// When
|
|
51
|
+
await user.click(trigger);
|
|
52
|
+
|
|
53
|
+
// Then
|
|
54
|
+
await waitFor(() => {
|
|
55
|
+
expect(trigger).toHaveAttribute("aria-expanded", "true");
|
|
56
|
+
expect(screen.getByText("Content 1")).toBeVisible();
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it("[3C.13-03] [P1] supports keyboard navigation", async () => {
|
|
61
|
+
// Given
|
|
62
|
+
const user = userEvent.setup();
|
|
63
|
+
render(
|
|
64
|
+
<Accordion>
|
|
65
|
+
<AccordionItem value="item-1">
|
|
66
|
+
<AccordionTrigger>Section 1</AccordionTrigger>
|
|
67
|
+
<AccordionContent>Content 1</AccordionContent>
|
|
68
|
+
</AccordionItem>
|
|
69
|
+
<AccordionItem value="item-2">
|
|
70
|
+
<AccordionTrigger>Section 2</AccordionTrigger>
|
|
71
|
+
<AccordionContent>Content 2</AccordionContent>
|
|
72
|
+
</AccordionItem>
|
|
73
|
+
</Accordion>,
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
const trigger1 = screen.getByRole("button", { name: "Section 1" });
|
|
77
|
+
const trigger2 = screen.getByRole("button", { name: "Section 2" });
|
|
78
|
+
|
|
79
|
+
// Focus first
|
|
80
|
+
// When
|
|
81
|
+
await user.tab();
|
|
82
|
+
// Then
|
|
83
|
+
expect(trigger1).toHaveFocus();
|
|
84
|
+
|
|
85
|
+
// Tab to move to next item
|
|
86
|
+
await user.tab();
|
|
87
|
+
expect(trigger2).toHaveFocus();
|
|
88
|
+
|
|
89
|
+
// Enter to expand
|
|
90
|
+
await user.keyboard("[Enter]");
|
|
91
|
+
await waitFor(() => {
|
|
92
|
+
expect(trigger2).toHaveAttribute("aria-expanded", "true");
|
|
93
|
+
expect(screen.getByText("Content 2")).toBeVisible();
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
});
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
|
|
2
|
+
import { render, screen } from "@testing-library/react";
|
|
3
|
+
import { InfoIcon } from "lucide-react";
|
|
4
|
+
import { describe, expect, it } from "vitest";
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
Alert,
|
|
8
|
+
AlertAction,
|
|
9
|
+
AlertDescription,
|
|
10
|
+
AlertIcon,
|
|
11
|
+
AlertTitle,
|
|
12
|
+
} from "./alert";
|
|
13
|
+
|
|
14
|
+
describe("Alert", () => {
|
|
15
|
+
it("[3C.12-01] [P1] renders all alert parts correctly", () => {
|
|
16
|
+
// Given
|
|
17
|
+
render(
|
|
18
|
+
<Alert data-testid="alert">
|
|
19
|
+
<AlertIcon render={<InfoIcon />} data-testid="alert-icon" />
|
|
20
|
+
<AlertTitle>Alert Title</AlertTitle>
|
|
21
|
+
<AlertDescription>Alert Description</AlertDescription>
|
|
22
|
+
<AlertAction data-testid="alert-action">Action</AlertAction>
|
|
23
|
+
</Alert>,
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
// Then
|
|
27
|
+
expect(screen.getByTestId("alert")).toBeInTheDocument();
|
|
28
|
+
expect(screen.getByTestId("alert-icon")).toBeInTheDocument();
|
|
29
|
+
expect(screen.getByText("Alert Title")).toBeInTheDocument();
|
|
30
|
+
expect(screen.getByText("Alert Description")).toBeInTheDocument();
|
|
31
|
+
expect(screen.getByTestId("alert-action")).toHaveTextContent("Action");
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("[3C.12-02] [P1] applies the color variants correctly", () => {
|
|
35
|
+
// Given
|
|
36
|
+
const { rerender } = render(
|
|
37
|
+
<Alert color="destructive" data-testid="alert-destructive">
|
|
38
|
+
Error
|
|
39
|
+
</Alert>,
|
|
40
|
+
);
|
|
41
|
+
// Then
|
|
42
|
+
expect(screen.getByTestId("alert-destructive")).toHaveAttribute(
|
|
43
|
+
"data-color",
|
|
44
|
+
"destructive",
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
// When
|
|
48
|
+
rerender(
|
|
49
|
+
<Alert color="success" data-testid="alert-success">
|
|
50
|
+
Success
|
|
51
|
+
</Alert>,
|
|
52
|
+
);
|
|
53
|
+
expect(screen.getByTestId("alert-success")).toHaveAttribute(
|
|
54
|
+
"data-color",
|
|
55
|
+
"success",
|
|
56
|
+
);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it("[3C.12-03] [P1] applies the size variants correctly", () => {
|
|
60
|
+
// Given
|
|
61
|
+
const { rerender } = render(
|
|
62
|
+
<Alert size="sm" data-testid="alert-sm">
|
|
63
|
+
Small
|
|
64
|
+
</Alert>,
|
|
65
|
+
);
|
|
66
|
+
// Then
|
|
67
|
+
expect(screen.getByTestId("alert-sm")).toHaveAttribute("data-size", "sm");
|
|
68
|
+
|
|
69
|
+
// When
|
|
70
|
+
rerender(
|
|
71
|
+
<Alert size="lg" data-testid="alert-lg">
|
|
72
|
+
Large
|
|
73
|
+
</Alert>,
|
|
74
|
+
);
|
|
75
|
+
expect(screen.getByTestId("alert-lg")).toHaveAttribute("data-size", "lg");
|
|
76
|
+
});
|
|
77
|
+
});
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
|
|
2
|
+
import { render, screen } from "@testing-library/react";
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
|
|
5
|
+
import { Badge } from "./badge";
|
|
6
|
+
|
|
7
|
+
describe("Badge", () => {
|
|
8
|
+
it("[3C.10-01] [P1] renders correctly with default styles", () => {
|
|
9
|
+
// Given
|
|
10
|
+
render(<Badge data-testid="badge">Hello</Badge>);
|
|
11
|
+
const badge = screen.getByTestId("badge");
|
|
12
|
+
|
|
13
|
+
// Then
|
|
14
|
+
expect(badge).toBeInTheDocument();
|
|
15
|
+
expect(badge).toHaveTextContent("Hello");
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("[3C.10-02] [P1] applies variant and color correctly", () => {
|
|
19
|
+
// Given
|
|
20
|
+
const { rerender } = render(
|
|
21
|
+
<Badge
|
|
22
|
+
variant="outline"
|
|
23
|
+
color="destructive"
|
|
24
|
+
data-testid="badge-outline-destructive"
|
|
25
|
+
>
|
|
26
|
+
Error
|
|
27
|
+
</Badge>,
|
|
28
|
+
);
|
|
29
|
+
const outlineBadge = screen.getByTestId("badge-outline-destructive");
|
|
30
|
+
// Then
|
|
31
|
+
expect(outlineBadge).toHaveClass("border-destructive", "text-destructive");
|
|
32
|
+
|
|
33
|
+
// When
|
|
34
|
+
rerender(
|
|
35
|
+
<Badge variant="soft" color="success" data-testid="badge-soft-success">
|
|
36
|
+
Success
|
|
37
|
+
</Badge>,
|
|
38
|
+
);
|
|
39
|
+
const softBadge = screen.getByTestId("badge-soft-success");
|
|
40
|
+
expect(softBadge).toHaveClass("bg-success/15", "text-success");
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("[3C.10-03] [P1] supports polymorphism via render prop", () => {
|
|
44
|
+
// Given
|
|
45
|
+
render(
|
|
46
|
+
<Badge render={<a href="/test" data-testid="badge-link" />}>
|
|
47
|
+
Link Badge
|
|
48
|
+
</Badge>,
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
const link = screen.getByTestId("badge-link");
|
|
52
|
+
// Then
|
|
53
|
+
expect(link.tagName).toBe("A");
|
|
54
|
+
expect(link).toHaveAttribute("href", "/test");
|
|
55
|
+
expect(link).toHaveTextContent("Link Badge");
|
|
56
|
+
});
|
|
57
|
+
});
|
|
@@ -1,26 +1,123 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
|
|
1
3
|
import { render, screen } from "@testing-library/react";
|
|
2
|
-
import
|
|
4
|
+
import userEvent from "@testing-library/user-event";
|
|
5
|
+
import { describe, expect, it, vi } from "vitest";
|
|
3
6
|
|
|
4
7
|
import { Button } from "./button";
|
|
5
8
|
|
|
6
9
|
describe("Button", () => {
|
|
7
|
-
|
|
10
|
+
// 1. Rendering & Attributes (API Surface)
|
|
11
|
+
it("[3C.1-01] [P1] renders correctly with default props", () => {
|
|
12
|
+
// Given
|
|
8
13
|
render(<Button>Click me</Button>);
|
|
9
14
|
const button = screen.getByRole("button", { name: "Click me" });
|
|
15
|
+
// Then
|
|
10
16
|
expect(button).toBeInTheDocument();
|
|
11
|
-
// Default variant is "solid" and color is "primary"
|
|
12
17
|
expect(button).toHaveAttribute("data-variant", "solid");
|
|
13
18
|
expect(button).toHaveAttribute("data-color", "primary");
|
|
14
19
|
});
|
|
15
20
|
|
|
16
|
-
it("applies custom variants and colors", () => {
|
|
21
|
+
it("[3C.1-02] [P1] applies custom variants and colors", () => {
|
|
22
|
+
// Given
|
|
17
23
|
render(
|
|
18
24
|
<Button variant="outline" color="destructive">
|
|
19
25
|
Delete
|
|
20
26
|
</Button>,
|
|
21
27
|
);
|
|
22
28
|
const button = screen.getByRole("button", { name: "Delete" });
|
|
29
|
+
// Then
|
|
23
30
|
expect(button).toHaveAttribute("data-variant", "outline");
|
|
24
31
|
expect(button).toHaveAttribute("data-color", "destructive");
|
|
25
32
|
});
|
|
33
|
+
|
|
34
|
+
it("[3C.1-03] [P1] merges custom classNames properly", () => {
|
|
35
|
+
// Given
|
|
36
|
+
render(<Button className="custom-test-class">Classy Button</Button>);
|
|
37
|
+
const button = screen.getByRole("button", { name: "Classy Button" });
|
|
38
|
+
// Then
|
|
39
|
+
expect(button).toHaveClass("custom-test-class");
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("[3C.1-04] [P1] supports iconOnly attribute to render as square", () => {
|
|
43
|
+
// Given
|
|
44
|
+
render(<Button iconOnly>Icon</Button>);
|
|
45
|
+
const button = screen.getByRole("button", { name: "Icon" });
|
|
46
|
+
// Then
|
|
47
|
+
expect(button).toHaveAttribute("data-icon", "true");
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// 2. Behaviors (Interaction & Events)
|
|
51
|
+
it("[3C.1-05] [P1] fires onClick event when clicked", async () => {
|
|
52
|
+
// Given
|
|
53
|
+
const user = userEvent.setup();
|
|
54
|
+
const handleClick = vi.fn();
|
|
55
|
+
render(<Button onClick={handleClick}>Click</Button>);
|
|
56
|
+
|
|
57
|
+
const button = screen.getByRole("button", { name: "Click" });
|
|
58
|
+
// When
|
|
59
|
+
await user.click(button);
|
|
60
|
+
|
|
61
|
+
// Then
|
|
62
|
+
expect(handleClick).toHaveBeenCalledTimes(1);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it("[3C.1-06] [P1] can be focused and activated via keyboard", async () => {
|
|
66
|
+
// Given
|
|
67
|
+
const user = userEvent.setup();
|
|
68
|
+
const handleClick = vi.fn();
|
|
69
|
+
render(<Button onClick={handleClick}>Submit</Button>);
|
|
70
|
+
|
|
71
|
+
const button = screen.getByRole("button", { name: "Submit" });
|
|
72
|
+
|
|
73
|
+
// Test focus
|
|
74
|
+
// When
|
|
75
|
+
await user.tab();
|
|
76
|
+
// Then
|
|
77
|
+
expect(button).toHaveFocus();
|
|
78
|
+
|
|
79
|
+
// Test keyboard activation (Enter)
|
|
80
|
+
await user.keyboard("{Enter}");
|
|
81
|
+
expect(handleClick).toHaveBeenCalledTimes(1);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it("[3C.1-07] [P1] handles disabled state correctly and blocks clicks", async () => {
|
|
85
|
+
// Given
|
|
86
|
+
const user = userEvent.setup();
|
|
87
|
+
const handleClick = vi.fn();
|
|
88
|
+
render(
|
|
89
|
+
<Button disabled onClick={handleClick}>
|
|
90
|
+
Disabled Button
|
|
91
|
+
</Button>,
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
const button = screen.getByRole("button", { name: "Disabled Button" });
|
|
95
|
+
// Then
|
|
96
|
+
expect(button).toBeDisabled();
|
|
97
|
+
|
|
98
|
+
// When
|
|
99
|
+
await user.click(button);
|
|
100
|
+
expect(handleClick).not.toHaveBeenCalled();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// 3. Architecture & Integration
|
|
104
|
+
it("[3C.1-08] [P1] forwards the ref to the underlying DOM element", () => {
|
|
105
|
+
// Given
|
|
106
|
+
const ref = React.createRef<HTMLButtonElement>();
|
|
107
|
+
render(<Button ref={ref}>Ref Button</Button>);
|
|
108
|
+
// Then
|
|
109
|
+
expect(ref.current).toBeInstanceOf(HTMLButtonElement);
|
|
110
|
+
expect(ref.current?.textContent).toBe("Ref Button");
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it("[3C.1-09] [P1] supports polymorphism via render prop (Base UI 'render' pattern)", () => {
|
|
114
|
+
// Given
|
|
115
|
+
render(<Button render={<a href="/home" />}>Link Button</Button>);
|
|
116
|
+
const link = screen.getByText("Link Button");
|
|
117
|
+
// Then
|
|
118
|
+
expect(link).toBeInTheDocument();
|
|
119
|
+
expect(link.tagName).toBe("A");
|
|
120
|
+
expect(link).toHaveAttribute("href", "/home");
|
|
121
|
+
expect(link).toHaveAttribute("data-variant", "solid");
|
|
122
|
+
});
|
|
26
123
|
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
|
|
2
|
+
import { render, screen } from "@testing-library/react";
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
Card,
|
|
7
|
+
CardContent,
|
|
8
|
+
CardDescription,
|
|
9
|
+
CardFooter,
|
|
10
|
+
CardHeader,
|
|
11
|
+
CardTitle,
|
|
12
|
+
} from "./card";
|
|
13
|
+
|
|
14
|
+
describe("Card", () => {
|
|
15
|
+
it("[3C.11-01] [P1] renders all card parts correctly", () => {
|
|
16
|
+
// Given
|
|
17
|
+
render(
|
|
18
|
+
<Card data-testid="card">
|
|
19
|
+
<CardHeader>
|
|
20
|
+
<CardTitle>Card Title</CardTitle>
|
|
21
|
+
<CardDescription>Card Description</CardDescription>
|
|
22
|
+
</CardHeader>
|
|
23
|
+
<CardContent>Card Content</CardContent>
|
|
24
|
+
<CardFooter>Card Footer</CardFooter>
|
|
25
|
+
</Card>,
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
// Then
|
|
29
|
+
expect(screen.getByTestId("card")).toBeInTheDocument();
|
|
30
|
+
expect(screen.getByText("Card Title")).toBeInTheDocument();
|
|
31
|
+
expect(screen.getByText("Card Description")).toBeInTheDocument();
|
|
32
|
+
expect(screen.getByText("Card Content")).toBeInTheDocument();
|
|
33
|
+
expect(screen.getByText("Card Footer")).toBeInTheDocument();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("[3C.11-02] [P1] applies the size variants correctly", () => {
|
|
37
|
+
// Given
|
|
38
|
+
const { rerender } = render(
|
|
39
|
+
<Card size="sm" data-testid="card-sm">
|
|
40
|
+
Content
|
|
41
|
+
</Card>,
|
|
42
|
+
);
|
|
43
|
+
// Then
|
|
44
|
+
expect(screen.getByTestId("card-sm")).toHaveAttribute("data-size", "sm");
|
|
45
|
+
|
|
46
|
+
// When
|
|
47
|
+
rerender(
|
|
48
|
+
<Card size="lg" data-testid="card-lg">
|
|
49
|
+
Content
|
|
50
|
+
</Card>,
|
|
51
|
+
);
|
|
52
|
+
expect(screen.getByTestId("card-lg")).toHaveAttribute("data-size", "lg");
|
|
53
|
+
});
|
|
54
|
+
});
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
|
|
3
|
+
import { render, screen } from "@testing-library/react";
|
|
4
|
+
import userEvent from "@testing-library/user-event";
|
|
5
|
+
import { describe, expect, it, vi } from "vitest";
|
|
6
|
+
|
|
7
|
+
import { Checkbox } from "./checkbox";
|
|
8
|
+
|
|
9
|
+
describe("Checkbox", () => {
|
|
10
|
+
it("[3C.6-01] [P1] renders correctly", () => {
|
|
11
|
+
// Given
|
|
12
|
+
render(<Checkbox aria-label="Accept terms" />);
|
|
13
|
+
const checkbox = screen.getByRole("checkbox", { name: "Accept terms" });
|
|
14
|
+
// Then
|
|
15
|
+
expect(checkbox).toBeInTheDocument();
|
|
16
|
+
expect(checkbox).toHaveAttribute("data-slot", "checkbox");
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it("[3C.6-02] [P1] handles user click to toggle state", async () => {
|
|
20
|
+
// Given
|
|
21
|
+
const user = userEvent.setup();
|
|
22
|
+
const handleCheckedChange = vi.fn();
|
|
23
|
+
render(
|
|
24
|
+
<Checkbox aria-label="Toggle" onCheckedChange={handleCheckedChange} />,
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
const checkbox = screen.getByRole("checkbox", { name: "Toggle" });
|
|
28
|
+
|
|
29
|
+
// Initially unchecked
|
|
30
|
+
// Then
|
|
31
|
+
expect(checkbox).not.toBeChecked();
|
|
32
|
+
|
|
33
|
+
// Click to check
|
|
34
|
+
// When
|
|
35
|
+
await user.click(checkbox);
|
|
36
|
+
expect(checkbox).toBeChecked();
|
|
37
|
+
expect(handleCheckedChange).toHaveBeenCalledWith(true, expect.anything());
|
|
38
|
+
|
|
39
|
+
// Click to uncheck
|
|
40
|
+
await user.click(checkbox);
|
|
41
|
+
expect(checkbox).not.toBeChecked();
|
|
42
|
+
expect(handleCheckedChange).toHaveBeenCalledWith(false, expect.anything());
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("[3C.6-03] [P1] can be focused and toggled via keyboard (Space)", async () => {
|
|
46
|
+
// Given
|
|
47
|
+
const user = userEvent.setup();
|
|
48
|
+
render(<Checkbox aria-label="Keyboard toggle" />);
|
|
49
|
+
|
|
50
|
+
const checkbox = screen.getByRole("checkbox", { name: "Keyboard toggle" });
|
|
51
|
+
|
|
52
|
+
// Test focus
|
|
53
|
+
// When
|
|
54
|
+
await user.tab();
|
|
55
|
+
// Then
|
|
56
|
+
expect(checkbox).toHaveFocus();
|
|
57
|
+
|
|
58
|
+
// Test keyboard activation (Space for checkbox)
|
|
59
|
+
await user.keyboard("[Space]");
|
|
60
|
+
expect(checkbox).toBeChecked();
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("[3C.6-04] [P1] handles disabled state correctly and blocks clicks", async () => {
|
|
64
|
+
// Given
|
|
65
|
+
const user = userEvent.setup();
|
|
66
|
+
const handleCheckedChange = vi.fn();
|
|
67
|
+
render(
|
|
68
|
+
<Checkbox
|
|
69
|
+
disabled
|
|
70
|
+
aria-label="Disabled"
|
|
71
|
+
onCheckedChange={handleCheckedChange}
|
|
72
|
+
/>,
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
const checkbox = screen.getByRole("checkbox", { name: "Disabled" });
|
|
76
|
+
// Then
|
|
77
|
+
expect(checkbox).toHaveAttribute("aria-disabled", "true");
|
|
78
|
+
|
|
79
|
+
// When
|
|
80
|
+
await user.click(checkbox);
|
|
81
|
+
expect(handleCheckedChange).not.toHaveBeenCalled();
|
|
82
|
+
expect(checkbox).not.toBeChecked();
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("[3C.6-05] [P1] forwards the ref to the underlying DOM element", () => {
|
|
86
|
+
// Given
|
|
87
|
+
const ref = React.createRef<HTMLSpanElement>();
|
|
88
|
+
render(<Checkbox ref={ref} aria-label="Ref checkbox" />);
|
|
89
|
+
// Then
|
|
90
|
+
expect(ref.current).toBeInstanceOf(HTMLSpanElement);
|
|
91
|
+
});
|
|
92
|
+
});
|