@getmicdrop/svelte-components 5.3.12 → 5.3.13
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 +145 -145
- package/dist/calendar/ShowCard/ShowCard.svelte +157 -157
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +61 -61
- package/dist/components/Layout/Grid.svelte +109 -109
- package/dist/components/Layout/Section.svelte +80 -80
- package/dist/components/Layout/Sidebar.svelte +108 -108
- package/dist/components/Layout/Stack.svelte +90 -90
- package/dist/constants/formOptions.js +26 -26
- package/dist/constants/validation.js +91 -91
- package/dist/constants/validation.spec.js +64 -64
- package/dist/datetime/__tests__/format.test.d.ts +2 -0
- package/dist/datetime/__tests__/format.test.d.ts.map +1 -0
- package/dist/datetime/__tests__/format.test.js +268 -0
- package/dist/datetime/__tests__/integration.test.d.ts +2 -0
- package/dist/datetime/__tests__/integration.test.d.ts.map +1 -0
- package/dist/datetime/__tests__/integration.test.js +243 -0
- package/dist/datetime/__tests__/parse.test.d.ts +2 -0
- package/dist/datetime/__tests__/parse.test.d.ts.map +1 -0
- package/dist/datetime/__tests__/parse.test.js +261 -0
- package/dist/datetime/__tests__/timezone.test.d.ts +2 -0
- package/dist/datetime/__tests__/timezone.test.d.ts.map +1 -0
- package/dist/datetime/__tests__/timezone.test.js +214 -0
- package/dist/datetime/constants.d.ts +133 -0
- package/dist/datetime/constants.d.ts.map +1 -0
- package/dist/datetime/constants.js +112 -0
- package/dist/datetime/format.d.ts +158 -0
- package/dist/datetime/format.d.ts.map +1 -0
- package/dist/datetime/format.js +315 -0
- package/dist/datetime/index.d.ts +42 -0
- package/dist/datetime/index.d.ts.map +1 -0
- package/dist/datetime/index.js +44 -0
- package/dist/datetime/parse.d.ts +149 -0
- package/dist/datetime/parse.d.ts.map +1 -0
- package/dist/datetime/parse.js +276 -0
- package/dist/datetime/timezone.d.ts +95 -0
- package/dist/datetime/timezone.d.ts.map +1 -0
- package/dist/datetime/timezone.js +241 -0
- package/dist/datetime/types.d.ts +105 -0
- package/dist/datetime/types.d.ts.map +1 -0
- package/dist/datetime/types.js +31 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +232 -218
- package/dist/patterns/data/DataGrid.svelte +45 -45
- package/dist/patterns/data/DataList.svelte +24 -24
- package/dist/patterns/data/DataTable.svelte +40 -40
- 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.spec.js +203 -203
- package/dist/patterns/forms/FormValidationSummary.stories.svelte +97 -97
- package/dist/patterns/forms/FormValidationSummary.svelte +67 -67
- package/dist/patterns/layout/Grid.svelte +35 -35
- package/dist/patterns/layout/Sidebar.svelte +39 -39
- package/dist/patterns/layout/Stack.svelte +45 -45
- package/dist/patterns/navigation/BottomNav.spec.js +130 -130
- package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
- package/dist/patterns/navigation/BottomNav.svelte +54 -54
- package/dist/patterns/navigation/Header.spec.js +203 -203
- package/dist/patterns/navigation/Header.stories.svelte +77 -77
- package/dist/patterns/navigation/Header.svelte +240 -240
- package/dist/patterns/page/PageHeader.svelte +36 -36
- 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 +41 -41
- package/dist/patterns/page/SectionHeader.svelte +41 -41
- 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 +61 -61
- 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 +65 -65
- 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 +142 -142
- 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 +301 -301
- 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 +100 -100
- package/dist/primitives/Drawer/Drawer.svelte +214 -214
- package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
- package/dist/primitives/Dropdown/Dropdown.svelte +148 -148
- package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
- package/dist/primitives/Icons/ArrowLeft.svelte +20 -20
- package/dist/primitives/Icons/ArrowRight.svelte +20 -20
- package/dist/primitives/Icons/Availability.svelte +26 -26
- package/dist/primitives/Icons/Back.svelte +26 -26
- package/dist/primitives/Icons/CheckCircle.svelte +18 -18
- package/dist/primitives/Icons/CheckCircleOutline.svelte +27 -27
- package/dist/primitives/Icons/ChevronLeft.svelte +16 -16
- package/dist/primitives/Icons/ChevronRight.svelte +16 -16
- package/dist/primitives/Icons/Copy.svelte +27 -27
- package/dist/primitives/Icons/Cross.svelte +17 -17
- package/dist/primitives/Icons/DownArrow.svelte +20 -20
- package/dist/primitives/Icons/ErrorCircle.svelte +18 -18
- package/dist/primitives/Icons/FacebookIcon.svelte +13 -13
- package/dist/primitives/Icons/Home.svelte +27 -27
- package/dist/primitives/Icons/Icon.spec.js +175 -175
- package/dist/primitives/Icons/Icon.stories.svelte +100 -100
- package/dist/primitives/Icons/Icon.svelte +63 -63
- package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
- package/dist/primitives/Icons/ImageOutline.svelte +19 -19
- package/dist/primitives/Icons/Info.svelte +19 -19
- package/dist/primitives/Icons/InstagramIcon.svelte +19 -19
- package/dist/primitives/Icons/LogoInstagram.svelte +15 -15
- package/dist/primitives/Icons/Message.svelte +27 -27
- package/dist/primitives/Icons/MoonIcon.svelte +16 -16
- package/dist/primitives/Icons/More.svelte +33 -33
- package/dist/primitives/Icons/MoreHori.spec.js +67 -67
- package/dist/primitives/Icons/MoreHori.svelte +34 -34
- package/dist/primitives/Icons/Notification.svelte +26 -26
- package/dist/primitives/Icons/Payment.svelte +26 -26
- package/dist/primitives/Icons/Profile.svelte +33 -33
- package/dist/primitives/Icons/Reload.svelte +41 -41
- package/dist/primitives/Icons/Shows.svelte +33 -33
- package/dist/primitives/Icons/Signout.svelte +33 -33
- package/dist/primitives/Icons/SunIcon.svelte +19 -19
- package/dist/primitives/Icons/TiktokIcon.svelte +13 -13
- package/dist/primitives/Icons/TrashBinOutline.svelte +19 -19
- package/dist/primitives/Icons/TwitterIcon.svelte +13 -13
- package/dist/primitives/Icons/WarningIcon.spec.js +30 -30
- package/dist/primitives/Icons/WarningIcon.svelte +24 -24
- package/dist/primitives/Input/Input.spec.js +573 -573
- package/dist/primitives/Input/Input.stories.svelte +139 -139
- package/dist/primitives/Input/Input.svelte +444 -444
- package/dist/primitives/Input/Select.spec.js +218 -218
- package/dist/primitives/Input/Select.stories.svelte +112 -112
- package/dist/primitives/Input/Select.svelte +232 -232
- package/dist/primitives/Input/Textarea.stories.svelte +137 -137
- package/dist/primitives/Input/Textarea.svelte +79 -79
- 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/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 +52 -52
- package/dist/primitives/Spinner/Spinner.spec.js +75 -75
- package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
- package/dist/primitives/Spinner/Spinner.svelte +57 -57
- package/dist/primitives/Tabs/TabItem.svelte +51 -51
- package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
- package/dist/primitives/Tabs/Tabs.svelte +128 -128
- 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 +111 -111
- 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 +980 -980
- package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
- package/dist/recipes/feedback/EmptyState/EmptyState.svelte +47 -47
- package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
- package/dist/recipes/feedback/ErrorDisplay.stories.svelte +112 -112
- package/dist/recipes/feedback/ErrorDisplay.svelte +38 -38
- package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +129 -129
- package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +167 -167
- package/dist/recipes/fields/CheckboxField.svelte +85 -85
- package/dist/recipes/fields/FormField.svelte +58 -58
- package/dist/recipes/fields/RadioGroup.svelte +95 -95
- package/dist/recipes/fields/SelectField.svelte +82 -82
- package/dist/recipes/fields/TextareaField.svelte +101 -101
- package/dist/recipes/fields/ToggleField.svelte +60 -60
- package/dist/recipes/fields/index.js +7 -7
- package/dist/recipes/inputs/MultiSelect.spec.js +257 -257
- package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
- package/dist/recipes/inputs/MultiSelect.svelte +244 -244
- package/dist/recipes/inputs/OTPInput.spec.js +238 -238
- package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
- package/dist/recipes/inputs/OTPInput.svelte +102 -102
- package/dist/recipes/inputs/PasswordInput.svelte +100 -100
- package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.spec.js +173 -173
- package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +108 -108
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.spec.js +300 -300
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +165 -165
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +337 -337
- package/dist/recipes/inputs/Search.svelte +85 -85
- package/dist/recipes/inputs/SelectDropdown.svelte +161 -161
- 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 +93 -6
- package/dist/stores/auth.spec.js +310 -2
- 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 +388 -388
- package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
- package/dist/stories/PrimitivesGallery.svelte +752 -752
- package/dist/stories/RecipesGallery.stories.svelte +19 -19
- package/dist/stories/RecipesGallery.svelte +441 -441
- package/dist/stories/button-audit-manifest.json +11186 -11186
- package/dist/tailwind/preset.cjs +82 -82
- package/dist/telemetry.js +357 -357
- package/dist/tokens/tokens.css +87 -87
- package/dist/utils/apiConfig.js +49 -49
- package/dist/utils/utils.js +9 -1
- package/package.json +233 -191
|
@@ -1,111 +1,111 @@
|
|
|
1
|
-
<script module>
|
|
2
|
-
import { defineMeta } from "@storybook/addon-svelte-csf";
|
|
3
|
-
|
|
4
|
-
import ValidationError from './ValidationError.svelte';
|
|
5
|
-
|
|
6
|
-
const { Story } = defineMeta({
|
|
7
|
-
title: 'Components/ValidationError',
|
|
8
|
-
component: ValidationError,
|
|
9
|
-
tags: ['autodocs'],
|
|
10
|
-
argTypes: {
|
|
11
|
-
error: { control: 'text' },
|
|
12
|
-
show: { control: 'boolean' },
|
|
13
|
-
id: { control: 'text' },
|
|
14
|
-
},
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
</script>
|
|
18
|
-
|
|
19
|
-
<script>
|
|
20
|
-
</script>
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
<Story
|
|
24
|
-
name="Default"
|
|
25
|
-
args={{
|
|
26
|
-
error: 'This field is required',
|
|
27
|
-
show: true,
|
|
28
|
-
}}
|
|
29
|
-
/>
|
|
30
|
-
|
|
31
|
-
<Story
|
|
32
|
-
name="Email Validation"
|
|
33
|
-
args={{
|
|
34
|
-
error: 'Please enter a valid email address',
|
|
35
|
-
show: true,
|
|
36
|
-
}}
|
|
37
|
-
/>
|
|
38
|
-
|
|
39
|
-
<Story
|
|
40
|
-
name="Password Validation"
|
|
41
|
-
args={{
|
|
42
|
-
error: 'Password must be at least 8 characters',
|
|
43
|
-
show: true,
|
|
44
|
-
}}
|
|
45
|
-
/>
|
|
46
|
-
|
|
47
|
-
<Story name="With Input Field">
|
|
48
|
-
<div class="max-w-md">
|
|
49
|
-
<label class="block text-sm font-medium mb-1">Email Address</label>
|
|
50
|
-
<input
|
|
51
|
-
type="email"
|
|
52
|
-
class="w-full px-3 py-2 border border-red-300 rounded"
|
|
53
|
-
value="invalid-email"
|
|
54
|
-
/>
|
|
55
|
-
<ValidationError error="Please enter a valid email address" show={true} />
|
|
56
|
-
</div>
|
|
57
|
-
</Story>
|
|
58
|
-
|
|
59
|
-
<Story name="Multiple Validation Errors">
|
|
60
|
-
<div class="max-w-md space-y-4">
|
|
61
|
-
<div>
|
|
62
|
-
<label class="block text-sm font-medium mb-1">Username</label>
|
|
63
|
-
<input type="text" class="w-full px-3 py-2 border border-red-300 rounded" />
|
|
64
|
-
<ValidationError error="Username is required" show={true} />
|
|
65
|
-
</div>
|
|
66
|
-
|
|
67
|
-
<div>
|
|
68
|
-
<label class="block text-sm font-medium mb-1">Email</label>
|
|
69
|
-
<input type="email" class="w-full px-3 py-2 border border-red-300 rounded" />
|
|
70
|
-
<ValidationError error="Invalid email format" show={true} />
|
|
71
|
-
</div>
|
|
72
|
-
|
|
73
|
-
<div>
|
|
74
|
-
<label class="block text-sm font-medium mb-1">Password</label>
|
|
75
|
-
<input type="password" class="w-full px-3 py-2 border border-red-300 rounded" />
|
|
76
|
-
<ValidationError error="Password must contain at least one number" show={true} />
|
|
77
|
-
</div>
|
|
78
|
-
</div>
|
|
79
|
-
</Story>
|
|
80
|
-
|
|
81
|
-
<Story name="Hidden State">
|
|
82
|
-
<div class="max-w-md">
|
|
83
|
-
<label class="block text-sm font-medium mb-1">Email</label>
|
|
84
|
-
<input type="email" class="w-full px-3 py-2 border border-gray-300 rounded" />
|
|
85
|
-
<ValidationError error="This error is hidden" show={false} />
|
|
86
|
-
<p class="text-sm text-gray-500 dark:text-gray-400 mt-2">Validation error is hidden until field is touched</p>
|
|
87
|
-
</div>
|
|
88
|
-
</Story>
|
|
89
|
-
|
|
90
|
-
<Story name="Accessible with aria-describedby">
|
|
91
|
-
<div class="max-w-md">
|
|
92
|
-
<label for="accessible-email" class="block text-sm font-medium mb-1">Email Address</label>
|
|
93
|
-
<input
|
|
94
|
-
id="accessible-email"
|
|
95
|
-
type="email"
|
|
96
|
-
aria-describedby="email-error"
|
|
97
|
-
aria-invalid="true"
|
|
98
|
-
class="w-full px-3 py-2 border border-red-300 rounded focus:ring-red-500 focus:border-red-500"
|
|
99
|
-
value="invalid-email"
|
|
100
|
-
/>
|
|
101
|
-
<ValidationError
|
|
102
|
-
id="email-error"
|
|
103
|
-
error="Please enter a valid email address"
|
|
104
|
-
show={true}
|
|
105
|
-
/>
|
|
106
|
-
<p class="text-sm text-gray-500 mt-4">
|
|
107
|
-
This example shows proper accessibility: the input references the error via aria-describedby,
|
|
108
|
-
and the error has aria-live="assertive" for screen reader announcements.
|
|
109
|
-
</p>
|
|
110
|
-
</div>
|
|
111
|
-
</Story>
|
|
1
|
+
<script module>
|
|
2
|
+
import { defineMeta } from "@storybook/addon-svelte-csf";
|
|
3
|
+
|
|
4
|
+
import ValidationError from './ValidationError.svelte';
|
|
5
|
+
|
|
6
|
+
const { Story } = defineMeta({
|
|
7
|
+
title: 'Components/ValidationError',
|
|
8
|
+
component: ValidationError,
|
|
9
|
+
tags: ['autodocs'],
|
|
10
|
+
argTypes: {
|
|
11
|
+
error: { control: 'text' },
|
|
12
|
+
show: { control: 'boolean' },
|
|
13
|
+
id: { control: 'text' },
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<script>
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
<Story
|
|
24
|
+
name="Default"
|
|
25
|
+
args={{
|
|
26
|
+
error: 'This field is required',
|
|
27
|
+
show: true,
|
|
28
|
+
}}
|
|
29
|
+
/>
|
|
30
|
+
|
|
31
|
+
<Story
|
|
32
|
+
name="Email Validation"
|
|
33
|
+
args={{
|
|
34
|
+
error: 'Please enter a valid email address',
|
|
35
|
+
show: true,
|
|
36
|
+
}}
|
|
37
|
+
/>
|
|
38
|
+
|
|
39
|
+
<Story
|
|
40
|
+
name="Password Validation"
|
|
41
|
+
args={{
|
|
42
|
+
error: 'Password must be at least 8 characters',
|
|
43
|
+
show: true,
|
|
44
|
+
}}
|
|
45
|
+
/>
|
|
46
|
+
|
|
47
|
+
<Story name="With Input Field">
|
|
48
|
+
<div class="max-w-md">
|
|
49
|
+
<label class="block text-sm font-medium mb-1">Email Address</label>
|
|
50
|
+
<input
|
|
51
|
+
type="email"
|
|
52
|
+
class="w-full px-3 py-2 border border-red-300 rounded"
|
|
53
|
+
value="invalid-email"
|
|
54
|
+
/>
|
|
55
|
+
<ValidationError error="Please enter a valid email address" show={true} />
|
|
56
|
+
</div>
|
|
57
|
+
</Story>
|
|
58
|
+
|
|
59
|
+
<Story name="Multiple Validation Errors">
|
|
60
|
+
<div class="max-w-md space-y-4">
|
|
61
|
+
<div>
|
|
62
|
+
<label class="block text-sm font-medium mb-1">Username</label>
|
|
63
|
+
<input type="text" class="w-full px-3 py-2 border border-red-300 rounded" />
|
|
64
|
+
<ValidationError error="Username is required" show={true} />
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
<div>
|
|
68
|
+
<label class="block text-sm font-medium mb-1">Email</label>
|
|
69
|
+
<input type="email" class="w-full px-3 py-2 border border-red-300 rounded" />
|
|
70
|
+
<ValidationError error="Invalid email format" show={true} />
|
|
71
|
+
</div>
|
|
72
|
+
|
|
73
|
+
<div>
|
|
74
|
+
<label class="block text-sm font-medium mb-1">Password</label>
|
|
75
|
+
<input type="password" class="w-full px-3 py-2 border border-red-300 rounded" />
|
|
76
|
+
<ValidationError error="Password must contain at least one number" show={true} />
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
</Story>
|
|
80
|
+
|
|
81
|
+
<Story name="Hidden State">
|
|
82
|
+
<div class="max-w-md">
|
|
83
|
+
<label class="block text-sm font-medium mb-1">Email</label>
|
|
84
|
+
<input type="email" class="w-full px-3 py-2 border border-gray-300 rounded" />
|
|
85
|
+
<ValidationError error="This error is hidden" show={false} />
|
|
86
|
+
<p class="text-sm text-gray-500 dark:text-gray-400 mt-2">Validation error is hidden until field is touched</p>
|
|
87
|
+
</div>
|
|
88
|
+
</Story>
|
|
89
|
+
|
|
90
|
+
<Story name="Accessible with aria-describedby">
|
|
91
|
+
<div class="max-w-md">
|
|
92
|
+
<label for="accessible-email" class="block text-sm font-medium mb-1">Email Address</label>
|
|
93
|
+
<input
|
|
94
|
+
id="accessible-email"
|
|
95
|
+
type="email"
|
|
96
|
+
aria-describedby="email-error"
|
|
97
|
+
aria-invalid="true"
|
|
98
|
+
class="w-full px-3 py-2 border border-red-300 rounded focus:ring-red-500 focus:border-red-500"
|
|
99
|
+
value="invalid-email"
|
|
100
|
+
/>
|
|
101
|
+
<ValidationError
|
|
102
|
+
id="email-error"
|
|
103
|
+
error="Please enter a valid email address"
|
|
104
|
+
show={true}
|
|
105
|
+
/>
|
|
106
|
+
<p class="text-sm text-gray-500 mt-4">
|
|
107
|
+
This example shows proper accessibility: the input references the error via aria-describedby,
|
|
108
|
+
and the error has aria-live="assertive" for screen reader announcements.
|
|
109
|
+
</p>
|
|
110
|
+
</div>
|
|
111
|
+
</Story>
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { slide } from "svelte/transition";
|
|
3
|
-
import { cubicOut } from "svelte/easing";
|
|
4
|
-
import WarningIcon from "./Icons/WarningIcon.svelte";
|
|
5
|
-
|
|
6
|
-
interface Props {
|
|
7
|
-
/** Error message to display */
|
|
8
|
-
error?: string;
|
|
9
|
-
/** Whether to show the error */
|
|
10
|
-
show?: boolean;
|
|
11
|
-
/** Optional ID for aria-describedby linking from input fields */
|
|
12
|
-
id?: string;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
let { error = '', show = true, id }: Props = $props();
|
|
16
|
-
</script>
|
|
17
|
-
|
|
18
|
-
{#if error && show}
|
|
19
|
-
<div
|
|
20
|
-
transition:slide={{ duration: 300, easing: cubicOut }}
|
|
21
|
-
class="flex items-start gap-1.5 text-red-600 dark:text-red-500 mt-2"
|
|
22
|
-
role="alert"
|
|
23
|
-
aria-live="assertive"
|
|
24
|
-
{id}
|
|
25
|
-
>
|
|
26
|
-
<WarningIcon className="shrink-0 mt-[1px]" />
|
|
27
|
-
<p class="text-sm leading-tight m-0">{error}</p>
|
|
28
|
-
</div>
|
|
29
|
-
{/if}
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { slide } from "svelte/transition";
|
|
3
|
+
import { cubicOut } from "svelte/easing";
|
|
4
|
+
import WarningIcon from "./Icons/WarningIcon.svelte";
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
/** Error message to display */
|
|
8
|
+
error?: string;
|
|
9
|
+
/** Whether to show the error */
|
|
10
|
+
show?: boolean;
|
|
11
|
+
/** Optional ID for aria-describedby linking from input fields */
|
|
12
|
+
id?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let { error = '', show = true, id }: Props = $props();
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
{#if error && show}
|
|
19
|
+
<div
|
|
20
|
+
transition:slide={{ duration: 300, easing: cubicOut }}
|
|
21
|
+
class="flex items-start gap-1.5 text-red-600 dark:text-red-500 mt-2"
|
|
22
|
+
role="alert"
|
|
23
|
+
aria-live="assertive"
|
|
24
|
+
{id}
|
|
25
|
+
>
|
|
26
|
+
<WarningIcon className="shrink-0 mt-[1px]" />
|
|
27
|
+
<p class="text-sm leading-tight m-0">{error}</p>
|
|
28
|
+
</div>
|
|
29
|
+
{/if}
|