@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
package/dist/utils/auth.js
CHANGED
|
@@ -1,195 +1,195 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auth Utilities
|
|
3
|
-
*
|
|
4
|
-
* Centralized JWT token handling for Micdrop applications.
|
|
5
|
-
* Single source of truth for performer token extraction and decoding.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { jwtDecode } from 'jwt-decode';
|
|
9
|
-
import { getPerformerToken, getCookie, parseCookies } from './utils.js';
|
|
10
|
-
|
|
11
|
-
// Re-export base cookie utilities
|
|
12
|
-
export { getPerformerToken, getCookie, parseCookies };
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Get performer token from a cookie string (for server-side use).
|
|
16
|
-
* @param {string} [cookieString] - Cookie header string
|
|
17
|
-
* @returns {string|null} Token or null
|
|
18
|
-
*/
|
|
19
|
-
export function getTokenFromCookies(cookieString) {
|
|
20
|
-
if (!cookieString) return null;
|
|
21
|
-
|
|
22
|
-
const cookies = cookieString.split('; ').reduce((acc, cookie) => {
|
|
23
|
-
const [name, ...valueParts] = cookie.split('=');
|
|
24
|
-
if (name) {
|
|
25
|
-
acc[name] = valueParts.join('=');
|
|
26
|
-
}
|
|
27
|
-
return acc;
|
|
28
|
-
}, {});
|
|
29
|
-
|
|
30
|
-
return cookies['performer_token'] || null;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Decode a performer JWT token.
|
|
35
|
-
* @param {string|null} [token] - JWT token string
|
|
36
|
-
* @returns {Object|null} Decoded payload or null
|
|
37
|
-
*/
|
|
38
|
-
export function decodePerformerToken(token) {
|
|
39
|
-
if (!token) return null;
|
|
40
|
-
|
|
41
|
-
try {
|
|
42
|
-
return jwtDecode(token);
|
|
43
|
-
} catch (error) {
|
|
44
|
-
console.error('Failed to decode performer token:', error);
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Get decoded token payload from cookies.
|
|
51
|
-
* @param {string} [cookieString] - Cookie string (for server-side)
|
|
52
|
-
* @returns {Object|null} Decoded payload or null
|
|
53
|
-
*/
|
|
54
|
-
export function getDecodedToken(cookieString) {
|
|
55
|
-
const token = cookieString
|
|
56
|
-
? getTokenFromCookies(cookieString)
|
|
57
|
-
: getPerformerToken();
|
|
58
|
-
return decodePerformerToken(token);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Extract performer ID from token.
|
|
63
|
-
* @param {string|null} [tokenOrCookies] - JWT token or cookie string
|
|
64
|
-
* @returns {number|null} Performer ID or null
|
|
65
|
-
*/
|
|
66
|
-
export function getPerformerId(tokenOrCookies) {
|
|
67
|
-
const decoded = typeof tokenOrCookies === 'string' && tokenOrCookies.includes('=')
|
|
68
|
-
? getDecodedToken(tokenOrCookies)
|
|
69
|
-
: decodePerformerToken(tokenOrCookies ?? getPerformerToken());
|
|
70
|
-
|
|
71
|
-
if (!decoded) return null;
|
|
72
|
-
|
|
73
|
-
const id = decoded.id ?? decoded.userId ?? decoded.user_id;
|
|
74
|
-
return typeof id === 'number' ? id : null;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Extract performer email from token.
|
|
79
|
-
* @param {string|null} [tokenOrCookies] - JWT token or cookie string
|
|
80
|
-
* @returns {string} Email or empty string
|
|
81
|
-
*/
|
|
82
|
-
export function getPerformerEmail(tokenOrCookies) {
|
|
83
|
-
const decoded = typeof tokenOrCookies === 'string' && tokenOrCookies.includes('=')
|
|
84
|
-
? getDecodedToken(tokenOrCookies)
|
|
85
|
-
: decodePerformerToken(tokenOrCookies ?? getPerformerToken());
|
|
86
|
-
|
|
87
|
-
if (!decoded) return '';
|
|
88
|
-
|
|
89
|
-
const email = decoded.Email ?? decoded.email ?? '';
|
|
90
|
-
|
|
91
|
-
// Guard against literal "undefined" or "null" strings
|
|
92
|
-
if (email === 'undefined' || email === 'null') return '';
|
|
93
|
-
|
|
94
|
-
return email;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Extract performer full name from token.
|
|
99
|
-
* @param {string|null} [tokenOrCookies] - JWT token or cookie string
|
|
100
|
-
* @returns {string} Full name or empty string
|
|
101
|
-
*/
|
|
102
|
-
export function getPerformerName(tokenOrCookies) {
|
|
103
|
-
const decoded = typeof tokenOrCookies === 'string' && tokenOrCookies.includes('=')
|
|
104
|
-
? getDecodedToken(tokenOrCookies)
|
|
105
|
-
: decodePerformerToken(tokenOrCookies ?? getPerformerToken());
|
|
106
|
-
|
|
107
|
-
if (!decoded) return '';
|
|
108
|
-
|
|
109
|
-
const name = decoded.FullName ?? decoded.fullName ?? decoded.full_name ?? '';
|
|
110
|
-
|
|
111
|
-
// Guard against literal "undefined" or "null" strings
|
|
112
|
-
if (name === 'undefined' || name === 'null') return '';
|
|
113
|
-
|
|
114
|
-
return name;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Check if the current token is expired.
|
|
119
|
-
* @param {string|null} [tokenOrCookies] - JWT token or cookie string
|
|
120
|
-
* @returns {boolean} True if expired or no token
|
|
121
|
-
*/
|
|
122
|
-
export function isTokenExpired(tokenOrCookies) {
|
|
123
|
-
// If explicitly passed null/undefined, treat as expired (no token)
|
|
124
|
-
if (tokenOrCookies === null || tokenOrCookies === undefined) {
|
|
125
|
-
// Only fall back to browser cookie if called with no arguments
|
|
126
|
-
const token = arguments.length === 0 ? getPerformerToken() : null;
|
|
127
|
-
const decoded = decodePerformerToken(token);
|
|
128
|
-
if (!decoded?.exp) return true;
|
|
129
|
-
return decoded.exp * 1000 < Date.now();
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
const decoded = typeof tokenOrCookies === 'string' && tokenOrCookies.includes('=')
|
|
133
|
-
? getDecodedToken(tokenOrCookies)
|
|
134
|
-
: decodePerformerToken(tokenOrCookies);
|
|
135
|
-
|
|
136
|
-
if (!decoded?.exp) return true;
|
|
137
|
-
|
|
138
|
-
// exp is in seconds, Date.now() is in milliseconds
|
|
139
|
-
return decoded.exp * 1000 < Date.now();
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Get user details from the userDetails cookie.
|
|
144
|
-
* @param {string} [cookieString] - Cookie string (for server-side)
|
|
145
|
-
* @returns {Object|null} User details or null
|
|
146
|
-
*/
|
|
147
|
-
export function getUserDetailsFromCookie(cookieString) {
|
|
148
|
-
let userDetailsCookie;
|
|
149
|
-
|
|
150
|
-
if (cookieString) {
|
|
151
|
-
const cookies = cookieString.split('; ').reduce((acc, cookie) => {
|
|
152
|
-
const [name, ...valueParts] = cookie.split('=');
|
|
153
|
-
if (name) acc[name] = valueParts.join('=');
|
|
154
|
-
return acc;
|
|
155
|
-
}, {});
|
|
156
|
-
userDetailsCookie = cookies['userDetails'];
|
|
157
|
-
} else {
|
|
158
|
-
userDetailsCookie = getCookie('userDetails');
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
if (!userDetailsCookie) return null;
|
|
162
|
-
|
|
163
|
-
try {
|
|
164
|
-
return JSON.parse(decodeURIComponent(userDetailsCookie));
|
|
165
|
-
} catch (error) {
|
|
166
|
-
console.error('Failed to parse userDetails cookie:', error);
|
|
167
|
-
return null;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* Get performer name with fallback to userDetails cookie.
|
|
173
|
-
* @param {string} [cookieString] - Cookie string (for server-side)
|
|
174
|
-
* @returns {string} Name or empty string
|
|
175
|
-
*/
|
|
176
|
-
export function getPerformerNameWithFallback(cookieString) {
|
|
177
|
-
const name = getPerformerName(cookieString);
|
|
178
|
-
if (name) return name;
|
|
179
|
-
|
|
180
|
-
const userDetails = getUserDetailsFromCookie(cookieString);
|
|
181
|
-
return userDetails?.firstName ?? '';
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Get performer email with fallback to userDetails cookie.
|
|
186
|
-
* @param {string} [cookieString] - Cookie string (for server-side)
|
|
187
|
-
* @returns {string} Email or empty string
|
|
188
|
-
*/
|
|
189
|
-
export function getPerformerEmailWithFallback(cookieString) {
|
|
190
|
-
const email = getPerformerEmail(cookieString);
|
|
191
|
-
if (email) return email;
|
|
192
|
-
|
|
193
|
-
const userDetails = getUserDetailsFromCookie(cookieString);
|
|
194
|
-
return userDetails?.email ?? '';
|
|
195
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Auth Utilities
|
|
3
|
+
*
|
|
4
|
+
* Centralized JWT token handling for Micdrop applications.
|
|
5
|
+
* Single source of truth for performer token extraction and decoding.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { jwtDecode } from 'jwt-decode';
|
|
9
|
+
import { getPerformerToken, getCookie, parseCookies } from './utils.js';
|
|
10
|
+
|
|
11
|
+
// Re-export base cookie utilities
|
|
12
|
+
export { getPerformerToken, getCookie, parseCookies };
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Get performer token from a cookie string (for server-side use).
|
|
16
|
+
* @param {string} [cookieString] - Cookie header string
|
|
17
|
+
* @returns {string|null} Token or null
|
|
18
|
+
*/
|
|
19
|
+
export function getTokenFromCookies(cookieString) {
|
|
20
|
+
if (!cookieString) return null;
|
|
21
|
+
|
|
22
|
+
const cookies = cookieString.split('; ').reduce((acc, cookie) => {
|
|
23
|
+
const [name, ...valueParts] = cookie.split('=');
|
|
24
|
+
if (name) {
|
|
25
|
+
acc[name] = valueParts.join('=');
|
|
26
|
+
}
|
|
27
|
+
return acc;
|
|
28
|
+
}, {});
|
|
29
|
+
|
|
30
|
+
return cookies['performer_token'] || null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Decode a performer JWT token.
|
|
35
|
+
* @param {string|null} [token] - JWT token string
|
|
36
|
+
* @returns {Object|null} Decoded payload or null
|
|
37
|
+
*/
|
|
38
|
+
export function decodePerformerToken(token) {
|
|
39
|
+
if (!token) return null;
|
|
40
|
+
|
|
41
|
+
try {
|
|
42
|
+
return jwtDecode(token);
|
|
43
|
+
} catch (error) {
|
|
44
|
+
console.error('Failed to decode performer token:', error);
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Get decoded token payload from cookies.
|
|
51
|
+
* @param {string} [cookieString] - Cookie string (for server-side)
|
|
52
|
+
* @returns {Object|null} Decoded payload or null
|
|
53
|
+
*/
|
|
54
|
+
export function getDecodedToken(cookieString) {
|
|
55
|
+
const token = cookieString
|
|
56
|
+
? getTokenFromCookies(cookieString)
|
|
57
|
+
: getPerformerToken();
|
|
58
|
+
return decodePerformerToken(token);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Extract performer ID from token.
|
|
63
|
+
* @param {string|null} [tokenOrCookies] - JWT token or cookie string
|
|
64
|
+
* @returns {number|null} Performer ID or null
|
|
65
|
+
*/
|
|
66
|
+
export function getPerformerId(tokenOrCookies) {
|
|
67
|
+
const decoded = typeof tokenOrCookies === 'string' && tokenOrCookies.includes('=')
|
|
68
|
+
? getDecodedToken(tokenOrCookies)
|
|
69
|
+
: decodePerformerToken(tokenOrCookies ?? getPerformerToken());
|
|
70
|
+
|
|
71
|
+
if (!decoded) return null;
|
|
72
|
+
|
|
73
|
+
const id = decoded.id ?? decoded.userId ?? decoded.user_id;
|
|
74
|
+
return typeof id === 'number' ? id : null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Extract performer email from token.
|
|
79
|
+
* @param {string|null} [tokenOrCookies] - JWT token or cookie string
|
|
80
|
+
* @returns {string} Email or empty string
|
|
81
|
+
*/
|
|
82
|
+
export function getPerformerEmail(tokenOrCookies) {
|
|
83
|
+
const decoded = typeof tokenOrCookies === 'string' && tokenOrCookies.includes('=')
|
|
84
|
+
? getDecodedToken(tokenOrCookies)
|
|
85
|
+
: decodePerformerToken(tokenOrCookies ?? getPerformerToken());
|
|
86
|
+
|
|
87
|
+
if (!decoded) return '';
|
|
88
|
+
|
|
89
|
+
const email = decoded.Email ?? decoded.email ?? '';
|
|
90
|
+
|
|
91
|
+
// Guard against literal "undefined" or "null" strings
|
|
92
|
+
if (email === 'undefined' || email === 'null') return '';
|
|
93
|
+
|
|
94
|
+
return email;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Extract performer full name from token.
|
|
99
|
+
* @param {string|null} [tokenOrCookies] - JWT token or cookie string
|
|
100
|
+
* @returns {string} Full name or empty string
|
|
101
|
+
*/
|
|
102
|
+
export function getPerformerName(tokenOrCookies) {
|
|
103
|
+
const decoded = typeof tokenOrCookies === 'string' && tokenOrCookies.includes('=')
|
|
104
|
+
? getDecodedToken(tokenOrCookies)
|
|
105
|
+
: decodePerformerToken(tokenOrCookies ?? getPerformerToken());
|
|
106
|
+
|
|
107
|
+
if (!decoded) return '';
|
|
108
|
+
|
|
109
|
+
const name = decoded.FullName ?? decoded.fullName ?? decoded.full_name ?? '';
|
|
110
|
+
|
|
111
|
+
// Guard against literal "undefined" or "null" strings
|
|
112
|
+
if (name === 'undefined' || name === 'null') return '';
|
|
113
|
+
|
|
114
|
+
return name;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Check if the current token is expired.
|
|
119
|
+
* @param {string|null} [tokenOrCookies] - JWT token or cookie string
|
|
120
|
+
* @returns {boolean} True if expired or no token
|
|
121
|
+
*/
|
|
122
|
+
export function isTokenExpired(tokenOrCookies) {
|
|
123
|
+
// If explicitly passed null/undefined, treat as expired (no token)
|
|
124
|
+
if (tokenOrCookies === null || tokenOrCookies === undefined) {
|
|
125
|
+
// Only fall back to browser cookie if called with no arguments
|
|
126
|
+
const token = arguments.length === 0 ? getPerformerToken() : null;
|
|
127
|
+
const decoded = decodePerformerToken(token);
|
|
128
|
+
if (!decoded?.exp) return true;
|
|
129
|
+
return decoded.exp * 1000 < Date.now();
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const decoded = typeof tokenOrCookies === 'string' && tokenOrCookies.includes('=')
|
|
133
|
+
? getDecodedToken(tokenOrCookies)
|
|
134
|
+
: decodePerformerToken(tokenOrCookies);
|
|
135
|
+
|
|
136
|
+
if (!decoded?.exp) return true;
|
|
137
|
+
|
|
138
|
+
// exp is in seconds, Date.now() is in milliseconds
|
|
139
|
+
return decoded.exp * 1000 < Date.now();
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Get user details from the userDetails cookie.
|
|
144
|
+
* @param {string} [cookieString] - Cookie string (for server-side)
|
|
145
|
+
* @returns {Object|null} User details or null
|
|
146
|
+
*/
|
|
147
|
+
export function getUserDetailsFromCookie(cookieString) {
|
|
148
|
+
let userDetailsCookie;
|
|
149
|
+
|
|
150
|
+
if (cookieString) {
|
|
151
|
+
const cookies = cookieString.split('; ').reduce((acc, cookie) => {
|
|
152
|
+
const [name, ...valueParts] = cookie.split('=');
|
|
153
|
+
if (name) acc[name] = valueParts.join('=');
|
|
154
|
+
return acc;
|
|
155
|
+
}, {});
|
|
156
|
+
userDetailsCookie = cookies['userDetails'];
|
|
157
|
+
} else {
|
|
158
|
+
userDetailsCookie = getCookie('userDetails');
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (!userDetailsCookie) return null;
|
|
162
|
+
|
|
163
|
+
try {
|
|
164
|
+
return JSON.parse(decodeURIComponent(userDetailsCookie));
|
|
165
|
+
} catch (error) {
|
|
166
|
+
console.error('Failed to parse userDetails cookie:', error);
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Get performer name with fallback to userDetails cookie.
|
|
173
|
+
* @param {string} [cookieString] - Cookie string (for server-side)
|
|
174
|
+
* @returns {string} Name or empty string
|
|
175
|
+
*/
|
|
176
|
+
export function getPerformerNameWithFallback(cookieString) {
|
|
177
|
+
const name = getPerformerName(cookieString);
|
|
178
|
+
if (name) return name;
|
|
179
|
+
|
|
180
|
+
const userDetails = getUserDetailsFromCookie(cookieString);
|
|
181
|
+
return userDetails?.firstName ?? '';
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Get performer email with fallback to userDetails cookie.
|
|
186
|
+
* @param {string} [cookieString] - Cookie string (for server-side)
|
|
187
|
+
* @returns {string} Email or empty string
|
|
188
|
+
*/
|
|
189
|
+
export function getPerformerEmailWithFallback(cookieString) {
|
|
190
|
+
const email = getPerformerEmail(cookieString);
|
|
191
|
+
if (email) return email;
|
|
192
|
+
|
|
193
|
+
const userDetails = getUserDetailsFromCookie(cookieString);
|
|
194
|
+
return userDetails?.email ?? '';
|
|
195
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clickOutside.d.ts","sourceRoot":"","sources":["../../src/lib/utils/clickOutside.js"],"names":[],"mappings":"AAAA;;EAYC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export function clickOutside(node, callback) {
|
|
2
|
+
const handleClick = event => {
|
|
3
|
+
if (!node.contains(event.target)) {
|
|
4
|
+
callback();
|
|
5
|
+
}
|
|
6
|
+
};
|
|
7
|
+
document.addEventListener('mousedown', handleClick, true);
|
|
8
|
+
return {
|
|
9
|
+
destroy() {
|
|
10
|
+
document.removeEventListener('mousedown', handleClick, true);
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feedback Context Collector
|
|
3
|
+
* SSR-safe utility that gathers environment context for feedback submissions.
|
|
4
|
+
*/
|
|
5
|
+
export interface FeedbackLastError {
|
|
6
|
+
code: string;
|
|
7
|
+
message: string;
|
|
8
|
+
requestId?: string;
|
|
9
|
+
traceId?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface FeedbackContextData {
|
|
12
|
+
url: string;
|
|
13
|
+
app: string;
|
|
14
|
+
appVersion: string;
|
|
15
|
+
userAgent: string;
|
|
16
|
+
timestamp: string;
|
|
17
|
+
lastError?: FeedbackLastError;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Collect feedback context from the current environment.
|
|
21
|
+
* Safe to call in SSR — returns empty strings for browser-only values.
|
|
22
|
+
*/
|
|
23
|
+
export declare function collectFeedbackContext(app: string, appVersion: string, lastError?: FeedbackLastError | null): FeedbackContextData;
|
|
24
|
+
//# sourceMappingURL=feedbackContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedbackContext.d.ts","sourceRoot":"","sources":["../../src/lib/utils/feedbackContext.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,iBAAiB,GAAG,IAAI,GACnC,mBAAmB,CAWrB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feedback Context Collector
|
|
3
|
+
* SSR-safe utility that gathers environment context for feedback submissions.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Collect feedback context from the current environment.
|
|
7
|
+
* Safe to call in SSR — returns empty strings for browser-only values.
|
|
8
|
+
*/
|
|
9
|
+
export function collectFeedbackContext(app, appVersion, lastError) {
|
|
10
|
+
const isBrowser = typeof window !== 'undefined';
|
|
11
|
+
return {
|
|
12
|
+
url: isBrowser ? window.location.href : '',
|
|
13
|
+
app,
|
|
14
|
+
appVersion,
|
|
15
|
+
userAgent: isBrowser ? navigator.userAgent : '',
|
|
16
|
+
timestamp: new Date().toISOString(),
|
|
17
|
+
lastError: lastError || undefined,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchHelpers.d.ts","sourceRoot":"","sources":["../../src/lib/utils/fetchHelpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fetchHelpers.d.ts","sourceRoot":"","sources":["../../src/lib/utils/fetchHelpers.ts"],"names":[],"mappings":"AAKA,UAAU,WAAW,CAAC,CAAC,GAAG,OAAO;IAC/B,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,UAAU,UAAU,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,WAAW,CAAC,CAAC,CAAC;IACtD,EAAE,EAAE,OAAO,CAAC;CACb;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,CAAC,GAAG,OAAO,EACzC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAiBzB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,CAAC,GAAG,OAAO,EACxC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAkBxB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Svelte action to trap focus within an element (for modals and dialogs).
|
|
3
|
+
* When used, focus will cycle between focusable elements within the container.
|
|
4
|
+
*
|
|
5
|
+
* @param {HTMLElement} node - The container element to trap focus within
|
|
6
|
+
* @param {Object} options - Configuration options
|
|
7
|
+
* @param {boolean} options.enabled - Whether the focus trap is active
|
|
8
|
+
* @param {HTMLElement} options.returnFocusTo - Element to return focus to when trap is disabled
|
|
9
|
+
* @returns {Object} Svelte action lifecycle methods
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* <div use:focusTrap={{ enabled: isOpen, returnFocusTo: triggerElement }}>
|
|
13
|
+
* ...modal content...
|
|
14
|
+
* </div>
|
|
15
|
+
*/
|
|
16
|
+
export function focusTrap(node: HTMLElement, options?: {
|
|
17
|
+
enabled: boolean;
|
|
18
|
+
returnFocusTo: HTMLElement;
|
|
19
|
+
}): Object;
|
|
20
|
+
//# sourceMappingURL=focusTrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focusTrap.d.ts","sourceRoot":"","sources":["../../src/lib/utils/focusTrap.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,gCAXW,WAAW,YAEnB;IAAyB,OAAO,EAAxB,OAAO;IACc,aAAa,EAAlC,WAAW;CACnB,GAAU,MAAM,CAyHlB"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Svelte action to trap focus within an element (for modals and dialogs).
|
|
3
|
+
* When used, focus will cycle between focusable elements within the container.
|
|
4
|
+
*
|
|
5
|
+
* @param {HTMLElement} node - The container element to trap focus within
|
|
6
|
+
* @param {Object} options - Configuration options
|
|
7
|
+
* @param {boolean} options.enabled - Whether the focus trap is active
|
|
8
|
+
* @param {HTMLElement} options.returnFocusTo - Element to return focus to when trap is disabled
|
|
9
|
+
* @returns {Object} Svelte action lifecycle methods
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* <div use:focusTrap={{ enabled: isOpen, returnFocusTo: triggerElement }}>
|
|
13
|
+
* ...modal content...
|
|
14
|
+
* </div>
|
|
15
|
+
*/
|
|
16
|
+
export function focusTrap(node, options = {}) {
|
|
17
|
+
const FOCUSABLE_SELECTORS = [
|
|
18
|
+
'a[href]',
|
|
19
|
+
'area[href]',
|
|
20
|
+
'input:not([disabled]):not([type="hidden"])',
|
|
21
|
+
'select:not([disabled])',
|
|
22
|
+
'textarea:not([disabled])',
|
|
23
|
+
'button:not([disabled])',
|
|
24
|
+
'[tabindex]:not([tabindex="-1"])',
|
|
25
|
+
'[contenteditable]',
|
|
26
|
+
'audio[controls]',
|
|
27
|
+
'video[controls]',
|
|
28
|
+
'details>summary:first-of-type',
|
|
29
|
+
'details',
|
|
30
|
+
].join(',');
|
|
31
|
+
|
|
32
|
+
let enabled = options.enabled ?? true;
|
|
33
|
+
let returnFocusTo = options.returnFocusTo ?? null;
|
|
34
|
+
let previouslyFocused = null;
|
|
35
|
+
|
|
36
|
+
function getFocusableElements() {
|
|
37
|
+
const elements = Array.from(node.querySelectorAll(FOCUSABLE_SELECTORS));
|
|
38
|
+
return elements.filter(
|
|
39
|
+
el => !el.hasAttribute('disabled') && el.tabIndex !== -1 && isVisible(el)
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function isVisible(element) {
|
|
44
|
+
return !!(
|
|
45
|
+
element.offsetWidth ||
|
|
46
|
+
element.offsetHeight ||
|
|
47
|
+
element.getClientRects().length
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function handleKeydown(event) {
|
|
52
|
+
if (!enabled || event.key !== 'Tab') return;
|
|
53
|
+
|
|
54
|
+
const focusableElements = getFocusableElements();
|
|
55
|
+
if (focusableElements.length === 0) return;
|
|
56
|
+
|
|
57
|
+
const firstElement = focusableElements[0];
|
|
58
|
+
const lastElement = focusableElements[focusableElements.length - 1];
|
|
59
|
+
|
|
60
|
+
if (event.shiftKey) {
|
|
61
|
+
// Shift+Tab: going backwards
|
|
62
|
+
if (document.activeElement === firstElement) {
|
|
63
|
+
event.preventDefault();
|
|
64
|
+
lastElement.focus();
|
|
65
|
+
}
|
|
66
|
+
} else {
|
|
67
|
+
// Tab: going forwards
|
|
68
|
+
if (document.activeElement === lastElement) {
|
|
69
|
+
event.preventDefault();
|
|
70
|
+
firstElement.focus();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function activate() {
|
|
76
|
+
if (!enabled) return;
|
|
77
|
+
|
|
78
|
+
// Store previously focused element
|
|
79
|
+
previouslyFocused = document.activeElement;
|
|
80
|
+
|
|
81
|
+
// Focus the first focusable element or the container itself
|
|
82
|
+
const focusableElements = getFocusableElements();
|
|
83
|
+
if (focusableElements.length > 0) {
|
|
84
|
+
// Use requestAnimationFrame to ensure DOM is ready
|
|
85
|
+
requestAnimationFrame(() => {
|
|
86
|
+
focusableElements[0].focus();
|
|
87
|
+
});
|
|
88
|
+
} else {
|
|
89
|
+
// If no focusable elements, make the container focusable
|
|
90
|
+
node.setAttribute('tabindex', '-1');
|
|
91
|
+
node.focus();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
document.addEventListener('keydown', handleKeydown);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function deactivate() {
|
|
98
|
+
document.removeEventListener('keydown', handleKeydown);
|
|
99
|
+
|
|
100
|
+
// Return focus to the specified element or the previously focused element
|
|
101
|
+
const focusTarget = returnFocusTo || previouslyFocused;
|
|
102
|
+
if (focusTarget && typeof focusTarget.focus === 'function') {
|
|
103
|
+
focusTarget.focus();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Initialize
|
|
108
|
+
if (enabled) {
|
|
109
|
+
activate();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
update(newOptions) {
|
|
114
|
+
const newEnabled = newOptions.enabled ?? true;
|
|
115
|
+
returnFocusTo = newOptions.returnFocusTo ?? null;
|
|
116
|
+
|
|
117
|
+
if (newEnabled !== enabled) {
|
|
118
|
+
enabled = newEnabled;
|
|
119
|
+
if (enabled) {
|
|
120
|
+
activate();
|
|
121
|
+
} else {
|
|
122
|
+
deactivate();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
destroy() {
|
|
127
|
+
deactivate();
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
package/dist/utils/formatters.js
CHANGED