@getmicdrop/svelte-components 5.17.0 → 5.17.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/calendar/AboutShow/AboutShow.svelte +187 -187
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte +782 -782
- package/dist/calendar/FAQs/FAQs.svelte +77 -77
- package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte +126 -126
- package/dist/calendar/OrderSummary/OrderSummary.svelte +457 -457
- package/dist/calendar/PublicCard/PublicCard.svelte +146 -146
- package/dist/calendar/ShowCard/ShowCard.svelte +157 -157
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +61 -61
- package/dist/components/Heading.spec.d.ts +2 -0
- package/dist/components/Heading.spec.d.ts.map +1 -0
- package/dist/components/Heading.spec.js +89 -0
- package/dist/components/Heading.svelte +60 -60
- package/dist/components/Layout/AppShell.svelte +104 -104
- package/dist/components/Layout/ContentSection.svelte +80 -80
- package/dist/components/Layout/Grid.svelte +4 -4
- 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 +6 -6
- package/dist/components/Layout/Text.svelte +87 -87
- package/dist/components/Layout/TwoColumn.svelte +108 -108
- package/dist/components/Layout/__tests__/AppShell.test.js +140 -0
- package/dist/components/Text.spec.d.ts +2 -0
- package/dist/components/Text.spec.d.ts.map +1 -0
- package/dist/components/Text.spec.js +89 -0
- package/dist/components/Text.svelte +53 -53
- package/dist/constants/validation.js +91 -91
- package/dist/constants/validation.spec.js +64 -64
- package/dist/datetime/__tests__/format.test.js +1 -1
- package/dist/datetime/__tests__/parse.test.js +1 -1
- package/dist/datetime/__tests__/timezone.test.js +1 -1
- package/dist/datetime/parse.js +1 -1
- package/dist/datetime/timezone.d.ts.map +1 -1
- package/dist/datetime/timezone.js +1 -2
- package/dist/forms/createFormStore.svelte.d.ts +1 -1
- package/dist/forms/createFormStore.svelte.d.ts.map +1 -1
- package/dist/forms/createFormStore.svelte.js +1 -0
- package/dist/forms/createFormStore.svelte.spec.d.ts +2 -0
- package/dist/forms/createFormStore.svelte.spec.d.ts.map +1 -0
- package/dist/forms/createFormStore.svelte.spec.js +388 -0
- package/dist/index.js +57 -57
- package/dist/index.spec.js +369 -369
- package/dist/patterns/chat/ChatActivityNotice.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatActivityNotice.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatActivityNotice.spec.js +59 -0
- package/dist/patterns/chat/ChatActivityNotice.svelte +41 -41
- package/dist/patterns/chat/ChatBubble.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatBubble.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatBubble.spec.js +91 -0
- package/dist/patterns/chat/ChatBubble.svelte +95 -95
- package/dist/patterns/chat/ChatContainer.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatContainer.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatContainer.spec.js +30 -0
- package/dist/patterns/chat/ChatContainer.svelte +46 -46
- package/dist/patterns/chat/ChatDateDivider.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatDateDivider.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatDateDivider.spec.js +30 -0
- package/dist/patterns/chat/ChatDateDivider.svelte +27 -27
- package/dist/patterns/chat/ChatInvitationBubble.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatInvitationBubble.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatInvitationBubble.spec.js +46 -0
- package/dist/patterns/chat/ChatInvitationBubble.svelte +37 -37
- package/dist/patterns/chat/ChatInvitationNotice.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatInvitationNotice.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatInvitationNotice.spec.js +32 -0
- package/dist/patterns/chat/ChatInvitationNotice.svelte +27 -27
- package/dist/patterns/chat/ChatMessageGroup.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatMessageGroup.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatMessageGroup.spec.js +58 -0
- package/dist/patterns/chat/ChatMessageGroup.svelte +57 -57
- package/dist/patterns/chat/ChatSlotUpdate.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatSlotUpdate.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatSlotUpdate.spec.js +65 -0
- package/dist/patterns/chat/ChatSlotUpdate.svelte +46 -46
- package/dist/patterns/chat/ChatStatusBadge.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatStatusBadge.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatStatusBadge.spec.js +79 -0
- package/dist/patterns/chat/ChatStatusBadge.svelte +91 -91
- package/dist/patterns/chat/ChatStatusTransition.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatStatusTransition.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatStatusTransition.spec.js +81 -0
- package/dist/patterns/chat/ChatStatusTransition.svelte +64 -64
- package/dist/patterns/chat/ChatTextBubble.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatTextBubble.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatTextBubble.spec.js +35 -0
- 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.spec.js +61 -0
- package/dist/patterns/data/DataTable.svelte +36 -36
- 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.spec.js +34 -0
- package/dist/patterns/forms/FormGrid.svelte +33 -33
- package/dist/patterns/forms/FormSection.svelte +32 -32
- package/dist/patterns/forms/FormValidationSummary.stories.svelte +83 -83
- package/dist/patterns/forms/FormValidationSummary.svelte +74 -74
- package/dist/patterns/index.js +21 -21
- package/dist/patterns/layout/Sidebar.spec.js +240 -1
- package/dist/patterns/layout/Sidebar.svelte +39 -39
- package/dist/patterns/layout/SidebarTestWrapper.svelte +34 -0
- package/dist/patterns/layout/SidebarTestWrapper.svelte.d.ts +23 -0
- package/dist/patterns/layout/SidebarTestWrapper.svelte.d.ts.map +1 -0
- package/dist/patterns/layout/index.js +29 -29
- package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
- package/dist/patterns/navigation/BottomNav.svelte +74 -74
- package/dist/patterns/navigation/Header.spec.js +123 -0
- package/dist/patterns/navigation/Header.stories.svelte +77 -77
- package/dist/patterns/navigation/Header.svelte +251 -251
- package/dist/patterns/page/PageHeader.svelte +18 -18
- 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 +24 -24
- package/dist/patterns/page/SectionHeader.svelte +29 -29
- 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.spec.js +112 -2
- package/dist/primitives/Accordion/Accordion.stories.svelte +75 -75
- package/dist/primitives/Accordion/Accordion.svelte +42 -42
- package/dist/primitives/Accordion/AccordionItem.svelte +95 -95
- package/dist/primitives/Accordion/AccordionToggleWrapper.test.svelte +28 -0
- package/dist/primitives/Accordion/AccordionToggleWrapper.test.svelte.d.ts +7 -0
- package/dist/primitives/Accordion/AccordionToggleWrapper.test.svelte.d.ts.map +1 -0
- package/dist/primitives/Alert/Alert.spec.js +173 -173
- package/dist/primitives/Alert/Alert.stories.svelte +88 -88
- package/dist/primitives/Alert/Alert.svelte +27 -27
- package/dist/primitives/Avatar/Avatar.spec.js +23 -0
- 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 -136
- 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 -0
- package/dist/primitives/BottomSheet/BottomSheetWithActions.test.svelte.d.ts +10 -0
- package/dist/primitives/BottomSheet/BottomSheetWithActions.test.svelte.d.ts.map +1 -0
- package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +123 -123
- package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
- package/dist/primitives/Breadcrumb/Breadcrumb.svelte +99 -99
- 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.d.ts +2 -0
- package/dist/primitives/Button/ButtonGroup.spec.d.ts.map +1 -0
- package/dist/primitives/Button/ButtonGroup.spec.js +44 -0
- 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 +32 -0
- package/dist/primitives/Checkbox/Checkbox.stories.svelte +84 -84
- package/dist/primitives/Checkbox/Checkbox.svelte +88 -88
- package/dist/primitives/DarkModeToggle.spec.js +390 -390
- package/dist/primitives/DarkModeToggle.stories.svelte +57 -57
- package/dist/primitives/DarkModeToggle.svelte +136 -136
- package/dist/primitives/Drawer/Drawer.spec.js +437 -0
- package/dist/primitives/Drawer/Drawer.stories.svelte +80 -80
- package/dist/primitives/Drawer/Drawer.svelte +224 -224
- package/dist/primitives/Drawer/DrawerTestWrapper.svelte +86 -0
- package/dist/primitives/Drawer/DrawerTestWrapper.svelte.d.ts +26 -0
- package/dist/primitives/Drawer/DrawerTestWrapper.svelte.d.ts.map +1 -0
- package/dist/primitives/Dropdown/Dropdown.spec.js +116 -0
- package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
- package/dist/primitives/Dropdown/Dropdown.svelte +170 -170
- package/dist/primitives/Dropdown/DropdownDivider.spec.d.ts +2 -0
- package/dist/primitives/Dropdown/DropdownDivider.spec.d.ts.map +1 -0
- package/dist/primitives/Dropdown/DropdownDivider.spec.js +30 -0
- package/dist/primitives/Dropdown/DropdownDivider.svelte +9 -9
- package/dist/primitives/Dropdown/DropdownItem.spec.js +155 -1
- package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
- package/dist/primitives/Dropdown/DropdownItemTestWrapper.svelte +43 -0
- package/dist/primitives/Dropdown/DropdownItemTestWrapper.svelte.d.ts +17 -0
- package/dist/primitives/Dropdown/DropdownItemTestWrapper.svelte.d.ts.map +1 -0
- package/dist/primitives/Helper/Helper.spec.d.ts +2 -0
- package/dist/primitives/Helper/Helper.spec.d.ts.map +1 -0
- package/dist/primitives/Helper/Helper.spec.js +57 -0
- package/dist/primitives/Helper/Helper.svelte +33 -33
- package/dist/primitives/Icons/ArrowLeft.svelte +8 -8
- package/dist/primitives/Icons/ArrowRight.svelte +8 -8
- package/dist/primitives/Icons/Availability.svelte +14 -14
- package/dist/primitives/Icons/Back.svelte +14 -14
- package/dist/primitives/Icons/CheckCircle.svelte +6 -6
- package/dist/primitives/Icons/CheckCircleOutline.svelte +15 -15
- package/dist/primitives/Icons/ChevronLeft.svelte +4 -4
- package/dist/primitives/Icons/ChevronRight.svelte +4 -4
- package/dist/primitives/Icons/Copy.svelte +15 -15
- package/dist/primitives/Icons/Cross.svelte +5 -5
- package/dist/primitives/Icons/DownArrow.svelte +8 -8
- package/dist/primitives/Icons/ErrorCircle.svelte +6 -6
- package/dist/primitives/Icons/FacebookIcon.svelte +2 -2
- package/dist/primitives/Icons/Home.svelte +15 -15
- package/dist/primitives/Icons/Icon.spec.js +169 -169
- package/dist/primitives/Icons/Icon.stories.svelte +100 -100
- package/dist/primitives/Icons/Icon.svelte +52 -52
- package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
- package/dist/primitives/Icons/Info.svelte +7 -7
- package/dist/primitives/Icons/InstagramIcon.svelte +4 -4
- package/dist/primitives/Icons/LogoInstagram.svelte +2 -2
- package/dist/primitives/Icons/Message.svelte +15 -15
- package/dist/primitives/Icons/MoonIcon.svelte +5 -5
- package/dist/primitives/Icons/More.svelte +21 -21
- package/dist/primitives/Icons/MoreHori.spec.js +61 -61
- package/dist/primitives/Icons/MoreHori.svelte +22 -22
- package/dist/primitives/Icons/Notification.svelte +14 -14
- package/dist/primitives/Icons/Payment.svelte +14 -14
- package/dist/primitives/Icons/Profile.svelte +21 -21
- package/dist/primitives/Icons/Reload.svelte +29 -29
- package/dist/primitives/Icons/Shows.svelte +21 -21
- package/dist/primitives/Icons/Signout.svelte +21 -21
- package/dist/primitives/Icons/SunIcon.svelte +8 -8
- package/dist/primitives/Icons/TiktokIcon.svelte +2 -2
- package/dist/primitives/Icons/TwitterIcon.svelte +2 -2
- package/dist/primitives/Icons/WarningIcon.spec.js +18 -18
- package/dist/primitives/Icons/WarningIcon.svelte +5 -5
- package/dist/primitives/Input/Input.spec.js +1235 -573
- package/dist/primitives/Input/Input.stories.svelte +139 -139
- package/dist/primitives/Input/Input.svelte +423 -423
- package/dist/primitives/Input/Select.spec.js +632 -218
- 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.spec.js +9 -0
- package/dist/primitives/Label/Label.svelte +37 -37
- package/dist/primitives/LandingButton/LandingButton.spec.d.ts +2 -0
- package/dist/primitives/LandingButton/LandingButton.spec.d.ts.map +1 -0
- package/dist/primitives/LandingButton/LandingButton.spec.js +61 -0
- package/dist/primitives/LandingButton/LandingButton.svelte +92 -92
- package/dist/primitives/MenuItem/MenuItem.spec.d.ts +2 -0
- package/dist/primitives/MenuItem/MenuItem.spec.d.ts.map +1 -0
- package/dist/primitives/MenuItem/MenuItem.spec.js +130 -0
- package/dist/primitives/MenuItem/MenuItem.svelte +85 -85
- package/dist/primitives/Modal/Modal.spec.js +314 -99
- package/dist/primitives/Modal/Modal.stories.svelte +86 -86
- package/dist/primitives/Modal/Modal.svelte +181 -181
- package/dist/primitives/NavItem/NavItem.spec.d.ts +2 -0
- package/dist/primitives/NavItem/NavItem.spec.d.ts.map +1 -0
- package/dist/primitives/NavItem/NavItem.spec.js +97 -0
- package/dist/primitives/NavItem/NavItem.svelte +75 -75
- package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
- package/dist/primitives/Pagination/Pagination.svelte +261 -261
- package/dist/primitives/Radio/Radio.stories.svelte +80 -80
- package/dist/primitives/Radio/Radio.svelte +67 -67
- package/dist/primitives/SearchResultItem/SearchResultItem.spec.d.ts +2 -0
- package/dist/primitives/SearchResultItem/SearchResultItem.spec.d.ts.map +1 -0
- package/dist/primitives/SearchResultItem/SearchResultItem.spec.js +78 -0
- package/dist/primitives/SearchResultItem/SearchResultItem.svelte +109 -109
- package/dist/primitives/SidebarToggle/SidebarToggle.spec.d.ts +2 -0
- package/dist/primitives/SidebarToggle/SidebarToggle.spec.d.ts.map +1 -0
- package/dist/primitives/SidebarToggle/SidebarToggle.spec.js +61 -0
- package/dist/primitives/SidebarToggle/SidebarToggle.svelte +55 -55
- package/dist/primitives/Skeleton/CardPlaceholder.svelte +87 -87
- package/dist/primitives/Skeleton/ImagePlaceholder.svelte +59 -59
- package/dist/primitives/Skeleton/ListPlaceholder.svelte +76 -76
- package/dist/primitives/Skeleton/Skeleton.stories.svelte +151 -151
- package/dist/primitives/Skeleton/Skeleton.svelte +26 -26
- package/dist/primitives/Spinner/Spinner.spec.js +84 -71
- package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
- package/dist/primitives/Spinner/Spinner.svelte +20 -20
- package/dist/primitives/Tabs/TabItem.svelte +49 -49
- package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
- package/dist/primitives/Tabs/Tabs.svelte +137 -137
- package/dist/primitives/Toggle.spec.js +221 -146
- package/dist/primitives/Toggle.stories.svelte +92 -92
- package/dist/primitives/Toggle.svelte +141 -141
- package/dist/primitives/ToggleTestWrapper.svelte +30 -0
- package/dist/primitives/ToggleTestWrapper.svelte.d.ts +29 -0
- package/dist/primitives/ToggleTestWrapper.svelte.d.ts.map +1 -0
- package/dist/primitives/Tooltip/Tooltip.spec.d.ts +2 -0
- package/dist/primitives/Tooltip/Tooltip.spec.d.ts.map +1 -0
- package/dist/primitives/Tooltip/Tooltip.spec.js +126 -0
- 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 +69 -69
- package/dist/primitives/ValidationError.svelte +29 -29
- package/dist/primitives/index.js +113 -113
- package/dist/recipes/CropImage/CropImage.spec.js +208 -208
- package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
- package/dist/recipes/CropImage/CropImage.svelte +241 -241
- package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
- package/dist/recipes/ImageUploader/ImageUploader.svelte +992 -992
- package/dist/recipes/SuperLogin/SuperLogin.spec.js +21 -21
- package/dist/recipes/SuperLogin/SuperLogin.svelte +4 -4
- package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
- package/dist/recipes/feedback/EmptyState/EmptyState.svelte +1 -1
- package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
- package/dist/recipes/feedback/ErrorDisplay.stories.svelte +101 -101
- package/dist/recipes/feedback/ErrorDisplay.svelte +1 -1
- package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +133 -133
- package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +157 -157
- 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 +97 -97
- package/dist/recipes/fields/ToggleField.svelte +60 -60
- package/dist/recipes/fields/index.js +7 -7
- package/dist/recipes/inputs/MultiSelect.spec.js +263 -263
- package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
- package/dist/recipes/inputs/MultiSelect.svelte +283 -283
- package/dist/recipes/inputs/OTPInput.spec.js +251 -251
- package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
- package/dist/recipes/inputs/OTPInput.svelte +117 -117
- package/dist/recipes/inputs/PasswordInput.svelte +22 -22
- package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +131 -131
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.spec.js +19 -19
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +123 -123
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +336 -339
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte.d.ts.map +1 -1
- package/dist/recipes/inputs/Search.spec.js +66 -2
- package/dist/recipes/inputs/Search.svelte +102 -102
- package/dist/recipes/inputs/index.js +7 -7
- package/dist/recipes/modals/AlertModal.svelte +130 -130
- package/dist/recipes/modals/ConfirmationModal.spec.js +396 -206
- package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
- package/dist/recipes/modals/ConfirmationModal.svelte +162 -162
- package/dist/recipes/modals/InputModal.svelte +182 -182
- package/dist/recipes/modals/ModalStateManager.spec.js +100 -100
- package/dist/recipes/modals/ModalStateManager.svelte +77 -77
- package/dist/recipes/modals/ModalTestWrapper.svelte +65 -65
- package/dist/recipes/modals/StatusModal.svelte +206 -206
- package/dist/services/EventService.d.ts +1 -1
- package/dist/services/EventService.d.ts.map +1 -1
- package/dist/services/EventService.js +79 -75
- package/dist/services/EventService.spec.js +217 -217
- package/dist/services/ShowService.js +144 -143
- package/dist/services/ShowService.spec.js +345 -345
- package/dist/stores/auth.svelte.spec.d.ts +2 -0
- package/dist/stores/auth.svelte.spec.d.ts.map +1 -0
- package/dist/stores/auth.svelte.spec.js +112 -0
- package/dist/stores/formDataStore.svelte.spec.d.ts +2 -0
- package/dist/stores/formDataStore.svelte.spec.d.ts.map +1 -0
- package/dist/stores/formDataStore.svelte.spec.js +150 -0
- package/dist/stores/formSave.svelte.spec.d.ts +2 -0
- package/dist/stores/formSave.svelte.spec.d.ts.map +1 -0
- package/dist/stores/formSave.svelte.spec.js +196 -0
- package/dist/stores/navigation.spec.d.ts +2 -0
- package/dist/stores/navigation.spec.d.ts.map +1 -0
- package/dist/stores/navigation.spec.js +53 -0
- package/dist/stores/toaster.js +13 -13
- 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 +206 -206
- package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
- package/dist/stories/PrimitivesGallery.svelte +756 -756
- package/dist/stories/RecipesGallery.stories.svelte +19 -19
- package/dist/stories/RecipesGallery.svelte +454 -454
- package/dist/stories/button-audit-manifest.json +11186 -11186
- package/dist/tailwind/preset.cjs +82 -82
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +402 -405
- package/dist/telemetry.server.js +212 -212
- package/dist/telemetry.server.spec.js +437 -438
- package/dist/telemetry.spec.js +1168 -1169
- package/dist/tokens/tokens.css +87 -87
- package/dist/tokens/typography-base.css +163 -163
- package/dist/tokens/utilities.css +353 -353
- package/dist/utils/apiConfig.js +117 -120
- package/dist/utils/apiConfig.spec.js +219 -219
- package/dist/utils/greetings.js +187 -187
- package/dist/utils/haptic.spec.d.ts +2 -0
- package/dist/utils/haptic.spec.d.ts.map +1 -0
- package/dist/utils/haptic.spec.js +153 -0
- package/dist/utils/imageOptimizer.spec.d.ts +2 -0
- package/dist/utils/imageOptimizer.spec.d.ts.map +1 -0
- package/dist/utils/imageOptimizer.spec.js +201 -0
- package/dist/utils/imageValidation.js +121 -121
- package/dist/utils/logger.spec.d.ts +2 -0
- package/dist/utils/logger.spec.d.ts.map +1 -0
- package/dist/utils/logger.spec.js +95 -0
- package/dist/utils/transitions.js +4 -4
- package/dist/utils/utils.js +693 -693
- package/package.json +292 -294
|
@@ -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}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MenuItem.spec.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/MenuItem/MenuItem.spec.js"],"names":[],"mappings":""}
|
|
@@ -0,0 +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,85 +1,85 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
/**
|
|
3
|
-
* MenuItem Component
|
|
4
|
-
* For dropdown menus, action sheets, and sidebar navigation items.
|
|
5
|
-
*
|
|
6
|
-
* Replaces: Button variant="menu-item" and variant="menu-item-danger"
|
|
7
|
-
*/
|
|
8
|
-
import { twMerge } from 'tailwind-merge';
|
|
9
|
-
import type { Snippet } from 'svelte';
|
|
10
|
-
import { buttonMenuItemSizes } from '../../tokens/sizing.js';
|
|
11
|
-
|
|
12
|
-
interface Props {
|
|
13
|
-
/** Destructive/danger styling (red text) */
|
|
14
|
-
danger?: boolean;
|
|
15
|
-
/** Size variant */
|
|
16
|
-
size?: 'sm' | 'md' | 'lg' | 'nav';
|
|
17
|
-
/** Disabled state */
|
|
18
|
-
disabled?: boolean;
|
|
19
|
-
/** Active/selected state */
|
|
20
|
-
active?: boolean;
|
|
21
|
-
/** Content */
|
|
22
|
-
children?: Snippet;
|
|
23
|
-
/** Trailing content (icons, badges) */
|
|
24
|
-
trailing?: Snippet;
|
|
25
|
-
/** Additional classes */
|
|
26
|
-
class?: string;
|
|
27
|
-
/** Click handler */
|
|
28
|
-
onclick?: (e: MouseEvent) => void;
|
|
29
|
-
[key: string]: unknown;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
let {
|
|
33
|
-
danger = false,
|
|
34
|
-
size = 'md',
|
|
35
|
-
disabled = false,
|
|
36
|
-
active = false,
|
|
37
|
-
children,
|
|
38
|
-
trailing,
|
|
39
|
-
class: className = '',
|
|
40
|
-
onclick,
|
|
41
|
-
...restProps
|
|
42
|
-
}: Props = $props();
|
|
43
|
-
|
|
44
|
-
const baseClasses = 'w-full text-left whitespace-nowrap bg-transparent border-transparent rounded-lg font-medium leading-none focus:outline-hidden transition-all duration-150 ease-out select-none';
|
|
45
|
-
|
|
46
|
-
const variantClasses = {
|
|
47
|
-
default: 'text-gray-900 hover:bg-gray-100 dark:text-white dark:hover:bg-gray-600',
|
|
48
|
-
danger: 'text-red-600 hover:bg-red-50 dark:text-red-500 dark:hover:bg-gray-600',
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
const activeClasses = 'bg-blue-50 dark:bg-gray-700';
|
|
52
|
-
const disabledClasses = 'text-gray-400 cursor-not-allowed dark:text-gray-500';
|
|
53
|
-
|
|
54
|
-
let sizeClass = $derived(buttonMenuItemSizes[size] || buttonMenuItemSizes.md);
|
|
55
|
-
|
|
56
|
-
let variantClass = $derived(() => {
|
|
57
|
-
if (disabled) return disabledClasses;
|
|
58
|
-
if (active) return `${variantClasses[danger ? 'danger' : 'default']} ${activeClasses}`;
|
|
59
|
-
return variantClasses[danger ? 'danger' : 'default'];
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
let hasTrailing = $derived(typeof trailing === 'function' || trailing);
|
|
63
|
-
|
|
64
|
-
let classes = $derived(twMerge(
|
|
65
|
-
baseClasses,
|
|
66
|
-
hasTrailing ? 'flex items-center justify-between' : 'flex items-center justify-start',
|
|
67
|
-
sizeClass,
|
|
68
|
-
variantClass(),
|
|
69
|
-
disabled ? 'cursor-not-allowed' : 'cursor-pointer active:scale-[0.97] active:opacity-90',
|
|
70
|
-
className
|
|
71
|
-
));
|
|
72
|
-
</script>
|
|
73
|
-
|
|
74
|
-
<button
|
|
75
|
-
type="button"
|
|
76
|
-
class={classes}
|
|
77
|
-
{disabled}
|
|
78
|
-
{onclick}
|
|
79
|
-
{...restProps}
|
|
80
|
-
>
|
|
81
|
-
<span class="inline-flex items-center gap-1.5">
|
|
82
|
-
{#if typeof children === 'function'}{@render children()}{:else if children}{children}{/if}
|
|
83
|
-
</span>
|
|
84
|
-
{#if typeof trailing === 'function'}{@render trailing()}{:else if trailing}{trailing}{/if}
|
|
85
|
-
</button>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* MenuItem Component
|
|
4
|
+
* For dropdown menus, action sheets, and sidebar navigation items.
|
|
5
|
+
*
|
|
6
|
+
* Replaces: Button variant="menu-item" and variant="menu-item-danger"
|
|
7
|
+
*/
|
|
8
|
+
import { twMerge } from 'tailwind-merge';
|
|
9
|
+
import type { Snippet } from 'svelte';
|
|
10
|
+
import { buttonMenuItemSizes } from '../../tokens/sizing.js';
|
|
11
|
+
|
|
12
|
+
interface Props {
|
|
13
|
+
/** Destructive/danger styling (red text) */
|
|
14
|
+
danger?: boolean;
|
|
15
|
+
/** Size variant */
|
|
16
|
+
size?: 'sm' | 'md' | 'lg' | 'nav';
|
|
17
|
+
/** Disabled state */
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
/** Active/selected state */
|
|
20
|
+
active?: boolean;
|
|
21
|
+
/** Content */
|
|
22
|
+
children?: Snippet;
|
|
23
|
+
/** Trailing content (icons, badges) */
|
|
24
|
+
trailing?: Snippet;
|
|
25
|
+
/** Additional classes */
|
|
26
|
+
class?: string;
|
|
27
|
+
/** Click handler */
|
|
28
|
+
onclick?: (e: MouseEvent) => void;
|
|
29
|
+
[key: string]: unknown;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
let {
|
|
33
|
+
danger = false,
|
|
34
|
+
size = 'md',
|
|
35
|
+
disabled = false,
|
|
36
|
+
active = false,
|
|
37
|
+
children,
|
|
38
|
+
trailing,
|
|
39
|
+
class: className = '',
|
|
40
|
+
onclick,
|
|
41
|
+
...restProps
|
|
42
|
+
}: Props = $props();
|
|
43
|
+
|
|
44
|
+
const baseClasses = 'w-full text-left whitespace-nowrap bg-transparent border-transparent rounded-lg font-medium leading-none focus:outline-hidden transition-all duration-150 ease-out select-none';
|
|
45
|
+
|
|
46
|
+
const variantClasses = {
|
|
47
|
+
default: 'text-gray-900 hover:bg-gray-100 dark:text-white dark:hover:bg-gray-600',
|
|
48
|
+
danger: 'text-red-600 hover:bg-red-50 dark:text-red-500 dark:hover:bg-gray-600',
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const activeClasses = 'bg-blue-50 dark:bg-gray-700';
|
|
52
|
+
const disabledClasses = 'text-gray-400 cursor-not-allowed dark:text-gray-500';
|
|
53
|
+
|
|
54
|
+
let sizeClass = $derived(buttonMenuItemSizes[size] || buttonMenuItemSizes.md);
|
|
55
|
+
|
|
56
|
+
let variantClass = $derived(() => {
|
|
57
|
+
if (disabled) return disabledClasses;
|
|
58
|
+
if (active) return `${variantClasses[danger ? 'danger' : 'default']} ${activeClasses}`;
|
|
59
|
+
return variantClasses[danger ? 'danger' : 'default'];
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
let hasTrailing = $derived(typeof trailing === 'function' || trailing);
|
|
63
|
+
|
|
64
|
+
let classes = $derived(twMerge(
|
|
65
|
+
baseClasses,
|
|
66
|
+
hasTrailing ? 'flex items-center justify-between' : 'flex items-center justify-start',
|
|
67
|
+
sizeClass,
|
|
68
|
+
variantClass(),
|
|
69
|
+
disabled ? 'cursor-not-allowed' : 'cursor-pointer active:scale-[0.97] active:opacity-90',
|
|
70
|
+
className
|
|
71
|
+
));
|
|
72
|
+
</script>
|
|
73
|
+
|
|
74
|
+
<button
|
|
75
|
+
type="button"
|
|
76
|
+
class={classes}
|
|
77
|
+
{disabled}
|
|
78
|
+
{onclick}
|
|
79
|
+
{...restProps}
|
|
80
|
+
>
|
|
81
|
+
<span class="inline-flex items-center gap-1.5">
|
|
82
|
+
{#if typeof children === 'function'}{@render children()}{:else if children}{children}{/if}
|
|
83
|
+
</span>
|
|
84
|
+
{#if typeof trailing === 'function'}{@render trailing()}{:else if trailing}{trailing}{/if}
|
|
85
|
+
</button>
|