@getmicdrop/svelte-components 5.8.1 → 5.8.2
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/Heading.svelte +60 -58
- package/dist/components/Heading.svelte.d.ts +1 -0
- package/dist/components/Heading.svelte.d.ts.map +1 -1
- package/dist/components/Layout/AppShell.svelte +104 -104
- package/dist/components/Layout/ContentSection.svelte +80 -80
- package/dist/components/Layout/Grid.svelte +4 -4
- package/dist/components/Layout/Heading.svelte +81 -81
- package/dist/components/Layout/PageContainer.svelte +69 -69
- package/dist/components/Layout/Responsive.svelte +75 -75
- package/dist/components/Layout/Section.svelte +80 -80
- package/dist/components/Layout/ShowOnDesktop.svelte +37 -37
- package/dist/components/Layout/ShowOnMobile.svelte +37 -37
- package/dist/components/Layout/Sidebar.svelte +108 -108
- package/dist/components/Layout/Stack.spec.js +1 -1
- package/dist/components/Layout/Stack.svelte +6 -6
- package/dist/components/Layout/Text.svelte +87 -87
- package/dist/components/Layout/TwoColumn.svelte +108 -108
- package/dist/components/Text.svelte +53 -53
- package/dist/constants/validation.js +91 -91
- package/dist/constants/validation.spec.js +64 -64
- package/dist/datetime/__tests__/format.test.js +1 -1
- package/dist/datetime/__tests__/parse.test.js +1 -1
- package/dist/datetime/__tests__/timezone.test.js +1 -1
- package/dist/datetime/parse.js +1 -1
- package/dist/forms/createFormStore.svelte.js +1 -0
- package/dist/index.js +50 -50
- package/dist/patterns/data/DataGrid.svelte +45 -45
- package/dist/patterns/data/DataList.svelte +24 -24
- package/dist/patterns/data/DataTable.svelte +36 -36
- package/dist/patterns/forms/FormActions.spec.js +95 -95
- package/dist/patterns/forms/FormActions.stories.svelte +97 -97
- package/dist/patterns/forms/FormActions.svelte +46 -46
- package/dist/patterns/forms/FormGrid.svelte +33 -33
- package/dist/patterns/forms/FormSection.svelte +32 -32
- package/dist/patterns/forms/FormValidationSummary.stories.svelte +83 -83
- package/dist/patterns/forms/FormValidationSummary.svelte +74 -74
- package/dist/patterns/layout/Sidebar.svelte +39 -39
- package/dist/patterns/layout/index.js +29 -29
- package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
- package/dist/patterns/navigation/BottomNav.svelte +74 -74
- package/dist/patterns/navigation/Header.stories.svelte +77 -77
- package/dist/patterns/navigation/Header.svelte +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/DropdownDivider.svelte +9 -9
- package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
- package/dist/primitives/Helper/Helper.svelte +33 -33
- package/dist/primitives/Icons/ArrowLeft.svelte +8 -8
- package/dist/primitives/Icons/ArrowRight.svelte +8 -8
- package/dist/primitives/Icons/Availability.svelte +14 -14
- package/dist/primitives/Icons/Back.svelte +14 -14
- package/dist/primitives/Icons/CheckCircle.svelte +6 -6
- package/dist/primitives/Icons/CheckCircleOutline.svelte +15 -15
- package/dist/primitives/Icons/ChevronLeft.svelte +4 -4
- package/dist/primitives/Icons/ChevronRight.svelte +4 -4
- package/dist/primitives/Icons/Copy.svelte +15 -15
- package/dist/primitives/Icons/Cross.svelte +5 -5
- package/dist/primitives/Icons/DownArrow.svelte +8 -8
- package/dist/primitives/Icons/ErrorCircle.svelte +6 -6
- package/dist/primitives/Icons/FacebookIcon.svelte +2 -2
- package/dist/primitives/Icons/Home.svelte +15 -15
- package/dist/primitives/Icons/Icon.spec.js +169 -169
- package/dist/primitives/Icons/Icon.stories.svelte +100 -100
- package/dist/primitives/Icons/Icon.svelte +52 -52
- package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
- package/dist/primitives/Icons/Info.svelte +7 -7
- package/dist/primitives/Icons/InstagramIcon.svelte +4 -4
- package/dist/primitives/Icons/LogoInstagram.svelte +2 -2
- package/dist/primitives/Icons/Message.svelte +15 -15
- package/dist/primitives/Icons/MoonIcon.svelte +5 -5
- package/dist/primitives/Icons/More.svelte +21 -21
- package/dist/primitives/Icons/MoreHori.spec.js +61 -61
- package/dist/primitives/Icons/MoreHori.svelte +22 -22
- package/dist/primitives/Icons/Notification.svelte +14 -14
- package/dist/primitives/Icons/Payment.svelte +14 -14
- package/dist/primitives/Icons/Profile.svelte +21 -21
- package/dist/primitives/Icons/Reload.svelte +29 -29
- package/dist/primitives/Icons/Shows.svelte +21 -21
- package/dist/primitives/Icons/Signout.svelte +21 -21
- package/dist/primitives/Icons/SunIcon.svelte +8 -8
- package/dist/primitives/Icons/TiktokIcon.svelte +2 -2
- package/dist/primitives/Icons/TwitterIcon.svelte +2 -2
- package/dist/primitives/Icons/WarningIcon.spec.js +18 -18
- package/dist/primitives/Icons/WarningIcon.svelte +5 -5
- package/dist/primitives/Input/Input.spec.js +573 -573
- package/dist/primitives/Input/Input.stories.svelte +139 -139
- package/dist/primitives/Input/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/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/Tooltip/Tooltip.svelte +83 -83
- package/dist/primitives/Typography/Typography.svelte +53 -53
- package/dist/primitives/ValidationError.spec.js +103 -103
- package/dist/primitives/ValidationError.stories.svelte +69 -69
- package/dist/primitives/ValidationError.svelte +29 -29
- package/dist/primitives/index.js +91 -91
- 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/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/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/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/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 +1169 -1169
- package/dist/tokens/tokens.css +87 -87
- package/dist/tokens/typography-base.css +163 -163
- package/dist/tokens/utilities.css +353 -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 +296 -295
|
@@ -1,117 +1,117 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { Snippet } from 'svelte';
|
|
3
|
-
import { passwordStrength } from "check-password-strength";
|
|
4
|
-
import { safeSlide } from "../../../utils/transitions.js";
|
|
5
|
-
import { cubicOut } from "svelte/easing";
|
|
6
|
-
|
|
7
|
-
interface Props {
|
|
8
|
-
password?: string;
|
|
9
|
-
strengthText?: string;
|
|
10
|
-
score?: number;
|
|
11
|
-
textColor?: string;
|
|
12
|
-
children?: Snippet;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
let {
|
|
16
|
-
password = "",
|
|
17
|
-
strengthText = $bindable(""),
|
|
18
|
-
score = $bindable(-1),
|
|
19
|
-
textColor = $bindable(""),
|
|
20
|
-
children,
|
|
21
|
-
}: Props = $props();
|
|
22
|
-
|
|
23
|
-
let debouncedPassword = $state("");
|
|
24
|
-
let timer = $state<ReturnType<typeof setTimeout> | undefined>();
|
|
25
|
-
|
|
26
|
-
const customOptions = [
|
|
27
|
-
{
|
|
28
|
-
id: 0,
|
|
29
|
-
value: "Too weak",
|
|
30
|
-
minDiversity: 0,
|
|
31
|
-
minLength: 0,
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
id: 1,
|
|
35
|
-
value: "Weak",
|
|
36
|
-
minDiversity: 1,
|
|
37
|
-
minLength: 6,
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
id: 2,
|
|
41
|
-
value: "Good",
|
|
42
|
-
minDiversity: 2,
|
|
43
|
-
minLength: 8,
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
id: 3,
|
|
47
|
-
value: "Strong",
|
|
48
|
-
minDiversity: 3,
|
|
49
|
-
minLength: 10,
|
|
50
|
-
},
|
|
51
|
-
] as const;
|
|
52
|
-
|
|
53
|
-
// Debounce password updates
|
|
54
|
-
$effect(() => {
|
|
55
|
-
clearTimeout(timer);
|
|
56
|
-
if (password.length === 0) {
|
|
57
|
-
debouncedPassword = "";
|
|
58
|
-
} else {
|
|
59
|
-
timer = setTimeout(() => {
|
|
60
|
-
debouncedPassword = password;
|
|
61
|
-
}, 400); // 400ms delay as requested
|
|
62
|
-
}
|
|
63
|
-
return () => clearTimeout(timer);
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
let strength = $derived(debouncedPassword
|
|
67
|
-
? passwordStrength(debouncedPassword, customOptions as any)
|
|
68
|
-
: null);
|
|
69
|
-
|
|
70
|
-
// Compute score based on password length and strength
|
|
71
|
-
$effect(() => {
|
|
72
|
-
score = debouncedPassword.length > 12 ? 3 : (strength?.id ?? -1);
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
// Map score to display text and color
|
|
76
|
-
$effect(() => {
|
|
77
|
-
strengthText =
|
|
78
|
-
score === 0
|
|
79
|
-
? "Too weak"
|
|
80
|
-
: score === 1
|
|
81
|
-
? "Weak"
|
|
82
|
-
: score === 2
|
|
83
|
-
? "Good"
|
|
84
|
-
: score === 3
|
|
85
|
-
? "Strong"
|
|
86
|
-
: "";
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
let strengthColor = $derived(score <= 1 ? "bg-red-600" : "bg-green-600");
|
|
90
|
-
|
|
91
|
-
$effect(() => {
|
|
92
|
-
textColor = score <= 1 ? "text-red-600" : "text-green-600";
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
// Calculate how many bars to fill (1-3)
|
|
96
|
-
let filledBars = $derived(score === 0 ? 1 : score === 1 ? 2 : score >= 2 ? 3 : 0);
|
|
97
|
-
</script>
|
|
98
|
-
|
|
99
|
-
{#if debouncedPassword.length > 0}
|
|
100
|
-
<div
|
|
101
|
-
transition:safeSlide={{ duration: 600, easing: cubicOut }}
|
|
102
|
-
class="pt-2 space-y-2"
|
|
103
|
-
>
|
|
104
|
-
<!-- 3 segment bars -->
|
|
105
|
-
<div class="flex gap-1.5">
|
|
106
|
-
{#each [0, 1, 2] as barIndex}
|
|
107
|
-
<div
|
|
108
|
-
class="h-1 flex-1 rounded-full transition-colors duration-300 {barIndex <
|
|
109
|
-
filledBars
|
|
110
|
-
? strengthColor
|
|
111
|
-
: 'bg-gray-200 dark:bg-gray-700'}"
|
|
112
|
-
></div>
|
|
113
|
-
{/each}
|
|
114
|
-
</div>
|
|
115
|
-
{@render children?.()}
|
|
116
|
-
</div>
|
|
117
|
-
{/if}
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import { passwordStrength } from "check-password-strength";
|
|
4
|
+
import { safeSlide } from "../../../utils/transitions.js";
|
|
5
|
+
import { cubicOut } from "svelte/easing";
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
password?: string;
|
|
9
|
+
strengthText?: string;
|
|
10
|
+
score?: number;
|
|
11
|
+
textColor?: string;
|
|
12
|
+
children?: Snippet;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let {
|
|
16
|
+
password = "",
|
|
17
|
+
strengthText = $bindable(""),
|
|
18
|
+
score = $bindable(-1),
|
|
19
|
+
textColor = $bindable(""),
|
|
20
|
+
children,
|
|
21
|
+
}: Props = $props();
|
|
22
|
+
|
|
23
|
+
let debouncedPassword = $state("");
|
|
24
|
+
let timer = $state<ReturnType<typeof setTimeout> | undefined>();
|
|
25
|
+
|
|
26
|
+
const customOptions = [
|
|
27
|
+
{
|
|
28
|
+
id: 0,
|
|
29
|
+
value: "Too weak",
|
|
30
|
+
minDiversity: 0,
|
|
31
|
+
minLength: 0,
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
id: 1,
|
|
35
|
+
value: "Weak",
|
|
36
|
+
minDiversity: 1,
|
|
37
|
+
minLength: 6,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
id: 2,
|
|
41
|
+
value: "Good",
|
|
42
|
+
minDiversity: 2,
|
|
43
|
+
minLength: 8,
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
id: 3,
|
|
47
|
+
value: "Strong",
|
|
48
|
+
minDiversity: 3,
|
|
49
|
+
minLength: 10,
|
|
50
|
+
},
|
|
51
|
+
] as const;
|
|
52
|
+
|
|
53
|
+
// Debounce password updates
|
|
54
|
+
$effect(() => {
|
|
55
|
+
clearTimeout(timer);
|
|
56
|
+
if (password.length === 0) {
|
|
57
|
+
debouncedPassword = "";
|
|
58
|
+
} else {
|
|
59
|
+
timer = setTimeout(() => {
|
|
60
|
+
debouncedPassword = password;
|
|
61
|
+
}, 400); // 400ms delay as requested
|
|
62
|
+
}
|
|
63
|
+
return () => clearTimeout(timer);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
let strength = $derived(debouncedPassword
|
|
67
|
+
? passwordStrength(debouncedPassword, customOptions as any)
|
|
68
|
+
: null);
|
|
69
|
+
|
|
70
|
+
// Compute score based on password length and strength
|
|
71
|
+
$effect(() => {
|
|
72
|
+
score = debouncedPassword.length > 12 ? 3 : (strength?.id ?? -1);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// Map score to display text and color
|
|
76
|
+
$effect(() => {
|
|
77
|
+
strengthText =
|
|
78
|
+
score === 0
|
|
79
|
+
? "Too weak"
|
|
80
|
+
: score === 1
|
|
81
|
+
? "Weak"
|
|
82
|
+
: score === 2
|
|
83
|
+
? "Good"
|
|
84
|
+
: score === 3
|
|
85
|
+
? "Strong"
|
|
86
|
+
: "";
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
let strengthColor = $derived(score <= 1 ? "bg-red-600" : "bg-green-600");
|
|
90
|
+
|
|
91
|
+
$effect(() => {
|
|
92
|
+
textColor = score <= 1 ? "text-red-600" : "text-green-600";
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
// Calculate how many bars to fill (1-3)
|
|
96
|
+
let filledBars = $derived(score === 0 ? 1 : score === 1 ? 2 : score >= 2 ? 3 : 0);
|
|
97
|
+
</script>
|
|
98
|
+
|
|
99
|
+
{#if debouncedPassword.length > 0}
|
|
100
|
+
<div
|
|
101
|
+
transition:safeSlide={{ duration: 600, easing: cubicOut }}
|
|
102
|
+
class="pt-2 space-y-2"
|
|
103
|
+
>
|
|
104
|
+
<!-- 3 segment bars -->
|
|
105
|
+
<div class="flex gap-1.5">
|
|
106
|
+
{#each [0, 1, 2] as barIndex}
|
|
107
|
+
<div
|
|
108
|
+
class="h-1 flex-1 rounded-full transition-colors duration-300 {barIndex <
|
|
109
|
+
filledBars
|
|
110
|
+
? strengthColor
|
|
111
|
+
: 'bg-gray-200 dark:bg-gray-700'}"
|
|
112
|
+
></div>
|
|
113
|
+
{/each}
|
|
114
|
+
</div>
|
|
115
|
+
{@render children?.()}
|
|
116
|
+
</div>
|
|
117
|
+
{/if}
|
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
<script module>
|
|
2
|
-
import { defineMeta } from "@storybook/addon-svelte-csf";
|
|
3
|
-
|
|
4
|
-
import PlaceAutocomplete from "./PlaceAutocomplete.svelte";
|
|
5
|
-
|
|
6
|
-
const { Story } = defineMeta({
|
|
7
|
-
title: "Components/PlaceAutocomplete",
|
|
8
|
-
component: PlaceAutocomplete,
|
|
9
|
-
argTypes: {
|
|
10
|
-
placeholder: { control: "text" },
|
|
11
|
-
initialValue: { control: "text" },
|
|
12
|
-
mode: { control: "select", options: ["full", "cityState"] },
|
|
13
|
-
language: { control: "text" },
|
|
14
|
-
region: { control: "text" },
|
|
15
|
-
onResponse: { action: "response" },
|
|
16
|
-
onError: { action: "error" },
|
|
17
|
-
},
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
function handleResponse(data) {
|
|
21
|
-
console.log("Place selected:", data);
|
|
22
|
-
alert(`Selected: ${JSON.stringify(data, null, 2)}`);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function handleError(error) {
|
|
26
|
-
console.error("Error:", error);
|
|
27
|
-
alert(`Error: ${error}`);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
</script>
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
<Story
|
|
34
|
-
name="Default Full Address"
|
|
35
|
-
args={{
|
|
36
|
-
placeholder: "Search for location...",
|
|
37
|
-
mode: "full",
|
|
38
|
-
onResponse: handleResponse,
|
|
39
|
-
onError: handleError
|
|
40
|
-
}}
|
|
41
|
-
/>
|
|
42
|
-
|
|
43
|
-
<Story name="City State Only">
|
|
44
|
-
<div style="max-width: 500px; margin: 0 auto;">
|
|
45
|
-
<PlaceAutocomplete
|
|
46
|
-
placeholder="Search for city, state..."
|
|
47
|
-
mode="cityState"
|
|
48
|
-
onResponse={handleResponse}
|
|
49
|
-
onError={handleError}
|
|
50
|
-
/>
|
|
51
|
-
</div>
|
|
52
|
-
</Story>
|
|
53
|
-
|
|
54
|
-
<Story name="With Initial Value">
|
|
55
|
-
<div style="max-width: 500px; margin: 0 auto;">
|
|
56
|
-
<PlaceAutocomplete
|
|
57
|
-
placeholder="Search for location..."
|
|
58
|
-
initialValue="New York, NY"
|
|
59
|
-
mode="cityState"
|
|
60
|
-
onResponse={handleResponse}
|
|
61
|
-
onError={handleError}
|
|
62
|
-
/>
|
|
63
|
-
</div>
|
|
64
|
-
</Story>
|
|
65
|
-
|
|
66
|
-
<Story name="Custom Placeholder">
|
|
67
|
-
<div style="max-width: 500px; margin: 0 auto;">
|
|
68
|
-
<PlaceAutocomplete
|
|
69
|
-
placeholder="Where is your venue located?"
|
|
70
|
-
mode="full"
|
|
71
|
-
onResponse={handleResponse}
|
|
72
|
-
onError={handleError}
|
|
73
|
-
/>
|
|
74
|
-
</div>
|
|
75
|
-
</Story>
|
|
76
|
-
|
|
77
|
-
<Story name="In Form Context">
|
|
78
|
-
<div style="max-width: 600px; margin: 0 auto; padding: 20px;">
|
|
79
|
-
<h2 class="text-2xl font-bold mb-6">Event Location</h2>
|
|
1
|
+
<script module>
|
|
2
|
+
import { defineMeta } from "@storybook/addon-svelte-csf";
|
|
3
|
+
|
|
4
|
+
import PlaceAutocomplete from "./PlaceAutocomplete.svelte";
|
|
5
|
+
|
|
6
|
+
const { Story } = defineMeta({
|
|
7
|
+
title: "Components/PlaceAutocomplete",
|
|
8
|
+
component: PlaceAutocomplete,
|
|
9
|
+
argTypes: {
|
|
10
|
+
placeholder: { control: "text" },
|
|
11
|
+
initialValue: { control: "text" },
|
|
12
|
+
mode: { control: "select", options: ["full", "cityState"] },
|
|
13
|
+
language: { control: "text" },
|
|
14
|
+
region: { control: "text" },
|
|
15
|
+
onResponse: { action: "response" },
|
|
16
|
+
onError: { action: "error" },
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
function handleResponse(data) {
|
|
21
|
+
console.log("Place selected:", data);
|
|
22
|
+
alert(`Selected: ${JSON.stringify(data, null, 2)}`);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function handleError(error) {
|
|
26
|
+
console.error("Error:", error);
|
|
27
|
+
alert(`Error: ${error}`);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
</script>
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
<Story
|
|
34
|
+
name="Default Full Address"
|
|
35
|
+
args={{
|
|
36
|
+
placeholder: "Search for location...",
|
|
37
|
+
mode: "full",
|
|
38
|
+
onResponse: handleResponse,
|
|
39
|
+
onError: handleError
|
|
40
|
+
}}
|
|
41
|
+
/>
|
|
42
|
+
|
|
43
|
+
<Story name="City State Only">
|
|
44
|
+
<div style="max-width: 500px; margin: 0 auto;">
|
|
45
|
+
<PlaceAutocomplete
|
|
46
|
+
placeholder="Search for city, state..."
|
|
47
|
+
mode="cityState"
|
|
48
|
+
onResponse={handleResponse}
|
|
49
|
+
onError={handleError}
|
|
50
|
+
/>
|
|
51
|
+
</div>
|
|
52
|
+
</Story>
|
|
53
|
+
|
|
54
|
+
<Story name="With Initial Value">
|
|
55
|
+
<div style="max-width: 500px; margin: 0 auto;">
|
|
56
|
+
<PlaceAutocomplete
|
|
57
|
+
placeholder="Search for location..."
|
|
58
|
+
initialValue="New York, NY"
|
|
59
|
+
mode="cityState"
|
|
60
|
+
onResponse={handleResponse}
|
|
61
|
+
onError={handleError}
|
|
62
|
+
/>
|
|
63
|
+
</div>
|
|
64
|
+
</Story>
|
|
65
|
+
|
|
66
|
+
<Story name="Custom Placeholder">
|
|
67
|
+
<div style="max-width: 500px; margin: 0 auto;">
|
|
68
|
+
<PlaceAutocomplete
|
|
69
|
+
placeholder="Where is your venue located?"
|
|
70
|
+
mode="full"
|
|
71
|
+
onResponse={handleResponse}
|
|
72
|
+
onError={handleError}
|
|
73
|
+
/>
|
|
74
|
+
</div>
|
|
75
|
+
</Story>
|
|
76
|
+
|
|
77
|
+
<Story name="In Form Context">
|
|
78
|
+
<div style="max-width: 600px; margin: 0 auto; padding: 20px;">
|
|
79
|
+
<h2 class="text-2xl font-bold mb-6">Event Location</h2>
|
|
80
80
|
<div class="space-y-4">
|
|
81
81
|
<div>
|
|
82
82
|
<label for="venue-name" class="block text-sm font-medium text-gray-500 dark:text-gray-400 mb-2">
|
|
@@ -95,19 +95,19 @@
|
|
|
95
95
|
Venue Location
|
|
96
96
|
</label>
|
|
97
97
|
<PlaceAutocomplete
|
|
98
|
-
placeholder="Search for venue location..."
|
|
99
|
-
mode="full"
|
|
100
|
-
onResponse={handleResponse}
|
|
101
|
-
onError={handleError}
|
|
102
|
-
/>
|
|
103
|
-
</div>
|
|
104
|
-
<button class="px-4 py-2 bg-primary text-white rounded-lg">
|
|
105
|
-
Save Location
|
|
106
|
-
</button>
|
|
107
|
-
</div>
|
|
108
|
-
</div>
|
|
109
|
-
</Story>
|
|
110
|
-
|
|
98
|
+
placeholder="Search for venue location..."
|
|
99
|
+
mode="full"
|
|
100
|
+
onResponse={handleResponse}
|
|
101
|
+
onError={handleError}
|
|
102
|
+
/>
|
|
103
|
+
</div>
|
|
104
|
+
<button class="px-4 py-2 bg-primary text-white rounded-lg">
|
|
105
|
+
Save Location
|
|
106
|
+
</button>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
</Story>
|
|
110
|
+
|
|
111
111
|
<Story name="Performer Location">
|
|
112
112
|
<div style="max-width: 500px; margin: 0 auto;">
|
|
113
113
|
<!-- svelte-ignore a11y_label_has_associated_control -->
|
|
@@ -118,17 +118,17 @@
|
|
|
118
118
|
Let venues know where you're based
|
|
119
119
|
</p>
|
|
120
120
|
<PlaceAutocomplete
|
|
121
|
-
placeholder="Enter your city and state..."
|
|
122
|
-
mode="cityState"
|
|
123
|
-
onResponse={handleResponse}
|
|
124
|
-
onError={handleError}
|
|
125
|
-
/>
|
|
126
|
-
</div>
|
|
127
|
-
</Story>
|
|
128
|
-
|
|
129
|
-
<Story name="Multiple Locations">
|
|
130
|
-
<div style="max-width: 700px; margin: 0 auto; padding: 20px;">
|
|
131
|
-
<h2 class="text-xl font-bold mb-6">Tour Locations</h2>
|
|
121
|
+
placeholder="Enter your city and state..."
|
|
122
|
+
mode="cityState"
|
|
123
|
+
onResponse={handleResponse}
|
|
124
|
+
onError={handleError}
|
|
125
|
+
/>
|
|
126
|
+
</div>
|
|
127
|
+
</Story>
|
|
128
|
+
|
|
129
|
+
<Story name="Multiple Locations">
|
|
130
|
+
<div style="max-width: 700px; margin: 0 auto; padding: 20px;">
|
|
131
|
+
<h2 class="text-xl font-bold mb-6">Tour Locations</h2>
|
|
132
132
|
<div class="space-y-6">
|
|
133
133
|
<div>
|
|
134
134
|
<!-- svelte-ignore a11y_label_has_associated_control -->
|
|
@@ -148,23 +148,23 @@
|
|
|
148
148
|
Destination City
|
|
149
149
|
</label>
|
|
150
150
|
<PlaceAutocomplete
|
|
151
|
-
placeholder="Where will you end?"
|
|
152
|
-
mode="cityState"
|
|
153
|
-
onResponse={handleResponse}
|
|
154
|
-
onError={handleError}
|
|
155
|
-
/>
|
|
156
|
-
</div>
|
|
157
|
-
</div>
|
|
158
|
-
</div>
|
|
159
|
-
</Story>
|
|
160
|
-
|
|
161
|
-
<Story name="Compact Layout">
|
|
162
|
-
<div style="max-width: 350px; margin: 0 auto;">
|
|
163
|
-
<PlaceAutocomplete
|
|
164
|
-
placeholder="City..."
|
|
165
|
-
mode="cityState"
|
|
166
|
-
onResponse={handleResponse}
|
|
167
|
-
onError={handleError}
|
|
168
|
-
/>
|
|
169
|
-
</div>
|
|
170
|
-
</Story>
|
|
151
|
+
placeholder="Where will you end?"
|
|
152
|
+
mode="cityState"
|
|
153
|
+
onResponse={handleResponse}
|
|
154
|
+
onError={handleError}
|
|
155
|
+
/>
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
</Story>
|
|
160
|
+
|
|
161
|
+
<Story name="Compact Layout">
|
|
162
|
+
<div style="max-width: 350px; margin: 0 auto;">
|
|
163
|
+
<PlaceAutocomplete
|
|
164
|
+
placeholder="City..."
|
|
165
|
+
mode="cityState"
|
|
166
|
+
onResponse={handleResponse}
|
|
167
|
+
onError={handleError}
|
|
168
|
+
/>
|
|
169
|
+
</div>
|
|
170
|
+
</Story>
|
|
@@ -39,15 +39,15 @@
|
|
|
39
39
|
children,
|
|
40
40
|
...restProps
|
|
41
41
|
}: Props = $props();
|
|
42
|
-
|
|
43
|
-
const sizes = {
|
|
44
|
-
sm: { icon: "w-3.5 h-3.5", input: `h-8 ${typography.xs} pl-8`, wrapper: "h-8" },
|
|
45
|
-
md: { icon: "w-4 h-4", input: `h-10 ${typography.sm} pl-9`, wrapper: "h-10" },
|
|
46
|
-
lg: { icon: "w-5 h-5", input: `h-11 ${typography.sm} pl-10`, wrapper: "h-11" }
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
let sizeConfig = $derived(sizes[size] || sizes.lg);
|
|
50
|
-
|
|
42
|
+
|
|
43
|
+
const sizes = {
|
|
44
|
+
sm: { icon: "w-3.5 h-3.5", input: `h-8 ${typography.xs} pl-8`, wrapper: "h-8" },
|
|
45
|
+
md: { icon: "w-4 h-4", input: `h-10 ${typography.sm} pl-9`, wrapper: "h-10" },
|
|
46
|
+
lg: { icon: "w-5 h-5", input: `h-11 ${typography.sm} pl-10`, wrapper: "h-11" }
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
let sizeConfig = $derived(sizes[size] || sizes.lg);
|
|
50
|
+
|
|
51
51
|
function handleInput(event: Event) {
|
|
52
52
|
value = (event.target as HTMLInputElement).value;
|
|
53
53
|
oninput?.(event);
|
|
@@ -72,31 +72,31 @@
|
|
|
72
72
|
function handleBlur(event: FocusEvent) {
|
|
73
73
|
onblur?.(event);
|
|
74
74
|
}
|
|
75
|
-
</script>
|
|
76
|
-
|
|
77
|
-
<div class="relative w-full {sizeConfig.wrapper} {className}">
|
|
78
|
-
<div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
|
|
79
|
-
<SearchOutline class={`${typography.iconMuted} ${sizeConfig.icon}`} />
|
|
80
|
-
</div>
|
|
81
|
-
<input
|
|
82
|
-
type="search"
|
|
83
|
-
{id}
|
|
84
|
-
{name}
|
|
85
|
-
{placeholder}
|
|
86
|
-
{disabled}
|
|
87
|
-
class="w-full pr-3 bg-gray-50 dark:bg-gray-700 font-medium border border-gray-300 dark:border-gray-600 rounded-lg transition-colors focus:outline-none focus:ring-4 focus:ring-blue-300 dark:focus:ring-blue-800 focus:border-blue-500 hover:border-blue-500 placeholder-gray-500 dark:placeholder-gray-400 [&::-webkit-search-cancel-button]:appearance-none {sizeConfig.input} {disabled ? 'opacity-50 cursor-not-allowed' : ''}"
|
|
88
|
-
bind:value
|
|
89
|
-
oninput={handleInput}
|
|
90
|
-
onchange={handleChange}
|
|
91
|
-
onkeydown={handleKeydown}
|
|
92
|
-
onkeyup={handleKeyup}
|
|
93
|
-
onfocus={handleFocus}
|
|
94
|
-
onblur={handleBlur}
|
|
95
|
-
{...restProps}
|
|
96
|
-
/>
|
|
97
|
-
{#if children}
|
|
98
|
-
<div class={`absolute inset-y-0 right-0 flex items-center ${typography.iconMuted}`}>
|
|
99
|
-
{@render children()}
|
|
100
|
-
</div>
|
|
101
|
-
{/if}
|
|
102
|
-
</div>
|
|
75
|
+
</script>
|
|
76
|
+
|
|
77
|
+
<div class="relative w-full {sizeConfig.wrapper} {className}">
|
|
78
|
+
<div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
|
|
79
|
+
<SearchOutline class={`${typography.iconMuted} ${sizeConfig.icon}`} />
|
|
80
|
+
</div>
|
|
81
|
+
<input
|
|
82
|
+
type="search"
|
|
83
|
+
{id}
|
|
84
|
+
{name}
|
|
85
|
+
{placeholder}
|
|
86
|
+
{disabled}
|
|
87
|
+
class="w-full pr-3 bg-gray-50 dark:bg-gray-700 font-medium border border-gray-300 dark:border-gray-600 rounded-lg transition-colors focus:outline-none focus:ring-4 focus:ring-blue-300 dark:focus:ring-blue-800 focus:border-blue-500 hover:border-blue-500 placeholder-gray-500 dark:placeholder-gray-400 [&::-webkit-search-cancel-button]:appearance-none {sizeConfig.input} {disabled ? 'opacity-50 cursor-not-allowed' : ''}"
|
|
88
|
+
bind:value
|
|
89
|
+
oninput={handleInput}
|
|
90
|
+
onchange={handleChange}
|
|
91
|
+
onkeydown={handleKeydown}
|
|
92
|
+
onkeyup={handleKeyup}
|
|
93
|
+
onfocus={handleFocus}
|
|
94
|
+
onblur={handleBlur}
|
|
95
|
+
{...restProps}
|
|
96
|
+
/>
|
|
97
|
+
{#if children}
|
|
98
|
+
<div class={`absolute inset-y-0 right-0 flex items-center ${typography.iconMuted}`}>
|
|
99
|
+
{@render children()}
|
|
100
|
+
</div>
|
|
101
|
+
{/if}
|
|
102
|
+
</div>
|