@getmicdrop/svelte-components 5.5.5 → 5.6.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 +134 -134
- package/dist/calendar/ShowCard/ShowCard.svelte +157 -157
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +61 -61
- package/dist/components/Layout/AppShell.svelte +104 -0
- package/dist/components/Layout/AppShell.svelte.d.ts +26 -0
- package/dist/components/Layout/AppShell.svelte.d.ts.map +1 -0
- package/dist/components/Layout/ContentSection.svelte +80 -0
- package/dist/components/Layout/ContentSection.svelte.d.ts +23 -0
- package/dist/components/Layout/ContentSection.svelte.d.ts.map +1 -0
- package/dist/components/Layout/Grid.svelte +4 -4
- package/dist/components/Layout/Heading.svelte +81 -0
- package/dist/components/Layout/Heading.svelte.d.ts +24 -0
- package/dist/components/Layout/Heading.svelte.d.ts.map +1 -0
- package/dist/components/Layout/PageContainer.svelte +69 -0
- package/dist/components/Layout/PageContainer.svelte.d.ts +23 -0
- package/dist/components/Layout/PageContainer.svelte.d.ts.map +1 -0
- package/dist/components/Layout/Responsive.svelte +75 -0
- package/dist/components/Layout/Responsive.svelte.d.ts +19 -0
- package/dist/components/Layout/Responsive.svelte.d.ts.map +1 -0
- package/dist/components/Layout/Section.svelte +80 -80
- package/dist/components/Layout/ShowOnDesktop.svelte +37 -0
- package/dist/components/Layout/ShowOnDesktop.svelte.d.ts +16 -0
- package/dist/components/Layout/ShowOnDesktop.svelte.d.ts.map +1 -0
- package/dist/components/Layout/ShowOnMobile.svelte +37 -0
- package/dist/components/Layout/ShowOnMobile.svelte.d.ts +16 -0
- package/dist/components/Layout/ShowOnMobile.svelte.d.ts.map +1 -0
- 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 -0
- package/dist/components/Layout/Text.svelte.d.ts +28 -0
- package/dist/components/Layout/Text.svelte.d.ts.map +1 -0
- package/dist/components/Layout/TwoColumn.svelte +108 -0
- package/dist/components/Layout/TwoColumn.svelte.d.ts +28 -0
- package/dist/components/Layout/TwoColumn.svelte.d.ts.map +1 -0
- package/dist/components/Layout/__tests__/Heading.test.d.ts +2 -0
- package/dist/components/Layout/__tests__/Heading.test.d.ts.map +1 -0
- package/dist/components/Layout/__tests__/Heading.test.js +123 -0
- package/dist/components/Layout/__tests__/ShowOnDesktop.test.d.ts +2 -0
- package/dist/components/Layout/__tests__/ShowOnDesktop.test.d.ts.map +1 -0
- package/dist/components/Layout/__tests__/ShowOnDesktop.test.js +84 -0
- package/dist/components/Layout/__tests__/ShowOnMobile.test.d.ts +2 -0
- package/dist/components/Layout/__tests__/ShowOnMobile.test.d.ts.map +1 -0
- package/dist/components/Layout/__tests__/ShowOnMobile.test.js +80 -0
- package/dist/components/Layout/__tests__/Text.test.d.ts +2 -0
- package/dist/components/Layout/__tests__/Text.test.d.ts.map +1 -0
- package/dist/components/Layout/__tests__/Text.test.js +146 -0
- package/dist/components/Layout/__tests__/TwoColumn.test.d.ts +2 -0
- package/dist/components/Layout/__tests__/TwoColumn.test.d.ts.map +1 -0
- package/dist/components/Layout/__tests__/TwoColumn.test.js +129 -0
- 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 +1 -0
- package/dist/index.js +40 -40
- 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.d.ts +9 -0
- package/dist/patterns/layout/index.js +22 -0
- package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
- package/dist/patterns/navigation/BottomNav.svelte +64 -64
- package/dist/patterns/navigation/Header.stories.svelte +77 -77
- package/dist/patterns/navigation/Header.svelte +193 -193
- 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/Badges/Badge.spec.js +144 -144
- package/dist/primitives/Badges/Badge.stories.svelte +86 -86
- package/dist/primitives/Badges/Badge.svelte +79 -79
- 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/Breadcrumb/Breadcrumb.spec.js +122 -122
- package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
- package/dist/primitives/Breadcrumb/Breadcrumb.svelte +89 -89
- package/dist/primitives/Button/Button.spec.js +223 -223
- package/dist/primitives/Button/Button.stories.svelte +76 -76
- package/dist/primitives/Button/Button.svelte +270 -270
- 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/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.stories.svelte +80 -80
- package/dist/primitives/Drawer/Drawer.svelte +120 -120
- package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
- package/dist/primitives/Dropdown/Dropdown.svelte +14 -14
- package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
- 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 +417 -417
- package/dist/primitives/Input/Select.spec.js +212 -212
- package/dist/primitives/Input/Select.stories.svelte +112 -112
- package/dist/primitives/Input/Select.svelte +128 -128
- package/dist/primitives/Input/Textarea.stories.svelte +137 -137
- package/dist/primitives/Input/Textarea.svelte +35 -35
- package/dist/primitives/Label/Label.svelte +37 -37
- package/dist/primitives/Modal/Modal.spec.js +99 -99
- package/dist/primitives/Modal/Modal.stories.svelte +86 -86
- package/dist/primitives/Modal/Modal.svelte +158 -158
- package/dist/primitives/NumberInput/NumberInput.svelte +106 -106
- 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/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 +123 -123
- package/dist/primitives/Toggle.spec.js +143 -143
- package/dist/primitives/Toggle.stories.svelte +92 -92
- package/dist/primitives/Toggle.svelte +71 -71
- 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 +84 -84
- package/dist/recipes/CropImage/CropImage.spec.js +208 -208
- package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
- package/dist/recipes/CropImage/CropImage.svelte +238 -238
- package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
- package/dist/recipes/ImageUploader/ImageUploader.svelte +804 -804
- package/dist/recipes/SuperLogin/SuperLogin.spec.js +17 -17
- 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 +258 -258
- package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
- package/dist/recipes/inputs/MultiSelect.svelte +256 -256
- package/dist/recipes/inputs/OTPInput.spec.js +251 -251
- package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
- package/dist/recipes/inputs/OTPInput.svelte +29 -29
- package/dist/recipes/inputs/PasswordInput.svelte +22 -22
- package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +117 -117
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +123 -123
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +326 -326
- package/dist/recipes/inputs/Search.svelte +37 -37
- package/dist/recipes/inputs/SelectDropdown.svelte +57 -57
- package/dist/recipes/modals/AlertModal.svelte +130 -130
- package/dist/recipes/modals/ConfirmationModal.spec.js +206 -206
- package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
- package/dist/recipes/modals/ConfirmationModal.svelte +152 -152
- 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.js +75 -75
- package/dist/services/EventService.spec.js +217 -217
- package/dist/services/ShowService.spec.js +345 -345
- package/dist/stores/auth.js +36 -36
- package/dist/stores/auth.spec.js +139 -139
- 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 +725 -725
- package/dist/stories/RecipesGallery.stories.svelte +19 -19
- package/dist/stories/RecipesGallery.svelte +271 -271
- 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 +1144 -1144
- package/dist/tokens/__tests__/typography-base.test.d.ts +2 -0
- package/dist/tokens/__tests__/typography-base.test.d.ts.map +1 -0
- package/dist/tokens/__tests__/typography-base.test.js +138 -0
- package/dist/tokens/tokens.css +87 -87
- package/dist/tokens/typography-base.css +163 -0
- package/dist/utils/apiConfig.spec.js +219 -219
- package/dist/utils/transitions.js +62 -62
- package/dist/utils/utils.js +354 -354
- package/package.json +292 -291
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { Snippet } from 'svelte';
|
|
3
|
-
|
|
4
|
-
interface Props {
|
|
5
|
-
color?: 'gray' | 'green' | 'red' | 'disabled';
|
|
6
|
-
defaultClass?: string;
|
|
7
|
-
show?: boolean;
|
|
8
|
-
class?: string;
|
|
9
|
-
children?: Snippet;
|
|
10
|
-
[key: string]: unknown;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
let {
|
|
14
|
-
color = "gray",
|
|
15
|
-
defaultClass = "text-sm rtl:text-right font-medium block",
|
|
16
|
-
show = true,
|
|
17
|
-
class: className = "",
|
|
18
|
-
children,
|
|
19
|
-
...restProps
|
|
20
|
-
}: Props = $props();
|
|
21
|
-
|
|
22
|
-
const colorClasses = {
|
|
23
|
-
gray: "text-gray-900 dark:text-gray-300",
|
|
24
|
-
green: "text-green-700 dark:text-green-500",
|
|
25
|
-
red: "text-red-700 dark:text-red-500",
|
|
26
|
-
disabled: "text-gray-400 dark:text-gray-500"
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
let labelClass = $derived(`${defaultClass} ${colorClasses[color] || colorClasses.gray} ${className}`.trim());
|
|
30
|
-
</script>
|
|
31
|
-
|
|
32
|
-
{#if show}
|
|
33
|
-
<!-- svelte-ignore a11y_label_has_associated_control -->
|
|
34
|
-
<label {...restProps} class={labelClass}>{#if children}{@render children()}{/if}</label>
|
|
35
|
-
{:else}
|
|
36
|
-
{#if children}{@render children()}{/if}
|
|
37
|
-
{/if}
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
color?: 'gray' | 'green' | 'red' | 'disabled';
|
|
6
|
+
defaultClass?: string;
|
|
7
|
+
show?: boolean;
|
|
8
|
+
class?: string;
|
|
9
|
+
children?: Snippet;
|
|
10
|
+
[key: string]: unknown;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
let {
|
|
14
|
+
color = "gray",
|
|
15
|
+
defaultClass = "text-sm rtl:text-right font-medium block",
|
|
16
|
+
show = true,
|
|
17
|
+
class: className = "",
|
|
18
|
+
children,
|
|
19
|
+
...restProps
|
|
20
|
+
}: Props = $props();
|
|
21
|
+
|
|
22
|
+
const colorClasses = {
|
|
23
|
+
gray: "text-gray-900 dark:text-gray-300",
|
|
24
|
+
green: "text-green-700 dark:text-green-500",
|
|
25
|
+
red: "text-red-700 dark:text-red-500",
|
|
26
|
+
disabled: "text-gray-400 dark:text-gray-500"
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
let labelClass = $derived(`${defaultClass} ${colorClasses[color] || colorClasses.gray} ${className}`.trim());
|
|
30
|
+
</script>
|
|
31
|
+
|
|
32
|
+
{#if show}
|
|
33
|
+
<!-- svelte-ignore a11y_label_has_associated_control -->
|
|
34
|
+
<label {...restProps} class={labelClass}>{#if children}{@render children()}{/if}</label>
|
|
35
|
+
{:else}
|
|
36
|
+
{#if children}{@render children()}{/if}
|
|
37
|
+
{/if}
|
|
@@ -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 show is true', () => {
|
|
18
|
-
setupTest({
|
|
19
|
-
show: 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 show is false', () => {
|
|
33
|
-
setupTest({
|
|
34
|
-
show: 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
|
-
show: 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
|
-
show: 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
|
-
show: 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
|
+
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 show is true', () => {
|
|
18
|
+
setupTest({
|
|
19
|
+
show: 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 show is false', () => {
|
|
33
|
+
setupTest({
|
|
34
|
+
show: 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
|
+
show: 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
|
+
show: 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
|
+
show: 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:show={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:show={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:show={show3} isSuccess={true}>
|
|
70
|
-
{#snippet body()}
|
|
71
|
-
<div class="flex flex-col items-center gap-4 text-center">
|
|
72
|
-
<div class="text-green-600 dark:text-green-400 text-5xl">✓</div>
|
|
73
|
-
<h3 class="text-xl font-semibold">Success!</h3>
|
|
74
|
-
<p class="text-gray-500 dark:text-gray-400">Your action was completed successfully.</p>
|
|
75
|
-
</div>
|
|
76
|
-
{/snippet}
|
|
77
|
-
{#snippet footer()}
|
|
78
|
-
<button
|
|
79
|
-
onclick={() => (show3 = false)}
|
|
80
|
-
class="px-4 py-2 bg-green-600 text-white rounded-lg"
|
|
81
|
-
>
|
|
82
|
-
Done
|
|
83
|
-
</button>
|
|
84
|
-
{/snippet}
|
|
85
|
-
</ModalProgress>
|
|
86
|
-
</Story>
|
|
1
|
+
<script module>
|
|
2
|
+
import { defineMeta } from "@storybook/addon-svelte-csf";
|
|
3
|
+
|
|
4
|
+
import ModalProgress from "./Modal.svelte";
|
|
5
|
+
|
|
6
|
+
const { Story } = defineMeta({
|
|
7
|
+
title: "Components/Modal/ModalProgress",
|
|
8
|
+
component: ModalProgress,
|
|
9
|
+
});
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<script>
|
|
13
|
+
let show1 = $state(false);
|
|
14
|
+
let show2 = $state(false);
|
|
15
|
+
let show3 = $state(false);
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<Story name="Basic Modal">
|
|
19
|
+
<button
|
|
20
|
+
onclick={() => (show1 = true)}
|
|
21
|
+
class="px-4 py-2 bg-primary text-white rounded-lg"
|
|
22
|
+
>
|
|
23
|
+
Open Basic Modal
|
|
24
|
+
</button>
|
|
25
|
+
<ModalProgress bind:show={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:show={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:show={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>
|