@getmicdrop/svelte-components 5.10.3 → 5.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/calendar/AboutShow/AboutShow.svelte +172 -172
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte +782 -782
- package/dist/calendar/FAQs/FAQs.svelte +75 -75
- package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte +126 -126
- package/dist/calendar/OrderSummary/OrderSummary.svelte +367 -367
- 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.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/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/forms/createFormStore.svelte.js +0 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +57 -51
- package/dist/index.spec.js +0 -1
- package/dist/patterns/data/DataGrid.svelte +45 -45
- package/dist/patterns/data/DataList.svelte +24 -24
- 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.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/layout/Sidebar.svelte +39 -39
- 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.stories.svelte +77 -77
- package/dist/patterns/navigation/Header.svelte +251 -255
- package/dist/patterns/navigation/Header.svelte.d.ts.map +1 -1
- 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.stories.svelte +75 -75
- package/dist/primitives/Accordion/Accordion.svelte +42 -42
- package/dist/primitives/Accordion/AccordionItem.svelte +95 -95
- 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.stories.svelte +94 -94
- package/dist/primitives/Avatar/Avatar.svelte +66 -66
- package/dist/primitives/AvatarButton/AvatarButton.svelte +57 -0
- package/dist/primitives/AvatarButton/AvatarButton.svelte.d.ts +18 -0
- package/dist/primitives/AvatarButton/AvatarButton.svelte.d.ts.map +1 -0
- 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 +136 -136
- package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
- package/dist/primitives/BottomSheet/BottomSheet.svelte +100 -100
- package/dist/primitives/BottomSheet/BottomSheet.svelte.d.ts +2 -2
- package/dist/primitives/BottomSheet/BottomSheet.svelte.d.ts.map +1 -1
- package/dist/primitives/BottomSheet/BottomSheetWrapper.test.svelte +3 -3
- package/dist/primitives/BottomSheet/BottomSheetWrapper.test.svelte.d.ts +1 -1
- package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +123 -122
- package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
- package/dist/primitives/Breadcrumb/Breadcrumb.svelte +99 -98
- package/dist/primitives/Button/Button.spec.js +223 -223
- package/dist/primitives/Button/Button.stories.svelte +76 -76
- package/dist/primitives/Button/Button.svelte +278 -283
- package/dist/primitives/Button/Button.svelte.d.ts +2 -0
- package/dist/primitives/Button/Button.svelte.d.ts.map +1 -1
- 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 -0
- package/dist/primitives/CardAction/CardAction.svelte.d.ts +20 -0
- package/dist/primitives/CardAction/CardAction.svelte.d.ts.map +1 -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 +33 -33
- package/dist/primitives/Drawer/Drawer.stories.svelte +80 -80
- package/dist/primitives/Drawer/Drawer.svelte +123 -127
- package/dist/primitives/Drawer/Drawer.svelte.d.ts +2 -3
- package/dist/primitives/Drawer/Drawer.svelte.d.ts.map +1 -1
- package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
- package/dist/primitives/Dropdown/Dropdown.svelte +170 -170
- package/dist/primitives/Dropdown/DropdownDivider.svelte +9 -9
- package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
- 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 +573 -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 +218 -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.svelte +37 -37
- package/dist/primitives/LandingButton/LandingButton.svelte +92 -0
- package/dist/primitives/LandingButton/LandingButton.svelte.d.ts +22 -0
- package/dist/primitives/LandingButton/LandingButton.svelte.d.ts.map +1 -0
- package/dist/primitives/MenuItem/MenuItem.svelte +85 -0
- package/dist/primitives/MenuItem/MenuItem.svelte.d.ts +24 -0
- package/dist/primitives/MenuItem/MenuItem.svelte.d.ts.map +1 -0
- package/dist/primitives/Modal/Modal.spec.js +99 -99
- package/dist/primitives/Modal/Modal.stories.svelte +86 -86
- package/dist/primitives/Modal/Modal.svelte +181 -157
- package/dist/primitives/Modal/Modal.svelte.d.ts +7 -5
- package/dist/primitives/Modal/Modal.svelte.d.ts.map +1 -1
- package/dist/primitives/Modal/ModalTestWrapper.svelte +3 -3
- package/dist/primitives/Modal/ModalTestWrapper.svelte.d.ts +2 -2
- package/dist/primitives/NavItem/NavItem.svelte +75 -0
- package/dist/primitives/NavItem/NavItem.svelte.d.ts +20 -0
- package/dist/primitives/NavItem/NavItem.svelte.d.ts.map +1 -0
- 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.svelte +109 -0
- package/dist/primitives/SearchResultItem/SearchResultItem.svelte.d.ts +26 -0
- package/dist/primitives/SearchResultItem/SearchResultItem.svelte.d.ts.map +1 -0
- package/dist/primitives/SidebarToggle/SidebarToggle.svelte +55 -0
- package/dist/primitives/SidebarToggle/SidebarToggle.svelte.d.ts +18 -0
- package/dist/primitives/SidebarToggle/SidebarToggle.svelte.d.ts.map +1 -0
- 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 +71 -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 +146 -146
- package/dist/primitives/Toggle.stories.svelte +92 -92
- package/dist/primitives/Toggle.svelte +141 -131
- package/dist/primitives/Toggle.svelte.d.ts +2 -0
- package/dist/primitives/Toggle.svelte.d.ts.map +1 -1
- 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.d.ts +7 -0
- package/dist/primitives/index.js +113 -92
- package/dist/recipes/CropImage/CropImage.spec.js +208 -208
- package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
- package/dist/recipes/CropImage/CropImage.svelte +219 -219
- package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
- package/dist/recipes/ImageUploader/ImageUploader.svelte +970 -970
- package/dist/recipes/SuperLogin/SuperLogin.svelte +3 -3
- package/dist/recipes/SuperLogin/SuperLogin.svelte.d.ts.map +1 -1
- package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
- package/dist/recipes/feedback/EmptyState/EmptyState.svelte +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 +80 -80
- 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 +260 -260
- 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.stories.svelte +123 -123
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +344 -344
- package/dist/recipes/inputs/Search.svelte +102 -102
- package/dist/recipes/inputs/index.d.ts +0 -1
- package/dist/recipes/inputs/index.js +0 -1
- package/dist/recipes/modals/AlertModal.spec.js +2 -2
- package/dist/recipes/modals/AlertModal.svelte +130 -130
- package/dist/recipes/modals/AlertModal.svelte.d.ts +3 -3
- package/dist/recipes/modals/ConfirmationModal.spec.js +206 -206
- package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
- package/dist/recipes/modals/ConfirmationModal.svelte +162 -152
- package/dist/recipes/modals/ConfirmationModal.svelte.d.ts +5 -3
- package/dist/recipes/modals/ConfirmationModal.svelte.d.ts.map +1 -1
- package/dist/recipes/modals/InputModal.spec.js +2 -2
- package/dist/recipes/modals/InputModal.svelte +182 -182
- package/dist/recipes/modals/InputModal.svelte.d.ts +3 -3
- package/dist/recipes/modals/ModalStateManager.spec.js +100 -100
- package/dist/recipes/modals/ModalStateManager.svelte +77 -77
- package/dist/recipes/modals/ModalTestWrapper.spec.js +49 -49
- package/dist/recipes/modals/ModalTestWrapper.svelte +65 -65
- package/dist/recipes/modals/ModalTestWrapper.svelte.d.ts +2 -2
- package/dist/recipes/modals/StatusModal.spec.js +2 -2
- package/dist/recipes/modals/StatusModal.svelte +206 -206
- package/dist/recipes/modals/StatusModal.svelte.d.ts +3 -3
- package/dist/services/EventService.js +75 -75
- package/dist/services/EventService.spec.js +217 -217
- package/dist/services/ShowService.spec.js +345 -345
- 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/ComponentConsolidation.stories.svelte +10 -10
- 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 -752
- package/dist/stories/PrimitivesGallery.svelte.d.ts.map +1 -1
- package/dist/stories/RecipesGallery.spec.js +9 -18
- package/dist/stories/RecipesGallery.stories.svelte +19 -19
- package/dist/stories/RecipesGallery.svelte +454 -471
- package/dist/stories/RecipesGallery.svelte.d.ts.map +1 -1
- package/dist/stories/button-audit-manifest.json +11186 -11186
- package/dist/tailwind/preset.cjs +82 -82
- package/dist/telemetry.js +405 -405
- package/dist/telemetry.spec.js +1169 -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.spec.js +219 -219
- package/dist/utils/haptic.d.ts +41 -0
- package/dist/utils/haptic.d.ts.map +1 -0
- package/dist/utils/haptic.js +115 -0
- package/dist/utils/transitions.js +4 -4
- package/dist/utils/utils.js +693 -693
- package/package.json +297 -297
- package/dist/recipes/inputs/SelectDropdown.spec.d.ts +0 -2
- package/dist/recipes/inputs/SelectDropdown.spec.d.ts.map +0 -1
- package/dist/recipes/inputs/SelectDropdown.spec.js +0 -518
- package/dist/recipes/inputs/SelectDropdown.svelte +0 -171
- package/dist/recipes/inputs/SelectDropdown.svelte.d.ts +0 -16
- package/dist/recipes/inputs/SelectDropdown.svelte.d.ts.map +0 -1
|
@@ -0,0 +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>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
interface Props {
|
|
3
|
+
/** Destructive/danger styling (red text) */
|
|
4
|
+
danger?: boolean;
|
|
5
|
+
/** Size variant */
|
|
6
|
+
size?: 'sm' | 'md' | 'lg' | 'nav';
|
|
7
|
+
/** Disabled state */
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
/** Active/selected state */
|
|
10
|
+
active?: boolean;
|
|
11
|
+
/** Content */
|
|
12
|
+
children?: Snippet;
|
|
13
|
+
/** Trailing content (icons, badges) */
|
|
14
|
+
trailing?: Snippet;
|
|
15
|
+
/** Additional classes */
|
|
16
|
+
class?: string;
|
|
17
|
+
/** Click handler */
|
|
18
|
+
onclick?: (e: MouseEvent) => void;
|
|
19
|
+
[key: string]: unknown;
|
|
20
|
+
}
|
|
21
|
+
declare const MenuItem: import("svelte").Component<Props, {}, "">;
|
|
22
|
+
type MenuItem = ReturnType<typeof MenuItem>;
|
|
23
|
+
export default MenuItem;
|
|
24
|
+
//# sourceMappingURL=MenuItem.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MenuItem.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/MenuItem/MenuItem.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAIpC,UAAU,KAAK;IACb,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mBAAmB;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;IAClC,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yBAAyB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AA2DH,QAAA,MAAM,QAAQ,2CAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
|
|
@@ -1,99 +1,99 @@
|
|
|
1
|
-
import { render, screen, fireEvent } from '@testing-library/svelte';
|
|
2
|
-
import userEvent from '@testing-library/user-event';
|
|
3
|
-
import { expect, describe, test, vi } from 'vitest';
|
|
4
|
-
import ModalTestWrapper from './ModalTestWrapper.svelte';
|
|
5
|
-
|
|
6
|
-
function setupTest(args) {
|
|
7
|
-
const user = userEvent.setup();
|
|
8
|
-
const { component, rerender } = render(ModalTestWrapper, { props: { ...args } });
|
|
9
|
-
return { user, component, rerender };
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
describe('Modal Component Tests', () => {
|
|
13
|
-
// Note: Modal renders both mobile sheet and desktop centered versions
|
|
14
|
-
// CSS hides one based on viewport, but in tests both are in DOM
|
|
15
|
-
// Use getAllByText and check that at least one exists
|
|
16
|
-
|
|
17
|
-
test('Renders Modal when
|
|
18
|
-
setupTest({
|
|
19
|
-
|
|
20
|
-
title: 'Test Title',
|
|
21
|
-
description: 'Test Description',
|
|
22
|
-
warningText: 'Test Warning'
|
|
23
|
-
});
|
|
24
|
-
// Modal renders both mobile and desktop versions, so use getAllByText
|
|
25
|
-
expect(screen.getAllByText((content, element) => content.includes('Test Title')).length).toBeGreaterThan(0);
|
|
26
|
-
expect(screen.getAllByText((content, element) => content.includes('Test Description')).length).toBeGreaterThan(0);
|
|
27
|
-
expect(screen.getAllByText((content, element) => content.includes('Test Warning')).length).toBeGreaterThan(0);
|
|
28
|
-
expect(screen.getAllByRole('button', { name: /Cancel/i }).length).toBeGreaterThan(0);
|
|
29
|
-
expect(screen.getAllByRole('button', { name: /Confirm/i }).length).toBeGreaterThan(0);
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
test('Does not render Modal when
|
|
33
|
-
setupTest({
|
|
34
|
-
|
|
35
|
-
title: 'Test Title',
|
|
36
|
-
description: 'Test Description',
|
|
37
|
-
warningText: 'Test Warning'
|
|
38
|
-
});
|
|
39
|
-
expect(screen.queryByText('Test Title')).not.toBeInTheDocument();
|
|
40
|
-
expect(screen.queryByText('Test Description')).not.toBeInTheDocument();
|
|
41
|
-
expect(screen.queryByText('Test Warning')).not.toBeInTheDocument();
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
test('Displays the correct title, description, and warning text', () => {
|
|
45
|
-
const title = 'Correct Title';
|
|
46
|
-
const description = 'Correct Description';
|
|
47
|
-
const warningText = 'Correct Warning';
|
|
48
|
-
setupTest({
|
|
49
|
-
|
|
50
|
-
title,
|
|
51
|
-
description,
|
|
52
|
-
warningText,
|
|
53
|
-
});
|
|
54
|
-
// Modal renders both mobile and desktop versions
|
|
55
|
-
expect(screen.getAllByText((content) => content.includes(title)).length).toBeGreaterThan(0);
|
|
56
|
-
expect(screen.getAllByText((content) => content.includes(description)).length).toBeGreaterThan(0);
|
|
57
|
-
expect(screen.getAllByText((content) => content.includes(warningText)).length).toBeGreaterThan(0);
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
test('Dispatches cancel event on escape key press', async () => {
|
|
61
|
-
// Create a mock function to track cancel calls
|
|
62
|
-
const oncancel = vi.fn();
|
|
63
|
-
|
|
64
|
-
const { user } = setupTest({
|
|
65
|
-
|
|
66
|
-
title: 'Test Title',
|
|
67
|
-
oncancel
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
// Verify modal is open
|
|
71
|
-
expect(screen.getAllByText((content) => content.includes('Test Title')).length).toBeGreaterThan(0);
|
|
72
|
-
|
|
73
|
-
// Press Escape key
|
|
74
|
-
await fireEvent.keyDown(window, { key: 'Escape' });
|
|
75
|
-
|
|
76
|
-
// Cancel callback should be called
|
|
77
|
-
expect(oncancel).toHaveBeenCalled();
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
test('Prevents propagation of click events within modal', async () => {
|
|
81
|
-
const { user } = setupTest({
|
|
82
|
-
|
|
83
|
-
title: 'Test Title'
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
// Find the modal content (first instance)
|
|
87
|
-
const modalElements = screen.getAllByText((content) => content.includes('Test Title'));
|
|
88
|
-
expect(modalElements.length).toBeGreaterThan(0);
|
|
89
|
-
|
|
90
|
-
const modalContent = modalElements[0].closest('.md\\:hidden, .hidden');
|
|
91
|
-
if (modalContent) {
|
|
92
|
-
const clickEvent = new MouseEvent('click', { bubbles: true });
|
|
93
|
-
modalContent.dispatchEvent(clickEvent);
|
|
94
|
-
|
|
95
|
-
// Modal should still be visible
|
|
96
|
-
expect(screen.getAllByText((content) => content.includes('Test Title')).length).toBeGreaterThan(0);
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
});
|
|
1
|
+
import { render, screen, fireEvent } from '@testing-library/svelte';
|
|
2
|
+
import userEvent from '@testing-library/user-event';
|
|
3
|
+
import { expect, describe, test, vi } from 'vitest';
|
|
4
|
+
import ModalTestWrapper from './ModalTestWrapper.svelte';
|
|
5
|
+
|
|
6
|
+
function setupTest(args) {
|
|
7
|
+
const user = userEvent.setup();
|
|
8
|
+
const { component, rerender } = render(ModalTestWrapper, { props: { ...args } });
|
|
9
|
+
return { user, component, rerender };
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
describe('Modal Component Tests', () => {
|
|
13
|
+
// Note: Modal renders both mobile sheet and desktop centered versions
|
|
14
|
+
// CSS hides one based on viewport, but in tests both are in DOM
|
|
15
|
+
// Use getAllByText and check that at least one exists
|
|
16
|
+
|
|
17
|
+
test('Renders Modal when open is true', () => {
|
|
18
|
+
setupTest({
|
|
19
|
+
open: true,
|
|
20
|
+
title: 'Test Title',
|
|
21
|
+
description: 'Test Description',
|
|
22
|
+
warningText: 'Test Warning'
|
|
23
|
+
});
|
|
24
|
+
// Modal renders both mobile and desktop versions, so use getAllByText
|
|
25
|
+
expect(screen.getAllByText((content, element) => content.includes('Test Title')).length).toBeGreaterThan(0);
|
|
26
|
+
expect(screen.getAllByText((content, element) => content.includes('Test Description')).length).toBeGreaterThan(0);
|
|
27
|
+
expect(screen.getAllByText((content, element) => content.includes('Test Warning')).length).toBeGreaterThan(0);
|
|
28
|
+
expect(screen.getAllByRole('button', { name: /Cancel/i }).length).toBeGreaterThan(0);
|
|
29
|
+
expect(screen.getAllByRole('button', { name: /Confirm/i }).length).toBeGreaterThan(0);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test('Does not render Modal when open is false', () => {
|
|
33
|
+
setupTest({
|
|
34
|
+
open: false,
|
|
35
|
+
title: 'Test Title',
|
|
36
|
+
description: 'Test Description',
|
|
37
|
+
warningText: 'Test Warning'
|
|
38
|
+
});
|
|
39
|
+
expect(screen.queryByText('Test Title')).not.toBeInTheDocument();
|
|
40
|
+
expect(screen.queryByText('Test Description')).not.toBeInTheDocument();
|
|
41
|
+
expect(screen.queryByText('Test Warning')).not.toBeInTheDocument();
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test('Displays the correct title, description, and warning text', () => {
|
|
45
|
+
const title = 'Correct Title';
|
|
46
|
+
const description = 'Correct Description';
|
|
47
|
+
const warningText = 'Correct Warning';
|
|
48
|
+
setupTest({
|
|
49
|
+
open: true,
|
|
50
|
+
title,
|
|
51
|
+
description,
|
|
52
|
+
warningText,
|
|
53
|
+
});
|
|
54
|
+
// Modal renders both mobile and desktop versions
|
|
55
|
+
expect(screen.getAllByText((content) => content.includes(title)).length).toBeGreaterThan(0);
|
|
56
|
+
expect(screen.getAllByText((content) => content.includes(description)).length).toBeGreaterThan(0);
|
|
57
|
+
expect(screen.getAllByText((content) => content.includes(warningText)).length).toBeGreaterThan(0);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test('Dispatches cancel event on escape key press', async () => {
|
|
61
|
+
// Create a mock function to track cancel calls
|
|
62
|
+
const oncancel = vi.fn();
|
|
63
|
+
|
|
64
|
+
const { user } = setupTest({
|
|
65
|
+
open: true,
|
|
66
|
+
title: 'Test Title',
|
|
67
|
+
oncancel
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// Verify modal is open
|
|
71
|
+
expect(screen.getAllByText((content) => content.includes('Test Title')).length).toBeGreaterThan(0);
|
|
72
|
+
|
|
73
|
+
// Press Escape key
|
|
74
|
+
await fireEvent.keyDown(window, { key: 'Escape' });
|
|
75
|
+
|
|
76
|
+
// Cancel callback should be called
|
|
77
|
+
expect(oncancel).toHaveBeenCalled();
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
test('Prevents propagation of click events within modal', async () => {
|
|
81
|
+
const { user } = setupTest({
|
|
82
|
+
open: true,
|
|
83
|
+
title: 'Test Title'
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
// Find the modal content (first instance)
|
|
87
|
+
const modalElements = screen.getAllByText((content) => content.includes('Test Title'));
|
|
88
|
+
expect(modalElements.length).toBeGreaterThan(0);
|
|
89
|
+
|
|
90
|
+
const modalContent = modalElements[0].closest('.md\\:hidden, .hidden');
|
|
91
|
+
if (modalContent) {
|
|
92
|
+
const clickEvent = new MouseEvent('click', { bubbles: true });
|
|
93
|
+
modalContent.dispatchEvent(clickEvent);
|
|
94
|
+
|
|
95
|
+
// Modal should still be visible
|
|
96
|
+
expect(screen.getAllByText((content) => content.includes('Test Title')).length).toBeGreaterThan(0);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
});
|
|
@@ -1,86 +1,86 @@
|
|
|
1
|
-
<script module>
|
|
2
|
-
import { defineMeta } from "@storybook/addon-svelte-csf";
|
|
3
|
-
|
|
4
|
-
import ModalProgress from "./Modal.svelte";
|
|
5
|
-
|
|
6
|
-
const { Story } = defineMeta({
|
|
7
|
-
title: "Components/Modal/ModalProgress",
|
|
8
|
-
component: ModalProgress,
|
|
9
|
-
});
|
|
10
|
-
</script>
|
|
11
|
-
|
|
12
|
-
<script>
|
|
13
|
-
let show1 = $state(false);
|
|
14
|
-
let show2 = $state(false);
|
|
15
|
-
let show3 = $state(false);
|
|
16
|
-
</script>
|
|
17
|
-
|
|
18
|
-
<Story name="Basic Modal">
|
|
19
|
-
<button
|
|
20
|
-
onclick={() => (show1 = true)}
|
|
21
|
-
class="px-4 py-2 bg-primary text-white rounded-lg"
|
|
22
|
-
>
|
|
23
|
-
Open Basic Modal
|
|
24
|
-
</button>
|
|
25
|
-
<ModalProgress bind:
|
|
26
|
-
{#snippet header()}
|
|
27
|
-
<h2 class="text-xl font-semibold mb-2">Modal Title</h2>
|
|
28
|
-
{/snippet}
|
|
29
|
-
{#snippet body()}
|
|
30
|
-
<p class="text-gray-500 dark:text-gray-400">This is the modal body content.</p>
|
|
31
|
-
{/snippet}
|
|
32
|
-
{#snippet footer()}
|
|
33
|
-
<button
|
|
34
|
-
onclick={() => (show1 = false)}
|
|
35
|
-
class="px-4 py-2 bg-gray-600 text-white rounded-lg"
|
|
36
|
-
>
|
|
37
|
-
Close
|
|
38
|
-
</button>
|
|
39
|
-
{/snippet}
|
|
40
|
-
</ModalProgress>
|
|
41
|
-
</Story>
|
|
42
|
-
|
|
43
|
-
<Story name="Processing State">
|
|
44
|
-
<button
|
|
45
|
-
onclick={() => (show2 = true)}
|
|
46
|
-
class="px-4 py-2 bg-primary text-white rounded-lg"
|
|
47
|
-
>
|
|
48
|
-
Open Processing Modal
|
|
49
|
-
</button>
|
|
50
|
-
<ModalProgress bind:
|
|
51
|
-
{#snippet body()}
|
|
52
|
-
<div class="flex flex-col items-center gap-4">
|
|
53
|
-
<div
|
|
54
|
-
class="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600"
|
|
55
|
-
></div>
|
|
56
|
-
<p class="text-gray-500 dark:text-gray-400">Processing your request...</p>
|
|
57
|
-
</div>
|
|
58
|
-
{/snippet}
|
|
59
|
-
</ModalProgress>
|
|
60
|
-
</Story>
|
|
61
|
-
|
|
62
|
-
<Story name="Success State">
|
|
63
|
-
<button
|
|
64
|
-
onclick={() => (show3 = true)}
|
|
65
|
-
class="px-4 py-2 bg-green-600 text-white rounded-lg"
|
|
66
|
-
>
|
|
67
|
-
Open Success Modal
|
|
68
|
-
</button>
|
|
69
|
-
<ModalProgress bind:
|
|
70
|
-
{#snippet body()}
|
|
71
|
-
<div class="flex flex-col items-center gap-4 text-center">
|
|
72
|
-
<div class="text-green-600 dark:text-green-400 text-5xl">✓</div>
|
|
73
|
-
<h3 class="text-xl font-semibold">Success!</h3>
|
|
74
|
-
<p class="text-gray-500 dark:text-gray-400">Your action was completed successfully.</p>
|
|
75
|
-
</div>
|
|
76
|
-
{/snippet}
|
|
77
|
-
{#snippet footer()}
|
|
78
|
-
<button
|
|
79
|
-
onclick={() => (show3 = false)}
|
|
80
|
-
class="px-4 py-2 bg-green-600 text-white rounded-lg"
|
|
81
|
-
>
|
|
82
|
-
Done
|
|
83
|
-
</button>
|
|
84
|
-
{/snippet}
|
|
85
|
-
</ModalProgress>
|
|
86
|
-
</Story>
|
|
1
|
+
<script module>
|
|
2
|
+
import { defineMeta } from "@storybook/addon-svelte-csf";
|
|
3
|
+
|
|
4
|
+
import ModalProgress from "./Modal.svelte";
|
|
5
|
+
|
|
6
|
+
const { Story } = defineMeta({
|
|
7
|
+
title: "Components/Modal/ModalProgress",
|
|
8
|
+
component: ModalProgress,
|
|
9
|
+
});
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<script>
|
|
13
|
+
let show1 = $state(false);
|
|
14
|
+
let show2 = $state(false);
|
|
15
|
+
let show3 = $state(false);
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<Story name="Basic Modal">
|
|
19
|
+
<button
|
|
20
|
+
onclick={() => (show1 = true)}
|
|
21
|
+
class="px-4 py-2 bg-primary text-white rounded-lg"
|
|
22
|
+
>
|
|
23
|
+
Open Basic Modal
|
|
24
|
+
</button>
|
|
25
|
+
<ModalProgress bind:open={show1}>
|
|
26
|
+
{#snippet header()}
|
|
27
|
+
<h2 class="text-xl font-semibold mb-2">Modal Title</h2>
|
|
28
|
+
{/snippet}
|
|
29
|
+
{#snippet body()}
|
|
30
|
+
<p class="text-gray-500 dark:text-gray-400">This is the modal body content.</p>
|
|
31
|
+
{/snippet}
|
|
32
|
+
{#snippet footer()}
|
|
33
|
+
<button
|
|
34
|
+
onclick={() => (show1 = false)}
|
|
35
|
+
class="px-4 py-2 bg-gray-600 text-white rounded-lg"
|
|
36
|
+
>
|
|
37
|
+
Close
|
|
38
|
+
</button>
|
|
39
|
+
{/snippet}
|
|
40
|
+
</ModalProgress>
|
|
41
|
+
</Story>
|
|
42
|
+
|
|
43
|
+
<Story name="Processing State">
|
|
44
|
+
<button
|
|
45
|
+
onclick={() => (show2 = true)}
|
|
46
|
+
class="px-4 py-2 bg-primary text-white rounded-lg"
|
|
47
|
+
>
|
|
48
|
+
Open Processing Modal
|
|
49
|
+
</button>
|
|
50
|
+
<ModalProgress bind:open={show2} isProcessing={true}>
|
|
51
|
+
{#snippet body()}
|
|
52
|
+
<div class="flex flex-col items-center gap-4">
|
|
53
|
+
<div
|
|
54
|
+
class="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600"
|
|
55
|
+
></div>
|
|
56
|
+
<p class="text-gray-500 dark:text-gray-400">Processing your request...</p>
|
|
57
|
+
</div>
|
|
58
|
+
{/snippet}
|
|
59
|
+
</ModalProgress>
|
|
60
|
+
</Story>
|
|
61
|
+
|
|
62
|
+
<Story name="Success State">
|
|
63
|
+
<button
|
|
64
|
+
onclick={() => (show3 = true)}
|
|
65
|
+
class="px-4 py-2 bg-green-600 text-white rounded-lg"
|
|
66
|
+
>
|
|
67
|
+
Open Success Modal
|
|
68
|
+
</button>
|
|
69
|
+
<ModalProgress bind:open={show3} isSuccess={true}>
|
|
70
|
+
{#snippet body()}
|
|
71
|
+
<div class="flex flex-col items-center gap-4 text-center">
|
|
72
|
+
<div class="text-green-600 dark:text-green-400 text-5xl">✓</div>
|
|
73
|
+
<h3 class="text-xl font-semibold">Success!</h3>
|
|
74
|
+
<p class="text-gray-500 dark:text-gray-400">Your action was completed successfully.</p>
|
|
75
|
+
</div>
|
|
76
|
+
{/snippet}
|
|
77
|
+
{#snippet footer()}
|
|
78
|
+
<button
|
|
79
|
+
onclick={() => (show3 = false)}
|
|
80
|
+
class="px-4 py-2 bg-green-600 text-white rounded-lg"
|
|
81
|
+
>
|
|
82
|
+
Done
|
|
83
|
+
</button>
|
|
84
|
+
{/snippet}
|
|
85
|
+
</ModalProgress>
|
|
86
|
+
</Story>
|