@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,61 +1,61 @@
|
|
|
1
|
-
import { render } from '@testing-library/svelte';
|
|
2
|
-
import { expect, describe, test, vi } from 'vitest';
|
|
3
|
-
import LandingButton from './LandingButton.svelte';
|
|
4
|
-
|
|
5
|
-
describe('LandingButton', () => {
|
|
6
|
-
test('renders a button by default', () => {
|
|
7
|
-
const { container } = render(LandingButton);
|
|
8
|
-
expect(container.querySelector('button')).toBeInTheDocument();
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
test('button has type="button"', () => {
|
|
12
|
-
const { container } = render(LandingButton);
|
|
13
|
-
expect(container.querySelector('button')).toHaveAttribute('type', 'button');
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
test('renders an anchor when href is provided', () => {
|
|
17
|
-
const { container } = render(LandingButton, { props: { href: '/page' } });
|
|
18
|
-
expect(container.querySelector('a')).toBeInTheDocument();
|
|
19
|
-
expect(container.querySelector('a')).toHaveAttribute('href', '/page');
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
test('no button when href is provided', () => {
|
|
23
|
-
const { container } = render(LandingButton, { props: { href: '/page' } });
|
|
24
|
-
expect(container.querySelector('button')).not.toBeInTheDocument();
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
test('disabled state', () => {
|
|
28
|
-
const { container } = render(LandingButton, { props: { disabled: true } });
|
|
29
|
-
const btn = container.querySelector('button');
|
|
30
|
-
expect(btn).toBeDisabled();
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
test('loading state disables button', () => {
|
|
34
|
-
const { container } = render(LandingButton, { props: { loading: true } });
|
|
35
|
-
const btn = container.querySelector('button');
|
|
36
|
-
expect(btn).toBeDisabled();
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
test('primary variant is default', () => {
|
|
40
|
-
const { container } = render(LandingButton);
|
|
41
|
-
// Should render without issues
|
|
42
|
-
expect(container.querySelector('button')).toBeInTheDocument();
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
test('secondary variant renders', () => {
|
|
46
|
-
const { container } = render(LandingButton, { props: { variant: 'secondary' } });
|
|
47
|
-
expect(container.querySelector('button')).toBeInTheDocument();
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
test('applies custom className', () => {
|
|
51
|
-
const { container } = render(LandingButton, { props: { class: 'my-landing-btn' } });
|
|
52
|
-
const btn = container.querySelector('button');
|
|
53
|
-
expect(btn).toHaveClass('my-landing-btn');
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
test('anchor with disabled state', () => {
|
|
57
|
-
const { container } = render(LandingButton, { props: { href: '/page', disabled: true } });
|
|
58
|
-
const a = container.querySelector('a');
|
|
59
|
-
expect(a).toBeInTheDocument();
|
|
60
|
-
});
|
|
61
|
-
});
|
|
1
|
+
import { render } from '@testing-library/svelte';
|
|
2
|
+
import { expect, describe, test, vi } from 'vitest';
|
|
3
|
+
import LandingButton from './LandingButton.svelte';
|
|
4
|
+
|
|
5
|
+
describe('LandingButton', () => {
|
|
6
|
+
test('renders a button by default', () => {
|
|
7
|
+
const { container } = render(LandingButton);
|
|
8
|
+
expect(container.querySelector('button')).toBeInTheDocument();
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
test('button has type="button"', () => {
|
|
12
|
+
const { container } = render(LandingButton);
|
|
13
|
+
expect(container.querySelector('button')).toHaveAttribute('type', 'button');
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
test('renders an anchor when href is provided', () => {
|
|
17
|
+
const { container } = render(LandingButton, { props: { href: '/page' } });
|
|
18
|
+
expect(container.querySelector('a')).toBeInTheDocument();
|
|
19
|
+
expect(container.querySelector('a')).toHaveAttribute('href', '/page');
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test('no button when href is provided', () => {
|
|
23
|
+
const { container } = render(LandingButton, { props: { href: '/page' } });
|
|
24
|
+
expect(container.querySelector('button')).not.toBeInTheDocument();
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test('disabled state', () => {
|
|
28
|
+
const { container } = render(LandingButton, { props: { disabled: true } });
|
|
29
|
+
const btn = container.querySelector('button');
|
|
30
|
+
expect(btn).toBeDisabled();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test('loading state disables button', () => {
|
|
34
|
+
const { container } = render(LandingButton, { props: { loading: true } });
|
|
35
|
+
const btn = container.querySelector('button');
|
|
36
|
+
expect(btn).toBeDisabled();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test('primary variant is default', () => {
|
|
40
|
+
const { container } = render(LandingButton);
|
|
41
|
+
// Should render without issues
|
|
42
|
+
expect(container.querySelector('button')).toBeInTheDocument();
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test('secondary variant renders', () => {
|
|
46
|
+
const { container } = render(LandingButton, { props: { variant: 'secondary' } });
|
|
47
|
+
expect(container.querySelector('button')).toBeInTheDocument();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test('applies custom className', () => {
|
|
51
|
+
const { container } = render(LandingButton, { props: { class: 'my-landing-btn' } });
|
|
52
|
+
const btn = container.querySelector('button');
|
|
53
|
+
expect(btn).toHaveClass('my-landing-btn');
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test('anchor with disabled state', () => {
|
|
57
|
+
const { container } = render(LandingButton, { props: { href: '/page', disabled: true } });
|
|
58
|
+
const a = container.querySelector('a');
|
|
59
|
+
expect(a).toBeInTheDocument();
|
|
60
|
+
});
|
|
61
|
+
});
|
|
@@ -1,92 +1,92 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
/**
|
|
3
|
-
* LandingButton Component
|
|
4
|
-
* Hero/landing page CTA buttons with shadow and prominent styling.
|
|
5
|
-
*
|
|
6
|
-
* Replaces: Button variant="landing" and variant="landing-secondary"
|
|
7
|
-
*/
|
|
8
|
-
import { twMerge } from 'tailwind-merge';
|
|
9
|
-
import type { Snippet } from 'svelte';
|
|
10
|
-
import { buttonSizes } from '../../tokens/sizing.js';
|
|
11
|
-
|
|
12
|
-
interface Props {
|
|
13
|
-
/** Visual style: primary (blue) or secondary (outline) */
|
|
14
|
-
variant?: 'primary' | 'secondary';
|
|
15
|
-
/** Disabled state */
|
|
16
|
-
disabled?: boolean;
|
|
17
|
-
/** Loading state */
|
|
18
|
-
loading?: boolean;
|
|
19
|
-
/** Link href (renders as <a> if provided) */
|
|
20
|
-
href?: string | null;
|
|
21
|
-
/** Content */
|
|
22
|
-
children?: Snippet;
|
|
23
|
-
/** Additional classes */
|
|
24
|
-
class?: string;
|
|
25
|
-
/** Click handler */
|
|
26
|
-
onclick?: (e: MouseEvent) => void;
|
|
27
|
-
[key: string]: unknown;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
let {
|
|
31
|
-
variant = 'primary',
|
|
32
|
-
disabled = false,
|
|
33
|
-
loading = false,
|
|
34
|
-
href = null,
|
|
35
|
-
children,
|
|
36
|
-
class: className = '',
|
|
37
|
-
onclick,
|
|
38
|
-
...restProps
|
|
39
|
-
}: Props = $props();
|
|
40
|
-
|
|
41
|
-
let effectiveDisabled = $derived(disabled || loading);
|
|
42
|
-
|
|
43
|
-
const baseClasses = 'inline-flex items-center justify-center rounded-xl font-medium leading-none focus:outline-hidden transition-all duration-150 ease-out select-none no-underline hover:no-underline shadow hover:shadow-md';
|
|
44
|
-
|
|
45
|
-
const variantClasses = {
|
|
46
|
-
primary: 'text-white bg-blue-600 border border-blue-600 hover:bg-blue-700 dark:bg-blue-600 dark:border-blue-600 dark:hover:bg-blue-700',
|
|
47
|
-
secondary: 'text-gray-700 bg-white border border-gray-200 hover:border-gray-400 hover:text-gray-900 dark:text-gray-300 dark:bg-gray-800 dark:border-gray-600 dark:hover:border-gray-500 dark:hover:text-gray-100',
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
const disabledClasses = 'bg-gray-200 border-gray-200 text-gray-400 cursor-not-allowed shadow-none dark:bg-gray-700 dark:border-gray-700 dark:text-gray-500';
|
|
51
|
-
|
|
52
|
-
// Landing size from tokens
|
|
53
|
-
let sizeClass = $derived(buttonSizes.landing);
|
|
54
|
-
|
|
55
|
-
let variantClass = $derived(() => {
|
|
56
|
-
if (effectiveDisabled) return disabledClasses;
|
|
57
|
-
return variantClasses[variant] || variantClasses.primary;
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
let classes = $derived(twMerge(
|
|
61
|
-
baseClasses,
|
|
62
|
-
sizeClass,
|
|
63
|
-
variantClass(),
|
|
64
|
-
effectiveDisabled ? 'cursor-not-allowed' : 'cursor-pointer active:scale-[0.97] active:opacity-90',
|
|
65
|
-
className
|
|
66
|
-
));
|
|
67
|
-
</script>
|
|
68
|
-
|
|
69
|
-
{#if href}
|
|
70
|
-
<a
|
|
71
|
-
{href}
|
|
72
|
-
class={classes}
|
|
73
|
-
{onclick}
|
|
74
|
-
{...restProps}
|
|
75
|
-
>
|
|
76
|
-
<span class="inline-flex items-center gap-1.5" class:invisible={loading}>
|
|
77
|
-
{#if typeof children === 'function'}{@render children()}{:else if children}{children}{/if}
|
|
78
|
-
</span>
|
|
79
|
-
</a>
|
|
80
|
-
{:else}
|
|
81
|
-
<button
|
|
82
|
-
type="button"
|
|
83
|
-
class={classes}
|
|
84
|
-
disabled={effectiveDisabled}
|
|
85
|
-
{onclick}
|
|
86
|
-
{...restProps}
|
|
87
|
-
>
|
|
88
|
-
<span class="inline-flex items-center gap-1.5" class:invisible={loading}>
|
|
89
|
-
{#if typeof children === 'function'}{@render children()}{:else if children}{children}{/if}
|
|
90
|
-
</span>
|
|
91
|
-
</button>
|
|
92
|
-
{/if}
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* LandingButton Component
|
|
4
|
+
* Hero/landing page CTA buttons with shadow and prominent styling.
|
|
5
|
+
*
|
|
6
|
+
* Replaces: Button variant="landing" and variant="landing-secondary"
|
|
7
|
+
*/
|
|
8
|
+
import { twMerge } from 'tailwind-merge';
|
|
9
|
+
import type { Snippet } from 'svelte';
|
|
10
|
+
import { buttonSizes } from '../../tokens/sizing.js';
|
|
11
|
+
|
|
12
|
+
interface Props {
|
|
13
|
+
/** Visual style: primary (blue) or secondary (outline) */
|
|
14
|
+
variant?: 'primary' | 'secondary';
|
|
15
|
+
/** Disabled state */
|
|
16
|
+
disabled?: boolean;
|
|
17
|
+
/** Loading state */
|
|
18
|
+
loading?: boolean;
|
|
19
|
+
/** Link href (renders as <a> if provided) */
|
|
20
|
+
href?: string | null;
|
|
21
|
+
/** Content */
|
|
22
|
+
children?: Snippet;
|
|
23
|
+
/** Additional classes */
|
|
24
|
+
class?: string;
|
|
25
|
+
/** Click handler */
|
|
26
|
+
onclick?: (e: MouseEvent) => void;
|
|
27
|
+
[key: string]: unknown;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
let {
|
|
31
|
+
variant = 'primary',
|
|
32
|
+
disabled = false,
|
|
33
|
+
loading = false,
|
|
34
|
+
href = null,
|
|
35
|
+
children,
|
|
36
|
+
class: className = '',
|
|
37
|
+
onclick,
|
|
38
|
+
...restProps
|
|
39
|
+
}: Props = $props();
|
|
40
|
+
|
|
41
|
+
let effectiveDisabled = $derived(disabled || loading);
|
|
42
|
+
|
|
43
|
+
const baseClasses = 'inline-flex items-center justify-center rounded-xl font-medium leading-none focus:outline-hidden transition-all duration-150 ease-out select-none no-underline hover:no-underline shadow hover:shadow-md';
|
|
44
|
+
|
|
45
|
+
const variantClasses = {
|
|
46
|
+
primary: 'text-white bg-blue-600 border border-blue-600 hover:bg-blue-700 dark:bg-blue-600 dark:border-blue-600 dark:hover:bg-blue-700',
|
|
47
|
+
secondary: 'text-gray-700 bg-white border border-gray-200 hover:border-gray-400 hover:text-gray-900 dark:text-gray-300 dark:bg-gray-800 dark:border-gray-600 dark:hover:border-gray-500 dark:hover:text-gray-100',
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const disabledClasses = 'bg-gray-200 border-gray-200 text-gray-400 cursor-not-allowed shadow-none dark:bg-gray-700 dark:border-gray-700 dark:text-gray-500';
|
|
51
|
+
|
|
52
|
+
// Landing size from tokens
|
|
53
|
+
let sizeClass = $derived(buttonSizes.landing);
|
|
54
|
+
|
|
55
|
+
let variantClass = $derived(() => {
|
|
56
|
+
if (effectiveDisabled) return disabledClasses;
|
|
57
|
+
return variantClasses[variant] || variantClasses.primary;
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
let classes = $derived(twMerge(
|
|
61
|
+
baseClasses,
|
|
62
|
+
sizeClass,
|
|
63
|
+
variantClass(),
|
|
64
|
+
effectiveDisabled ? 'cursor-not-allowed' : 'cursor-pointer active:scale-[0.97] active:opacity-90',
|
|
65
|
+
className
|
|
66
|
+
));
|
|
67
|
+
</script>
|
|
68
|
+
|
|
69
|
+
{#if href}
|
|
70
|
+
<a
|
|
71
|
+
{href}
|
|
72
|
+
class={classes}
|
|
73
|
+
{onclick}
|
|
74
|
+
{...restProps}
|
|
75
|
+
>
|
|
76
|
+
<span class="inline-flex items-center gap-1.5" class:invisible={loading}>
|
|
77
|
+
{#if typeof children === 'function'}{@render children()}{:else if children}{children}{/if}
|
|
78
|
+
</span>
|
|
79
|
+
</a>
|
|
80
|
+
{:else}
|
|
81
|
+
<button
|
|
82
|
+
type="button"
|
|
83
|
+
class={classes}
|
|
84
|
+
disabled={effectiveDisabled}
|
|
85
|
+
{onclick}
|
|
86
|
+
{...restProps}
|
|
87
|
+
>
|
|
88
|
+
<span class="inline-flex items-center gap-1.5" class:invisible={loading}>
|
|
89
|
+
{#if typeof children === 'function'}{@render children()}{:else if children}{children}{/if}
|
|
90
|
+
</span>
|
|
91
|
+
</button>
|
|
92
|
+
{/if}
|
|
@@ -1,130 +1,130 @@
|
|
|
1
|
-
import { render, fireEvent } from '@testing-library/svelte';
|
|
2
|
-
import { createRawSnippet } from 'svelte';
|
|
3
|
-
import { expect, describe, test, vi } from 'vitest';
|
|
4
|
-
import MenuItem from './MenuItem.svelte';
|
|
5
|
-
|
|
6
|
-
function textSnippet(text) {
|
|
7
|
-
return createRawSnippet(() => ({
|
|
8
|
-
render: () => `<span>${text}</span>`
|
|
9
|
-
}));
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
describe('MenuItem', () => {
|
|
13
|
-
test('renders a button element', () => {
|
|
14
|
-
const { container } = render(MenuItem);
|
|
15
|
-
expect(container.querySelector('button')).toBeInTheDocument();
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
test('button has type="button"', () => {
|
|
19
|
-
const { container } = render(MenuItem);
|
|
20
|
-
expect(container.querySelector('button')).toHaveAttribute('type', 'button');
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
test('has full width styling', () => {
|
|
24
|
-
const { container } = render(MenuItem);
|
|
25
|
-
const button = container.querySelector('button');
|
|
26
|
-
expect(button.className).toContain('w-full');
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
test('applies default (non-danger) styling', () => {
|
|
30
|
-
const { container } = render(MenuItem);
|
|
31
|
-
const button = container.querySelector('button');
|
|
32
|
-
expect(button.className).toContain('text-gray-900');
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
test('applies danger styling', () => {
|
|
36
|
-
const { container } = render(MenuItem, { props: { danger: true } });
|
|
37
|
-
const button = container.querySelector('button');
|
|
38
|
-
expect(button.className).toContain('text-red-600');
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
test('applies active styling', () => {
|
|
42
|
-
const { container } = render(MenuItem, { props: { active: true } });
|
|
43
|
-
const button = container.querySelector('button');
|
|
44
|
-
expect(button.className).toContain('bg-blue-50');
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
test('applies disabled state', () => {
|
|
48
|
-
const { container } = render(MenuItem, { props: { disabled: true } });
|
|
49
|
-
const button = container.querySelector('button');
|
|
50
|
-
expect(button).toBeDisabled();
|
|
51
|
-
expect(button.className).toContain('cursor-not-allowed');
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
test('onclick handler', async () => {
|
|
55
|
-
const onclick = vi.fn();
|
|
56
|
-
const { container } = render(MenuItem, { props: { onclick } });
|
|
57
|
-
await fireEvent.click(container.querySelector('button'));
|
|
58
|
-
expect(onclick).toHaveBeenCalled();
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
test('applies custom className', () => {
|
|
62
|
-
const { container } = render(MenuItem, { props: { class: 'my-menu-item' } });
|
|
63
|
-
expect(container.querySelector('.my-menu-item')).toBeInTheDocument();
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
test('renders children content when provided', () => {
|
|
67
|
-
const { container } = render(MenuItem, {
|
|
68
|
-
props: { children: textSnippet('Menu option') }
|
|
69
|
-
});
|
|
70
|
-
const span = container.querySelector('span');
|
|
71
|
-
expect(span.textContent).toBe('Menu option');
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
test('renders empty span when no children provided', () => {
|
|
75
|
-
const { container } = render(MenuItem);
|
|
76
|
-
const span = container.querySelector('button > span');
|
|
77
|
-
expect(span.textContent.trim()).toBe('');
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
test('renders trailing content when provided', () => {
|
|
81
|
-
const { container } = render(MenuItem, {
|
|
82
|
-
props: {
|
|
83
|
-
children: textSnippet('Item'),
|
|
84
|
-
trailing: textSnippet('Badge')
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
expect(container.querySelector('button').textContent).toContain('Badge');
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
test('does not render trailing when not provided', () => {
|
|
91
|
-
const { container } = render(MenuItem, {
|
|
92
|
-
props: { children: textSnippet('Item') }
|
|
93
|
-
});
|
|
94
|
-
// Button should contain only the children span content
|
|
95
|
-
const button = container.querySelector('button');
|
|
96
|
-
expect(button.textContent).toContain('Item');
|
|
97
|
-
expect(button.textContent).not.toContain('Badge');
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
test('size sm applies smaller padding', () => {
|
|
101
|
-
const { container } = render(MenuItem, { props: { size: 'sm' } });
|
|
102
|
-
const button = container.querySelector('button');
|
|
103
|
-
expect(button.className).toContain('py-2');
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
test('size lg applies larger padding', () => {
|
|
107
|
-
const { container } = render(MenuItem, { props: { size: 'lg' } });
|
|
108
|
-
const button = container.querySelector('button');
|
|
109
|
-
expect(button.className).toContain('py-4');
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
test('passes through additional props', () => {
|
|
113
|
-
const { container } = render(MenuItem, { props: { 'data-testid': 'my-item' } });
|
|
114
|
-
expect(container.querySelector('[data-testid="my-item"]')).toBeInTheDocument();
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
test('danger + active combination applies danger active styling', () => {
|
|
118
|
-
const { container } = render(MenuItem, { props: { danger: true, active: true } });
|
|
119
|
-
const button = container.querySelector('button');
|
|
120
|
-
expect(button.className).toContain('text-red-600');
|
|
121
|
-
expect(button.className).toContain('bg-blue-50');
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
test('unknown size falls back to md sizing', () => {
|
|
125
|
-
const { container } = render(MenuItem, { props: { size: 'unknown' } });
|
|
126
|
-
const button = container.querySelector('button');
|
|
127
|
-
// Falls back to md via || operator
|
|
128
|
-
expect(button.className).toContain('py-3');
|
|
129
|
-
});
|
|
130
|
-
});
|
|
1
|
+
import { render, fireEvent } from '@testing-library/svelte';
|
|
2
|
+
import { createRawSnippet } from 'svelte';
|
|
3
|
+
import { expect, describe, test, vi } from 'vitest';
|
|
4
|
+
import MenuItem from './MenuItem.svelte';
|
|
5
|
+
|
|
6
|
+
function textSnippet(text) {
|
|
7
|
+
return createRawSnippet(() => ({
|
|
8
|
+
render: () => `<span>${text}</span>`
|
|
9
|
+
}));
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
describe('MenuItem', () => {
|
|
13
|
+
test('renders a button element', () => {
|
|
14
|
+
const { container } = render(MenuItem);
|
|
15
|
+
expect(container.querySelector('button')).toBeInTheDocument();
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
test('button has type="button"', () => {
|
|
19
|
+
const { container } = render(MenuItem);
|
|
20
|
+
expect(container.querySelector('button')).toHaveAttribute('type', 'button');
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test('has full width styling', () => {
|
|
24
|
+
const { container } = render(MenuItem);
|
|
25
|
+
const button = container.querySelector('button');
|
|
26
|
+
expect(button.className).toContain('w-full');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('applies default (non-danger) styling', () => {
|
|
30
|
+
const { container } = render(MenuItem);
|
|
31
|
+
const button = container.querySelector('button');
|
|
32
|
+
expect(button.className).toContain('text-gray-900');
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test('applies danger styling', () => {
|
|
36
|
+
const { container } = render(MenuItem, { props: { danger: true } });
|
|
37
|
+
const button = container.querySelector('button');
|
|
38
|
+
expect(button.className).toContain('text-red-600');
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test('applies active styling', () => {
|
|
42
|
+
const { container } = render(MenuItem, { props: { active: true } });
|
|
43
|
+
const button = container.querySelector('button');
|
|
44
|
+
expect(button.className).toContain('bg-blue-50');
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test('applies disabled state', () => {
|
|
48
|
+
const { container } = render(MenuItem, { props: { disabled: true } });
|
|
49
|
+
const button = container.querySelector('button');
|
|
50
|
+
expect(button).toBeDisabled();
|
|
51
|
+
expect(button.className).toContain('cursor-not-allowed');
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test('onclick handler', async () => {
|
|
55
|
+
const onclick = vi.fn();
|
|
56
|
+
const { container } = render(MenuItem, { props: { onclick } });
|
|
57
|
+
await fireEvent.click(container.querySelector('button'));
|
|
58
|
+
expect(onclick).toHaveBeenCalled();
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('applies custom className', () => {
|
|
62
|
+
const { container } = render(MenuItem, { props: { class: 'my-menu-item' } });
|
|
63
|
+
expect(container.querySelector('.my-menu-item')).toBeInTheDocument();
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test('renders children content when provided', () => {
|
|
67
|
+
const { container } = render(MenuItem, {
|
|
68
|
+
props: { children: textSnippet('Menu option') }
|
|
69
|
+
});
|
|
70
|
+
const span = container.querySelector('span');
|
|
71
|
+
expect(span.textContent).toBe('Menu option');
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test('renders empty span when no children provided', () => {
|
|
75
|
+
const { container } = render(MenuItem);
|
|
76
|
+
const span = container.querySelector('button > span');
|
|
77
|
+
expect(span.textContent.trim()).toBe('');
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
test('renders trailing content when provided', () => {
|
|
81
|
+
const { container } = render(MenuItem, {
|
|
82
|
+
props: {
|
|
83
|
+
children: textSnippet('Item'),
|
|
84
|
+
trailing: textSnippet('Badge')
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
expect(container.querySelector('button').textContent).toContain('Badge');
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test('does not render trailing when not provided', () => {
|
|
91
|
+
const { container } = render(MenuItem, {
|
|
92
|
+
props: { children: textSnippet('Item') }
|
|
93
|
+
});
|
|
94
|
+
// Button should contain only the children span content
|
|
95
|
+
const button = container.querySelector('button');
|
|
96
|
+
expect(button.textContent).toContain('Item');
|
|
97
|
+
expect(button.textContent).not.toContain('Badge');
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
test('size sm applies smaller padding', () => {
|
|
101
|
+
const { container } = render(MenuItem, { props: { size: 'sm' } });
|
|
102
|
+
const button = container.querySelector('button');
|
|
103
|
+
expect(button.className).toContain('py-2');
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test('size lg applies larger padding', () => {
|
|
107
|
+
const { container } = render(MenuItem, { props: { size: 'lg' } });
|
|
108
|
+
const button = container.querySelector('button');
|
|
109
|
+
expect(button.className).toContain('py-4');
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test('passes through additional props', () => {
|
|
113
|
+
const { container } = render(MenuItem, { props: { 'data-testid': 'my-item' } });
|
|
114
|
+
expect(container.querySelector('[data-testid="my-item"]')).toBeInTheDocument();
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test('danger + active combination applies danger active styling', () => {
|
|
118
|
+
const { container } = render(MenuItem, { props: { danger: true, active: true } });
|
|
119
|
+
const button = container.querySelector('button');
|
|
120
|
+
expect(button.className).toContain('text-red-600');
|
|
121
|
+
expect(button.className).toContain('bg-blue-50');
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test('unknown size falls back to md sizing', () => {
|
|
125
|
+
const { container } = render(MenuItem, { props: { size: 'unknown' } });
|
|
126
|
+
const button = container.querySelector('button');
|
|
127
|
+
// Falls back to md via || operator
|
|
128
|
+
expect(button.className).toContain('py-3');
|
|
129
|
+
});
|
|
130
|
+
});
|