@getmicdrop/svelte-components 5.5.1 → 5.5.4
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/Grid.svelte +4 -4
- package/dist/components/Layout/Section.svelte +80 -80
- package/dist/components/Layout/Sidebar.svelte +108 -108
- package/dist/components/Layout/Stack.svelte +6 -6
- package/dist/constants/validation.js +91 -91
- package/dist/constants/validation.spec.js +64 -64
- package/dist/index.d.ts +1 -0
- package/dist/index.js +223 -222
- 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 +88 -88
- 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 +33 -33
- package/dist/patterns/layout/Sidebar.svelte +39 -39
- package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
- package/dist/patterns/navigation/BottomNav.svelte +20 -20
- 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 +54 -54
- 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 +170 -170
- 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 +103 -103
- package/dist/primitives/Badges/Badge.stories.svelte +86 -86
- package/dist/primitives/Badges/Badge.svelte +79 -79
- package/dist/primitives/BottomSheet/BottomSheet.spec.js +127 -127
- package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
- package/dist/primitives/BottomSheet/BottomSheet.svelte +100 -100
- package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +120 -120
- package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
- package/dist/primitives/Breadcrumb/Breadcrumb.svelte +89 -89
- package/dist/primitives/Button/Button.spec.js +211 -211
- package/dist/primitives/Button/Button.stories.svelte +76 -76
- package/dist/primitives/Button/Button.svelte +270 -270
- package/dist/primitives/Button/ButtonSaveDemo.spec.js +48 -48
- 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 +357 -357
- 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 +392 -392
- package/dist/primitives/Input/Select.spec.js +218 -218
- 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 +95 -95
- 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 +75 -75
- 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 +127 -127
- 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/recipes/CropImage/CropImage.spec.js +216 -216
- 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.svelte +7 -6
- 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 +129 -129
- 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 +257 -257
- package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
- package/dist/recipes/inputs/MultiSelect.svelte +249 -249
- package/dist/recipes/inputs/OTPInput.spec.js +238 -238
- 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.spec.js +173 -173
- package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +43 -43
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.spec.js +300 -300
- 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 +191 -191
- 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 +342 -342
- 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/tokens/tokens.css +87 -87
- package/dist/utils/transitions.d.ts +24 -0
- package/dist/utils/transitions.d.ts.map +1 -0
- package/dist/utils/transitions.js +62 -0
- package/dist/utils/utils.js +354 -354
- package/package.json +283 -283
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
import { render, screen } from "@testing-library/svelte";
|
|
2
|
-
import { expect, describe, test } from "vitest";
|
|
3
|
-
import PageLoader from "./PageLoader.svelte";
|
|
4
|
-
|
|
5
|
-
describe("PageLoader Component Tests", () => {
|
|
6
|
-
test("Shows spinner when loading", () => {
|
|
7
|
-
render(PageLoader, { props: { isLoading: true } });
|
|
8
|
-
expect(screen.getByRole("status")).toBeInTheDocument();
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
test("Shows error alert when error is set", () => {
|
|
12
|
-
render(PageLoader, {
|
|
13
|
-
props: { isLoading: false, error: "Something went wrong" },
|
|
14
|
-
});
|
|
15
|
-
expect(screen.getByRole("alert")).toBeInTheDocument();
|
|
16
|
-
expect(screen.getByText("Something went wrong")).toBeInTheDocument();
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
test("Shows custom error title", () => {
|
|
20
|
-
render(PageLoader, {
|
|
21
|
-
props: {
|
|
22
|
-
isLoading: false,
|
|
23
|
-
error: "Failed",
|
|
24
|
-
errorTitle: "Loading Error",
|
|
25
|
-
},
|
|
26
|
-
});
|
|
27
|
-
expect(screen.getByText("Loading Error")).toBeInTheDocument();
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
test("Does not show spinner when not loading", () => {
|
|
31
|
-
render(PageLoader, { props: { isLoading: false } });
|
|
32
|
-
expect(screen.queryByRole("status")).not.toBeInTheDocument();
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
test("Does not show error when no error", () => {
|
|
36
|
-
render(PageLoader, { props: { isLoading: false, error: null } });
|
|
37
|
-
expect(screen.queryByRole("alert")).not.toBeInTheDocument();
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
test("Has custom min height class", () => {
|
|
41
|
-
const { container } = render(PageLoader, {
|
|
42
|
-
props: { isLoading: true, minHeight: "h-96" },
|
|
43
|
-
});
|
|
44
|
-
const loadingDiv = container.querySelector(".h-96");
|
|
45
|
-
expect(loadingDiv).toBeInTheDocument();
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
test("Shows loading message when provided", () => {
|
|
49
|
-
render(PageLoader, {
|
|
50
|
-
props: { isLoading: true, loadingMessage: "Please wait..." },
|
|
51
|
-
});
|
|
52
|
-
expect(screen.getByText("Please wait...")).toBeInTheDocument();
|
|
53
|
-
});
|
|
54
|
-
});
|
|
1
|
+
import { render, screen } from "@testing-library/svelte";
|
|
2
|
+
import { expect, describe, test } from "vitest";
|
|
3
|
+
import PageLoader from "./PageLoader.svelte";
|
|
4
|
+
|
|
5
|
+
describe("PageLoader Component Tests", () => {
|
|
6
|
+
test("Shows spinner when loading", () => {
|
|
7
|
+
render(PageLoader, { props: { isLoading: true } });
|
|
8
|
+
expect(screen.getByRole("status")).toBeInTheDocument();
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
test("Shows error alert when error is set", () => {
|
|
12
|
+
render(PageLoader, {
|
|
13
|
+
props: { isLoading: false, error: "Something went wrong" },
|
|
14
|
+
});
|
|
15
|
+
expect(screen.getByRole("alert")).toBeInTheDocument();
|
|
16
|
+
expect(screen.getByText("Something went wrong")).toBeInTheDocument();
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test("Shows custom error title", () => {
|
|
20
|
+
render(PageLoader, {
|
|
21
|
+
props: {
|
|
22
|
+
isLoading: false,
|
|
23
|
+
error: "Failed",
|
|
24
|
+
errorTitle: "Loading Error",
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
expect(screen.getByText("Loading Error")).toBeInTheDocument();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test("Does not show spinner when not loading", () => {
|
|
31
|
+
render(PageLoader, { props: { isLoading: false } });
|
|
32
|
+
expect(screen.queryByRole("status")).not.toBeInTheDocument();
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test("Does not show error when no error", () => {
|
|
36
|
+
render(PageLoader, { props: { isLoading: false, error: null } });
|
|
37
|
+
expect(screen.queryByRole("alert")).not.toBeInTheDocument();
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test("Has custom min height class", () => {
|
|
41
|
+
const { container } = render(PageLoader, {
|
|
42
|
+
props: { isLoading: true, minHeight: "h-96" },
|
|
43
|
+
});
|
|
44
|
+
const loadingDiv = container.querySelector(".h-96");
|
|
45
|
+
expect(loadingDiv).toBeInTheDocument();
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test("Shows loading message when provided", () => {
|
|
49
|
+
render(PageLoader, {
|
|
50
|
+
props: { isLoading: true, loadingMessage: "Please wait..." },
|
|
51
|
+
});
|
|
52
|
+
expect(screen.getByText("Please wait...")).toBeInTheDocument();
|
|
53
|
+
});
|
|
54
|
+
});
|
|
@@ -1,137 +1,137 @@
|
|
|
1
|
-
<script module>
|
|
2
|
-
import { defineMeta } from "@storybook/addon-svelte-csf";
|
|
3
|
-
|
|
4
|
-
import PageLoader from './PageLoader.svelte';
|
|
5
|
-
|
|
6
|
-
const { Story } = defineMeta({
|
|
7
|
-
title: 'Components/PageLoader',
|
|
8
|
-
component: PageLoader,
|
|
9
|
-
tags: ['autodocs'],
|
|
10
|
-
argTypes: {
|
|
11
|
-
isLoading: { control: 'boolean' },
|
|
12
|
-
error: { control: 'text' },
|
|
13
|
-
loadingMessage: { control: 'text' },
|
|
14
|
-
errorTitle: { control: 'text' },
|
|
15
|
-
showRetry: { control: 'boolean' },
|
|
16
|
-
},
|
|
17
|
-
});
|
|
18
|
-
</script>
|
|
19
|
-
|
|
20
|
-
<script>
|
|
21
|
-
let loading = $state(true);
|
|
22
|
-
let hasError = $state(false);
|
|
23
|
-
|
|
24
|
-
function simulateLoading() {
|
|
25
|
-
loading = true;
|
|
26
|
-
hasError = false;
|
|
27
|
-
setTimeout(() => {
|
|
28
|
-
loading = false;
|
|
29
|
-
}, 2000);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
function simulateError() {
|
|
33
|
-
loading = true;
|
|
34
|
-
hasError = false;
|
|
35
|
-
setTimeout(() => {
|
|
36
|
-
loading = false;
|
|
37
|
-
hasError = true;
|
|
38
|
-
}, 1000);
|
|
39
|
-
}
|
|
40
|
-
</script>
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
<Story
|
|
44
|
-
name="Loading State"
|
|
45
|
-
args={{
|
|
46
|
-
isLoading: true,
|
|
47
|
-
error: null,
|
|
48
|
-
}}
|
|
49
|
-
/>
|
|
50
|
-
|
|
51
|
-
<Story
|
|
52
|
-
name="Loading with Message"
|
|
53
|
-
args={{
|
|
54
|
-
isLoading: true,
|
|
55
|
-
error: null,
|
|
56
|
-
loadingMessage: 'Fetching your data...',
|
|
57
|
-
}}
|
|
58
|
-
/>
|
|
59
|
-
|
|
60
|
-
<Story
|
|
61
|
-
name="Error State"
|
|
62
|
-
args={{
|
|
63
|
-
isLoading: false,
|
|
64
|
-
error: 'Failed to load data. Please try again.',
|
|
65
|
-
errorTitle: 'Loading Failed',
|
|
66
|
-
}}
|
|
67
|
-
/>
|
|
68
|
-
|
|
69
|
-
<Story
|
|
70
|
-
name="Error with Retry"
|
|
71
|
-
args={{
|
|
72
|
-
isLoading: false,
|
|
73
|
-
error: 'Network connection failed',
|
|
74
|
-
errorTitle: 'Connection Error',
|
|
75
|
-
showRetry: true,
|
|
76
|
-
onRetry: () => alert('Retrying...'),
|
|
77
|
-
}}
|
|
78
|
-
/>
|
|
79
|
-
|
|
80
|
-
<Story
|
|
81
|
-
name="Content Loaded"
|
|
82
|
-
args={{
|
|
83
|
-
isLoading: false,
|
|
84
|
-
error: null,
|
|
85
|
-
}}
|
|
86
|
-
/>
|
|
87
|
-
|
|
88
|
-
<Story name="Interactive Loading">
|
|
89
|
-
<div class="space-y-4">
|
|
90
|
-
<div class="flex gap-2">
|
|
91
|
-
<button
|
|
92
|
-
class="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600"
|
|
93
|
-
onclick={simulateLoading}
|
|
94
|
-
>
|
|
95
|
-
Simulate Loading
|
|
96
|
-
</button>
|
|
97
|
-
<button
|
|
98
|
-
class="px-4 py-2 bg-red-500 text-white rounded hover:bg-red-600"
|
|
99
|
-
onclick={simulateError}
|
|
100
|
-
>
|
|
101
|
-
Simulate Error
|
|
102
|
-
</button>
|
|
103
|
-
</div>
|
|
104
|
-
|
|
105
|
-
<PageLoader
|
|
106
|
-
isLoading={loading}
|
|
107
|
-
error={hasError ? 'Failed to load content' : null}
|
|
108
|
-
loadingMessage="Please wait..."
|
|
109
|
-
showRetry={true}
|
|
110
|
-
onRetry={simulateLoading}
|
|
111
|
-
>
|
|
112
|
-
<div class="p-8 bg-green-50 rounded-lg">
|
|
113
|
-
<h3 class="text-xl font-bold text-green-800">Success!</h3>
|
|
114
|
-
<p class="text-green-600 mt-2">Your content has loaded successfully.</p>
|
|
115
|
-
</div>
|
|
116
|
-
</PageLoader>
|
|
117
|
-
</div>
|
|
118
|
-
</Story>
|
|
119
|
-
|
|
120
|
-
<Story name="Different Heights">
|
|
121
|
-
<div class="space-y-8">
|
|
122
|
-
<div class="border rounded p-4">
|
|
123
|
-
<h4 class="font-semibold mb-2">Small (h-32)</h4>
|
|
124
|
-
<PageLoader isLoading={true} minHeight="h-32" />
|
|
125
|
-
</div>
|
|
126
|
-
|
|
127
|
-
<div class="border rounded p-4">
|
|
128
|
-
<h4 class="font-semibold mb-2">Medium (h-64 - default)</h4>
|
|
129
|
-
<PageLoader isLoading={true} />
|
|
130
|
-
</div>
|
|
131
|
-
|
|
132
|
-
<div class="border rounded p-4">
|
|
133
|
-
<h4 class="font-semibold mb-2">Large (h-96)</h4>
|
|
134
|
-
<PageLoader isLoading={true} minHeight="h-96" />
|
|
135
|
-
</div>
|
|
136
|
-
</div>
|
|
137
|
-
</Story>
|
|
1
|
+
<script module>
|
|
2
|
+
import { defineMeta } from "@storybook/addon-svelte-csf";
|
|
3
|
+
|
|
4
|
+
import PageLoader from './PageLoader.svelte';
|
|
5
|
+
|
|
6
|
+
const { Story } = defineMeta({
|
|
7
|
+
title: 'Components/PageLoader',
|
|
8
|
+
component: PageLoader,
|
|
9
|
+
tags: ['autodocs'],
|
|
10
|
+
argTypes: {
|
|
11
|
+
isLoading: { control: 'boolean' },
|
|
12
|
+
error: { control: 'text' },
|
|
13
|
+
loadingMessage: { control: 'text' },
|
|
14
|
+
errorTitle: { control: 'text' },
|
|
15
|
+
showRetry: { control: 'boolean' },
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
</script>
|
|
19
|
+
|
|
20
|
+
<script>
|
|
21
|
+
let loading = $state(true);
|
|
22
|
+
let hasError = $state(false);
|
|
23
|
+
|
|
24
|
+
function simulateLoading() {
|
|
25
|
+
loading = true;
|
|
26
|
+
hasError = false;
|
|
27
|
+
setTimeout(() => {
|
|
28
|
+
loading = false;
|
|
29
|
+
}, 2000);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function simulateError() {
|
|
33
|
+
loading = true;
|
|
34
|
+
hasError = false;
|
|
35
|
+
setTimeout(() => {
|
|
36
|
+
loading = false;
|
|
37
|
+
hasError = true;
|
|
38
|
+
}, 1000);
|
|
39
|
+
}
|
|
40
|
+
</script>
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
<Story
|
|
44
|
+
name="Loading State"
|
|
45
|
+
args={{
|
|
46
|
+
isLoading: true,
|
|
47
|
+
error: null,
|
|
48
|
+
}}
|
|
49
|
+
/>
|
|
50
|
+
|
|
51
|
+
<Story
|
|
52
|
+
name="Loading with Message"
|
|
53
|
+
args={{
|
|
54
|
+
isLoading: true,
|
|
55
|
+
error: null,
|
|
56
|
+
loadingMessage: 'Fetching your data...',
|
|
57
|
+
}}
|
|
58
|
+
/>
|
|
59
|
+
|
|
60
|
+
<Story
|
|
61
|
+
name="Error State"
|
|
62
|
+
args={{
|
|
63
|
+
isLoading: false,
|
|
64
|
+
error: 'Failed to load data. Please try again.',
|
|
65
|
+
errorTitle: 'Loading Failed',
|
|
66
|
+
}}
|
|
67
|
+
/>
|
|
68
|
+
|
|
69
|
+
<Story
|
|
70
|
+
name="Error with Retry"
|
|
71
|
+
args={{
|
|
72
|
+
isLoading: false,
|
|
73
|
+
error: 'Network connection failed',
|
|
74
|
+
errorTitle: 'Connection Error',
|
|
75
|
+
showRetry: true,
|
|
76
|
+
onRetry: () => alert('Retrying...'),
|
|
77
|
+
}}
|
|
78
|
+
/>
|
|
79
|
+
|
|
80
|
+
<Story
|
|
81
|
+
name="Content Loaded"
|
|
82
|
+
args={{
|
|
83
|
+
isLoading: false,
|
|
84
|
+
error: null,
|
|
85
|
+
}}
|
|
86
|
+
/>
|
|
87
|
+
|
|
88
|
+
<Story name="Interactive Loading">
|
|
89
|
+
<div class="space-y-4">
|
|
90
|
+
<div class="flex gap-2">
|
|
91
|
+
<button
|
|
92
|
+
class="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600"
|
|
93
|
+
onclick={simulateLoading}
|
|
94
|
+
>
|
|
95
|
+
Simulate Loading
|
|
96
|
+
</button>
|
|
97
|
+
<button
|
|
98
|
+
class="px-4 py-2 bg-red-500 text-white rounded hover:bg-red-600"
|
|
99
|
+
onclick={simulateError}
|
|
100
|
+
>
|
|
101
|
+
Simulate Error
|
|
102
|
+
</button>
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
<PageLoader
|
|
106
|
+
isLoading={loading}
|
|
107
|
+
error={hasError ? 'Failed to load content' : null}
|
|
108
|
+
loadingMessage="Please wait..."
|
|
109
|
+
showRetry={true}
|
|
110
|
+
onRetry={simulateLoading}
|
|
111
|
+
>
|
|
112
|
+
<div class="p-8 bg-green-50 rounded-lg">
|
|
113
|
+
<h3 class="text-xl font-bold text-green-800">Success!</h3>
|
|
114
|
+
<p class="text-green-600 mt-2">Your content has loaded successfully.</p>
|
|
115
|
+
</div>
|
|
116
|
+
</PageLoader>
|
|
117
|
+
</div>
|
|
118
|
+
</Story>
|
|
119
|
+
|
|
120
|
+
<Story name="Different Heights">
|
|
121
|
+
<div class="space-y-8">
|
|
122
|
+
<div class="border rounded p-4">
|
|
123
|
+
<h4 class="font-semibold mb-2">Small (h-32)</h4>
|
|
124
|
+
<PageLoader isLoading={true} minHeight="h-32" />
|
|
125
|
+
</div>
|
|
126
|
+
|
|
127
|
+
<div class="border rounded p-4">
|
|
128
|
+
<h4 class="font-semibold mb-2">Medium (h-64 - default)</h4>
|
|
129
|
+
<PageLoader isLoading={true} />
|
|
130
|
+
</div>
|
|
131
|
+
|
|
132
|
+
<div class="border rounded p-4">
|
|
133
|
+
<h4 class="font-semibold mb-2">Large (h-96)</h4>
|
|
134
|
+
<PageLoader isLoading={true} minHeight="h-96" />
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
</Story>
|
|
@@ -27,27 +27,27 @@
|
|
|
27
27
|
children,
|
|
28
28
|
}: Props = $props();
|
|
29
29
|
</script>
|
|
30
|
-
|
|
31
|
-
{#if isLoading}
|
|
32
|
-
<div class="flex items-center justify-center {minHeight}">
|
|
33
|
-
<div class="text-center">
|
|
34
|
-
<Spinner />
|
|
35
|
-
{#if loadingMessage}
|
|
36
|
-
<p class={`mt-4 ${typography.textMuted}`}>{loadingMessage}</p>
|
|
37
|
-
{/if}
|
|
38
|
-
</div>
|
|
39
|
-
</div>
|
|
40
|
-
{:else if error}
|
|
41
|
-
<div class="p-4">
|
|
42
|
-
<Alert type="danger" title={errorTitle} message={error} />
|
|
43
|
-
{#if showRetry}
|
|
44
|
-
<div class="mt-4 text-center">
|
|
45
|
-
<Button variant="link" onclick={onRetry}>
|
|
46
|
-
Try again
|
|
47
|
-
</Button>
|
|
48
|
-
</div>
|
|
49
|
-
{/if}
|
|
50
|
-
</div>
|
|
51
|
-
{:else}
|
|
52
|
-
{@render children?.()}
|
|
53
|
-
{/if}
|
|
30
|
+
|
|
31
|
+
{#if isLoading}
|
|
32
|
+
<div class="flex items-center justify-center {minHeight}">
|
|
33
|
+
<div class="text-center">
|
|
34
|
+
<Spinner />
|
|
35
|
+
{#if loadingMessage}
|
|
36
|
+
<p class={`mt-4 ${typography.textMuted}`}>{loadingMessage}</p>
|
|
37
|
+
{/if}
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
{:else if error}
|
|
41
|
+
<div class="p-4">
|
|
42
|
+
<Alert type="danger" title={errorTitle} message={error} />
|
|
43
|
+
{#if showRetry}
|
|
44
|
+
<div class="mt-4 text-center">
|
|
45
|
+
<Button variant="link" onclick={onRetry}>
|
|
46
|
+
Try again
|
|
47
|
+
</Button>
|
|
48
|
+
</div>
|
|
49
|
+
{/if}
|
|
50
|
+
</div>
|
|
51
|
+
{:else}
|
|
52
|
+
{@render children?.()}
|
|
53
|
+
{/if}
|
|
@@ -20,32 +20,32 @@
|
|
|
20
20
|
actions,
|
|
21
21
|
}: Props = $props();
|
|
22
22
|
</script>
|
|
23
|
-
|
|
24
|
-
<div class={className}>
|
|
25
|
-
{#if divider}
|
|
26
|
-
<hr class="border-gray-200 dark:border-gray-700 mb-4" />
|
|
27
|
-
{/if}
|
|
28
|
-
|
|
29
|
-
<div class="flex items-center justify-between gap-4">
|
|
30
|
-
<div class="flex items-center gap-2">
|
|
31
|
-
{#if title}
|
|
32
|
-
<h2 class={typography.h3}>{title}</h2>
|
|
33
|
-
{/if}
|
|
34
|
-
{#if count !== null}
|
|
35
|
-
<span class={`inline-flex items-center justify-center px-2 py-0.5 ${typography.xsMuted} bg-gray-100 dark:bg-gray-700 rounded-full`}>
|
|
36
|
-
{count}
|
|
37
|
-
</span>
|
|
38
|
-
{/if}
|
|
39
|
-
</div>
|
|
40
|
-
|
|
41
|
-
{#if actions}
|
|
42
|
-
<div class="flex items-center gap-2">
|
|
43
|
-
{@render actions()}
|
|
44
|
-
</div>
|
|
45
|
-
{/if}
|
|
46
|
-
</div>
|
|
47
|
-
|
|
48
|
-
{#if description}
|
|
49
|
-
<p class={`mt-1 ${typography.smMuted}`}>{description}</p>
|
|
50
|
-
{/if}
|
|
51
|
-
</div>
|
|
23
|
+
|
|
24
|
+
<div class={className}>
|
|
25
|
+
{#if divider}
|
|
26
|
+
<hr class="border-gray-200 dark:border-gray-700 mb-4" />
|
|
27
|
+
{/if}
|
|
28
|
+
|
|
29
|
+
<div class="flex items-center justify-between gap-4">
|
|
30
|
+
<div class="flex items-center gap-2">
|
|
31
|
+
{#if title}
|
|
32
|
+
<h2 class={typography.h3}>{title}</h2>
|
|
33
|
+
{/if}
|
|
34
|
+
{#if count !== null}
|
|
35
|
+
<span class={`inline-flex items-center justify-center px-2 py-0.5 ${typography.xsMuted} bg-gray-100 dark:bg-gray-700 rounded-full`}>
|
|
36
|
+
{count}
|
|
37
|
+
</span>
|
|
38
|
+
{/if}
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
{#if actions}
|
|
42
|
+
<div class="flex items-center gap-2">
|
|
43
|
+
{@render actions()}
|
|
44
|
+
</div>
|
|
45
|
+
{/if}
|
|
46
|
+
</div>
|
|
47
|
+
|
|
48
|
+
{#if description}
|
|
49
|
+
<p class={`mt-1 ${typography.smMuted}`}>{description}</p>
|
|
50
|
+
{/if}
|
|
51
|
+
</div>
|