@getmicdrop/svelte-components 5.5.1 → 5.5.5
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/dist/calendar/AboutShow/AboutShow.spec.d.ts +2 -0
- package/dist/calendar/AboutShow/AboutShow.spec.d.ts.map +1 -0
- package/dist/calendar/AboutShow/AboutShow.spec.js +791 -0
- package/dist/calendar/AboutShow/AboutShow.svelte +172 -172
- package/dist/calendar/Calendar/MiniMonthCalendar.spec.d.ts +2 -0
- package/dist/calendar/Calendar/MiniMonthCalendar.spec.d.ts.map +1 -0
- package/dist/calendar/Calendar/MiniMonthCalendar.spec.js +1191 -0
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte +782 -782
- package/dist/calendar/FAQs/FAQs.spec.d.ts +2 -0
- package/dist/calendar/FAQs/FAQs.spec.d.ts.map +1 -0
- package/dist/calendar/FAQs/FAQs.spec.js +238 -0
- package/dist/calendar/FAQs/FAQs.svelte +75 -75
- package/dist/calendar/MonthSwitcher/MonthSwitcher.spec.d.ts +2 -0
- package/dist/calendar/MonthSwitcher/MonthSwitcher.spec.d.ts.map +1 -0
- package/dist/calendar/MonthSwitcher/MonthSwitcher.spec.js +420 -0
- package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte +126 -126
- package/dist/calendar/OrderSummary/OrderSummary.spec.d.ts +2 -0
- package/dist/calendar/OrderSummary/OrderSummary.spec.d.ts.map +1 -0
- package/dist/calendar/OrderSummary/OrderSummary.spec.js +808 -0
- package/dist/calendar/OrderSummary/OrderSummary.svelte +367 -367
- package/dist/calendar/PublicCard/PublicCard.spec.d.ts +2 -0
- package/dist/calendar/PublicCard/PublicCard.spec.d.ts.map +1 -0
- package/dist/calendar/PublicCard/PublicCard.spec.js +301 -0
- package/dist/calendar/PublicCard/PublicCard.svelte +134 -134
- package/dist/calendar/ShowCard/ShowCard.spec.d.ts +2 -0
- package/dist/calendar/ShowCard/ShowCard.spec.d.ts.map +1 -0
- package/dist/calendar/ShowCard/ShowCard.spec.js +714 -0
- package/dist/calendar/ShowCard/ShowCard.svelte +157 -157
- package/dist/calendar/ShowTimeCard/ShowTimeCard.spec.d.ts +2 -0
- package/dist/calendar/ShowTimeCard/ShowTimeCard.spec.d.ts.map +1 -0
- package/dist/calendar/ShowTimeCard/ShowTimeCard.spec.js +241 -0
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +61 -61
- package/dist/components/Layout/Grid.svelte +4 -4
- package/dist/components/Layout/Section.spec.d.ts +2 -0
- package/dist/components/Layout/Section.spec.d.ts.map +1 -0
- package/dist/components/Layout/Section.spec.js +149 -0
- package/dist/components/Layout/Section.svelte +80 -80
- package/dist/components/Layout/Sidebar.spec.d.ts +2 -0
- package/dist/components/Layout/Sidebar.spec.d.ts.map +1 -0
- package/dist/components/Layout/Sidebar.spec.js +186 -0
- package/dist/components/Layout/Sidebar.svelte +108 -108
- package/dist/components/Layout/Stack.spec.js +3 -3
- package/dist/components/Layout/Stack.svelte +6 -6
- package/dist/constants/formOptions.spec.js +9 -5
- package/dist/constants/validation.js +91 -91
- package/dist/constants/validation.spec.js +64 -64
- package/dist/datetime/__tests__/format.test.js +1 -1
- package/dist/datetime/__tests__/parse.test.js +1 -1
- package/dist/datetime/__tests__/timezone.test.js +124 -2
- package/dist/datetime/parse.js +1 -1
- package/dist/forms/createFieldTracker.spec.d.ts +2 -0
- package/dist/forms/createFieldTracker.spec.d.ts.map +1 -0
- package/dist/forms/createFieldTracker.spec.js +343 -0
- package/dist/forms/createFormStore.spec.d.ts +2 -0
- package/dist/forms/createFormStore.spec.d.ts.map +1 -0
- package/dist/forms/createFormStore.spec.js +689 -0
- package/dist/forms/createFormStore.svelte.js +0 -1
- package/dist/index.d.ts +5 -112
- package/dist/index.js +40 -225
- package/dist/patterns/data/DataGrid.spec.d.ts +2 -0
- package/dist/patterns/data/DataGrid.spec.d.ts.map +1 -0
- package/dist/patterns/data/DataGrid.spec.js +159 -0
- package/dist/patterns/data/DataGrid.svelte +45 -45
- package/dist/patterns/data/DataList.spec.d.ts +2 -0
- package/dist/patterns/data/DataList.spec.d.ts.map +1 -0
- package/dist/patterns/data/DataList.spec.js +158 -0
- package/dist/patterns/data/DataList.svelte +24 -24
- package/dist/patterns/data/DataTable.spec.d.ts +2 -0
- package/dist/patterns/data/DataTable.spec.d.ts.map +1 -0
- package/dist/patterns/data/DataTable.spec.js +196 -0
- package/dist/patterns/data/DataTable.svelte +36 -36
- package/dist/patterns/forms/FormActions.spec.js +95 -88
- package/dist/patterns/forms/FormActions.stories.svelte +97 -97
- package/dist/patterns/forms/FormActions.svelte +46 -46
- package/dist/patterns/forms/FormGrid.spec.d.ts +2 -0
- package/dist/patterns/forms/FormGrid.spec.d.ts.map +1 -0
- package/dist/patterns/forms/FormGrid.spec.js +125 -0
- package/dist/patterns/forms/FormGrid.svelte +33 -33
- package/dist/patterns/forms/FormSection.spec.d.ts +2 -0
- package/dist/patterns/forms/FormSection.spec.d.ts.map +1 -0
- package/dist/patterns/forms/FormSection.spec.js +153 -0
- package/dist/patterns/forms/FormSection.svelte +32 -32
- package/dist/patterns/forms/FormValidationSummary.stories.svelte +83 -83
- package/dist/patterns/forms/FormValidationSummary.svelte +33 -33
- package/dist/patterns/layout/Sidebar.spec.d.ts +2 -0
- package/dist/patterns/layout/Sidebar.spec.d.ts.map +1 -0
- package/dist/patterns/layout/Sidebar.spec.js +159 -0
- package/dist/patterns/layout/Sidebar.svelte +39 -39
- package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
- package/dist/patterns/navigation/BottomNav.svelte +20 -20
- package/dist/patterns/navigation/Header.spec.js +33 -24
- package/dist/patterns/navigation/Header.stories.svelte +77 -77
- package/dist/patterns/navigation/Header.svelte +193 -193
- package/dist/patterns/page/PageHeader.spec.d.ts +2 -0
- package/dist/patterns/page/PageHeader.spec.d.ts.map +1 -0
- package/dist/patterns/page/PageHeader.spec.js +167 -0
- package/dist/patterns/page/PageHeader.svelte +18 -18
- package/dist/patterns/page/PageLayout.spec.d.ts +2 -0
- package/dist/patterns/page/PageLayout.spec.d.ts.map +1 -0
- package/dist/patterns/page/PageLayout.spec.js +145 -0
- package/dist/patterns/page/PageLayout.svelte +40 -40
- package/dist/patterns/page/PageLoader.spec.js +57 -54
- package/dist/patterns/page/PageLoader.stories.svelte +137 -137
- package/dist/patterns/page/PageLoader.svelte +24 -24
- package/dist/patterns/page/SectionHeader.spec.d.ts +2 -0
- package/dist/patterns/page/SectionHeader.spec.d.ts.map +1 -0
- package/dist/patterns/page/SectionHeader.spec.js +197 -0
- package/dist/patterns/page/SectionHeader.svelte +29 -29
- package/dist/presets/badges.js +112 -112
- package/dist/presets/badges.spec.d.ts +2 -0
- package/dist/presets/badges.spec.d.ts.map +1 -0
- package/dist/presets/badges.spec.js +172 -0
- package/dist/presets/buttons.js +76 -76
- package/dist/presets/buttons.spec.d.ts +2 -0
- package/dist/presets/buttons.spec.d.ts.map +1 -0
- package/dist/presets/buttons.spec.js +135 -0
- package/dist/presets/index.js +9 -9
- package/dist/primitives/Accordion/Accordion.spec.d.ts +2 -0
- package/dist/primitives/Accordion/Accordion.spec.d.ts.map +1 -0
- package/dist/primitives/Accordion/Accordion.spec.js +83 -0
- package/dist/primitives/Accordion/Accordion.stories.svelte +75 -75
- package/dist/primitives/Accordion/Accordion.svelte +42 -42
- package/dist/primitives/Accordion/AccordionItem.spec.d.ts +2 -0
- package/dist/primitives/Accordion/AccordionItem.spec.d.ts.map +1 -0
- package/dist/primitives/Accordion/AccordionItem.spec.js +661 -0
- package/dist/primitives/Accordion/AccordionItem.svelte +95 -95
- package/dist/primitives/Accordion/AccordionItemWrapper.test.svelte +107 -0
- package/dist/primitives/Accordion/AccordionItemWrapper.test.svelte.d.ts +35 -0
- package/dist/primitives/Accordion/AccordionItemWrapper.test.svelte.d.ts.map +1 -0
- package/dist/primitives/Alert/Alert.spec.js +173 -170
- package/dist/primitives/Alert/Alert.stories.svelte +88 -88
- package/dist/primitives/Alert/Alert.svelte +27 -27
- package/dist/primitives/Avatar/Avatar.spec.d.ts +2 -0
- package/dist/primitives/Avatar/Avatar.spec.d.ts.map +1 -0
- package/dist/primitives/Avatar/Avatar.spec.js +211 -0
- package/dist/primitives/Avatar/Avatar.stories.svelte +94 -94
- package/dist/primitives/Avatar/Avatar.svelte +66 -66
- package/dist/primitives/Badges/Badge.spec.js +144 -103
- package/dist/primitives/Badges/Badge.stories.svelte +86 -86
- package/dist/primitives/Badges/Badge.svelte +79 -79
- package/dist/primitives/BottomSheet/BottomSheet.spec.js +136 -127
- package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
- package/dist/primitives/BottomSheet/BottomSheet.svelte +100 -100
- package/dist/primitives/BottomSheet/BottomSheetWrapper.test.svelte +13 -0
- package/dist/primitives/BottomSheet/BottomSheetWrapper.test.svelte.d.ts +7 -0
- package/dist/primitives/BottomSheet/BottomSheetWrapper.test.svelte.d.ts.map +1 -0
- package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +122 -120
- package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
- package/dist/primitives/Breadcrumb/Breadcrumb.svelte +89 -89
- package/dist/primitives/Button/Button.spec.js +223 -211
- package/dist/primitives/Button/Button.stories.svelte +76 -76
- package/dist/primitives/Button/Button.svelte +270 -270
- package/dist/primitives/Button/ButtonSaveDemo.spec.js +146 -48
- package/dist/primitives/Button/ButtonSaveDemo.svelte +25 -25
- package/dist/primitives/Button/ButtonVariantShowcase.spec.d.ts +2 -0
- package/dist/primitives/Button/ButtonVariantShowcase.spec.d.ts.map +1 -0
- package/dist/primitives/Button/ButtonVariantShowcase.spec.js +202 -0
- package/dist/primitives/Button/ButtonVariantShowcase.svelte +129 -129
- package/dist/primitives/Card.spec.js +49 -49
- package/dist/primitives/Card.stories.svelte +22 -22
- package/dist/primitives/Card.svelte +28 -28
- package/dist/primitives/Checkbox/Checkbox.spec.d.ts +2 -0
- package/dist/primitives/Checkbox/Checkbox.spec.d.ts.map +1 -0
- package/dist/primitives/Checkbox/Checkbox.spec.js +252 -0
- package/dist/primitives/Checkbox/Checkbox.stories.svelte +84 -84
- package/dist/primitives/Checkbox/Checkbox.svelte +88 -88
- package/dist/primitives/DarkModeToggle.spec.js +390 -357
- package/dist/primitives/DarkModeToggle.stories.svelte +57 -57
- package/dist/primitives/DarkModeToggle.svelte +136 -136
- package/dist/primitives/Drawer/Drawer.spec.d.ts +2 -0
- package/dist/primitives/Drawer/Drawer.spec.d.ts.map +1 -0
- package/dist/primitives/Drawer/Drawer.spec.js +212 -0
- package/dist/primitives/Drawer/Drawer.stories.svelte +80 -80
- package/dist/primitives/Drawer/Drawer.svelte +120 -120
- package/dist/primitives/Dropdown/Dropdown.spec.d.ts +2 -0
- package/dist/primitives/Dropdown/Dropdown.spec.d.ts.map +1 -0
- package/dist/primitives/Dropdown/Dropdown.spec.js +366 -0
- package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
- package/dist/primitives/Dropdown/Dropdown.svelte +14 -14
- package/dist/primitives/Dropdown/DropdownItem.spec.d.ts +2 -0
- package/dist/primitives/Dropdown/DropdownItem.spec.d.ts.map +1 -0
- package/dist/primitives/Dropdown/DropdownItem.spec.js +182 -0
- package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
- package/dist/primitives/Icons/ArrowLeft.svelte +8 -8
- package/dist/primitives/Icons/ArrowRight.svelte +8 -8
- package/dist/primitives/Icons/Availability.svelte +14 -14
- package/dist/primitives/Icons/Back.svelte +14 -14
- package/dist/primitives/Icons/CheckCircle.svelte +6 -6
- package/dist/primitives/Icons/CheckCircleOutline.svelte +15 -15
- package/dist/primitives/Icons/ChevronLeft.svelte +4 -4
- package/dist/primitives/Icons/ChevronRight.svelte +4 -4
- package/dist/primitives/Icons/Copy.svelte +15 -15
- package/dist/primitives/Icons/Cross.svelte +5 -5
- package/dist/primitives/Icons/DownArrow.svelte +8 -8
- package/dist/primitives/Icons/ErrorCircle.svelte +6 -6
- package/dist/primitives/Icons/FacebookIcon.svelte +2 -2
- package/dist/primitives/Icons/Home.svelte +15 -15
- package/dist/primitives/Icons/Icon.spec.js +169 -169
- package/dist/primitives/Icons/Icon.stories.svelte +100 -100
- package/dist/primitives/Icons/Icon.svelte +52 -52
- package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
- package/dist/primitives/Icons/Info.svelte +7 -7
- package/dist/primitives/Icons/InstagramIcon.svelte +4 -4
- package/dist/primitives/Icons/LogoInstagram.svelte +2 -2
- package/dist/primitives/Icons/Message.svelte +15 -15
- package/dist/primitives/Icons/MoonIcon.svelte +5 -5
- package/dist/primitives/Icons/More.svelte +21 -21
- package/dist/primitives/Icons/MoreHori.spec.js +61 -61
- package/dist/primitives/Icons/MoreHori.svelte +22 -22
- package/dist/primitives/Icons/Notification.svelte +14 -14
- package/dist/primitives/Icons/Payment.svelte +14 -14
- package/dist/primitives/Icons/Profile.svelte +21 -21
- package/dist/primitives/Icons/Reload.svelte +29 -29
- package/dist/primitives/Icons/Shows.svelte +21 -21
- package/dist/primitives/Icons/Signout.svelte +21 -21
- package/dist/primitives/Icons/SunIcon.svelte +8 -8
- package/dist/primitives/Icons/TiktokIcon.svelte +2 -2
- package/dist/primitives/Icons/TwitterIcon.svelte +2 -2
- package/dist/primitives/Icons/WarningIcon.spec.js +18 -18
- package/dist/primitives/Icons/WarningIcon.svelte +5 -5
- package/dist/primitives/Icons/iconTestUtils.spec.d.ts +2 -0
- package/dist/primitives/Icons/iconTestUtils.spec.d.ts.map +1 -0
- package/dist/primitives/Icons/iconTestUtils.spec.js +235 -0
- package/dist/primitives/Input/Input.spec.js +573 -573
- package/dist/primitives/Input/Input.stories.svelte +139 -139
- package/dist/primitives/Input/Input.svelte +384 -397
- package/dist/primitives/Input/Input.svelte.d.ts.map +1 -1
- package/dist/primitives/Input/Select.spec.js +212 -218
- package/dist/primitives/Input/Select.stories.svelte +112 -112
- package/dist/primitives/Input/Select.svelte +128 -128
- package/dist/primitives/Input/Textarea.spec.d.ts +2 -0
- package/dist/primitives/Input/Textarea.spec.d.ts.map +1 -0
- package/dist/primitives/Input/Textarea.spec.js +255 -0
- package/dist/primitives/Input/Textarea.stories.svelte +137 -137
- package/dist/primitives/Input/Textarea.svelte +35 -35
- package/dist/primitives/Label/Label.spec.d.ts +2 -0
- package/dist/primitives/Label/Label.spec.d.ts.map +1 -0
- package/dist/primitives/Label/Label.spec.js +157 -0
- package/dist/primitives/Label/Label.svelte +37 -37
- package/dist/primitives/Modal/Modal.spec.js +99 -95
- package/dist/primitives/Modal/Modal.stories.svelte +86 -86
- package/dist/primitives/Modal/Modal.svelte +158 -158
- package/dist/primitives/Modal/ModalTestWrapper.svelte +65 -0
- package/dist/primitives/Modal/ModalTestWrapper.svelte.d.ts +23 -0
- package/dist/primitives/Modal/ModalTestWrapper.svelte.d.ts.map +1 -0
- package/dist/primitives/NumberInput/NumberInput.spec.d.ts +2 -0
- package/dist/primitives/NumberInput/NumberInput.spec.d.ts.map +1 -0
- package/dist/primitives/NumberInput/NumberInput.spec.js +235 -0
- package/dist/primitives/NumberInput/NumberInput.svelte +106 -106
- package/dist/primitives/Pagination/Pagination.spec.d.ts +2 -0
- package/dist/primitives/Pagination/Pagination.spec.d.ts.map +1 -0
- package/dist/primitives/Pagination/Pagination.spec.js +266 -0
- package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
- package/dist/primitives/Pagination/Pagination.svelte +261 -261
- package/dist/primitives/Radio/Radio.spec.d.ts +2 -0
- package/dist/primitives/Radio/Radio.spec.d.ts.map +1 -0
- package/dist/primitives/Radio/Radio.spec.js +206 -0
- package/dist/primitives/Radio/Radio.stories.svelte +80 -80
- package/dist/primitives/Radio/Radio.svelte +67 -67
- package/dist/primitives/Skeleton/CardPlaceholder.spec.d.ts +2 -0
- package/dist/primitives/Skeleton/CardPlaceholder.spec.d.ts.map +1 -0
- package/dist/primitives/Skeleton/CardPlaceholder.spec.js +156 -0
- package/dist/primitives/Skeleton/CardPlaceholder.svelte +87 -87
- package/dist/primitives/Skeleton/ImagePlaceholder.spec.d.ts +2 -0
- package/dist/primitives/Skeleton/ImagePlaceholder.spec.d.ts.map +1 -0
- package/dist/primitives/Skeleton/ImagePlaceholder.spec.js +120 -0
- package/dist/primitives/Skeleton/ImagePlaceholder.svelte +59 -59
- package/dist/primitives/Skeleton/ListPlaceholder.spec.d.ts +2 -0
- package/dist/primitives/Skeleton/ListPlaceholder.spec.d.ts.map +1 -0
- package/dist/primitives/Skeleton/ListPlaceholder.spec.js +220 -0
- package/dist/primitives/Skeleton/ListPlaceholder.svelte +76 -76
- package/dist/primitives/Skeleton/Skeleton.spec.d.ts +2 -0
- package/dist/primitives/Skeleton/Skeleton.spec.d.ts.map +1 -0
- package/dist/primitives/Skeleton/Skeleton.spec.js +173 -0
- package/dist/primitives/Skeleton/Skeleton.stories.svelte +151 -151
- package/dist/primitives/Skeleton/Skeleton.svelte +26 -26
- package/dist/primitives/Spinner/Spinner.spec.js +71 -75
- package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
- package/dist/primitives/Spinner/Spinner.svelte +20 -20
- package/dist/primitives/Tabs/TabItem.spec.d.ts +2 -0
- package/dist/primitives/Tabs/TabItem.spec.d.ts.map +1 -0
- package/dist/primitives/Tabs/TabItem.spec.js +130 -0
- package/dist/primitives/Tabs/TabItem.svelte +49 -49
- package/dist/primitives/Tabs/Tabs.spec.d.ts +2 -0
- package/dist/primitives/Tabs/Tabs.spec.d.ts.map +1 -0
- package/dist/primitives/Tabs/Tabs.spec.js +295 -0
- package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
- package/dist/primitives/Tabs/Tabs.svelte +123 -123
- package/dist/primitives/Tabs/TabsWithItems.test.svelte +18 -0
- package/dist/primitives/Tabs/TabsWithItems.test.svelte.d.ts +16 -0
- package/dist/primitives/Tabs/TabsWithItems.test.svelte.d.ts.map +1 -0
- package/dist/primitives/Toggle.spec.js +143 -127
- package/dist/primitives/Toggle.stories.svelte +92 -92
- package/dist/primitives/Toggle.svelte +71 -71
- package/dist/primitives/Typography/Typography.spec.d.ts +2 -0
- package/dist/primitives/Typography/Typography.spec.d.ts.map +1 -0
- package/dist/primitives/Typography/Typography.spec.js +183 -0
- package/dist/primitives/Typography/Typography.svelte +53 -53
- package/dist/primitives/ValidationError.spec.js +103 -103
- package/dist/primitives/ValidationError.stories.svelte +69 -69
- package/dist/primitives/ValidationError.svelte +29 -29
- package/dist/primitives/index.d.ts +1 -0
- package/dist/primitives/index.js +3 -0
- package/dist/recipes/CropImage/CropImage.spec.js +208 -216
- package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
- package/dist/recipes/CropImage/CropImage.svelte +238 -238
- package/dist/recipes/ImageUploader/ImageUploader.spec.d.ts +2 -0
- package/dist/recipes/ImageUploader/ImageUploader.spec.d.ts.map +1 -0
- package/dist/recipes/ImageUploader/ImageUploader.spec.js +1351 -0
- package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
- package/dist/recipes/ImageUploader/ImageUploader.svelte +804 -804
- package/dist/recipes/SuperLogin/SuperLogin.spec.d.ts +2 -0
- package/dist/recipes/SuperLogin/SuperLogin.spec.d.ts.map +1 -0
- package/dist/recipes/SuperLogin/SuperLogin.spec.js +1436 -0
- package/dist/recipes/SuperLogin/SuperLogin.svelte +7 -6
- package/dist/recipes/SuperLogin/SuperLogin.svelte.d.ts.map +1 -1
- package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
- package/dist/recipes/feedback/EmptyState/EmptyState.spec.d.ts +2 -0
- package/dist/recipes/feedback/EmptyState/EmptyState.spec.d.ts.map +1 -0
- package/dist/recipes/feedback/EmptyState/EmptyState.spec.js +202 -0
- package/dist/recipes/feedback/EmptyState/EmptyState.svelte +1 -1
- package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
- package/dist/recipes/feedback/ErrorDisplay.stories.svelte +101 -101
- package/dist/recipes/feedback/ErrorDisplay.svelte +1 -1
- package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +133 -129
- package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +157 -157
- package/dist/recipes/fields/CheckboxField.spec.d.ts +2 -0
- package/dist/recipes/fields/CheckboxField.spec.d.ts.map +1 -0
- package/dist/recipes/fields/CheckboxField.spec.js +135 -0
- package/dist/recipes/fields/CheckboxField.svelte +85 -85
- package/dist/recipes/fields/FormField.spec.d.ts +2 -0
- package/dist/recipes/fields/FormField.spec.d.ts.map +1 -0
- package/dist/recipes/fields/FormField.spec.js +159 -0
- package/dist/recipes/fields/FormField.svelte +58 -58
- package/dist/recipes/fields/RadioGroup.spec.d.ts +2 -0
- package/dist/recipes/fields/RadioGroup.spec.d.ts.map +1 -0
- package/dist/recipes/fields/RadioGroup.spec.js +199 -0
- package/dist/recipes/fields/RadioGroup.svelte +95 -95
- package/dist/recipes/fields/SelectField.spec.d.ts +2 -0
- package/dist/recipes/fields/SelectField.spec.d.ts.map +1 -0
- package/dist/recipes/fields/SelectField.spec.js +188 -0
- package/dist/recipes/fields/SelectField.svelte +80 -80
- package/dist/recipes/fields/TextareaField.spec.d.ts +2 -0
- package/dist/recipes/fields/TextareaField.spec.d.ts.map +1 -0
- package/dist/recipes/fields/TextareaField.spec.js +205 -0
- package/dist/recipes/fields/TextareaField.svelte +97 -97
- package/dist/recipes/fields/ToggleField.spec.d.ts +2 -0
- package/dist/recipes/fields/ToggleField.spec.d.ts.map +1 -0
- package/dist/recipes/fields/ToggleField.spec.js +153 -0
- package/dist/recipes/fields/ToggleField.svelte +60 -60
- package/dist/recipes/fields/index.js +7 -7
- package/dist/recipes/inputs/MultiSelect.spec.js +258 -257
- package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
- package/dist/recipes/inputs/MultiSelect.svelte +256 -249
- package/dist/recipes/inputs/MultiSelect.svelte.d.ts +2 -0
- package/dist/recipes/inputs/MultiSelect.svelte.d.ts.map +1 -1
- package/dist/recipes/inputs/OTPInput.spec.js +251 -238
- package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
- package/dist/recipes/inputs/OTPInput.svelte +29 -29
- package/dist/recipes/inputs/PasswordInput.spec.d.ts +2 -0
- package/dist/recipes/inputs/PasswordInput.spec.d.ts.map +1 -0
- package/dist/recipes/inputs/PasswordInput.spec.js +410 -0
- package/dist/recipes/inputs/PasswordInput.svelte +22 -22
- package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.spec.js +245 -165
- package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +43 -43
- package/dist/recipes/inputs/PasswordStrengthIndicator/TestWrapper.svelte +71 -0
- package/dist/recipes/inputs/PasswordStrengthIndicator/TestWrapper.svelte.d.ts +9 -0
- package/dist/recipes/inputs/PasswordStrengthIndicator/TestWrapper.svelte.d.ts.map +1 -0
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.spec.js +1139 -193
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +123 -123
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +326 -326
- package/dist/recipes/inputs/Search.spec.d.ts +2 -0
- package/dist/recipes/inputs/Search.spec.d.ts.map +1 -0
- package/dist/recipes/inputs/Search.spec.js +177 -0
- package/dist/recipes/inputs/Search.svelte +37 -37
- package/dist/recipes/inputs/SelectDropdown.spec.d.ts +2 -0
- package/dist/recipes/inputs/SelectDropdown.spec.d.ts.map +1 -0
- package/dist/recipes/inputs/SelectDropdown.spec.js +512 -0
- package/dist/recipes/inputs/SelectDropdown.svelte +57 -57
- package/dist/recipes/modals/AlertModal.spec.d.ts +2 -0
- package/dist/recipes/modals/AlertModal.spec.d.ts.map +1 -0
- package/dist/recipes/modals/AlertModal.spec.js +432 -0
- package/dist/recipes/modals/AlertModal.svelte +130 -130
- package/dist/recipes/modals/ConfirmationModal.spec.js +206 -191
- package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
- package/dist/recipes/modals/ConfirmationModal.svelte +152 -152
- package/dist/recipes/modals/InputModal.spec.d.ts +2 -0
- package/dist/recipes/modals/InputModal.spec.d.ts.map +1 -0
- package/dist/recipes/modals/InputModal.spec.js +872 -0
- package/dist/recipes/modals/InputModal.svelte +182 -182
- package/dist/recipes/modals/ModalStateManager.spec.js +100 -100
- package/dist/recipes/modals/ModalStateManager.svelte +77 -77
- package/dist/recipes/modals/ModalTestWrapper.spec.d.ts +2 -0
- package/dist/recipes/modals/ModalTestWrapper.spec.d.ts.map +1 -0
- package/dist/recipes/modals/ModalTestWrapper.spec.js +502 -0
- package/dist/recipes/modals/ModalTestWrapper.svelte +65 -65
- package/dist/recipes/modals/StatusModal.spec.d.ts +2 -0
- package/dist/recipes/modals/StatusModal.spec.d.ts.map +1 -0
- package/dist/recipes/modals/StatusModal.spec.js +599 -0
- package/dist/recipes/modals/StatusModal.svelte +206 -206
- package/dist/services/EventService.js +75 -75
- package/dist/services/EventService.spec.js +217 -217
- package/dist/services/ShowService.spec.js +345 -342
- package/dist/stores/auth.js +36 -36
- package/dist/stores/auth.spec.js +139 -139
- package/dist/stores/toaster.js +13 -13
- package/dist/stories/ButtonAuditDashboard.spec.d.ts +2 -0
- package/dist/stories/ButtonAuditDashboard.spec.d.ts.map +1 -0
- package/dist/stories/ButtonAuditDashboard.spec.js +913 -0
- package/dist/stories/ButtonAuditReview.spec.d.ts +2 -0
- package/dist/stories/ButtonAuditReview.spec.d.ts.map +1 -0
- package/dist/stories/ButtonAuditReview.spec.js +422 -0
- package/dist/stories/ButtonAuditReview.stories.svelte +14 -14
- package/dist/stories/ButtonAuditReview.svelte +427 -427
- package/dist/stories/ButtonGridView.spec.d.ts +2 -0
- package/dist/stories/ButtonGridView.spec.d.ts.map +1 -0
- package/dist/stories/ButtonGridView.spec.js +667 -0
- package/dist/stories/ButtonShowcase.spec.d.ts +2 -0
- package/dist/stories/ButtonShowcase.spec.d.ts.map +1 -0
- package/dist/stories/ButtonShowcase.spec.js +499 -0
- package/dist/stories/PatternsGallery.spec.d.ts +2 -0
- package/dist/stories/PatternsGallery.spec.d.ts.map +1 -0
- package/dist/stories/PatternsGallery.spec.js +514 -0
- package/dist/stories/PatternsGallery.stories.svelte +19 -19
- package/dist/stories/PatternsGallery.svelte +206 -206
- package/dist/stories/PrimitivesGallery.spec.d.ts +2 -0
- package/dist/stories/PrimitivesGallery.spec.d.ts.map +1 -0
- package/dist/stories/PrimitivesGallery.spec.js +813 -0
- package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
- package/dist/stories/PrimitivesGallery.svelte +725 -725
- package/dist/stories/RecipesGallery.spec.d.ts +2 -0
- package/dist/stories/RecipesGallery.spec.d.ts.map +1 -0
- package/dist/stories/RecipesGallery.spec.js +299 -0
- package/dist/stories/RecipesGallery.stories.svelte +19 -19
- package/dist/stories/RecipesGallery.svelte +271 -271
- package/dist/stories/button-audit-manifest.json +11186 -11186
- package/dist/stripe/useStripeTheme.spec.d.ts +2 -0
- package/dist/stripe/useStripeTheme.spec.d.ts.map +1 -0
- package/dist/stripe/useStripeTheme.spec.js +793 -0
- package/dist/tailwind/preset.cjs +82 -82
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +6 -5
- package/dist/telemetry.spec.js +495 -12
- package/dist/tokens/__tests__/colors.test.d.ts +2 -0
- package/dist/tokens/__tests__/colors.test.d.ts.map +1 -0
- package/dist/tokens/__tests__/colors.test.js +152 -0
- package/dist/tokens/__tests__/radius.test.d.ts +2 -0
- package/dist/tokens/__tests__/radius.test.d.ts.map +1 -0
- package/dist/tokens/__tests__/radius.test.js +118 -0
- package/dist/tokens/__tests__/shadows.test.d.ts +2 -0
- package/dist/tokens/__tests__/shadows.test.d.ts.map +1 -0
- package/dist/tokens/__tests__/shadows.test.js +105 -0
- package/dist/tokens/__tests__/spacing.test.js +11 -8
- package/dist/tokens/__tests__/typography.test.d.ts +2 -0
- package/dist/tokens/__tests__/typography.test.d.ts.map +1 -0
- package/dist/tokens/__tests__/typography.test.js +156 -0
- package/dist/tokens/__tests__/z-index.test.d.ts +2 -0
- package/dist/tokens/__tests__/z-index.test.d.ts.map +1 -0
- package/dist/tokens/__tests__/z-index.test.js +121 -0
- package/dist/tokens/tokens.css +87 -87
- package/dist/utils/apiConfig.spec.js +102 -1
- package/dist/utils/formatters.spec.d.ts +2 -0
- package/dist/utils/formatters.spec.d.ts.map +1 -0
- package/dist/utils/formatters.spec.js +82 -0
- package/dist/utils/transitions.d.ts +24 -0
- package/dist/utils/transitions.d.ts.map +1 -0
- package/dist/utils/transitions.js +62 -0
- package/dist/utils/transitions.spec.d.ts +2 -0
- package/dist/utils/transitions.spec.d.ts.map +1 -0
- package/dist/utils/transitions.spec.js +130 -0
- package/dist/utils/utils.js +354 -354
- package/package.json +288 -283
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import { render, screen } from '@testing-library/svelte';
|
|
2
|
+
import userEvent from '@testing-library/user-event';
|
|
3
|
+
import { expect, describe, test, vi, beforeEach, afterEach } from 'vitest';
|
|
4
|
+
import Dropdown from './Dropdown.svelte';
|
|
5
|
+
|
|
6
|
+
describe('Dropdown Component', () => {
|
|
7
|
+
test('does not render when open is false', () => {
|
|
8
|
+
const { container } = render(Dropdown, { props: { open: false } });
|
|
9
|
+
expect(container.querySelector('[role="menu"]')).not.toBeInTheDocument();
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
test('renders when open is true', () => {
|
|
13
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
14
|
+
expect(container.querySelector('[role="menu"]')).toBeInTheDocument();
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test('has role="menu"', () => {
|
|
18
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
19
|
+
const menu = container.querySelector('[role="menu"]');
|
|
20
|
+
expect(menu).toBeInTheDocument();
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test('applies default ariaLabel', () => {
|
|
24
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
25
|
+
const menu = container.querySelector('[role="menu"]');
|
|
26
|
+
expect(menu).toHaveAttribute('aria-label', 'Menu');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('applies custom ariaLabel', () => {
|
|
30
|
+
const { container } = render(Dropdown, { props: { open: true, ariaLabel: 'Options' } });
|
|
31
|
+
const menu = container.querySelector('[role="menu"]');
|
|
32
|
+
expect(menu).toHaveAttribute('aria-label', 'Options');
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test('applies custom className', () => {
|
|
36
|
+
const { container } = render(Dropdown, { props: { open: true, class: 'custom-dropdown' } });
|
|
37
|
+
const menu = container.querySelector('[role="menu"]');
|
|
38
|
+
expect(menu).toHaveClass('custom-dropdown');
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test('passes through additional props', () => {
|
|
42
|
+
const { container } = render(Dropdown, { props: { open: true, 'data-testid': 'my-dropdown' } });
|
|
43
|
+
const menu = container.querySelector('[data-testid="my-dropdown"]');
|
|
44
|
+
expect(menu).toBeInTheDocument();
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
describe('Dropdown Styling', () => {
|
|
49
|
+
test('has absolute positioning', () => {
|
|
50
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
51
|
+
const menu = container.querySelector('[role="menu"]');
|
|
52
|
+
expect(menu).toHaveClass('absolute');
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test('has z-10 for stacking', () => {
|
|
56
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
57
|
+
const menu = container.querySelector('[role="menu"]');
|
|
58
|
+
expect(menu).toHaveClass('z-10');
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('has bg-white background', () => {
|
|
62
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
63
|
+
const menu = container.querySelector('[role="menu"]');
|
|
64
|
+
expect(menu).toHaveClass('bg-white');
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test('has dark mode background', () => {
|
|
68
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
69
|
+
const menu = container.querySelector('[role="menu"]');
|
|
70
|
+
expect(menu).toHaveClass('dark:bg-gray-700');
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
test('has rounded-lg border radius', () => {
|
|
74
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
75
|
+
const menu = container.querySelector('[role="menu"]');
|
|
76
|
+
expect(menu).toHaveClass('rounded-lg');
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test('has shadow-lg for elevation', () => {
|
|
80
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
81
|
+
const menu = container.querySelector('[role="menu"]');
|
|
82
|
+
expect(menu).toHaveClass('shadow-lg');
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test('has w-44 default width', () => {
|
|
86
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
87
|
+
const menu = container.querySelector('[role="menu"]');
|
|
88
|
+
expect(menu).toHaveClass('w-44');
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test('has divider classes', () => {
|
|
92
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
93
|
+
const menu = container.querySelector('[role="menu"]');
|
|
94
|
+
expect(menu).toHaveClass('divide-y');
|
|
95
|
+
expect(menu).toHaveClass('divide-gray-100');
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
describe('Dropdown List', () => {
|
|
100
|
+
test('contains ul element', () => {
|
|
101
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
102
|
+
const ul = container.querySelector('ul');
|
|
103
|
+
expect(ul).toBeInTheDocument();
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test('ul has py-2 padding', () => {
|
|
107
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
108
|
+
const ul = container.querySelector('ul');
|
|
109
|
+
expect(ul).toHaveClass('py-2');
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test('ul has text-sm sizing', () => {
|
|
113
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
114
|
+
const ul = container.querySelector('ul');
|
|
115
|
+
expect(ul).toHaveClass('text-sm');
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test('ul has text-gray-700 color', () => {
|
|
119
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
120
|
+
const ul = container.querySelector('ul');
|
|
121
|
+
expect(ul).toHaveClass('text-gray-700');
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test('ul has dark mode text color', () => {
|
|
125
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
126
|
+
const ul = container.querySelector('ul');
|
|
127
|
+
expect(ul).toHaveClass('dark:text-gray-200');
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
describe('Dropdown Props', () => {
|
|
132
|
+
test('open defaults to false', () => {
|
|
133
|
+
const { container } = render(Dropdown);
|
|
134
|
+
expect(container.querySelector('[role="menu"]')).not.toBeInTheDocument();
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
test('placement defaults to bottom', () => {
|
|
138
|
+
// Placement affects positioning classes
|
|
139
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
140
|
+
const menu = container.querySelector('[role="menu"]');
|
|
141
|
+
// Default bottom placement should exist without explicit placement classes from other positions
|
|
142
|
+
expect(menu).toBeInTheDocument();
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test('activeUrl can be set', () => {
|
|
146
|
+
// activeUrl is passed via context to child items
|
|
147
|
+
const { container } = render(Dropdown, { props: { open: true, activeUrl: '/test' } });
|
|
148
|
+
expect(container.querySelector('[role="menu"]')).toBeInTheDocument();
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
describe('Dropdown Callbacks', () => {
|
|
153
|
+
test('onclose callback prop is accepted', () => {
|
|
154
|
+
const onclose = vi.fn();
|
|
155
|
+
const { container } = render(Dropdown, { props: { open: true, onclose } });
|
|
156
|
+
expect(container.querySelector('[role="menu"]')).toBeInTheDocument();
|
|
157
|
+
// The onclose callback is triggered by keyboard/click events, tested in integration
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
describe('Dropdown Keyboard Navigation', () => {
|
|
162
|
+
let cleanup;
|
|
163
|
+
|
|
164
|
+
beforeEach(() => {
|
|
165
|
+
// Clean up any existing event listeners
|
|
166
|
+
cleanup = null;
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
afterEach(() => {
|
|
170
|
+
if (cleanup) {
|
|
171
|
+
cleanup();
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
test('Escape key closes dropdown and calls onclose', async () => {
|
|
176
|
+
const onclose = vi.fn();
|
|
177
|
+
const result = render(Dropdown, { props: { open: true, onclose } });
|
|
178
|
+
cleanup = result.unmount;
|
|
179
|
+
|
|
180
|
+
const ul = result.container.querySelector('ul');
|
|
181
|
+
expect(ul).toBeInTheDocument();
|
|
182
|
+
|
|
183
|
+
// Simulate Escape key from within the dropdown ul (dropdownRef)
|
|
184
|
+
const event = new KeyboardEvent('keydown', { key: 'Escape', bubbles: true });
|
|
185
|
+
Object.defineProperty(event, 'target', { value: ul, enumerable: true });
|
|
186
|
+
document.dispatchEvent(event);
|
|
187
|
+
|
|
188
|
+
expect(onclose).toHaveBeenCalled();
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
test('Tab key closes dropdown and calls onclose', async () => {
|
|
192
|
+
const onclose = vi.fn();
|
|
193
|
+
const result = render(Dropdown, { props: { open: true, onclose } });
|
|
194
|
+
cleanup = result.unmount;
|
|
195
|
+
|
|
196
|
+
const ul = result.container.querySelector('ul');
|
|
197
|
+
|
|
198
|
+
// Simulate Tab key from within the dropdown ul (dropdownRef)
|
|
199
|
+
const event = new KeyboardEvent('keydown', { key: 'Tab', bubbles: true });
|
|
200
|
+
Object.defineProperty(event, 'target', { value: ul, enumerable: true });
|
|
201
|
+
document.dispatchEvent(event);
|
|
202
|
+
|
|
203
|
+
expect(onclose).toHaveBeenCalled();
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
test('ArrowDown key prevents default', async () => {
|
|
207
|
+
const result = render(Dropdown, { props: { open: true } });
|
|
208
|
+
cleanup = result.unmount;
|
|
209
|
+
|
|
210
|
+
const ul = result.container.querySelector('ul');
|
|
211
|
+
const event = new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true, cancelable: true });
|
|
212
|
+
Object.defineProperty(event, 'target', { value: ul, enumerable: true });
|
|
213
|
+
const preventDefaultSpy = vi.spyOn(event, 'preventDefault');
|
|
214
|
+
|
|
215
|
+
document.dispatchEvent(event);
|
|
216
|
+
|
|
217
|
+
expect(preventDefaultSpy).toHaveBeenCalled();
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
test('ArrowUp key prevents default', async () => {
|
|
221
|
+
const result = render(Dropdown, { props: { open: true } });
|
|
222
|
+
cleanup = result.unmount;
|
|
223
|
+
|
|
224
|
+
const ul = result.container.querySelector('ul');
|
|
225
|
+
const event = new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true, cancelable: true });
|
|
226
|
+
Object.defineProperty(event, 'target', { value: ul, enumerable: true });
|
|
227
|
+
const preventDefaultSpy = vi.spyOn(event, 'preventDefault');
|
|
228
|
+
|
|
229
|
+
document.dispatchEvent(event);
|
|
230
|
+
|
|
231
|
+
expect(preventDefaultSpy).toHaveBeenCalled();
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
test('Home key prevents default', async () => {
|
|
235
|
+
const result = render(Dropdown, { props: { open: true } });
|
|
236
|
+
cleanup = result.unmount;
|
|
237
|
+
|
|
238
|
+
const ul = result.container.querySelector('ul');
|
|
239
|
+
const event = new KeyboardEvent('keydown', { key: 'Home', bubbles: true, cancelable: true });
|
|
240
|
+
Object.defineProperty(event, 'target', { value: ul, enumerable: true });
|
|
241
|
+
const preventDefaultSpy = vi.spyOn(event, 'preventDefault');
|
|
242
|
+
|
|
243
|
+
document.dispatchEvent(event);
|
|
244
|
+
|
|
245
|
+
expect(preventDefaultSpy).toHaveBeenCalled();
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
test('End key prevents default', async () => {
|
|
249
|
+
const result = render(Dropdown, { props: { open: true } });
|
|
250
|
+
cleanup = result.unmount;
|
|
251
|
+
|
|
252
|
+
const ul = result.container.querySelector('ul');
|
|
253
|
+
const event = new KeyboardEvent('keydown', { key: 'End', bubbles: true, cancelable: true });
|
|
254
|
+
Object.defineProperty(event, 'target', { value: ul, enumerable: true });
|
|
255
|
+
const preventDefaultSpy = vi.spyOn(event, 'preventDefault');
|
|
256
|
+
|
|
257
|
+
document.dispatchEvent(event);
|
|
258
|
+
|
|
259
|
+
expect(preventDefaultSpy).toHaveBeenCalled();
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
test('keyboard events do not trigger when dropdown is closed', async () => {
|
|
263
|
+
const onclose = vi.fn();
|
|
264
|
+
const result = render(Dropdown, { props: { open: false, onclose } });
|
|
265
|
+
cleanup = result.unmount;
|
|
266
|
+
|
|
267
|
+
// Simulate Escape key when closed
|
|
268
|
+
const event = new KeyboardEvent('keydown', { key: 'Escape', bubbles: true });
|
|
269
|
+
document.dispatchEvent(event);
|
|
270
|
+
|
|
271
|
+
// onclose should not be called when dropdown is already closed
|
|
272
|
+
expect(onclose).not.toHaveBeenCalled();
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
describe('Dropdown Click Outside', () => {
|
|
277
|
+
let cleanup;
|
|
278
|
+
|
|
279
|
+
afterEach(() => {
|
|
280
|
+
if (cleanup) {
|
|
281
|
+
cleanup();
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
test('clicking outside closes dropdown and calls onclose', async () => {
|
|
286
|
+
const onclose = vi.fn();
|
|
287
|
+
const result = render(Dropdown, { props: { open: true, onclose } });
|
|
288
|
+
cleanup = result.unmount;
|
|
289
|
+
|
|
290
|
+
const menu = result.container.querySelector('[role="menu"]');
|
|
291
|
+
expect(menu).toBeInTheDocument();
|
|
292
|
+
|
|
293
|
+
// Click outside the dropdown
|
|
294
|
+
const outsideElement = document.createElement('div');
|
|
295
|
+
document.body.appendChild(outsideElement);
|
|
296
|
+
|
|
297
|
+
const clickEvent = new MouseEvent('mousedown', { bubbles: true });
|
|
298
|
+
Object.defineProperty(clickEvent, 'target', { value: outsideElement, enumerable: true });
|
|
299
|
+
document.dispatchEvent(clickEvent);
|
|
300
|
+
|
|
301
|
+
expect(onclose).toHaveBeenCalled();
|
|
302
|
+
|
|
303
|
+
document.body.removeChild(outsideElement);
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
test('clicking inside dropdown does not close it', async () => {
|
|
307
|
+
const onclose = vi.fn();
|
|
308
|
+
const result = render(Dropdown, { props: { open: true, onclose } });
|
|
309
|
+
cleanup = result.unmount;
|
|
310
|
+
|
|
311
|
+
const ul = result.container.querySelector('ul');
|
|
312
|
+
|
|
313
|
+
// Click inside the dropdown (on the ul element which is a child)
|
|
314
|
+
const clickEvent = new MouseEvent('mousedown', { bubbles: true });
|
|
315
|
+
Object.defineProperty(clickEvent, 'target', { value: ul, enumerable: true });
|
|
316
|
+
document.dispatchEvent(clickEvent);
|
|
317
|
+
|
|
318
|
+
expect(onclose).not.toHaveBeenCalled();
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
test('does not handle click outside when dropdown is closed', async () => {
|
|
322
|
+
const onclose = vi.fn();
|
|
323
|
+
const result = render(Dropdown, { props: { open: false, onclose } });
|
|
324
|
+
cleanup = result.unmount;
|
|
325
|
+
|
|
326
|
+
// Click outside
|
|
327
|
+
const outsideElement = document.createElement('div');
|
|
328
|
+
document.body.appendChild(outsideElement);
|
|
329
|
+
|
|
330
|
+
const clickEvent = new MouseEvent('mousedown', { bubbles: true });
|
|
331
|
+
Object.defineProperty(clickEvent, 'target', { value: outsideElement, enumerable: true });
|
|
332
|
+
document.dispatchEvent(clickEvent);
|
|
333
|
+
|
|
334
|
+
expect(onclose).not.toHaveBeenCalled();
|
|
335
|
+
|
|
336
|
+
document.body.removeChild(outsideElement);
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
describe('Dropdown Context', () => {
|
|
341
|
+
test('sets up dropdown context with activeUrl', () => {
|
|
342
|
+
const { container } = render(Dropdown, { props: { open: true, activeUrl: '/test-url' } });
|
|
343
|
+
expect(container.querySelector('[role="menu"]')).toBeInTheDocument();
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
test('context close function calls onclose', () => {
|
|
347
|
+
const onclose = vi.fn();
|
|
348
|
+
render(Dropdown, { props: { open: true, onclose } });
|
|
349
|
+
// Context is tested through integration with child components
|
|
350
|
+
expect(onclose).not.toHaveBeenCalled(); // Not called until context.close() is invoked
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
describe('Dropdown Lifecycle', () => {
|
|
355
|
+
test('cleans up event listeners on destroy', () => {
|
|
356
|
+
const removeEventListenerSpy = vi.spyOn(document, 'removeEventListener');
|
|
357
|
+
const result = render(Dropdown, { props: { open: true } });
|
|
358
|
+
|
|
359
|
+
result.unmount();
|
|
360
|
+
|
|
361
|
+
expect(removeEventListenerSpy).toHaveBeenCalledWith('mousedown', expect.any(Function), true);
|
|
362
|
+
expect(removeEventListenerSpy).toHaveBeenCalledWith('keydown', expect.any(Function));
|
|
363
|
+
|
|
364
|
+
removeEventListenerSpy.mockRestore();
|
|
365
|
+
});
|
|
366
|
+
});
|
|
@@ -1,137 +1,137 @@
|
|
|
1
|
-
<script module>
|
|
2
|
-
import { defineMeta } from '@storybook/addon-svelte-csf';
|
|
3
|
-
import Dropdown from './Dropdown.svelte';
|
|
4
|
-
import DropdownItem from './DropdownItem.svelte';
|
|
5
|
-
import Button from '../Button/Button.svelte';
|
|
6
|
-
|
|
7
|
-
const { Story } = defineMeta({
|
|
8
|
-
title: 'Primitives/Dropdown',
|
|
9
|
-
component: Dropdown,
|
|
10
|
-
tags: ['autodocs'],
|
|
11
|
-
parameters: {
|
|
12
|
-
docs: {
|
|
13
|
-
description: {
|
|
14
|
-
component: 'Dropdown menu component for actions and navigation.',
|
|
15
|
-
},
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
let open1 = $state(false);
|
|
21
|
-
let open2 = $state(false);
|
|
22
|
-
let open3 = $state(false);
|
|
23
|
-
</script>
|
|
24
|
-
|
|
25
|
-
<Story name="Default">
|
|
26
|
-
{#snippet template()}
|
|
27
|
-
<div class="relative inline-block">
|
|
28
|
-
<Button onclick={() => open1 = !open1}>
|
|
29
|
-
Options ▼
|
|
30
|
-
</Button>
|
|
31
|
-
{#if open1}
|
|
32
|
-
<Dropdown class="absolute mt-1 z-10">
|
|
33
|
-
<DropdownItem onclick={() => { console.log('Edit'); open1 = false; }}>Edit</DropdownItem>
|
|
34
|
-
<DropdownItem onclick={() => { console.log('Duplicate'); open1 = false; }}>Duplicate</DropdownItem>
|
|
35
|
-
<DropdownItem onclick={() => { console.log('Archive'); open1 = false; }}>Archive</DropdownItem>
|
|
36
|
-
</Dropdown>
|
|
37
|
-
{/if}
|
|
38
|
-
</div>
|
|
39
|
-
{/snippet}
|
|
40
|
-
</Story>
|
|
41
|
-
|
|
42
|
-
<Story name="With Dividers">
|
|
43
|
-
{#snippet template()}
|
|
44
|
-
<div class="relative inline-block">
|
|
45
|
-
<Button onclick={() => open2 = !open2}>
|
|
46
|
-
Actions ▼
|
|
47
|
-
</Button>
|
|
48
|
-
{#if open2}
|
|
49
|
-
<Dropdown class="absolute mt-1 z-10">
|
|
50
|
-
<DropdownItem onclick={() => open2 = false}>View Details</DropdownItem>
|
|
51
|
-
<DropdownItem onclick={() => open2 = false}>Edit</DropdownItem>
|
|
52
|
-
<div class="border-t my-1"></div>
|
|
53
|
-
<DropdownItem onclick={() => open2 = false}>Share</DropdownItem>
|
|
54
|
-
<DropdownItem onclick={() => open2 = false}>Export</DropdownItem>
|
|
55
|
-
<div class="border-t my-1"></div>
|
|
56
|
-
<DropdownItem onclick={() => open2 = false} class="text-red-600">Delete</DropdownItem>
|
|
57
|
-
</Dropdown>
|
|
58
|
-
{/if}
|
|
59
|
-
</div>
|
|
60
|
-
{/snippet}
|
|
61
|
-
</Story>
|
|
62
|
-
|
|
63
|
-
<Story name="Right Aligned">
|
|
64
|
-
{#snippet template()}
|
|
65
|
-
<div class="flex justify-end">
|
|
66
|
-
<div class="relative inline-block">
|
|
67
|
-
<Button onclick={() => open3 = !open3}>
|
|
68
|
-
Menu ▼
|
|
69
|
-
</Button>
|
|
70
|
-
{#if open3}
|
|
71
|
-
<Dropdown class="absolute mt-1 right-0 z-10">
|
|
72
|
-
<DropdownItem onclick={() => open3 = false}>Profile</DropdownItem>
|
|
73
|
-
<DropdownItem onclick={() => open3 = false}>Settings</DropdownItem>
|
|
74
|
-
<DropdownItem onclick={() => open3 = false}>Help</DropdownItem>
|
|
75
|
-
<div class="border-t my-1"></div>
|
|
76
|
-
<DropdownItem onclick={() => open3 = false}>Sign Out</DropdownItem>
|
|
77
|
-
</Dropdown>
|
|
78
|
-
{/if}
|
|
79
|
-
</div>
|
|
80
|
-
</div>
|
|
81
|
-
{/snippet}
|
|
82
|
-
</Story>
|
|
83
|
-
|
|
84
|
-
<Story name="With Icons">
|
|
85
|
-
{#snippet template()}
|
|
86
|
-
<div class="relative inline-block">
|
|
87
|
-
<Button onclick={() => open1 = !open1}>
|
|
88
|
-
User Menu ▼
|
|
89
|
-
</Button>
|
|
90
|
-
{#if open1}
|
|
91
|
-
<Dropdown class="absolute mt-1 z-10 min-w-[180px]">
|
|
92
|
-
<DropdownItem onclick={() => open1 = false}>
|
|
93
|
-
<span class="mr-2">👤</span> Profile
|
|
94
|
-
</DropdownItem>
|
|
95
|
-
<DropdownItem onclick={() => open1 = false}>
|
|
96
|
-
<span class="mr-2">⚙️</span> Settings
|
|
97
|
-
</DropdownItem>
|
|
98
|
-
<DropdownItem onclick={() => open1 = false}>
|
|
99
|
-
<span class="mr-2">📊</span> Analytics
|
|
100
|
-
</DropdownItem>
|
|
101
|
-
<div class="border-t my-1"></div>
|
|
102
|
-
<DropdownItem onclick={() => open1 = false}>
|
|
103
|
-
<span class="mr-2">🚪</span> Sign Out
|
|
104
|
-
</DropdownItem>
|
|
105
|
-
</Dropdown>
|
|
106
|
-
{/if}
|
|
107
|
-
</div>
|
|
108
|
-
{/snippet}
|
|
109
|
-
</Story>
|
|
110
|
-
|
|
111
|
-
<Story name="In Card Context">
|
|
112
|
-
{#snippet template()}
|
|
113
|
-
<div class="border rounded-lg p-4 max-w-sm">
|
|
114
|
-
<div class="flex justify-between items-center mb-4">
|
|
115
|
-
<h3 class="font-medium">Card Title</h3>
|
|
116
|
-
<div class="relative">
|
|
117
|
-
<button
|
|
118
|
-
class="p-1 hover:bg-gray-100 rounded"
|
|
119
|
-
onclick={() => open1 = !open1}
|
|
120
|
-
>
|
|
121
|
-
⋮
|
|
122
|
-
</button>
|
|
123
|
-
{#if open1}
|
|
124
|
-
<Dropdown class="absolute mt-1 right-0 z-10">
|
|
125
|
-
<DropdownItem onclick={() => open1 = false}>Edit</DropdownItem>
|
|
126
|
-
<DropdownItem onclick={() => open1 = false}>Share</DropdownItem>
|
|
127
|
-
<DropdownItem onclick={() => open1 = false} class="text-red-600">Delete</DropdownItem>
|
|
128
|
-
</Dropdown>
|
|
129
|
-
{/if}
|
|
130
|
-
</div>
|
|
131
|
-
</div>
|
|
132
|
-
<p class="text-gray-600 text-sm">
|
|
133
|
-
This is a card with a dropdown menu in the header for common actions.
|
|
134
|
-
</p>
|
|
135
|
-
</div>
|
|
136
|
-
{/snippet}
|
|
137
|
-
</Story>
|
|
1
|
+
<script module>
|
|
2
|
+
import { defineMeta } from '@storybook/addon-svelte-csf';
|
|
3
|
+
import Dropdown from './Dropdown.svelte';
|
|
4
|
+
import DropdownItem from './DropdownItem.svelte';
|
|
5
|
+
import Button from '../Button/Button.svelte';
|
|
6
|
+
|
|
7
|
+
const { Story } = defineMeta({
|
|
8
|
+
title: 'Primitives/Dropdown',
|
|
9
|
+
component: Dropdown,
|
|
10
|
+
tags: ['autodocs'],
|
|
11
|
+
parameters: {
|
|
12
|
+
docs: {
|
|
13
|
+
description: {
|
|
14
|
+
component: 'Dropdown menu component for actions and navigation.',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
let open1 = $state(false);
|
|
21
|
+
let open2 = $state(false);
|
|
22
|
+
let open3 = $state(false);
|
|
23
|
+
</script>
|
|
24
|
+
|
|
25
|
+
<Story name="Default">
|
|
26
|
+
{#snippet template()}
|
|
27
|
+
<div class="relative inline-block">
|
|
28
|
+
<Button onclick={() => open1 = !open1}>
|
|
29
|
+
Options ▼
|
|
30
|
+
</Button>
|
|
31
|
+
{#if open1}
|
|
32
|
+
<Dropdown class="absolute mt-1 z-10">
|
|
33
|
+
<DropdownItem onclick={() => { console.log('Edit'); open1 = false; }}>Edit</DropdownItem>
|
|
34
|
+
<DropdownItem onclick={() => { console.log('Duplicate'); open1 = false; }}>Duplicate</DropdownItem>
|
|
35
|
+
<DropdownItem onclick={() => { console.log('Archive'); open1 = false; }}>Archive</DropdownItem>
|
|
36
|
+
</Dropdown>
|
|
37
|
+
{/if}
|
|
38
|
+
</div>
|
|
39
|
+
{/snippet}
|
|
40
|
+
</Story>
|
|
41
|
+
|
|
42
|
+
<Story name="With Dividers">
|
|
43
|
+
{#snippet template()}
|
|
44
|
+
<div class="relative inline-block">
|
|
45
|
+
<Button onclick={() => open2 = !open2}>
|
|
46
|
+
Actions ▼
|
|
47
|
+
</Button>
|
|
48
|
+
{#if open2}
|
|
49
|
+
<Dropdown class="absolute mt-1 z-10">
|
|
50
|
+
<DropdownItem onclick={() => open2 = false}>View Details</DropdownItem>
|
|
51
|
+
<DropdownItem onclick={() => open2 = false}>Edit</DropdownItem>
|
|
52
|
+
<div class="border-t my-1"></div>
|
|
53
|
+
<DropdownItem onclick={() => open2 = false}>Share</DropdownItem>
|
|
54
|
+
<DropdownItem onclick={() => open2 = false}>Export</DropdownItem>
|
|
55
|
+
<div class="border-t my-1"></div>
|
|
56
|
+
<DropdownItem onclick={() => open2 = false} class="text-red-600">Delete</DropdownItem>
|
|
57
|
+
</Dropdown>
|
|
58
|
+
{/if}
|
|
59
|
+
</div>
|
|
60
|
+
{/snippet}
|
|
61
|
+
</Story>
|
|
62
|
+
|
|
63
|
+
<Story name="Right Aligned">
|
|
64
|
+
{#snippet template()}
|
|
65
|
+
<div class="flex justify-end">
|
|
66
|
+
<div class="relative inline-block">
|
|
67
|
+
<Button onclick={() => open3 = !open3}>
|
|
68
|
+
Menu ▼
|
|
69
|
+
</Button>
|
|
70
|
+
{#if open3}
|
|
71
|
+
<Dropdown class="absolute mt-1 right-0 z-10">
|
|
72
|
+
<DropdownItem onclick={() => open3 = false}>Profile</DropdownItem>
|
|
73
|
+
<DropdownItem onclick={() => open3 = false}>Settings</DropdownItem>
|
|
74
|
+
<DropdownItem onclick={() => open3 = false}>Help</DropdownItem>
|
|
75
|
+
<div class="border-t my-1"></div>
|
|
76
|
+
<DropdownItem onclick={() => open3 = false}>Sign Out</DropdownItem>
|
|
77
|
+
</Dropdown>
|
|
78
|
+
{/if}
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
{/snippet}
|
|
82
|
+
</Story>
|
|
83
|
+
|
|
84
|
+
<Story name="With Icons">
|
|
85
|
+
{#snippet template()}
|
|
86
|
+
<div class="relative inline-block">
|
|
87
|
+
<Button onclick={() => open1 = !open1}>
|
|
88
|
+
User Menu ▼
|
|
89
|
+
</Button>
|
|
90
|
+
{#if open1}
|
|
91
|
+
<Dropdown class="absolute mt-1 z-10 min-w-[180px]">
|
|
92
|
+
<DropdownItem onclick={() => open1 = false}>
|
|
93
|
+
<span class="mr-2">👤</span> Profile
|
|
94
|
+
</DropdownItem>
|
|
95
|
+
<DropdownItem onclick={() => open1 = false}>
|
|
96
|
+
<span class="mr-2">⚙️</span> Settings
|
|
97
|
+
</DropdownItem>
|
|
98
|
+
<DropdownItem onclick={() => open1 = false}>
|
|
99
|
+
<span class="mr-2">📊</span> Analytics
|
|
100
|
+
</DropdownItem>
|
|
101
|
+
<div class="border-t my-1"></div>
|
|
102
|
+
<DropdownItem onclick={() => open1 = false}>
|
|
103
|
+
<span class="mr-2">🚪</span> Sign Out
|
|
104
|
+
</DropdownItem>
|
|
105
|
+
</Dropdown>
|
|
106
|
+
{/if}
|
|
107
|
+
</div>
|
|
108
|
+
{/snippet}
|
|
109
|
+
</Story>
|
|
110
|
+
|
|
111
|
+
<Story name="In Card Context">
|
|
112
|
+
{#snippet template()}
|
|
113
|
+
<div class="border rounded-lg p-4 max-w-sm">
|
|
114
|
+
<div class="flex justify-between items-center mb-4">
|
|
115
|
+
<h3 class="font-medium">Card Title</h3>
|
|
116
|
+
<div class="relative">
|
|
117
|
+
<button
|
|
118
|
+
class="p-1 hover:bg-gray-100 rounded"
|
|
119
|
+
onclick={() => open1 = !open1}
|
|
120
|
+
>
|
|
121
|
+
⋮
|
|
122
|
+
</button>
|
|
123
|
+
{#if open1}
|
|
124
|
+
<Dropdown class="absolute mt-1 right-0 z-10">
|
|
125
|
+
<DropdownItem onclick={() => open1 = false}>Edit</DropdownItem>
|
|
126
|
+
<DropdownItem onclick={() => open1 = false}>Share</DropdownItem>
|
|
127
|
+
<DropdownItem onclick={() => open1 = false} class="text-red-600">Delete</DropdownItem>
|
|
128
|
+
</Dropdown>
|
|
129
|
+
{/if}
|
|
130
|
+
</div>
|
|
131
|
+
</div>
|
|
132
|
+
<p class="text-gray-600 text-sm">
|
|
133
|
+
This is a card with a dropdown menu in the header for common actions.
|
|
134
|
+
</p>
|
|
135
|
+
</div>
|
|
136
|
+
{/snippet}
|
|
137
|
+
</Story>
|
|
@@ -144,17 +144,17 @@
|
|
|
144
144
|
right: "left-full top-0 ml-1"
|
|
145
145
|
};
|
|
146
146
|
</script>
|
|
147
|
-
|
|
148
|
-
{#if open}
|
|
149
|
-
<div
|
|
150
|
-
bind:this={containerRef}
|
|
151
|
-
class="absolute z-10 bg-white divide-y divide-gray-100 rounded-lg shadow-lg w-44 dark:bg-gray-700 dark:divide-gray-600 {className}"
|
|
152
|
-
role="menu"
|
|
153
|
-
aria-label={ariaLabel}
|
|
154
|
-
{...restProps}
|
|
155
|
-
>
|
|
156
|
-
<ul bind:this={dropdownRef} class="py-2 text-sm text-gray-700 dark:text-gray-200">
|
|
157
|
-
{#if typeof children === 'function'}{@render children()}{:else if children}{children}{/if}
|
|
158
|
-
</ul>
|
|
159
|
-
</div>
|
|
160
|
-
{/if}
|
|
147
|
+
|
|
148
|
+
{#if open}
|
|
149
|
+
<div
|
|
150
|
+
bind:this={containerRef}
|
|
151
|
+
class="absolute z-10 bg-white divide-y divide-gray-100 rounded-lg shadow-lg w-44 dark:bg-gray-700 dark:divide-gray-600 {className}"
|
|
152
|
+
role="menu"
|
|
153
|
+
aria-label={ariaLabel}
|
|
154
|
+
{...restProps}
|
|
155
|
+
>
|
|
156
|
+
<ul bind:this={dropdownRef} class="py-2 text-sm text-gray-700 dark:text-gray-200">
|
|
157
|
+
{#if typeof children === 'function'}{@render children()}{:else if children}{children}{/if}
|
|
158
|
+
</ul>
|
|
159
|
+
</div>
|
|
160
|
+
{/if}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DropdownItem.spec.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Dropdown/DropdownItem.spec.js"],"names":[],"mappings":""}
|