@getmicdrop/svelte-components 5.5.0 → 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 -1
- package/dist/index.js +226 -226
- 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,162 +1,162 @@
|
|
|
1
|
-
<script module>
|
|
2
|
-
import { defineMeta } from "@storybook/addon-svelte-csf";
|
|
3
|
-
|
|
4
|
-
import OTPInput from './OTPInput.svelte';
|
|
5
|
-
|
|
6
|
-
const { Story } = defineMeta({
|
|
7
|
-
title: 'Components/Input/OTPInput',
|
|
8
|
-
component: OTPInput,
|
|
9
|
-
tags: ['autodocs'],
|
|
10
|
-
argTypes: {
|
|
11
|
-
length: {
|
|
12
|
-
control: { type: 'number', min: 4, max: 8 },
|
|
13
|
-
description: 'Number of digits in the OTP',
|
|
14
|
-
},
|
|
15
|
-
disabled: {
|
|
16
|
-
control: 'boolean',
|
|
17
|
-
description: 'Disable all inputs',
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
});
|
|
21
|
-
</script>
|
|
22
|
-
|
|
23
|
-
<script>
|
|
24
|
-
let code = $state(['', '', '', '', '', '']);
|
|
25
|
-
let code4 = $state(['', '', '', '']);
|
|
26
|
-
let code8 = $state(['', '', '', '', '', '', '', '']);
|
|
27
|
-
let completedCode = $state('');
|
|
28
|
-
let otpRef = $state(null);
|
|
29
|
-
|
|
30
|
-
function handleComplete(event) {
|
|
31
|
-
completedCode = event.code;
|
|
32
|
-
console.log('OTP Complete:', event.code);
|
|
33
|
-
}
|
|
34
|
-
</script>
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
<Story
|
|
38
|
-
name="Default (6 digits)"
|
|
39
|
-
args={{
|
|
40
|
-
value: ['', '', '', '', '', ''],
|
|
41
|
-
length: 6,
|
|
42
|
-
disabled: false,
|
|
43
|
-
}}
|
|
44
|
-
/>
|
|
45
|
-
|
|
46
|
-
<Story
|
|
47
|
-
name="Four Digits"
|
|
48
|
-
args={{
|
|
49
|
-
value: ['', '', '', ''],
|
|
50
|
-
length: 4,
|
|
51
|
-
disabled: false,
|
|
52
|
-
}}
|
|
53
|
-
/>
|
|
54
|
-
|
|
55
|
-
<Story
|
|
56
|
-
name="Eight Digits"
|
|
57
|
-
args={{
|
|
58
|
-
value: ['', '', '', '', '', '', '', ''],
|
|
59
|
-
length: 8,
|
|
60
|
-
disabled: false,
|
|
61
|
-
}}
|
|
62
|
-
/>
|
|
63
|
-
|
|
64
|
-
<Story
|
|
65
|
-
name="Pre-filled"
|
|
66
|
-
args={{
|
|
67
|
-
value: ['1', '2', '3', '4', '5', '6'],
|
|
68
|
-
length: 6,
|
|
69
|
-
disabled: false,
|
|
70
|
-
}}
|
|
71
|
-
/>
|
|
72
|
-
|
|
73
|
-
<Story
|
|
74
|
-
name="Disabled"
|
|
75
|
-
args={{
|
|
76
|
-
value: ['1', '2', '3', '4', '5', '6'],
|
|
77
|
-
length: 6,
|
|
78
|
-
disabled: true,
|
|
79
|
-
}}
|
|
80
|
-
/>
|
|
81
|
-
|
|
82
|
-
<Story name="Interactive">
|
|
83
|
-
<div class="max-w-md space-y-6">
|
|
84
|
-
<div>
|
|
85
|
-
<h3 class="text-lg font-semibold mb-2">Enter Verification Code</h3>
|
|
86
|
-
<p class="text-sm text-gray-500 dark:text-gray-400 mb-4">
|
|
87
|
-
Enter the 6-digit code sent to your phone
|
|
88
|
-
</p>
|
|
89
|
-
<OTPInput
|
|
90
|
-
bind:value={code}
|
|
91
|
-
bind:this={otpRef}
|
|
92
|
-
oncomplete={handleComplete}
|
|
93
|
-
onchange={(e) => console.log('Changed:', e.code)}
|
|
94
|
-
/>
|
|
95
|
-
</div>
|
|
96
|
-
|
|
97
|
-
{#if completedCode}
|
|
98
|
-
<div class="p-4 bg-green-50 border border-green-200 rounded">
|
|
99
|
-
<p class="text-sm font-medium text-green-800">
|
|
100
|
-
Code entered: {completedCode}
|
|
101
|
-
</p>
|
|
102
|
-
</div>
|
|
103
|
-
{/if}
|
|
104
|
-
|
|
105
|
-
<div class="flex gap-2">
|
|
106
|
-
<button
|
|
107
|
-
class="px-4 py-2 bg-blue-500 text-white rounded hover:bg-primary"
|
|
108
|
-
onclick={() => otpRef?.focus()}
|
|
109
|
-
>
|
|
110
|
-
Focus First Input
|
|
111
|
-
</button>
|
|
112
|
-
<button
|
|
113
|
-
class="px-4 py-2 bg-gray-500 text-white rounded hover:bg-gray-600"
|
|
114
|
-
onclick={() => {
|
|
115
|
-
otpRef?.clear();
|
|
116
|
-
completedCode = '';
|
|
117
|
-
}}
|
|
118
|
-
>
|
|
119
|
-
Clear
|
|
120
|
-
</button>
|
|
121
|
-
</div>
|
|
122
|
-
</div>
|
|
123
|
-
</Story>
|
|
124
|
-
|
|
125
|
-
<Story name="Verification Flow">
|
|
126
|
-
<div class="max-w-md mx-auto p-6 bg-white dark:bg-gray-900 rounded-lg shadow-lg">
|
|
127
|
-
<div class="text-center mb-6">
|
|
128
|
-
<h2 class="text-2xl font-bold mb-2">Verify Your Phone</h2>
|
|
129
|
-
<p class="text-gray-500 dark:text-gray-400">
|
|
130
|
-
We've sent a 4-digit code to<br />
|
|
131
|
-
<span class="font-medium">+1 (555) 123-4567</span>
|
|
132
|
-
</p>
|
|
133
|
-
</div>
|
|
134
|
-
|
|
135
|
-
<div class="mb-6">
|
|
136
|
-
<OTPInput
|
|
137
|
-
bind:value={code4}
|
|
138
|
-
length={4}
|
|
139
|
-
oncomplete={(e) => alert(`Verifying code: ${e.code}`)}
|
|
140
|
-
/>
|
|
141
|
-
</div>
|
|
142
|
-
|
|
143
|
-
<p class="text-center text-sm text-gray-500 dark:text-gray-400">
|
|
144
|
-
Didn't receive a code?
|
|
145
|
-
<button class="text-primary hover:underline">Resend</button>
|
|
146
|
-
</p>
|
|
147
|
-
</div>
|
|
148
|
-
</Story>
|
|
149
|
-
|
|
150
|
-
<Story name="With Auto-Submit">
|
|
151
|
-
<div class="max-w-md">
|
|
152
|
-
<p class="text-sm text-gray-500 dark:text-gray-400 mb-4">
|
|
153
|
-
Code will auto-submit when all digits are entered
|
|
154
|
-
</p>
|
|
155
|
-
<OTPInput
|
|
156
|
-
value={['', '', '', '', '', '']}
|
|
157
|
-
oncomplete={(e) => {
|
|
158
|
-
alert(`Auto-submitting code: ${e.code}`);
|
|
159
|
-
}}
|
|
160
|
-
/>
|
|
161
|
-
</div>
|
|
162
|
-
</Story>
|
|
1
|
+
<script module>
|
|
2
|
+
import { defineMeta } from "@storybook/addon-svelte-csf";
|
|
3
|
+
|
|
4
|
+
import OTPInput from './OTPInput.svelte';
|
|
5
|
+
|
|
6
|
+
const { Story } = defineMeta({
|
|
7
|
+
title: 'Components/Input/OTPInput',
|
|
8
|
+
component: OTPInput,
|
|
9
|
+
tags: ['autodocs'],
|
|
10
|
+
argTypes: {
|
|
11
|
+
length: {
|
|
12
|
+
control: { type: 'number', min: 4, max: 8 },
|
|
13
|
+
description: 'Number of digits in the OTP',
|
|
14
|
+
},
|
|
15
|
+
disabled: {
|
|
16
|
+
control: 'boolean',
|
|
17
|
+
description: 'Disable all inputs',
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<script>
|
|
24
|
+
let code = $state(['', '', '', '', '', '']);
|
|
25
|
+
let code4 = $state(['', '', '', '']);
|
|
26
|
+
let code8 = $state(['', '', '', '', '', '', '', '']);
|
|
27
|
+
let completedCode = $state('');
|
|
28
|
+
let otpRef = $state(null);
|
|
29
|
+
|
|
30
|
+
function handleComplete(event) {
|
|
31
|
+
completedCode = event.code;
|
|
32
|
+
console.log('OTP Complete:', event.code);
|
|
33
|
+
}
|
|
34
|
+
</script>
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
<Story
|
|
38
|
+
name="Default (6 digits)"
|
|
39
|
+
args={{
|
|
40
|
+
value: ['', '', '', '', '', ''],
|
|
41
|
+
length: 6,
|
|
42
|
+
disabled: false,
|
|
43
|
+
}}
|
|
44
|
+
/>
|
|
45
|
+
|
|
46
|
+
<Story
|
|
47
|
+
name="Four Digits"
|
|
48
|
+
args={{
|
|
49
|
+
value: ['', '', '', ''],
|
|
50
|
+
length: 4,
|
|
51
|
+
disabled: false,
|
|
52
|
+
}}
|
|
53
|
+
/>
|
|
54
|
+
|
|
55
|
+
<Story
|
|
56
|
+
name="Eight Digits"
|
|
57
|
+
args={{
|
|
58
|
+
value: ['', '', '', '', '', '', '', ''],
|
|
59
|
+
length: 8,
|
|
60
|
+
disabled: false,
|
|
61
|
+
}}
|
|
62
|
+
/>
|
|
63
|
+
|
|
64
|
+
<Story
|
|
65
|
+
name="Pre-filled"
|
|
66
|
+
args={{
|
|
67
|
+
value: ['1', '2', '3', '4', '5', '6'],
|
|
68
|
+
length: 6,
|
|
69
|
+
disabled: false,
|
|
70
|
+
}}
|
|
71
|
+
/>
|
|
72
|
+
|
|
73
|
+
<Story
|
|
74
|
+
name="Disabled"
|
|
75
|
+
args={{
|
|
76
|
+
value: ['1', '2', '3', '4', '5', '6'],
|
|
77
|
+
length: 6,
|
|
78
|
+
disabled: true,
|
|
79
|
+
}}
|
|
80
|
+
/>
|
|
81
|
+
|
|
82
|
+
<Story name="Interactive">
|
|
83
|
+
<div class="max-w-md space-y-6">
|
|
84
|
+
<div>
|
|
85
|
+
<h3 class="text-lg font-semibold mb-2">Enter Verification Code</h3>
|
|
86
|
+
<p class="text-sm text-gray-500 dark:text-gray-400 mb-4">
|
|
87
|
+
Enter the 6-digit code sent to your phone
|
|
88
|
+
</p>
|
|
89
|
+
<OTPInput
|
|
90
|
+
bind:value={code}
|
|
91
|
+
bind:this={otpRef}
|
|
92
|
+
oncomplete={handleComplete}
|
|
93
|
+
onchange={(e) => console.log('Changed:', e.code)}
|
|
94
|
+
/>
|
|
95
|
+
</div>
|
|
96
|
+
|
|
97
|
+
{#if completedCode}
|
|
98
|
+
<div class="p-4 bg-green-50 border border-green-200 rounded">
|
|
99
|
+
<p class="text-sm font-medium text-green-800">
|
|
100
|
+
Code entered: {completedCode}
|
|
101
|
+
</p>
|
|
102
|
+
</div>
|
|
103
|
+
{/if}
|
|
104
|
+
|
|
105
|
+
<div class="flex gap-2">
|
|
106
|
+
<button
|
|
107
|
+
class="px-4 py-2 bg-blue-500 text-white rounded hover:bg-primary"
|
|
108
|
+
onclick={() => otpRef?.focus()}
|
|
109
|
+
>
|
|
110
|
+
Focus First Input
|
|
111
|
+
</button>
|
|
112
|
+
<button
|
|
113
|
+
class="px-4 py-2 bg-gray-500 text-white rounded hover:bg-gray-600"
|
|
114
|
+
onclick={() => {
|
|
115
|
+
otpRef?.clear();
|
|
116
|
+
completedCode = '';
|
|
117
|
+
}}
|
|
118
|
+
>
|
|
119
|
+
Clear
|
|
120
|
+
</button>
|
|
121
|
+
</div>
|
|
122
|
+
</div>
|
|
123
|
+
</Story>
|
|
124
|
+
|
|
125
|
+
<Story name="Verification Flow">
|
|
126
|
+
<div class="max-w-md mx-auto p-6 bg-white dark:bg-gray-900 rounded-lg shadow-lg">
|
|
127
|
+
<div class="text-center mb-6">
|
|
128
|
+
<h2 class="text-2xl font-bold mb-2">Verify Your Phone</h2>
|
|
129
|
+
<p class="text-gray-500 dark:text-gray-400">
|
|
130
|
+
We've sent a 4-digit code to<br />
|
|
131
|
+
<span class="font-medium">+1 (555) 123-4567</span>
|
|
132
|
+
</p>
|
|
133
|
+
</div>
|
|
134
|
+
|
|
135
|
+
<div class="mb-6">
|
|
136
|
+
<OTPInput
|
|
137
|
+
bind:value={code4}
|
|
138
|
+
length={4}
|
|
139
|
+
oncomplete={(e) => alert(`Verifying code: ${e.code}`)}
|
|
140
|
+
/>
|
|
141
|
+
</div>
|
|
142
|
+
|
|
143
|
+
<p class="text-center text-sm text-gray-500 dark:text-gray-400">
|
|
144
|
+
Didn't receive a code?
|
|
145
|
+
<button class="text-primary hover:underline">Resend</button>
|
|
146
|
+
</p>
|
|
147
|
+
</div>
|
|
148
|
+
</Story>
|
|
149
|
+
|
|
150
|
+
<Story name="With Auto-Submit">
|
|
151
|
+
<div class="max-w-md">
|
|
152
|
+
<p class="text-sm text-gray-500 dark:text-gray-400 mb-4">
|
|
153
|
+
Code will auto-submit when all digits are entered
|
|
154
|
+
</p>
|
|
155
|
+
<OTPInput
|
|
156
|
+
value={['', '', '', '', '', '']}
|
|
157
|
+
oncomplete={(e) => {
|
|
158
|
+
alert(`Auto-submitting code: ${e.code}`);
|
|
159
|
+
}}
|
|
160
|
+
/>
|
|
161
|
+
</div>
|
|
162
|
+
</Story>
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
oncomplete,
|
|
22
22
|
onchange,
|
|
23
23
|
}: Props = $props();
|
|
24
|
-
|
|
24
|
+
|
|
25
25
|
let inputs = $state<HTMLInputElement[]>([]);
|
|
26
26
|
|
|
27
27
|
// Initialize value array if needed
|
|
@@ -87,31 +87,31 @@
|
|
|
87
87
|
value = Array(length).fill("");
|
|
88
88
|
inputs[0]?.focus();
|
|
89
89
|
}
|
|
90
|
-
</script>
|
|
91
|
-
|
|
92
|
-
<div
|
|
93
|
-
class="flex justify-between gap-2 md:gap-3"
|
|
94
|
-
role="group"
|
|
95
|
-
aria-label="Enter {length}-digit verification code"
|
|
96
|
-
>
|
|
97
|
-
<span id="otp-instructions" class="sr-only">
|
|
98
|
-
Enter one digit per box. Use backspace to navigate back. You can also paste a {length}-digit code.
|
|
99
|
-
</span>
|
|
100
|
-
{#each value as digit, index}
|
|
101
|
-
<input
|
|
102
|
-
bind:this={inputs[index]}
|
|
103
|
-
type="text"
|
|
104
|
-
inputmode="numeric"
|
|
105
|
-
autocomplete="one-time-code"
|
|
106
|
-
maxlength="1"
|
|
107
|
-
value={digit}
|
|
108
|
-
{disabled}
|
|
109
|
-
aria-label="Digit {index + 1} of {length}"
|
|
110
|
-
aria-describedby="otp-instructions"
|
|
111
|
-
class="h-12 w-12 border-2 border-gray-300 bg-gray-50 p-0 text-center text-xl font-semibold leading-none text-gray-900 transition-colors focus:border-blue-500 focus:outline-none focus:ring-blue-500 disabled:cursor-not-allowed disabled:bg-gray-200 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder-gray-400 dark:focus:border-blue-500 dark:focus:ring-blue-500 dark:disabled:bg-gray-600 md:h-14 md:w-14 md:text-2xl rounded-lg"
|
|
112
|
-
oninput={(e) => handleInput(index, e)}
|
|
113
|
-
onkeydown={(e) => handleKeyDown(index, e)}
|
|
114
|
-
onpaste={handlePaste}
|
|
115
|
-
/>
|
|
116
|
-
{/each}
|
|
117
|
-
</div>
|
|
90
|
+
</script>
|
|
91
|
+
|
|
92
|
+
<div
|
|
93
|
+
class="flex justify-between gap-2 md:gap-3"
|
|
94
|
+
role="group"
|
|
95
|
+
aria-label="Enter {length}-digit verification code"
|
|
96
|
+
>
|
|
97
|
+
<span id="otp-instructions" class="sr-only">
|
|
98
|
+
Enter one digit per box. Use backspace to navigate back. You can also paste a {length}-digit code.
|
|
99
|
+
</span>
|
|
100
|
+
{#each value as digit, index}
|
|
101
|
+
<input
|
|
102
|
+
bind:this={inputs[index]}
|
|
103
|
+
type="text"
|
|
104
|
+
inputmode="numeric"
|
|
105
|
+
autocomplete="one-time-code"
|
|
106
|
+
maxlength="1"
|
|
107
|
+
value={digit}
|
|
108
|
+
{disabled}
|
|
109
|
+
aria-label="Digit {index + 1} of {length}"
|
|
110
|
+
aria-describedby="otp-instructions"
|
|
111
|
+
class="h-12 w-12 border-2 border-gray-300 bg-gray-50 p-0 text-center text-xl font-semibold leading-none text-gray-900 transition-colors focus:border-blue-500 focus:outline-none focus:ring-blue-500 disabled:cursor-not-allowed disabled:bg-gray-200 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder-gray-400 dark:focus:border-blue-500 dark:focus:ring-blue-500 dark:disabled:bg-gray-600 md:h-14 md:w-14 md:text-2xl rounded-lg"
|
|
112
|
+
oninput={(e) => handleInput(index, e)}
|
|
113
|
+
onkeydown={(e) => handleKeyDown(index, e)}
|
|
114
|
+
onpaste={handlePaste}
|
|
115
|
+
/>
|
|
116
|
+
{/each}
|
|
117
|
+
</div>
|
|
@@ -77,14 +77,14 @@
|
|
|
77
77
|
onblur,
|
|
78
78
|
onfocus,
|
|
79
79
|
}: Props = $props();
|
|
80
|
-
|
|
81
|
-
// Password strength tracking
|
|
82
|
-
let strengthScore = $state(-1);
|
|
83
|
-
let strengthText = $state('');
|
|
84
|
-
let strengthColor = $state('');
|
|
85
|
-
</script>
|
|
86
|
-
|
|
87
|
-
<div class={className}>
|
|
80
|
+
|
|
81
|
+
// Password strength tracking
|
|
82
|
+
let strengthScore = $state(-1);
|
|
83
|
+
let strengthText = $state('');
|
|
84
|
+
let strengthColor = $state('');
|
|
85
|
+
</script>
|
|
86
|
+
|
|
87
|
+
<div class={className}>
|
|
88
88
|
<Input
|
|
89
89
|
type="password"
|
|
90
90
|
{id}
|
|
@@ -105,17 +105,17 @@
|
|
|
105
105
|
{onblur}
|
|
106
106
|
{onfocus}
|
|
107
107
|
/>
|
|
108
|
-
|
|
109
|
-
{#if showStrength && value}
|
|
110
|
-
<PasswordStrengthIndicator
|
|
111
|
-
password={value}
|
|
112
|
-
bind:score={strengthScore}
|
|
113
|
-
bind:strengthText
|
|
114
|
-
bind:textColor={strengthColor}
|
|
115
|
-
>
|
|
116
|
-
<p class="text-xs {strengthColor}">
|
|
117
|
-
Password strength: {strengthText}
|
|
118
|
-
</p>
|
|
119
|
-
</PasswordStrengthIndicator>
|
|
120
|
-
{/if}
|
|
121
|
-
</div>
|
|
108
|
+
|
|
109
|
+
{#if showStrength && value}
|
|
110
|
+
<PasswordStrengthIndicator
|
|
111
|
+
password={value}
|
|
112
|
+
bind:score={strengthScore}
|
|
113
|
+
bind:strengthText
|
|
114
|
+
bind:textColor={strengthColor}
|
|
115
|
+
>
|
|
116
|
+
<p class="text-xs {strengthColor}">
|
|
117
|
+
Password strength: {strengthText}
|
|
118
|
+
</p>
|
|
119
|
+
</PasswordStrengthIndicator>
|
|
120
|
+
{/if}
|
|
121
|
+
</div>
|