@getmicdrop/svelte-components 5.17.4 → 5.19.0
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.svelte +191 -187
- package/dist/calendar/AboutShow/AboutShow.svelte.d.ts +2 -2
- package/dist/calendar/AboutShow/AboutShow.svelte.d.ts.map +1 -1
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte +801 -780
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte.d.ts +4 -0
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte.d.ts.map +1 -1
- package/dist/calendar/FAQs/FAQs.svelte +88 -77
- package/dist/calendar/FAQs/FAQs.svelte.d.ts +6 -4
- package/dist/calendar/FAQs/FAQs.svelte.d.ts.map +1 -1
- package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte +140 -125
- package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte.d.ts +2 -0
- package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte.d.ts.map +1 -1
- package/dist/calendar/OrderSummary/OrderSummary.spec.js +3 -3
- package/dist/calendar/OrderSummary/OrderSummary.svelte +461 -457
- package/dist/calendar/OrderSummary/OrderSummary.svelte.d.ts +4 -2
- package/dist/calendar/OrderSummary/OrderSummary.svelte.d.ts.map +1 -1
- package/dist/calendar/PublicCard/PublicCard.svelte +164 -155
- package/dist/calendar/PublicCard/PublicCard.svelte.d.ts +4 -0
- package/dist/calendar/PublicCard/PublicCard.svelte.d.ts.map +1 -1
- package/dist/calendar/ShowCard/ShowCard.svelte +180 -166
- package/dist/calendar/ShowCard/ShowCard.svelte.d.ts +4 -0
- package/dist/calendar/ShowCard/ShowCard.svelte.d.ts.map +1 -1
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +80 -72
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte.d.ts +4 -0
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte.d.ts.map +1 -1
- package/dist/calendar/index.js +15 -15
- package/dist/components/Heading.spec.js +89 -89
- package/dist/components/Heading.svelte +60 -60
- package/dist/components/Layout/AppShell.svelte +104 -104
- package/dist/components/Layout/ContentSection.svelte +80 -80
- package/dist/components/Layout/Grid.svelte +101 -101
- package/dist/components/Layout/Heading.svelte +81 -81
- package/dist/components/Layout/PageContainer.svelte +69 -69
- package/dist/components/Layout/Responsive.svelte +75 -75
- package/dist/components/Layout/Section.svelte +80 -80
- package/dist/components/Layout/ShowOnDesktop.svelte +37 -37
- package/dist/components/Layout/ShowOnMobile.svelte +37 -37
- package/dist/components/Layout/Sidebar.svelte +108 -108
- package/dist/components/Layout/Stack.spec.js +1 -1
- package/dist/components/Layout/Stack.svelte +52 -52
- package/dist/components/Layout/Text.svelte +87 -87
- package/dist/components/Layout/TwoColumn.svelte +108 -108
- package/dist/components/Text.spec.js +89 -89
- package/dist/components/Text.svelte +53 -53
- package/dist/config.js +151 -151
- package/dist/config.spec.js +29 -29
- package/dist/constants/formOptions.js +48 -48
- package/dist/constants/validation.js +91 -91
- package/dist/constants/validation.spec.js +64 -64
- package/dist/datetime/README.md +323 -323
- 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 +1 -1
- package/dist/datetime/parse.js +1 -1
- package/dist/forms/createFormStore.svelte.js +1 -0
- package/dist/forms/createFormStore.svelte.spec.js +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +66 -57
- package/dist/index.spec.js +369 -369
- package/dist/patterns/chat/ChatActivityNotice.spec.js +59 -59
- package/dist/patterns/chat/ChatActivityNotice.svelte +41 -41
- package/dist/patterns/chat/ChatBubble.spec.js +91 -91
- package/dist/patterns/chat/ChatBubble.svelte +103 -95
- package/dist/patterns/chat/ChatBubble.svelte.d.ts +6 -4
- package/dist/patterns/chat/ChatBubble.svelte.d.ts.map +1 -1
- package/dist/patterns/chat/ChatContainer.spec.js +30 -30
- package/dist/patterns/chat/ChatContainer.svelte +46 -46
- package/dist/patterns/chat/ChatDateDivider.spec.js +30 -30
- package/dist/patterns/chat/ChatDateDivider.svelte +27 -27
- package/dist/patterns/chat/ChatInvitationBubble.spec.js +46 -46
- package/dist/patterns/chat/ChatInvitationBubble.svelte +46 -37
- package/dist/patterns/chat/ChatInvitationBubble.svelte.d.ts +6 -3
- package/dist/patterns/chat/ChatInvitationBubble.svelte.d.ts.map +1 -1
- package/dist/patterns/chat/ChatInvitationNotice.spec.js +32 -32
- package/dist/patterns/chat/ChatInvitationNotice.svelte +36 -27
- package/dist/patterns/chat/ChatInvitationNotice.svelte.d.ts +6 -3
- package/dist/patterns/chat/ChatInvitationNotice.svelte.d.ts.map +1 -1
- package/dist/patterns/chat/ChatMessageGroup.spec.js +58 -58
- package/dist/patterns/chat/ChatMessageGroup.svelte +57 -57
- package/dist/patterns/chat/ChatSlotUpdate.spec.js +65 -65
- package/dist/patterns/chat/ChatSlotUpdate.svelte +46 -46
- package/dist/patterns/chat/ChatStatusBadge.spec.js +79 -79
- package/dist/patterns/chat/ChatStatusBadge.svelte +91 -91
- package/dist/patterns/chat/ChatStatusTransition.spec.js +81 -81
- package/dist/patterns/chat/ChatStatusTransition.svelte +64 -64
- package/dist/patterns/chat/ChatTextBubble.spec.js +35 -35
- package/dist/patterns/chat/ChatTextBubble.svelte +41 -41
- package/dist/patterns/chat/index.js +22 -22
- package/dist/patterns/data/DataGrid.svelte +45 -45
- package/dist/patterns/data/DataList.svelte +24 -24
- package/dist/patterns/data/DataTable.svelte +45 -45
- package/dist/patterns/data/index.js +4 -4
- package/dist/patterns/forms/FormActions.spec.js +95 -95
- package/dist/patterns/forms/FormActions.stories.svelte +97 -97
- package/dist/patterns/forms/FormActions.svelte +46 -46
- package/dist/patterns/forms/FormGrid.svelte +33 -33
- package/dist/patterns/forms/FormSection.svelte +32 -32
- package/dist/patterns/forms/FormValidationSummary.stories.svelte +97 -97
- package/dist/patterns/forms/FormValidationSummary.svelte +82 -74
- package/dist/patterns/forms/FormValidationSummary.svelte.d.ts +5 -3
- package/dist/patterns/forms/FormValidationSummary.svelte.d.ts.map +1 -1
- package/dist/patterns/forms/index.js +5 -5
- package/dist/patterns/index.js +21 -21
- package/dist/patterns/layout/Sidebar.svelte +39 -39
- package/dist/patterns/layout/SidebarTestWrapper.svelte +34 -34
- package/dist/patterns/layout/SidebarTestWrapper.svelte.d.ts +1 -1
- package/dist/patterns/layout/Stack.svelte +61 -61
- package/dist/patterns/layout/index.js +29 -29
- package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
- package/dist/patterns/navigation/BottomNav.svelte +82 -74
- package/dist/patterns/navigation/BottomNav.svelte.d.ts +10 -9
- package/dist/patterns/navigation/BottomNav.svelte.d.ts.map +1 -1
- package/dist/patterns/navigation/Header.stories.svelte +77 -77
- package/dist/patterns/navigation/Header.svelte +263 -251
- package/dist/patterns/navigation/Header.svelte.d.ts +17 -9
- package/dist/patterns/navigation/Header.svelte.d.ts.map +1 -1
- package/dist/patterns/navigation/index.js +3 -3
- package/dist/patterns/page/PageHeader.svelte +49 -49
- package/dist/patterns/page/PageLayout.svelte +40 -40
- package/dist/patterns/page/PageLoader.spec.js +57 -57
- package/dist/patterns/page/PageLoader.stories.svelte +137 -137
- package/dist/patterns/page/PageLoader.svelte +62 -53
- package/dist/patterns/page/PageLoader.svelte.d.ts +6 -3
- package/dist/patterns/page/PageLoader.svelte.d.ts.map +1 -1
- package/dist/patterns/page/SectionHeader.svelte +51 -51
- package/dist/patterns/page/index.js +5 -5
- package/dist/presets/badges.js +112 -112
- package/dist/presets/buttons.js +76 -76
- package/dist/presets/index.js +9 -9
- package/dist/primitives/Accordion/Accordion.stories.svelte +75 -75
- package/dist/primitives/Accordion/Accordion.svelte +62 -62
- package/dist/primitives/Accordion/AccordionItem.svelte +103 -95
- package/dist/primitives/Accordion/AccordionItem.svelte.d.ts +6 -4
- package/dist/primitives/Accordion/AccordionItem.svelte.d.ts.map +1 -1
- package/dist/primitives/Accordion/AccordionItemWrapper.test.svelte +107 -107
- package/dist/primitives/Accordion/AccordionToggleWrapper.test.svelte +28 -28
- package/dist/primitives/Alert/Alert.spec.js +173 -173
- package/dist/primitives/Alert/Alert.stories.svelte +88 -88
- package/dist/primitives/Alert/Alert.svelte +72 -64
- package/dist/primitives/Alert/Alert.svelte.d.ts +6 -4
- package/dist/primitives/Alert/Alert.svelte.d.ts.map +1 -1
- package/dist/primitives/Avatar/Avatar.stories.svelte +94 -94
- package/dist/primitives/Avatar/Avatar.svelte +66 -66
- package/dist/primitives/AvatarButton/AvatarButton.svelte +57 -57
- package/dist/primitives/Badges/Badge.spec.js +144 -144
- package/dist/primitives/Badges/Badge.stories.svelte +86 -86
- package/dist/primitives/Badges/Badge.svelte +99 -99
- package/dist/primitives/BottomSheet/BottomSheet.spec.js +238 -238
- package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
- package/dist/primitives/BottomSheet/BottomSheet.svelte +115 -115
- package/dist/primitives/BottomSheet/BottomSheetWithActions.test.svelte +20 -20
- package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +123 -123
- package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
- package/dist/primitives/Breadcrumb/Breadcrumb.svelte +107 -99
- package/dist/primitives/Breadcrumb/Breadcrumb.svelte.d.ts +13 -9
- package/dist/primitives/Breadcrumb/Breadcrumb.svelte.d.ts.map +1 -1
- package/dist/primitives/Button/Button.spec.js +225 -225
- package/dist/primitives/Button/Button.stories.svelte +76 -76
- package/dist/primitives/Button/Button.svelte +278 -278
- package/dist/primitives/Button/ButtonGroup.spec.js +44 -44
- package/dist/primitives/Button/ButtonGroup.svelte +50 -50
- package/dist/primitives/Button/ButtonSaveDemo.spec.js +146 -146
- package/dist/primitives/Button/ButtonSaveDemo.svelte +25 -25
- 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/CardAction/CardAction.svelte +68 -68
- package/dist/primitives/Checkbox/Checkbox.stories.svelte +84 -84
- package/dist/primitives/Checkbox/Checkbox.svelte +88 -88
- package/dist/primitives/DarkModeToggle.spec.js +390 -390
- package/dist/primitives/DarkModeToggle.stories.svelte +57 -57
- package/dist/primitives/DarkModeToggle.svelte +147 -136
- package/dist/primitives/DarkModeToggle.svelte.d.ts +9 -3
- package/dist/primitives/DarkModeToggle.svelte.d.ts.map +1 -1
- package/dist/primitives/Drawer/Drawer.stories.svelte +100 -100
- package/dist/primitives/Drawer/Drawer.svelte +224 -224
- package/dist/primitives/Drawer/DrawerTestWrapper.svelte +86 -86
- package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
- package/dist/primitives/Dropdown/Dropdown.svelte +179 -170
- package/dist/primitives/Dropdown/Dropdown.svelte.d.ts +7 -4
- package/dist/primitives/Dropdown/Dropdown.svelte.d.ts.map +1 -1
- package/dist/primitives/Dropdown/DropdownDivider.spec.js +30 -30
- package/dist/primitives/Dropdown/DropdownDivider.svelte +9 -9
- package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
- package/dist/primitives/Dropdown/DropdownItemTestWrapper.svelte +43 -43
- package/dist/primitives/Helper/Helper.spec.js +57 -57
- package/dist/primitives/Helper/Helper.svelte +33 -33
- package/dist/primitives/Icons/ArrowLeft.svelte +21 -21
- package/dist/primitives/Icons/ArrowRight.svelte +21 -21
- package/dist/primitives/Icons/Availability.svelte +27 -27
- package/dist/primitives/Icons/Back.svelte +27 -27
- package/dist/primitives/Icons/CheckCircle.svelte +19 -19
- package/dist/primitives/Icons/CheckCircleOutline.svelte +28 -28
- package/dist/primitives/Icons/ChevronLeft.svelte +17 -17
- package/dist/primitives/Icons/ChevronRight.svelte +17 -17
- package/dist/primitives/Icons/Copy.svelte +28 -28
- package/dist/primitives/Icons/Cross.svelte +18 -18
- package/dist/primitives/Icons/DownArrow.svelte +21 -21
- package/dist/primitives/Icons/ErrorCircle.svelte +19 -19
- package/dist/primitives/Icons/FacebookIcon.svelte +15 -15
- package/dist/primitives/Icons/Home.svelte +28 -28
- package/dist/primitives/Icons/Icon.spec.js +175 -175
- package/dist/primitives/Icons/Icon.stories.svelte +100 -100
- package/dist/primitives/Icons/Icon.svelte +79 -79
- package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
- package/dist/primitives/Icons/ImageOutline.svelte +21 -21
- package/dist/primitives/Icons/Info.svelte +20 -20
- package/dist/primitives/Icons/InstagramIcon.svelte +21 -21
- package/dist/primitives/Icons/LogoInstagram.svelte +15 -15
- package/dist/primitives/Icons/Message.svelte +28 -28
- package/dist/primitives/Icons/MoonIcon.svelte +18 -18
- package/dist/primitives/Icons/More.svelte +34 -34
- package/dist/primitives/Icons/MoreHori.spec.js +67 -67
- package/dist/primitives/Icons/MoreHori.svelte +35 -35
- package/dist/primitives/Icons/Notification.svelte +27 -27
- package/dist/primitives/Icons/Payment.svelte +27 -27
- package/dist/primitives/Icons/Profile.svelte +34 -34
- package/dist/primitives/Icons/Reload.svelte +42 -42
- package/dist/primitives/Icons/Shows.svelte +34 -34
- package/dist/primitives/Icons/Signout.svelte +34 -34
- package/dist/primitives/Icons/SunIcon.svelte +21 -21
- package/dist/primitives/Icons/TiktokIcon.svelte +15 -15
- package/dist/primitives/Icons/TrashBinOutline.svelte +21 -21
- package/dist/primitives/Icons/TwitterIcon.svelte +15 -15
- package/dist/primitives/Icons/WarningIcon.spec.js +30 -30
- package/dist/primitives/Icons/WarningIcon.svelte +24 -24
- package/dist/primitives/Input/Input.spec.js +1237 -1237
- package/dist/primitives/Input/Input.stories.svelte +139 -139
- package/dist/primitives/Input/Input.svelte +444 -431
- package/dist/primitives/Input/Input.svelte.d.ts.map +1 -1
- package/dist/primitives/Input/Select.spec.js +632 -632
- package/dist/primitives/Input/Select.stories.svelte +112 -112
- package/dist/primitives/Input/Select.svelte +252 -252
- package/dist/primitives/Input/Textarea.stories.svelte +137 -137
- package/dist/primitives/Input/Textarea.svelte +105 -105
- package/dist/primitives/Label/Label.svelte +37 -37
- package/dist/primitives/LandingButton/LandingButton.spec.js +61 -61
- package/dist/primitives/LandingButton/LandingButton.svelte +92 -92
- package/dist/primitives/MenuItem/MenuItem.spec.js +130 -130
- package/dist/primitives/MenuItem/MenuItem.svelte +85 -85
- package/dist/primitives/Modal/Modal.spec.js +314 -314
- package/dist/primitives/Modal/Modal.stories.svelte +86 -86
- package/dist/primitives/Modal/Modal.svelte +181 -181
- package/dist/primitives/NavItem/NavItem.spec.js +97 -97
- package/dist/primitives/NavItem/NavItem.svelte +75 -75
- package/dist/primitives/NumberInput/NumberInput.svelte +113 -105
- package/dist/primitives/NumberInput/NumberInput.svelte.d.ts.map +1 -1
- package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
- package/dist/primitives/Pagination/Pagination.svelte +275 -261
- package/dist/primitives/Pagination/Pagination.svelte.d.ts +14 -6
- package/dist/primitives/Pagination/Pagination.svelte.d.ts.map +1 -1
- package/dist/primitives/Radio/Radio.stories.svelte +80 -80
- package/dist/primitives/Radio/Radio.svelte +67 -67
- package/dist/primitives/SearchResultItem/SearchResultItem.spec.js +78 -78
- package/dist/primitives/SearchResultItem/SearchResultItem.svelte +109 -109
- package/dist/primitives/SidebarToggle/SidebarToggle.spec.js +61 -61
- package/dist/primitives/SidebarToggle/SidebarToggle.svelte +55 -55
- package/dist/primitives/Skeleton/CardPlaceholder.svelte +96 -87
- package/dist/primitives/Skeleton/CardPlaceholder.svelte.d.ts +8 -5
- package/dist/primitives/Skeleton/CardPlaceholder.svelte.d.ts.map +1 -1
- package/dist/primitives/Skeleton/ImagePlaceholder.svelte +68 -59
- package/dist/primitives/Skeleton/ImagePlaceholder.svelte.d.ts +8 -5
- package/dist/primitives/Skeleton/ImagePlaceholder.svelte.d.ts.map +1 -1
- package/dist/primitives/Skeleton/ListPlaceholder.svelte +85 -76
- package/dist/primitives/Skeleton/ListPlaceholder.svelte.d.ts +8 -5
- package/dist/primitives/Skeleton/ListPlaceholder.svelte.d.ts.map +1 -1
- package/dist/primitives/Skeleton/Skeleton.stories.svelte +151 -151
- package/dist/primitives/Skeleton/Skeleton.svelte +55 -46
- package/dist/primitives/Skeleton/Skeleton.svelte.d.ts +7 -4
- package/dist/primitives/Skeleton/Skeleton.svelte.d.ts.map +1 -1
- package/dist/primitives/Spinner/Spinner.spec.js +84 -84
- package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
- package/dist/primitives/Spinner/Spinner.svelte +52 -44
- package/dist/primitives/Spinner/Spinner.svelte.d.ts +6 -4
- package/dist/primitives/Spinner/Spinner.svelte.d.ts.map +1 -1
- package/dist/primitives/Tabs/TabItem.svelte +52 -52
- package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
- package/dist/primitives/Tabs/Tabs.svelte +137 -137
- package/dist/primitives/Toggle.spec.js +221 -221
- package/dist/primitives/Toggle.stories.svelte +92 -92
- package/dist/primitives/Toggle.svelte +141 -141
- package/dist/primitives/ToggleTestWrapper.svelte +30 -30
- package/dist/primitives/Tooltip/Tooltip.spec.js +126 -126
- package/dist/primitives/Tooltip/Tooltip.svelte +83 -83
- package/dist/primitives/Typography/Typography.svelte +53 -53
- package/dist/primitives/ValidationError.spec.js +103 -103
- package/dist/primitives/ValidationError.stories.svelte +112 -112
- package/dist/primitives/ValidationError.svelte +29 -29
- package/dist/primitives/index.js +113 -113
- package/dist/recipes/CropImage/CropImage.spec.js +208 -208
- package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
- package/dist/recipes/CropImage/CropImage.svelte +241 -241
- package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
- package/dist/recipes/ImageUploader/ImageUploader.svelte +994 -992
- package/dist/recipes/ImageUploader/ImageUploader.svelte.d.ts +1 -0
- package/dist/recipes/ImageUploader/ImageUploader.svelte.d.ts.map +1 -1
- package/dist/recipes/SuperLogin/SuperLogin.svelte +25 -23
- 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.svelte +75 -66
- package/dist/recipes/feedback/EmptyState/EmptyState.svelte.d.ts +7 -4
- package/dist/recipes/feedback/EmptyState/EmptyState.svelte.d.ts.map +1 -1
- package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
- package/dist/recipes/feedback/ErrorDisplay.stories.svelte +113 -113
- package/dist/recipes/feedback/ErrorDisplay.svelte +67 -67
- package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +133 -133
- package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +176 -176
- package/dist/recipes/feedback/index.js +4 -4
- package/dist/recipes/fields/CheckboxField.svelte +85 -85
- package/dist/recipes/fields/FormField.svelte +58 -58
- package/dist/recipes/fields/RadioGroup.svelte +95 -95
- package/dist/recipes/fields/SelectField.svelte +82 -82
- package/dist/recipes/fields/TextareaField.svelte +101 -101
- package/dist/recipes/fields/ToggleField.svelte +60 -60
- package/dist/recipes/fields/index.js +7 -7
- package/dist/recipes/index.js +24 -24
- package/dist/recipes/inputs/MultiSelect.spec.js +263 -263
- package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
- package/dist/recipes/inputs/MultiSelect.svelte +291 -283
- package/dist/recipes/inputs/MultiSelect.svelte.d.ts.map +1 -1
- package/dist/recipes/inputs/OTPInput.spec.js +251 -251
- package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
- package/dist/recipes/inputs/OTPInput.svelte +128 -117
- package/dist/recipes/inputs/OTPInput.svelte.d.ts +14 -12
- package/dist/recipes/inputs/OTPInput.svelte.d.ts.map +1 -1
- package/dist/recipes/inputs/PasswordInput.svelte +130 -121
- package/dist/recipes/inputs/PasswordInput.svelte.d.ts +7 -4
- package/dist/recipes/inputs/PasswordInput.svelte.d.ts.map +1 -1
- package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +142 -131
- package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte.d.ts +8 -3
- package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte.d.ts.map +1 -1
- package/dist/recipes/inputs/PhoneInput.svelte +254 -0
- package/dist/recipes/inputs/PhoneInput.svelte.d.ts +40 -0
- package/dist/recipes/inputs/PhoneInput.svelte.d.ts.map +1 -0
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +170 -170
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +349 -336
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte.d.ts +21 -16
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte.d.ts.map +1 -1
- package/dist/recipes/inputs/Search.svelte +110 -102
- package/dist/recipes/inputs/Search.svelte.d.ts +7 -5
- package/dist/recipes/inputs/Search.svelte.d.ts.map +1 -1
- package/dist/recipes/inputs/index.d.ts +1 -0
- package/dist/recipes/inputs/index.js +8 -7
- package/dist/recipes/inputs/phoneInput/CountrySelector.svelte +240 -0
- package/dist/recipes/inputs/phoneInput/CountrySelector.svelte.d.ts +15 -0
- package/dist/recipes/inputs/phoneInput/CountrySelector.svelte.d.ts.map +1 -0
- package/dist/recipes/inputs/phoneInput/countryData.d.ts +18 -0
- package/dist/recipes/inputs/phoneInput/countryData.d.ts.map +1 -0
- package/dist/recipes/inputs/phoneInput/countryData.js +211 -0
- package/dist/recipes/modals/AlertModal.svelte +139 -130
- package/dist/recipes/modals/AlertModal.svelte.d.ts +4 -2
- package/dist/recipes/modals/AlertModal.svelte.d.ts.map +1 -1
- package/dist/recipes/modals/ConfirmationModal.spec.js +396 -396
- package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
- package/dist/recipes/modals/ConfirmationModal.svelte +169 -162
- package/dist/recipes/modals/ConfirmationModal.svelte.d.ts +2 -0
- package/dist/recipes/modals/ConfirmationModal.svelte.d.ts.map +1 -1
- package/dist/recipes/modals/InputModal.svelte +194 -182
- package/dist/recipes/modals/InputModal.svelte.d.ts +6 -4
- package/dist/recipes/modals/InputModal.svelte.d.ts.map +1 -1
- package/dist/recipes/modals/ModalStateManager.spec.js +100 -100
- package/dist/recipes/modals/ModalStateManager.svelte +77 -77
- package/dist/recipes/modals/ModalTestWrapper.svelte +65 -65
- package/dist/recipes/modals/StatusModal.svelte +216 -206
- package/dist/recipes/modals/StatusModal.svelte.d.ts +4 -2
- package/dist/recipes/modals/StatusModal.svelte.d.ts.map +1 -1
- package/dist/recipes/modals/index.js +7 -7
- package/dist/schemas/common.js +1 -1
- package/dist/schemas/event.d.ts +4 -4
- package/dist/schemas/event.js +1 -1
- package/dist/schemas/order.d.ts +2 -2
- package/dist/schemas/order.js +1 -0
- package/dist/schemas/performer.js +1 -1
- package/dist/schemas/promo.d.ts +4 -4
- package/dist/schemas/promo.js +2 -2
- package/dist/schemas/ticket.js +1 -1
- package/dist/schemas/user.js +2 -1
- package/dist/services/event.service.d.ts +11 -0
- package/dist/services/event.service.d.ts.map +1 -0
- package/dist/services/event.service.js +64 -0
- package/dist/services/event.service.spec.d.ts +2 -0
- package/dist/services/event.service.spec.d.ts.map +1 -0
- package/dist/services/event.service.spec.js +168 -0
- package/dist/services/{ShowService.d.ts → show.service.d.ts} +47 -47
- package/dist/services/show.service.d.ts.map +1 -0
- package/dist/services/show.service.js +115 -0
- package/dist/services/show.service.spec.d.ts +2 -0
- package/dist/services/show.service.spec.d.ts.map +1 -0
- package/dist/services/show.service.spec.js +242 -0
- package/dist/stores/auth.d.ts +8 -8
- package/dist/stores/auth.svelte.spec.js +1 -1
- package/dist/stores/index.js +9 -9
- package/dist/stores/toaster.d.ts +3 -3
- package/dist/stores/toaster.js +13 -13
- package/dist/stores/toaster.spec.js +59 -59
- package/dist/stories/ButtonAuditReview.stories.svelte +14 -14
- package/dist/stories/ButtonAuditReview.svelte +427 -427
- package/dist/stories/PatternsGallery.stories.svelte +19 -19
- package/dist/stories/PatternsGallery.svelte +399 -399
- package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
- package/dist/stories/PrimitivesGallery.svelte +756 -756
- package/dist/stories/RecipesGallery.stories.svelte +19 -19
- package/dist/stories/RecipesGallery.svelte +454 -454
- package/dist/stories/button-audit-manifest.json +11186 -11186
- package/dist/tailwind/preset.cjs +82 -82
- package/dist/telemetry.js +402 -402
- package/dist/telemetry.server.js +212 -212
- package/dist/telemetry.server.spec.js +437 -437
- package/dist/telemetry.spec.js +1173 -1173
- package/dist/tokens/tokens.css +87 -87
- package/dist/tokens/typography-base.css +163 -163
- package/dist/tokens/utilities.css +353 -353
- package/dist/utils/__tests__/auth.test.js +431 -431
- package/dist/utils/apiConfig.d.ts +29 -29
- package/dist/utils/apiConfig.js +117 -117
- package/dist/utils/apiConfig.spec.js +219 -219
- package/dist/utils/assets.d.ts +3 -0
- package/dist/utils/assets.d.ts.map +1 -0
- package/dist/utils/assets.js +3 -0
- package/dist/utils/auth.d.ts +46 -46
- package/dist/utils/auth.js +195 -195
- package/dist/utils/classNames.d.ts +10 -0
- package/dist/utils/classNames.d.ts.map +1 -0
- package/dist/utils/classNames.js +15 -0
- package/dist/utils/cookieHelpers.d.ts +40 -0
- package/dist/utils/cookieHelpers.d.ts.map +1 -0
- package/dist/utils/cookieHelpers.js +102 -0
- package/dist/utils/dateHelpers.d.ts +71 -0
- package/dist/utils/dateHelpers.d.ts.map +1 -0
- package/dist/utils/dateHelpers.js +253 -0
- package/dist/utils/eventFormatters.d.ts +9 -0
- package/dist/utils/eventFormatters.d.ts.map +1 -0
- package/dist/utils/eventFormatters.js +96 -0
- package/dist/utils/fetchHelpers.d.ts +17 -0
- package/dist/utils/fetchHelpers.d.ts.map +1 -0
- package/dist/utils/fetchHelpers.js +44 -0
- package/dist/utils/formatters.d.ts +62 -0
- package/dist/utils/formatters.d.ts.map +1 -1
- package/dist/utils/formatters.js +128 -0
- package/dist/utils/formatters.spec.js +128 -1
- package/dist/utils/greetings.js +187 -187
- package/dist/utils/greetings.spec.js +337 -337
- package/dist/utils/haptic.spec.js +1 -1
- package/dist/utils/imageValidation.js +121 -121
- package/dist/utils/imageValidation.spec.js +223 -223
- package/dist/utils/permissions.d.ts +9 -0
- package/dist/utils/permissions.d.ts.map +1 -0
- package/dist/utils/permissions.js +93 -0
- package/dist/utils/phoneUtils.d.ts +35 -0
- package/dist/utils/phoneUtils.d.ts.map +1 -0
- package/dist/utils/phoneUtils.js +104 -0
- package/dist/utils/portal.d.ts +11 -11
- package/dist/utils/portal.js +25 -25
- package/dist/utils/portal.spec.js +143 -143
- package/dist/utils/stringHelpers.d.ts +17 -0
- package/dist/utils/stringHelpers.d.ts.map +1 -0
- package/dist/utils/stringHelpers.js +38 -0
- package/dist/utils/transitions.js +4 -4
- package/dist/utils/utils/utils.d.ts +2 -73
- package/dist/utils/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils/utils.js +3 -3
- package/dist/utils/utils/utils.spec.js +698 -698
- package/dist/utils/utils.d.ts +41 -98
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +59 -693
- package/dist/utils/utils.spec.js +643 -643
- package/package.json +301 -292
- package/dist/services/EventService.d.ts +0 -5
- package/dist/services/EventService.d.ts.map +0 -1
- package/dist/services/EventService.js +0 -79
- package/dist/services/EventService.spec.d.ts +0 -2
- package/dist/services/EventService.spec.d.ts.map +0 -1
- package/dist/services/EventService.spec.js +0 -217
- package/dist/services/ShowService.d.ts.map +0 -1
- package/dist/services/ShowService.js +0 -144
- package/dist/services/ShowService.spec.d.ts +0 -2
- package/dist/services/ShowService.spec.d.ts.map +0 -1
- package/dist/services/ShowService.spec.js +0 -345
|
@@ -1,314 +1,314 @@
|
|
|
1
|
-
import { render, screen, fireEvent } from '@testing-library/svelte';
|
|
2
|
-
import userEvent from '@testing-library/user-event';
|
|
3
|
-
import { expect, describe, test, vi } from 'vitest';
|
|
4
|
-
import ModalTestWrapper from './ModalTestWrapper.svelte';
|
|
5
|
-
|
|
6
|
-
function setupTest(args) {
|
|
7
|
-
const user = userEvent.setup();
|
|
8
|
-
const { component, rerender } = render(ModalTestWrapper, { props: { ...args } });
|
|
9
|
-
return { user, component, rerender };
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
describe('Modal Component Tests', () => {
|
|
13
|
-
// Note: Modal renders both mobile sheet and desktop centered versions
|
|
14
|
-
// CSS hides one based on viewport, but in tests both are in DOM
|
|
15
|
-
// Use getAllByText and check that at least one exists
|
|
16
|
-
|
|
17
|
-
test('Renders Modal when open is true', () => {
|
|
18
|
-
setupTest({
|
|
19
|
-
open: true,
|
|
20
|
-
title: 'Test Title',
|
|
21
|
-
description: 'Test Description',
|
|
22
|
-
warningText: 'Test Warning'
|
|
23
|
-
});
|
|
24
|
-
// Modal renders both mobile and desktop versions, so use getAllByText
|
|
25
|
-
expect(screen.getAllByText((content, element) => content.includes('Test Title')).length).toBeGreaterThan(0);
|
|
26
|
-
expect(screen.getAllByText((content, element) => content.includes('Test Description')).length).toBeGreaterThan(0);
|
|
27
|
-
expect(screen.getAllByText((content, element) => content.includes('Test Warning')).length).toBeGreaterThan(0);
|
|
28
|
-
expect(screen.getAllByRole('button', { name: /Cancel/i }).length).toBeGreaterThan(0);
|
|
29
|
-
expect(screen.getAllByRole('button', { name: /Confirm/i }).length).toBeGreaterThan(0);
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
test('Does not render Modal when open is false', () => {
|
|
33
|
-
setupTest({
|
|
34
|
-
open: false,
|
|
35
|
-
title: 'Test Title',
|
|
36
|
-
description: 'Test Description',
|
|
37
|
-
warningText: 'Test Warning'
|
|
38
|
-
});
|
|
39
|
-
expect(screen.queryByText('Test Title')).not.toBeInTheDocument();
|
|
40
|
-
expect(screen.queryByText('Test Description')).not.toBeInTheDocument();
|
|
41
|
-
expect(screen.queryByText('Test Warning')).not.toBeInTheDocument();
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
test('Displays the correct title, description, and warning text', () => {
|
|
45
|
-
const title = 'Correct Title';
|
|
46
|
-
const description = 'Correct Description';
|
|
47
|
-
const warningText = 'Correct Warning';
|
|
48
|
-
setupTest({
|
|
49
|
-
open: true,
|
|
50
|
-
title,
|
|
51
|
-
description,
|
|
52
|
-
warningText,
|
|
53
|
-
});
|
|
54
|
-
// Modal renders both mobile and desktop versions
|
|
55
|
-
expect(screen.getAllByText((content) => content.includes(title)).length).toBeGreaterThan(0);
|
|
56
|
-
expect(screen.getAllByText((content) => content.includes(description)).length).toBeGreaterThan(0);
|
|
57
|
-
expect(screen.getAllByText((content) => content.includes(warningText)).length).toBeGreaterThan(0);
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
test('Dispatches cancel event on escape key press', async () => {
|
|
61
|
-
// Create a mock function to track cancel calls
|
|
62
|
-
const oncancel = vi.fn();
|
|
63
|
-
|
|
64
|
-
const { user } = setupTest({
|
|
65
|
-
open: true,
|
|
66
|
-
title: 'Test Title',
|
|
67
|
-
oncancel
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
// Verify modal is open
|
|
71
|
-
expect(screen.getAllByText((content) => content.includes('Test Title')).length).toBeGreaterThan(0);
|
|
72
|
-
|
|
73
|
-
// Press Escape key
|
|
74
|
-
await fireEvent.keyDown(window, { key: 'Escape' });
|
|
75
|
-
|
|
76
|
-
// Cancel callback should be called
|
|
77
|
-
expect(oncancel).toHaveBeenCalled();
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
test('Prevents propagation of click events within modal', async () => {
|
|
81
|
-
const { user } = setupTest({
|
|
82
|
-
open: true,
|
|
83
|
-
title: 'Test Title'
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
// Find the modal content (first instance)
|
|
87
|
-
const modalElements = screen.getAllByText((content) => content.includes('Test Title'));
|
|
88
|
-
expect(modalElements.length).toBeGreaterThan(0);
|
|
89
|
-
|
|
90
|
-
const modalContent = modalElements[0].closest('.md\\:hidden, .hidden');
|
|
91
|
-
if (modalContent) {
|
|
92
|
-
const clickEvent = new MouseEvent('click', { bubbles: true });
|
|
93
|
-
modalContent.dispatchEvent(clickEvent);
|
|
94
|
-
|
|
95
|
-
// Modal should still be visible
|
|
96
|
-
expect(screen.getAllByText((content) => content.includes('Test Title')).length).toBeGreaterThan(0);
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
describe('Modal Backdrop Click Dismiss (lines 128, 134)', () => {
|
|
102
|
-
test('closes modal when mousedown and mouseup on backdrop', async () => {
|
|
103
|
-
const oncancel = vi.fn();
|
|
104
|
-
setupTest({
|
|
105
|
-
open: true,
|
|
106
|
-
title: 'Backdrop Test',
|
|
107
|
-
oncancel
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
// The modal is portaled to document.body, find the backdrop overlay
|
|
111
|
-
const backdrop = document.querySelector('[role="dialog"]');
|
|
112
|
-
expect(backdrop).toBeInTheDocument();
|
|
113
|
-
|
|
114
|
-
// Simulate mousedown directly on the backdrop (e.target === e.currentTarget)
|
|
115
|
-
const mousedownEvent = new MouseEvent('mousedown', {
|
|
116
|
-
bubbles: true,
|
|
117
|
-
cancelable: true
|
|
118
|
-
});
|
|
119
|
-
// Override target to be the backdrop itself
|
|
120
|
-
Object.defineProperty(mousedownEvent, 'target', { value: backdrop });
|
|
121
|
-
backdrop.dispatchEvent(mousedownEvent);
|
|
122
|
-
|
|
123
|
-
// Now simulate mouseup on the backdrop
|
|
124
|
-
const mouseupEvent = new MouseEvent('mouseup', {
|
|
125
|
-
bubbles: true,
|
|
126
|
-
cancelable: true
|
|
127
|
-
});
|
|
128
|
-
Object.defineProperty(mouseupEvent, 'target', { value: backdrop });
|
|
129
|
-
backdrop.dispatchEvent(mouseupEvent);
|
|
130
|
-
|
|
131
|
-
// Modal should be dismissed
|
|
132
|
-
expect(oncancel).toHaveBeenCalled();
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
test('does not close modal when mousedown on modal content (not backdrop)', async () => {
|
|
136
|
-
const oncancel = vi.fn();
|
|
137
|
-
setupTest({
|
|
138
|
-
open: true,
|
|
139
|
-
title: 'No Close Test',
|
|
140
|
-
oncancel
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
const backdrop = document.querySelector('[role="dialog"]');
|
|
144
|
-
expect(backdrop).toBeInTheDocument();
|
|
145
|
-
|
|
146
|
-
// Find an inner element (the modal content panel)
|
|
147
|
-
const modalContent = backdrop.querySelector('.md\\:hidden');
|
|
148
|
-
expect(modalContent).toBeInTheDocument();
|
|
149
|
-
|
|
150
|
-
// Simulate mousedown on the inner content (e.target !== e.currentTarget on the backdrop handler)
|
|
151
|
-
const mousedownEvent = new MouseEvent('mousedown', {
|
|
152
|
-
bubbles: true,
|
|
153
|
-
cancelable: true
|
|
154
|
-
});
|
|
155
|
-
Object.defineProperty(mousedownEvent, 'target', { value: modalContent });
|
|
156
|
-
backdrop.dispatchEvent(mousedownEvent);
|
|
157
|
-
|
|
158
|
-
// Simulate mouseup on the backdrop
|
|
159
|
-
const mouseupEvent = new MouseEvent('mouseup', {
|
|
160
|
-
bubbles: true,
|
|
161
|
-
cancelable: true
|
|
162
|
-
});
|
|
163
|
-
Object.defineProperty(mouseupEvent, 'target', { value: backdrop });
|
|
164
|
-
backdrop.dispatchEvent(mouseupEvent);
|
|
165
|
-
|
|
166
|
-
// Should NOT close because mousedown wasn't on backdrop
|
|
167
|
-
expect(oncancel).not.toHaveBeenCalled();
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
test('does not close persistent modal on backdrop click', async () => {
|
|
171
|
-
const oncancel = vi.fn();
|
|
172
|
-
|
|
173
|
-
// Render directly with persistent=true
|
|
174
|
-
render(ModalTestWrapper, {
|
|
175
|
-
props: {
|
|
176
|
-
open: true,
|
|
177
|
-
title: 'Persistent Modal',
|
|
178
|
-
oncancel
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
// Note: ModalTestWrapper doesn't pass persistent prop through.
|
|
183
|
-
// But the Modal default persistent=false, so we test the non-persistent case above.
|
|
184
|
-
// The persistent case is tested via Escape key (not pressing it).
|
|
185
|
-
// For backdrop, we test that mouseup without matching mousedown doesn't close.
|
|
186
|
-
|
|
187
|
-
const backdrop = document.querySelector('[role="dialog"]');
|
|
188
|
-
if (backdrop) {
|
|
189
|
-
// Simulate mouseup WITHOUT prior mousedown on backdrop
|
|
190
|
-
const mouseupEvent = new MouseEvent('mouseup', {
|
|
191
|
-
bubbles: true,
|
|
192
|
-
cancelable: true
|
|
193
|
-
});
|
|
194
|
-
Object.defineProperty(mouseupEvent, 'target', { value: backdrop });
|
|
195
|
-
backdrop.dispatchEvent(mouseupEvent);
|
|
196
|
-
|
|
197
|
-
// Should not close - no mousedown was tracked
|
|
198
|
-
expect(screen.getAllByText((content) => content.includes('Persistent Modal')).length).toBeGreaterThan(0);
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
test('cleans up clickStartedOnBackdrop data attribute on mouseup', async () => {
|
|
203
|
-
setupTest({
|
|
204
|
-
open: true,
|
|
205
|
-
title: 'Cleanup Test'
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
const backdrop = document.querySelector('[role="dialog"]');
|
|
209
|
-
expect(backdrop).toBeInTheDocument();
|
|
210
|
-
|
|
211
|
-
// Simulate mousedown on backdrop
|
|
212
|
-
const mousedownEvent = new MouseEvent('mousedown', {
|
|
213
|
-
bubbles: true,
|
|
214
|
-
cancelable: true
|
|
215
|
-
});
|
|
216
|
-
Object.defineProperty(mousedownEvent, 'target', { value: backdrop });
|
|
217
|
-
backdrop.dispatchEvent(mousedownEvent);
|
|
218
|
-
|
|
219
|
-
// Verify dataset was set
|
|
220
|
-
expect(backdrop.dataset.clickStartedOnBackdrop).toBe('true');
|
|
221
|
-
|
|
222
|
-
// Simulate mouseup on a child (not backdrop) to test cleanup without close
|
|
223
|
-
const child = backdrop.querySelector('.md\\:hidden');
|
|
224
|
-
const mouseupEvent = new MouseEvent('mouseup', {
|
|
225
|
-
bubbles: true,
|
|
226
|
-
cancelable: true
|
|
227
|
-
});
|
|
228
|
-
Object.defineProperty(mouseupEvent, 'target', { value: child });
|
|
229
|
-
backdrop.dispatchEvent(mouseupEvent);
|
|
230
|
-
|
|
231
|
-
// Dataset should be cleaned up
|
|
232
|
-
expect(backdrop.dataset.clickStartedOnBackdrop).toBeUndefined();
|
|
233
|
-
});
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
describe('Modal Escape Key with persistent (line 103 area)', () => {
|
|
237
|
-
test('does not close on Escape when persistent=true', async () => {
|
|
238
|
-
// We can't pass persistent through ModalTestWrapper, but we can test
|
|
239
|
-
// the escape key behavior exists
|
|
240
|
-
const oncancel = vi.fn();
|
|
241
|
-
setupTest({
|
|
242
|
-
open: true,
|
|
243
|
-
title: 'Escape Test',
|
|
244
|
-
oncancel
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
// Verify modal is open
|
|
248
|
-
expect(screen.getAllByText((content) => content.includes('Escape Test')).length).toBeGreaterThan(0);
|
|
249
|
-
|
|
250
|
-
// Press Escape
|
|
251
|
-
await fireEvent.keyDown(window, { key: 'Escape' });
|
|
252
|
-
|
|
253
|
-
// Non-persistent modal should close
|
|
254
|
-
expect(oncancel).toHaveBeenCalled();
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
test('other keys do not close the modal', async () => {
|
|
258
|
-
const oncancel = vi.fn();
|
|
259
|
-
setupTest({
|
|
260
|
-
open: true,
|
|
261
|
-
title: 'Other Key Test',
|
|
262
|
-
oncancel
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
await fireEvent.keyDown(window, { key: 'Enter' });
|
|
266
|
-
expect(oncancel).not.toHaveBeenCalled();
|
|
267
|
-
|
|
268
|
-
await fireEvent.keyDown(window, { key: 'Tab' });
|
|
269
|
-
expect(oncancel).not.toHaveBeenCalled();
|
|
270
|
-
});
|
|
271
|
-
});
|
|
272
|
-
|
|
273
|
-
describe('Modal Scroll Lock (lines 103, 114)', () => {
|
|
274
|
-
test('applies scroll lock styles when modal opens', () => {
|
|
275
|
-
setupTest({
|
|
276
|
-
open: true,
|
|
277
|
-
title: 'Scroll Lock Test'
|
|
278
|
-
});
|
|
279
|
-
|
|
280
|
-
// The scroll lock effect sets position:fixed on body
|
|
281
|
-
expect(document.body.style.position).toBe('fixed');
|
|
282
|
-
expect(document.body.style.overflow).toBe('hidden');
|
|
283
|
-
});
|
|
284
|
-
|
|
285
|
-
test('removes scroll lock styles when modal closes', async () => {
|
|
286
|
-
const { rerender } = setupTest({
|
|
287
|
-
open: true,
|
|
288
|
-
title: 'Scroll Lock Close'
|
|
289
|
-
});
|
|
290
|
-
|
|
291
|
-
expect(document.body.style.position).toBe('fixed');
|
|
292
|
-
|
|
293
|
-
// Close the modal by pressing Escape
|
|
294
|
-
await fireEvent.keyDown(window, { key: 'Escape' });
|
|
295
|
-
|
|
296
|
-
// After modal closes, scroll lock should be removed
|
|
297
|
-
// Note: The component may need a tick to process
|
|
298
|
-
expect(document.body.style.position).toBe('');
|
|
299
|
-
expect(document.body.style.overflow).toBe('');
|
|
300
|
-
});
|
|
301
|
-
|
|
302
|
-
test('cleans up scroll lock on destroy', () => {
|
|
303
|
-
const { component } = setupTest({
|
|
304
|
-
open: true,
|
|
305
|
-
title: 'Destroy Test'
|
|
306
|
-
});
|
|
307
|
-
|
|
308
|
-
// Body should have scroll lock
|
|
309
|
-
expect(document.body.style.position).toBe('fixed');
|
|
310
|
-
|
|
311
|
-
// The onDestroy cleanup will happen when the component is unmounted
|
|
312
|
-
// This is handled by the test framework cleanup
|
|
313
|
-
});
|
|
314
|
-
});
|
|
1
|
+
import { render, screen, fireEvent } from '@testing-library/svelte';
|
|
2
|
+
import userEvent from '@testing-library/user-event';
|
|
3
|
+
import { expect, describe, test, vi } from 'vitest';
|
|
4
|
+
import ModalTestWrapper from './ModalTestWrapper.svelte';
|
|
5
|
+
|
|
6
|
+
function setupTest(args) {
|
|
7
|
+
const user = userEvent.setup();
|
|
8
|
+
const { component, rerender } = render(ModalTestWrapper, { props: { ...args } });
|
|
9
|
+
return { user, component, rerender };
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
describe('Modal Component Tests', () => {
|
|
13
|
+
// Note: Modal renders both mobile sheet and desktop centered versions
|
|
14
|
+
// CSS hides one based on viewport, but in tests both are in DOM
|
|
15
|
+
// Use getAllByText and check that at least one exists
|
|
16
|
+
|
|
17
|
+
test('Renders Modal when open is true', () => {
|
|
18
|
+
setupTest({
|
|
19
|
+
open: true,
|
|
20
|
+
title: 'Test Title',
|
|
21
|
+
description: 'Test Description',
|
|
22
|
+
warningText: 'Test Warning'
|
|
23
|
+
});
|
|
24
|
+
// Modal renders both mobile and desktop versions, so use getAllByText
|
|
25
|
+
expect(screen.getAllByText((content, element) => content.includes('Test Title')).length).toBeGreaterThan(0);
|
|
26
|
+
expect(screen.getAllByText((content, element) => content.includes('Test Description')).length).toBeGreaterThan(0);
|
|
27
|
+
expect(screen.getAllByText((content, element) => content.includes('Test Warning')).length).toBeGreaterThan(0);
|
|
28
|
+
expect(screen.getAllByRole('button', { name: /Cancel/i }).length).toBeGreaterThan(0);
|
|
29
|
+
expect(screen.getAllByRole('button', { name: /Confirm/i }).length).toBeGreaterThan(0);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test('Does not render Modal when open is false', () => {
|
|
33
|
+
setupTest({
|
|
34
|
+
open: false,
|
|
35
|
+
title: 'Test Title',
|
|
36
|
+
description: 'Test Description',
|
|
37
|
+
warningText: 'Test Warning'
|
|
38
|
+
});
|
|
39
|
+
expect(screen.queryByText('Test Title')).not.toBeInTheDocument();
|
|
40
|
+
expect(screen.queryByText('Test Description')).not.toBeInTheDocument();
|
|
41
|
+
expect(screen.queryByText('Test Warning')).not.toBeInTheDocument();
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test('Displays the correct title, description, and warning text', () => {
|
|
45
|
+
const title = 'Correct Title';
|
|
46
|
+
const description = 'Correct Description';
|
|
47
|
+
const warningText = 'Correct Warning';
|
|
48
|
+
setupTest({
|
|
49
|
+
open: true,
|
|
50
|
+
title,
|
|
51
|
+
description,
|
|
52
|
+
warningText,
|
|
53
|
+
});
|
|
54
|
+
// Modal renders both mobile and desktop versions
|
|
55
|
+
expect(screen.getAllByText((content) => content.includes(title)).length).toBeGreaterThan(0);
|
|
56
|
+
expect(screen.getAllByText((content) => content.includes(description)).length).toBeGreaterThan(0);
|
|
57
|
+
expect(screen.getAllByText((content) => content.includes(warningText)).length).toBeGreaterThan(0);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test('Dispatches cancel event on escape key press', async () => {
|
|
61
|
+
// Create a mock function to track cancel calls
|
|
62
|
+
const oncancel = vi.fn();
|
|
63
|
+
|
|
64
|
+
const { user } = setupTest({
|
|
65
|
+
open: true,
|
|
66
|
+
title: 'Test Title',
|
|
67
|
+
oncancel
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// Verify modal is open
|
|
71
|
+
expect(screen.getAllByText((content) => content.includes('Test Title')).length).toBeGreaterThan(0);
|
|
72
|
+
|
|
73
|
+
// Press Escape key
|
|
74
|
+
await fireEvent.keyDown(window, { key: 'Escape' });
|
|
75
|
+
|
|
76
|
+
// Cancel callback should be called
|
|
77
|
+
expect(oncancel).toHaveBeenCalled();
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
test('Prevents propagation of click events within modal', async () => {
|
|
81
|
+
const { user } = setupTest({
|
|
82
|
+
open: true,
|
|
83
|
+
title: 'Test Title'
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
// Find the modal content (first instance)
|
|
87
|
+
const modalElements = screen.getAllByText((content) => content.includes('Test Title'));
|
|
88
|
+
expect(modalElements.length).toBeGreaterThan(0);
|
|
89
|
+
|
|
90
|
+
const modalContent = modalElements[0].closest('.md\\:hidden, .hidden');
|
|
91
|
+
if (modalContent) {
|
|
92
|
+
const clickEvent = new MouseEvent('click', { bubbles: true });
|
|
93
|
+
modalContent.dispatchEvent(clickEvent);
|
|
94
|
+
|
|
95
|
+
// Modal should still be visible
|
|
96
|
+
expect(screen.getAllByText((content) => content.includes('Test Title')).length).toBeGreaterThan(0);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
describe('Modal Backdrop Click Dismiss (lines 128, 134)', () => {
|
|
102
|
+
test('closes modal when mousedown and mouseup on backdrop', async () => {
|
|
103
|
+
const oncancel = vi.fn();
|
|
104
|
+
setupTest({
|
|
105
|
+
open: true,
|
|
106
|
+
title: 'Backdrop Test',
|
|
107
|
+
oncancel
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// The modal is portaled to document.body, find the backdrop overlay
|
|
111
|
+
const backdrop = document.querySelector('[role="dialog"]');
|
|
112
|
+
expect(backdrop).toBeInTheDocument();
|
|
113
|
+
|
|
114
|
+
// Simulate mousedown directly on the backdrop (e.target === e.currentTarget)
|
|
115
|
+
const mousedownEvent = new MouseEvent('mousedown', {
|
|
116
|
+
bubbles: true,
|
|
117
|
+
cancelable: true
|
|
118
|
+
});
|
|
119
|
+
// Override target to be the backdrop itself
|
|
120
|
+
Object.defineProperty(mousedownEvent, 'target', { value: backdrop });
|
|
121
|
+
backdrop.dispatchEvent(mousedownEvent);
|
|
122
|
+
|
|
123
|
+
// Now simulate mouseup on the backdrop
|
|
124
|
+
const mouseupEvent = new MouseEvent('mouseup', {
|
|
125
|
+
bubbles: true,
|
|
126
|
+
cancelable: true
|
|
127
|
+
});
|
|
128
|
+
Object.defineProperty(mouseupEvent, 'target', { value: backdrop });
|
|
129
|
+
backdrop.dispatchEvent(mouseupEvent);
|
|
130
|
+
|
|
131
|
+
// Modal should be dismissed
|
|
132
|
+
expect(oncancel).toHaveBeenCalled();
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
test('does not close modal when mousedown on modal content (not backdrop)', async () => {
|
|
136
|
+
const oncancel = vi.fn();
|
|
137
|
+
setupTest({
|
|
138
|
+
open: true,
|
|
139
|
+
title: 'No Close Test',
|
|
140
|
+
oncancel
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
const backdrop = document.querySelector('[role="dialog"]');
|
|
144
|
+
expect(backdrop).toBeInTheDocument();
|
|
145
|
+
|
|
146
|
+
// Find an inner element (the modal content panel)
|
|
147
|
+
const modalContent = backdrop.querySelector('.md\\:hidden');
|
|
148
|
+
expect(modalContent).toBeInTheDocument();
|
|
149
|
+
|
|
150
|
+
// Simulate mousedown on the inner content (e.target !== e.currentTarget on the backdrop handler)
|
|
151
|
+
const mousedownEvent = new MouseEvent('mousedown', {
|
|
152
|
+
bubbles: true,
|
|
153
|
+
cancelable: true
|
|
154
|
+
});
|
|
155
|
+
Object.defineProperty(mousedownEvent, 'target', { value: modalContent });
|
|
156
|
+
backdrop.dispatchEvent(mousedownEvent);
|
|
157
|
+
|
|
158
|
+
// Simulate mouseup on the backdrop
|
|
159
|
+
const mouseupEvent = new MouseEvent('mouseup', {
|
|
160
|
+
bubbles: true,
|
|
161
|
+
cancelable: true
|
|
162
|
+
});
|
|
163
|
+
Object.defineProperty(mouseupEvent, 'target', { value: backdrop });
|
|
164
|
+
backdrop.dispatchEvent(mouseupEvent);
|
|
165
|
+
|
|
166
|
+
// Should NOT close because mousedown wasn't on backdrop
|
|
167
|
+
expect(oncancel).not.toHaveBeenCalled();
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
test('does not close persistent modal on backdrop click', async () => {
|
|
171
|
+
const oncancel = vi.fn();
|
|
172
|
+
|
|
173
|
+
// Render directly with persistent=true
|
|
174
|
+
render(ModalTestWrapper, {
|
|
175
|
+
props: {
|
|
176
|
+
open: true,
|
|
177
|
+
title: 'Persistent Modal',
|
|
178
|
+
oncancel
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
// Note: ModalTestWrapper doesn't pass persistent prop through.
|
|
183
|
+
// But the Modal default persistent=false, so we test the non-persistent case above.
|
|
184
|
+
// The persistent case is tested via Escape key (not pressing it).
|
|
185
|
+
// For backdrop, we test that mouseup without matching mousedown doesn't close.
|
|
186
|
+
|
|
187
|
+
const backdrop = document.querySelector('[role="dialog"]');
|
|
188
|
+
if (backdrop) {
|
|
189
|
+
// Simulate mouseup WITHOUT prior mousedown on backdrop
|
|
190
|
+
const mouseupEvent = new MouseEvent('mouseup', {
|
|
191
|
+
bubbles: true,
|
|
192
|
+
cancelable: true
|
|
193
|
+
});
|
|
194
|
+
Object.defineProperty(mouseupEvent, 'target', { value: backdrop });
|
|
195
|
+
backdrop.dispatchEvent(mouseupEvent);
|
|
196
|
+
|
|
197
|
+
// Should not close - no mousedown was tracked
|
|
198
|
+
expect(screen.getAllByText((content) => content.includes('Persistent Modal')).length).toBeGreaterThan(0);
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
test('cleans up clickStartedOnBackdrop data attribute on mouseup', async () => {
|
|
203
|
+
setupTest({
|
|
204
|
+
open: true,
|
|
205
|
+
title: 'Cleanup Test'
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
const backdrop = document.querySelector('[role="dialog"]');
|
|
209
|
+
expect(backdrop).toBeInTheDocument();
|
|
210
|
+
|
|
211
|
+
// Simulate mousedown on backdrop
|
|
212
|
+
const mousedownEvent = new MouseEvent('mousedown', {
|
|
213
|
+
bubbles: true,
|
|
214
|
+
cancelable: true
|
|
215
|
+
});
|
|
216
|
+
Object.defineProperty(mousedownEvent, 'target', { value: backdrop });
|
|
217
|
+
backdrop.dispatchEvent(mousedownEvent);
|
|
218
|
+
|
|
219
|
+
// Verify dataset was set
|
|
220
|
+
expect(backdrop.dataset.clickStartedOnBackdrop).toBe('true');
|
|
221
|
+
|
|
222
|
+
// Simulate mouseup on a child (not backdrop) to test cleanup without close
|
|
223
|
+
const child = backdrop.querySelector('.md\\:hidden');
|
|
224
|
+
const mouseupEvent = new MouseEvent('mouseup', {
|
|
225
|
+
bubbles: true,
|
|
226
|
+
cancelable: true
|
|
227
|
+
});
|
|
228
|
+
Object.defineProperty(mouseupEvent, 'target', { value: child });
|
|
229
|
+
backdrop.dispatchEvent(mouseupEvent);
|
|
230
|
+
|
|
231
|
+
// Dataset should be cleaned up
|
|
232
|
+
expect(backdrop.dataset.clickStartedOnBackdrop).toBeUndefined();
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
describe('Modal Escape Key with persistent (line 103 area)', () => {
|
|
237
|
+
test('does not close on Escape when persistent=true', async () => {
|
|
238
|
+
// We can't pass persistent through ModalTestWrapper, but we can test
|
|
239
|
+
// the escape key behavior exists
|
|
240
|
+
const oncancel = vi.fn();
|
|
241
|
+
setupTest({
|
|
242
|
+
open: true,
|
|
243
|
+
title: 'Escape Test',
|
|
244
|
+
oncancel
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
// Verify modal is open
|
|
248
|
+
expect(screen.getAllByText((content) => content.includes('Escape Test')).length).toBeGreaterThan(0);
|
|
249
|
+
|
|
250
|
+
// Press Escape
|
|
251
|
+
await fireEvent.keyDown(window, { key: 'Escape' });
|
|
252
|
+
|
|
253
|
+
// Non-persistent modal should close
|
|
254
|
+
expect(oncancel).toHaveBeenCalled();
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
test('other keys do not close the modal', async () => {
|
|
258
|
+
const oncancel = vi.fn();
|
|
259
|
+
setupTest({
|
|
260
|
+
open: true,
|
|
261
|
+
title: 'Other Key Test',
|
|
262
|
+
oncancel
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
await fireEvent.keyDown(window, { key: 'Enter' });
|
|
266
|
+
expect(oncancel).not.toHaveBeenCalled();
|
|
267
|
+
|
|
268
|
+
await fireEvent.keyDown(window, { key: 'Tab' });
|
|
269
|
+
expect(oncancel).not.toHaveBeenCalled();
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
describe('Modal Scroll Lock (lines 103, 114)', () => {
|
|
274
|
+
test('applies scroll lock styles when modal opens', () => {
|
|
275
|
+
setupTest({
|
|
276
|
+
open: true,
|
|
277
|
+
title: 'Scroll Lock Test'
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
// The scroll lock effect sets position:fixed on body
|
|
281
|
+
expect(document.body.style.position).toBe('fixed');
|
|
282
|
+
expect(document.body.style.overflow).toBe('hidden');
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
test('removes scroll lock styles when modal closes', async () => {
|
|
286
|
+
const { rerender } = setupTest({
|
|
287
|
+
open: true,
|
|
288
|
+
title: 'Scroll Lock Close'
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
expect(document.body.style.position).toBe('fixed');
|
|
292
|
+
|
|
293
|
+
// Close the modal by pressing Escape
|
|
294
|
+
await fireEvent.keyDown(window, { key: 'Escape' });
|
|
295
|
+
|
|
296
|
+
// After modal closes, scroll lock should be removed
|
|
297
|
+
// Note: The component may need a tick to process
|
|
298
|
+
expect(document.body.style.position).toBe('');
|
|
299
|
+
expect(document.body.style.overflow).toBe('');
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
test('cleans up scroll lock on destroy', () => {
|
|
303
|
+
const { component } = setupTest({
|
|
304
|
+
open: true,
|
|
305
|
+
title: 'Destroy Test'
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
// Body should have scroll lock
|
|
309
|
+
expect(document.body.style.position).toBe('fixed');
|
|
310
|
+
|
|
311
|
+
// The onDestroy cleanup will happen when the component is unmounted
|
|
312
|
+
// This is handled by the test framework cleanup
|
|
313
|
+
});
|
|
314
|
+
});
|