@getmicdrop/svelte-components 5.19.0 → 5.20.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/base.css +18 -0
- package/dist/calendar/AboutShow/AboutShow.svelte +191 -191
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte +803 -801
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte.d.ts.map +1 -1
- package/dist/calendar/FAQs/FAQs.svelte +88 -88
- package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte +140 -140
- package/dist/calendar/OrderSummary/OrderSummary.svelte +461 -461
- package/dist/calendar/PublicCard/PublicCard.svelte +164 -164
- package/dist/calendar/ShowCard/ShowCard.svelte +180 -180
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +80 -80
- package/dist/calendar/index.js +15 -15
- package/dist/components/Heading.spec.js +89 -89
- package/dist/components/Heading.svelte +66 -60
- package/dist/components/Heading.svelte.d.ts +1 -0
- package/dist/components/Heading.svelte.d.ts.map +1 -1
- 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 +64 -53
- package/dist/components/Text.svelte.d.ts +2 -1
- package/dist/components/Text.svelte.d.ts.map +1 -1
- package/dist/config.js +151 -151
- package/dist/config.spec.js +29 -29
- package/dist/constants/formOptions.d.ts +2 -5
- package/dist/constants/formOptions.d.ts.map +1 -1
- package/dist/constants/formOptions.js +48 -48
- package/dist/constants/formOptions.spec.js +2 -7
- 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 +0 -1
- package/dist/forms/createFormStore.svelte.spec.js +0 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +85 -66
- 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 -103
- 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 -46
- package/dist/patterns/chat/ChatInvitationNotice.spec.js +32 -32
- package/dist/patterns/chat/ChatInvitationNotice.svelte +36 -36
- 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 +33 -32
- package/dist/patterns/forms/FormSection.svelte.d.ts +2 -0
- package/dist/patterns/forms/FormSection.svelte.d.ts.map +1 -1
- package/dist/patterns/forms/FormValidationSummary.stories.svelte +97 -97
- package/dist/patterns/forms/FormValidationSummary.svelte +82 -82
- 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/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 -82
- package/dist/patterns/navigation/Header.stories.svelte +77 -77
- package/dist/patterns/navigation/Header.svelte +263 -263
- 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 -62
- 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 -103
- 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 -72
- 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 -107
- 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.spec.js +4 -15
- 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 -147
- 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 -179
- 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 -444
- 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 -113
- package/dist/primitives/Pagination/DotIndicator.svelte +66 -0
- package/dist/primitives/Pagination/DotIndicator.svelte.d.ts +18 -0
- package/dist/primitives/Pagination/DotIndicator.svelte.d.ts.map +1 -0
- package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
- package/dist/primitives/Pagination/Pagination.svelte +275 -275
- 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 -96
- package/dist/primitives/Skeleton/ImagePlaceholder.svelte +68 -68
- package/dist/primitives/Skeleton/ListPlaceholder.svelte +85 -85
- package/dist/primitives/Skeleton/Skeleton.stories.svelte +151 -151
- package/dist/primitives/Skeleton/Skeleton.svelte +55 -55
- 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 -52
- 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.d.ts +1 -0
- package/dist/primitives/index.js +114 -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 -994
- package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
- package/dist/recipes/feedback/EmptyState/EmptyState.svelte +75 -75
- 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 -291
- 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 -128
- package/dist/recipes/inputs/PasswordInput.svelte +130 -130
- package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +142 -142
- package/dist/recipes/inputs/PhoneInput.svelte +254 -254
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +170 -170
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +349 -349
- package/dist/recipes/inputs/Search.svelte +110 -110
- package/dist/recipes/inputs/index.js +8 -8
- package/dist/recipes/inputs/phoneInput/CountrySelector.svelte +240 -240
- package/dist/recipes/modals/AlertModal.svelte +139 -139
- 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 -169
- package/dist/recipes/modals/FeedbackModal.svelte +205 -0
- package/dist/recipes/modals/FeedbackModal.svelte.d.ts +24 -0
- package/dist/recipes/modals/FeedbackModal.svelte.d.ts.map +1 -0
- package/dist/recipes/modals/InputModal.svelte +194 -194
- 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 -216
- package/dist/recipes/modals/index.d.ts +1 -0
- package/dist/recipes/modals/index.js +8 -7
- package/dist/schemas/common.js +1 -1
- package/dist/schemas/event.js +1 -1
- package/dist/schemas/order.js +0 -1
- package/dist/schemas/performer.js +1 -1
- package/dist/schemas/promo.js +2 -2
- package/dist/schemas/ticket.js +1 -1
- package/dist/schemas/user.js +1 -2
- package/dist/services/show.service.d.ts +46 -46
- 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 +87 -82
- package/dist/tailwind/preset.d.cts +2 -0
- package/dist/tailwind/preset.d.cts.map +1 -1
- 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/__tests__/spacing.test.js +2 -2
- package/dist/tokens/__tests__/variants.test.js +12 -4
- package/dist/tokens/base-resets.css +124 -0
- package/dist/tokens/spacing.d.ts +2 -0
- package/dist/tokens/spacing.d.ts.map +1 -1
- package/dist/tokens/spacing.js +1 -0
- package/dist/tokens/tokens.css +87 -87
- package/dist/tokens/typography-base.css +163 -163
- package/dist/tokens/utilities.css +430 -353
- package/dist/tokens/variants.d.ts +4 -4
- package/dist/tokens/variants.js +4 -4
- 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 +226 -219
- package/dist/utils/auth.d.ts +46 -46
- package/dist/utils/auth.js +195 -195
- package/dist/utils/clickOutside.d.ts +4 -0
- package/dist/utils/clickOutside.d.ts.map +1 -0
- package/dist/utils/clickOutside.js +13 -0
- package/dist/utils/feedbackContext.d.ts +24 -0
- package/dist/utils/feedbackContext.d.ts.map +1 -0
- package/dist/utils/feedbackContext.js +19 -0
- package/dist/utils/fetchHelpers.d.ts.map +1 -1
- package/dist/utils/fetchHelpers.js +1 -0
- package/dist/utils/focusTrap.d.ts +20 -0
- package/dist/utils/focusTrap.d.ts.map +1 -0
- package/dist/utils/focusTrap.js +130 -0
- package/dist/utils/formatters.js +1 -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/logger.d.ts +25 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +59 -1
- package/dist/utils/logger.spec.js +99 -1
- 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/transitions.d.ts +99 -1
- package/dist/utils/transitions.d.ts.map +1 -1
- package/dist/utils/transitions.js +148 -6
- package/dist/utils/utils/utils.d.ts +2 -2
- package/dist/utils/utils/utils.js +3 -3
- package/dist/utils/utils/utils.spec.js +698 -698
- package/dist/utils/utils.d.ts +41 -41
- package/dist/utils/utils.js +59 -59
- package/dist/utils/utils.spec.js +643 -643
- package/package.json +310 -301
|
@@ -1,86 +1,86 @@
|
|
|
1
|
-
<script module>
|
|
2
|
-
import { defineMeta } from "@storybook/addon-svelte-csf";
|
|
3
|
-
|
|
4
|
-
import ModalProgress from "./Modal.svelte";
|
|
5
|
-
|
|
6
|
-
const { Story } = defineMeta({
|
|
7
|
-
title: "Components/Modal/ModalProgress",
|
|
8
|
-
component: ModalProgress,
|
|
9
|
-
});
|
|
10
|
-
</script>
|
|
11
|
-
|
|
12
|
-
<script>
|
|
13
|
-
let show1 = $state(false);
|
|
14
|
-
let show2 = $state(false);
|
|
15
|
-
let show3 = $state(false);
|
|
16
|
-
</script>
|
|
17
|
-
|
|
18
|
-
<Story name="Basic Modal">
|
|
19
|
-
<button
|
|
20
|
-
onclick={() => (show1 = true)}
|
|
21
|
-
class="px-4 py-2 bg-primary text-white rounded-lg"
|
|
22
|
-
>
|
|
23
|
-
Open Basic Modal
|
|
24
|
-
</button>
|
|
25
|
-
<ModalProgress bind:open={show1}>
|
|
26
|
-
{#snippet header()}
|
|
27
|
-
<h2 class="text-xl font-semibold mb-2">Modal Title</h2>
|
|
28
|
-
{/snippet}
|
|
29
|
-
{#snippet body()}
|
|
30
|
-
<p class="text-gray-500 dark:text-gray-400">This is the modal body content.</p>
|
|
31
|
-
{/snippet}
|
|
32
|
-
{#snippet footer()}
|
|
33
|
-
<button
|
|
34
|
-
onclick={() => (show1 = false)}
|
|
35
|
-
class="px-4 py-2 bg-gray-600 text-white rounded-lg"
|
|
36
|
-
>
|
|
37
|
-
Close
|
|
38
|
-
</button>
|
|
39
|
-
{/snippet}
|
|
40
|
-
</ModalProgress>
|
|
41
|
-
</Story>
|
|
42
|
-
|
|
43
|
-
<Story name="Processing State">
|
|
44
|
-
<button
|
|
45
|
-
onclick={() => (show2 = true)}
|
|
46
|
-
class="px-4 py-2 bg-primary text-white rounded-lg"
|
|
47
|
-
>
|
|
48
|
-
Open Processing Modal
|
|
49
|
-
</button>
|
|
50
|
-
<ModalProgress bind:open={show2} isProcessing={true}>
|
|
51
|
-
{#snippet body()}
|
|
52
|
-
<div class="flex flex-col items-center gap-4">
|
|
53
|
-
<div
|
|
54
|
-
class="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600"
|
|
55
|
-
></div>
|
|
56
|
-
<p class="text-gray-500 dark:text-gray-400">Processing your request...</p>
|
|
57
|
-
</div>
|
|
58
|
-
{/snippet}
|
|
59
|
-
</ModalProgress>
|
|
60
|
-
</Story>
|
|
61
|
-
|
|
62
|
-
<Story name="Success State">
|
|
63
|
-
<button
|
|
64
|
-
onclick={() => (show3 = true)}
|
|
65
|
-
class="px-4 py-2 bg-green-600 text-white rounded-lg"
|
|
66
|
-
>
|
|
67
|
-
Open Success Modal
|
|
68
|
-
</button>
|
|
69
|
-
<ModalProgress bind:open={show3} isSuccess={true}>
|
|
70
|
-
{#snippet body()}
|
|
71
|
-
<div class="flex flex-col items-center gap-4 text-center">
|
|
72
|
-
<div class="text-green-600 dark:text-green-400 text-5xl">✓</div>
|
|
73
|
-
<h3 class="text-xl font-semibold">Success!</h3>
|
|
74
|
-
<p class="text-gray-500 dark:text-gray-400">Your action was completed successfully.</p>
|
|
75
|
-
</div>
|
|
76
|
-
{/snippet}
|
|
77
|
-
{#snippet footer()}
|
|
78
|
-
<button
|
|
79
|
-
onclick={() => (show3 = false)}
|
|
80
|
-
class="px-4 py-2 bg-green-600 text-white rounded-lg"
|
|
81
|
-
>
|
|
82
|
-
Done
|
|
83
|
-
</button>
|
|
84
|
-
{/snippet}
|
|
85
|
-
</ModalProgress>
|
|
86
|
-
</Story>
|
|
1
|
+
<script module>
|
|
2
|
+
import { defineMeta } from "@storybook/addon-svelte-csf";
|
|
3
|
+
|
|
4
|
+
import ModalProgress from "./Modal.svelte";
|
|
5
|
+
|
|
6
|
+
const { Story } = defineMeta({
|
|
7
|
+
title: "Components/Modal/ModalProgress",
|
|
8
|
+
component: ModalProgress,
|
|
9
|
+
});
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<script>
|
|
13
|
+
let show1 = $state(false);
|
|
14
|
+
let show2 = $state(false);
|
|
15
|
+
let show3 = $state(false);
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<Story name="Basic Modal">
|
|
19
|
+
<button
|
|
20
|
+
onclick={() => (show1 = true)}
|
|
21
|
+
class="px-4 py-2 bg-primary text-white rounded-lg"
|
|
22
|
+
>
|
|
23
|
+
Open Basic Modal
|
|
24
|
+
</button>
|
|
25
|
+
<ModalProgress bind:open={show1}>
|
|
26
|
+
{#snippet header()}
|
|
27
|
+
<h2 class="text-xl font-semibold mb-2">Modal Title</h2>
|
|
28
|
+
{/snippet}
|
|
29
|
+
{#snippet body()}
|
|
30
|
+
<p class="text-gray-500 dark:text-gray-400">This is the modal body content.</p>
|
|
31
|
+
{/snippet}
|
|
32
|
+
{#snippet footer()}
|
|
33
|
+
<button
|
|
34
|
+
onclick={() => (show1 = false)}
|
|
35
|
+
class="px-4 py-2 bg-gray-600 text-white rounded-lg"
|
|
36
|
+
>
|
|
37
|
+
Close
|
|
38
|
+
</button>
|
|
39
|
+
{/snippet}
|
|
40
|
+
</ModalProgress>
|
|
41
|
+
</Story>
|
|
42
|
+
|
|
43
|
+
<Story name="Processing State">
|
|
44
|
+
<button
|
|
45
|
+
onclick={() => (show2 = true)}
|
|
46
|
+
class="px-4 py-2 bg-primary text-white rounded-lg"
|
|
47
|
+
>
|
|
48
|
+
Open Processing Modal
|
|
49
|
+
</button>
|
|
50
|
+
<ModalProgress bind:open={show2} isProcessing={true}>
|
|
51
|
+
{#snippet body()}
|
|
52
|
+
<div class="flex flex-col items-center gap-4">
|
|
53
|
+
<div
|
|
54
|
+
class="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600"
|
|
55
|
+
></div>
|
|
56
|
+
<p class="text-gray-500 dark:text-gray-400">Processing your request...</p>
|
|
57
|
+
</div>
|
|
58
|
+
{/snippet}
|
|
59
|
+
</ModalProgress>
|
|
60
|
+
</Story>
|
|
61
|
+
|
|
62
|
+
<Story name="Success State">
|
|
63
|
+
<button
|
|
64
|
+
onclick={() => (show3 = true)}
|
|
65
|
+
class="px-4 py-2 bg-green-600 text-white rounded-lg"
|
|
66
|
+
>
|
|
67
|
+
Open Success Modal
|
|
68
|
+
</button>
|
|
69
|
+
<ModalProgress bind:open={show3} isSuccess={true}>
|
|
70
|
+
{#snippet body()}
|
|
71
|
+
<div class="flex flex-col items-center gap-4 text-center">
|
|
72
|
+
<div class="text-green-600 dark:text-green-400 text-5xl">✓</div>
|
|
73
|
+
<h3 class="text-xl font-semibold">Success!</h3>
|
|
74
|
+
<p class="text-gray-500 dark:text-gray-400">Your action was completed successfully.</p>
|
|
75
|
+
</div>
|
|
76
|
+
{/snippet}
|
|
77
|
+
{#snippet footer()}
|
|
78
|
+
<button
|
|
79
|
+
onclick={() => (show3 = false)}
|
|
80
|
+
class="px-4 py-2 bg-green-600 text-white rounded-lg"
|
|
81
|
+
>
|
|
82
|
+
Done
|
|
83
|
+
</button>
|
|
84
|
+
{/snippet}
|
|
85
|
+
</ModalProgress>
|
|
86
|
+
</Story>
|
|
@@ -1,181 +1,181 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
/**
|
|
3
|
-
* Modal Component - Flowbite Native
|
|
4
|
-
* Migrated to Svelte 5 runes
|
|
5
|
-
*
|
|
6
|
-
* Haptic Feedback:
|
|
7
|
-
* - Light haptic on modal open (subtle attention cue)
|
|
8
|
-
*/
|
|
9
|
-
import { onDestroy } from "svelte";
|
|
10
|
-
import { fade, fly } from "svelte/transition";
|
|
11
|
-
import { cubicOut } from "svelte/easing";
|
|
12
|
-
import { portal } from "../../utils/portal.js";
|
|
13
|
-
import { triggerHaptic } from "../../utils/haptic.js";
|
|
14
|
-
|
|
15
|
-
/** @type {{
|
|
16
|
-
open?: boolean,
|
|
17
|
-
isProcessing?: boolean,
|
|
18
|
-
isSuccess?: boolean,
|
|
19
|
-
size?: 'sm' | 'md' | 'lg' | 'xl',
|
|
20
|
-
persistent?: boolean,
|
|
21
|
-
haptic?: boolean,
|
|
22
|
-
oncancel?: () => void,
|
|
23
|
-
header?: import('svelte').Snippet,
|
|
24
|
-
body?: import('svelte').Snippet,
|
|
25
|
-
footer?: import('svelte').Snippet,
|
|
26
|
-
class?: string,
|
|
27
|
-
}} */
|
|
28
|
-
let {
|
|
29
|
-
open = $bindable(false),
|
|
30
|
-
isProcessing: _isProcessing = false,
|
|
31
|
-
isSuccess: _isSuccess = false,
|
|
32
|
-
size = "md",
|
|
33
|
-
persistent = false,
|
|
34
|
-
haptic = true,
|
|
35
|
-
oncancel,
|
|
36
|
-
header,
|
|
37
|
-
body,
|
|
38
|
-
footer,
|
|
39
|
-
class: _className,
|
|
40
|
-
...restProps
|
|
41
|
-
} = $props();
|
|
42
|
-
|
|
43
|
-
// Store scroll position for iOS scroll lock
|
|
44
|
-
let scrollY = $state(0);
|
|
45
|
-
|
|
46
|
-
// Track previous open state to detect open transitions
|
|
47
|
-
let prevOpen = $state(false);
|
|
48
|
-
|
|
49
|
-
// Trigger haptic on modal open (QOL Bible)
|
|
50
|
-
$effect(() => {
|
|
51
|
-
if (open && !prevOpen && haptic) {
|
|
52
|
-
triggerHaptic('light');
|
|
53
|
-
}
|
|
54
|
-
prevOpen = open;
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
// Handle escape key
|
|
58
|
-
function handleKeydown(event) {
|
|
59
|
-
if (event.key === "Escape" && open && !persistent) {
|
|
60
|
-
resetModal();
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const resetModal = () => {
|
|
65
|
-
oncancel?.();
|
|
66
|
-
open = false;
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
// Size classes for desktop modal (xs/sm/md/lg/xl scale)
|
|
70
|
-
const sizeClasses = {
|
|
71
|
-
sm: "max-w-sm",
|
|
72
|
-
md: "max-w-md",
|
|
73
|
-
lg: "max-w-xl",
|
|
74
|
-
xl: "max-w-2xl"
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
let modalSizeClass = $derived(sizeClasses[size] || sizeClasses.md);
|
|
78
|
-
|
|
79
|
-
// iOS-compatible scroll lock using position:fixed approach
|
|
80
|
-
// Also compensates for scrollbar width to prevent layout shift
|
|
81
|
-
$effect(() => {
|
|
82
|
-
if (typeof document !== "undefined") {
|
|
83
|
-
if (open) {
|
|
84
|
-
scrollY = window.scrollY;
|
|
85
|
-
// Calculate scrollbar width before hiding it
|
|
86
|
-
const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;
|
|
87
|
-
document.body.style.position = "fixed";
|
|
88
|
-
document.body.style.top = `-${scrollY}px`;
|
|
89
|
-
document.body.style.left = "0";
|
|
90
|
-
document.body.style.right = "0";
|
|
91
|
-
document.body.style.overflow = "hidden";
|
|
92
|
-
// Add padding to compensate for scrollbar disappearing
|
|
93
|
-
document.body.style.paddingRight = `${scrollbarWidth}px`;
|
|
94
|
-
} else {
|
|
95
|
-
document.body.style.position = "";
|
|
96
|
-
document.body.style.top = "";
|
|
97
|
-
document.body.style.left = "";
|
|
98
|
-
document.body.style.right = "";
|
|
99
|
-
document.body.style.overflow = "";
|
|
100
|
-
document.body.style.paddingRight = "";
|
|
101
|
-
window.scrollTo(0, scrollY);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
onDestroy(() => {
|
|
107
|
-
if (typeof document !== "undefined") {
|
|
108
|
-
document.body.style.position = "";
|
|
109
|
-
document.body.style.top = "";
|
|
110
|
-
document.body.style.left = "";
|
|
111
|
-
document.body.style.right = "";
|
|
112
|
-
document.body.style.overflow = "";
|
|
113
|
-
document.body.style.paddingRight = "";
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
</script>
|
|
117
|
-
|
|
118
|
-
<svelte:window onkeydown={handleKeydown} />
|
|
119
|
-
|
|
120
|
-
{#if open}
|
|
121
|
-
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
122
|
-
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
123
|
-
<div
|
|
124
|
-
class="fixed inset-0 flex bg-black/50 z-50 items-end justify-center md:items-center md:p-4 touch-none overscroll-none"
|
|
125
|
-
onmousedown={(e) => {
|
|
126
|
-
// Only track direct clicks on backdrop, not drags that end on backdrop
|
|
127
|
-
if (e.target === e.currentTarget && !persistent) {
|
|
128
|
-
e.currentTarget.dataset.clickStartedOnBackdrop = 'true';
|
|
129
|
-
}
|
|
130
|
-
}}
|
|
131
|
-
onmouseup={(e) => {
|
|
132
|
-
// Only close if both mousedown and mouseup were on the backdrop
|
|
133
|
-
if (e.target === e.currentTarget && e.currentTarget.dataset.clickStartedOnBackdrop === 'true' && !persistent) {
|
|
134
|
-
resetModal();
|
|
135
|
-
}
|
|
136
|
-
delete e.currentTarget.dataset.clickStartedOnBackdrop;
|
|
137
|
-
}}
|
|
138
|
-
transition:fade={{ duration: 300 }}
|
|
139
|
-
role="dialog"
|
|
140
|
-
aria-modal="true"
|
|
141
|
-
use:portal
|
|
142
|
-
{...restProps}
|
|
143
|
-
>
|
|
144
|
-
<!-- Mobile: Bottom sheet -->
|
|
145
|
-
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
146
|
-
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
147
|
-
<div
|
|
148
|
-
class="md:hidden bg-white dark:bg-gray-800 rounded-t-3xl w-full max-h-[90vh] max-h-[90dvh] overflow-hidden flex flex-col shadow-[0_-10px_40px_rgba(0,0,0,0.15)] touch-pan-y overscroll-contain"
|
|
149
|
-
onclick={(e) => e.stopPropagation()}
|
|
150
|
-
transition:fly={{ y: 300, duration: 300, easing: cubicOut }}
|
|
151
|
-
>
|
|
152
|
-
<!-- Handle bar -->
|
|
153
|
-
<div class="flex justify-center pt-3 pb-1 shrink-0">
|
|
154
|
-
<div class="w-10 h-1 bg-gray-300 dark:bg-gray-600 rounded-xs"></div>
|
|
155
|
-
</div>
|
|
156
|
-
|
|
157
|
-
<div class="p-6 pb-[calc(5rem+env(safe-area-inset-bottom,0px))] overflow-y-auto flex-1">
|
|
158
|
-
{#if header}{@render header()}{/if}
|
|
159
|
-
{#if body}{@render body()}{/if}
|
|
160
|
-
<div class="w-full flex flex-col gap-3 mt-6 empty:hidden empty:mt-0">
|
|
161
|
-
{#if footer}{@render footer()}{/if}
|
|
162
|
-
</div>
|
|
163
|
-
</div>
|
|
164
|
-
</div>
|
|
165
|
-
|
|
166
|
-
<!-- Desktop: Centered modal -->
|
|
167
|
-
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
168
|
-
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
169
|
-
<div
|
|
170
|
-
class="hidden md:block bg-white dark:bg-gray-800 p-6 rounded-lg {modalSizeClass} w-full max-h-[calc(100vh-4rem)] overflow-y-auto shadow-2xl"
|
|
171
|
-
onclick={(e) => e.stopPropagation()}
|
|
172
|
-
transition:fly={{ y: 20, duration: 200 }}
|
|
173
|
-
>
|
|
174
|
-
{#if header}{@render header()}{/if}
|
|
175
|
-
{#if body}{@render body()}{/if}
|
|
176
|
-
<div class="w-full flex flex-col md:flex-row md:justify-end gap-3 mt-6 empty:hidden empty:mt-0">
|
|
177
|
-
{#if footer}{@render footer()}{/if}
|
|
178
|
-
</div>
|
|
179
|
-
</div>
|
|
180
|
-
</div>
|
|
181
|
-
{/if}
|
|
1
|
+
<script>
|
|
2
|
+
/**
|
|
3
|
+
* Modal Component - Flowbite Native
|
|
4
|
+
* Migrated to Svelte 5 runes
|
|
5
|
+
*
|
|
6
|
+
* Haptic Feedback:
|
|
7
|
+
* - Light haptic on modal open (subtle attention cue)
|
|
8
|
+
*/
|
|
9
|
+
import { onDestroy } from "svelte";
|
|
10
|
+
import { fade, fly } from "svelte/transition";
|
|
11
|
+
import { cubicOut } from "svelte/easing";
|
|
12
|
+
import { portal } from "../../utils/portal.js";
|
|
13
|
+
import { triggerHaptic } from "../../utils/haptic.js";
|
|
14
|
+
|
|
15
|
+
/** @type {{
|
|
16
|
+
open?: boolean,
|
|
17
|
+
isProcessing?: boolean,
|
|
18
|
+
isSuccess?: boolean,
|
|
19
|
+
size?: 'sm' | 'md' | 'lg' | 'xl',
|
|
20
|
+
persistent?: boolean,
|
|
21
|
+
haptic?: boolean,
|
|
22
|
+
oncancel?: () => void,
|
|
23
|
+
header?: import('svelte').Snippet,
|
|
24
|
+
body?: import('svelte').Snippet,
|
|
25
|
+
footer?: import('svelte').Snippet,
|
|
26
|
+
class?: string,
|
|
27
|
+
}} */
|
|
28
|
+
let {
|
|
29
|
+
open = $bindable(false),
|
|
30
|
+
isProcessing: _isProcessing = false,
|
|
31
|
+
isSuccess: _isSuccess = false,
|
|
32
|
+
size = "md",
|
|
33
|
+
persistent = false,
|
|
34
|
+
haptic = true,
|
|
35
|
+
oncancel,
|
|
36
|
+
header,
|
|
37
|
+
body,
|
|
38
|
+
footer,
|
|
39
|
+
class: _className,
|
|
40
|
+
...restProps
|
|
41
|
+
} = $props();
|
|
42
|
+
|
|
43
|
+
// Store scroll position for iOS scroll lock
|
|
44
|
+
let scrollY = $state(0);
|
|
45
|
+
|
|
46
|
+
// Track previous open state to detect open transitions
|
|
47
|
+
let prevOpen = $state(false);
|
|
48
|
+
|
|
49
|
+
// Trigger haptic on modal open (QOL Bible)
|
|
50
|
+
$effect(() => {
|
|
51
|
+
if (open && !prevOpen && haptic) {
|
|
52
|
+
triggerHaptic('light');
|
|
53
|
+
}
|
|
54
|
+
prevOpen = open;
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// Handle escape key
|
|
58
|
+
function handleKeydown(event) {
|
|
59
|
+
if (event.key === "Escape" && open && !persistent) {
|
|
60
|
+
resetModal();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const resetModal = () => {
|
|
65
|
+
oncancel?.();
|
|
66
|
+
open = false;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
// Size classes for desktop modal (xs/sm/md/lg/xl scale)
|
|
70
|
+
const sizeClasses = {
|
|
71
|
+
sm: "max-w-sm",
|
|
72
|
+
md: "max-w-md",
|
|
73
|
+
lg: "max-w-xl",
|
|
74
|
+
xl: "max-w-2xl"
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
let modalSizeClass = $derived(sizeClasses[size] || sizeClasses.md);
|
|
78
|
+
|
|
79
|
+
// iOS-compatible scroll lock using position:fixed approach
|
|
80
|
+
// Also compensates for scrollbar width to prevent layout shift
|
|
81
|
+
$effect(() => {
|
|
82
|
+
if (typeof document !== "undefined") {
|
|
83
|
+
if (open) {
|
|
84
|
+
scrollY = window.scrollY;
|
|
85
|
+
// Calculate scrollbar width before hiding it
|
|
86
|
+
const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;
|
|
87
|
+
document.body.style.position = "fixed";
|
|
88
|
+
document.body.style.top = `-${scrollY}px`;
|
|
89
|
+
document.body.style.left = "0";
|
|
90
|
+
document.body.style.right = "0";
|
|
91
|
+
document.body.style.overflow = "hidden";
|
|
92
|
+
// Add padding to compensate for scrollbar disappearing
|
|
93
|
+
document.body.style.paddingRight = `${scrollbarWidth}px`;
|
|
94
|
+
} else {
|
|
95
|
+
document.body.style.position = "";
|
|
96
|
+
document.body.style.top = "";
|
|
97
|
+
document.body.style.left = "";
|
|
98
|
+
document.body.style.right = "";
|
|
99
|
+
document.body.style.overflow = "";
|
|
100
|
+
document.body.style.paddingRight = "";
|
|
101
|
+
window.scrollTo(0, scrollY);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
onDestroy(() => {
|
|
107
|
+
if (typeof document !== "undefined") {
|
|
108
|
+
document.body.style.position = "";
|
|
109
|
+
document.body.style.top = "";
|
|
110
|
+
document.body.style.left = "";
|
|
111
|
+
document.body.style.right = "";
|
|
112
|
+
document.body.style.overflow = "";
|
|
113
|
+
document.body.style.paddingRight = "";
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
</script>
|
|
117
|
+
|
|
118
|
+
<svelte:window onkeydown={handleKeydown} />
|
|
119
|
+
|
|
120
|
+
{#if open}
|
|
121
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
122
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
123
|
+
<div
|
|
124
|
+
class="fixed inset-0 flex bg-black/50 z-50 items-end justify-center md:items-center md:p-4 touch-none overscroll-none"
|
|
125
|
+
onmousedown={(e) => {
|
|
126
|
+
// Only track direct clicks on backdrop, not drags that end on backdrop
|
|
127
|
+
if (e.target === e.currentTarget && !persistent) {
|
|
128
|
+
e.currentTarget.dataset.clickStartedOnBackdrop = 'true';
|
|
129
|
+
}
|
|
130
|
+
}}
|
|
131
|
+
onmouseup={(e) => {
|
|
132
|
+
// Only close if both mousedown and mouseup were on the backdrop
|
|
133
|
+
if (e.target === e.currentTarget && e.currentTarget.dataset.clickStartedOnBackdrop === 'true' && !persistent) {
|
|
134
|
+
resetModal();
|
|
135
|
+
}
|
|
136
|
+
delete e.currentTarget.dataset.clickStartedOnBackdrop;
|
|
137
|
+
}}
|
|
138
|
+
transition:fade={{ duration: 300 }}
|
|
139
|
+
role="dialog"
|
|
140
|
+
aria-modal="true"
|
|
141
|
+
use:portal
|
|
142
|
+
{...restProps}
|
|
143
|
+
>
|
|
144
|
+
<!-- Mobile: Bottom sheet -->
|
|
145
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
146
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
147
|
+
<div
|
|
148
|
+
class="md:hidden bg-white dark:bg-gray-800 rounded-t-3xl w-full max-h-[90vh] max-h-[90dvh] overflow-hidden flex flex-col shadow-[0_-10px_40px_rgba(0,0,0,0.15)] touch-pan-y overscroll-contain"
|
|
149
|
+
onclick={(e) => e.stopPropagation()}
|
|
150
|
+
transition:fly={{ y: 300, duration: 300, easing: cubicOut }}
|
|
151
|
+
>
|
|
152
|
+
<!-- Handle bar -->
|
|
153
|
+
<div class="flex justify-center pt-3 pb-1 shrink-0">
|
|
154
|
+
<div class="w-10 h-1 bg-gray-300 dark:bg-gray-600 rounded-xs"></div>
|
|
155
|
+
</div>
|
|
156
|
+
|
|
157
|
+
<div class="p-6 pb-[calc(5rem+env(safe-area-inset-bottom,0px))] overflow-y-auto flex-1">
|
|
158
|
+
{#if header}{@render header()}{/if}
|
|
159
|
+
{#if body}{@render body()}{/if}
|
|
160
|
+
<div class="w-full flex flex-col gap-3 mt-6 empty:hidden empty:mt-0">
|
|
161
|
+
{#if footer}{@render footer()}{/if}
|
|
162
|
+
</div>
|
|
163
|
+
</div>
|
|
164
|
+
</div>
|
|
165
|
+
|
|
166
|
+
<!-- Desktop: Centered modal -->
|
|
167
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
168
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
169
|
+
<div
|
|
170
|
+
class="hidden md:block bg-white dark:bg-gray-800 p-6 rounded-lg {modalSizeClass} w-full max-h-[calc(100vh-4rem)] overflow-y-auto shadow-2xl"
|
|
171
|
+
onclick={(e) => e.stopPropagation()}
|
|
172
|
+
transition:fly={{ y: 20, duration: 200 }}
|
|
173
|
+
>
|
|
174
|
+
{#if header}{@render header()}{/if}
|
|
175
|
+
{#if body}{@render body()}{/if}
|
|
176
|
+
<div class="w-full flex flex-col md:flex-row md:justify-end gap-3 mt-6 empty:hidden empty:mt-0">
|
|
177
|
+
{#if footer}{@render footer()}{/if}
|
|
178
|
+
</div>
|
|
179
|
+
</div>
|
|
180
|
+
</div>
|
|
181
|
+
{/if}
|