@getmicdrop/svelte-components 5.17.4 → 5.18.1
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 +9 -5
- package/dist/calendar/AboutShow/AboutShow.svelte.d.ts +2 -2
- package/dist/calendar/AboutShow/AboutShow.svelte.d.ts.map +1 -1
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte +39 -18
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte.d.ts +4 -0
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte.d.ts.map +1 -1
- package/dist/calendar/FAQs/FAQs.svelte +16 -5
- package/dist/calendar/FAQs/FAQs.svelte.d.ts +6 -4
- package/dist/calendar/FAQs/FAQs.svelte.d.ts.map +1 -1
- package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte +19 -4
- package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte.d.ts +2 -0
- package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte.d.ts.map +1 -1
- package/dist/calendar/OrderSummary/OrderSummary.spec.js +3 -3
- package/dist/calendar/OrderSummary/OrderSummary.svelte +17 -13
- package/dist/calendar/OrderSummary/OrderSummary.svelte.d.ts +4 -2
- package/dist/calendar/OrderSummary/OrderSummary.svelte.d.ts.map +1 -1
- package/dist/calendar/PublicCard/PublicCard.svelte +11 -2
- package/dist/calendar/PublicCard/PublicCard.svelte.d.ts +4 -0
- package/dist/calendar/PublicCard/PublicCard.svelte.d.ts.map +1 -1
- package/dist/calendar/ShowCard/ShowCard.svelte +25 -11
- package/dist/calendar/ShowCard/ShowCard.svelte.d.ts +4 -0
- package/dist/calendar/ShowCard/ShowCard.svelte.d.ts.map +1 -1
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +12 -4
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte.d.ts +4 -0
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/patterns/chat/ChatBubble.svelte +9 -1
- package/dist/patterns/chat/ChatBubble.svelte.d.ts +6 -4
- package/dist/patterns/chat/ChatBubble.svelte.d.ts.map +1 -1
- package/dist/patterns/chat/ChatInvitationBubble.svelte +10 -1
- package/dist/patterns/chat/ChatInvitationBubble.svelte.d.ts +6 -3
- package/dist/patterns/chat/ChatInvitationBubble.svelte.d.ts.map +1 -1
- package/dist/patterns/chat/ChatInvitationNotice.svelte +10 -1
- package/dist/patterns/chat/ChatInvitationNotice.svelte.d.ts +6 -3
- package/dist/patterns/chat/ChatInvitationNotice.svelte.d.ts.map +1 -1
- package/dist/patterns/forms/FormValidationSummary.svelte +9 -1
- package/dist/patterns/forms/FormValidationSummary.svelte.d.ts +5 -3
- package/dist/patterns/forms/FormValidationSummary.svelte.d.ts.map +1 -1
- package/dist/patterns/navigation/BottomNav.svelte +9 -1
- package/dist/patterns/navigation/BottomNav.svelte.d.ts +10 -9
- package/dist/patterns/navigation/BottomNav.svelte.d.ts.map +1 -1
- package/dist/patterns/navigation/Header.svelte +20 -8
- package/dist/patterns/navigation/Header.svelte.d.ts +17 -9
- package/dist/patterns/navigation/Header.svelte.d.ts.map +1 -1
- package/dist/patterns/page/PageLoader.svelte +12 -3
- package/dist/patterns/page/PageLoader.svelte.d.ts +6 -3
- package/dist/patterns/page/PageLoader.svelte.d.ts.map +1 -1
- package/dist/primitives/Accordion/AccordionItem.svelte +9 -1
- package/dist/primitives/Accordion/AccordionItem.svelte.d.ts +6 -4
- package/dist/primitives/Accordion/AccordionItem.svelte.d.ts.map +1 -1
- package/dist/primitives/Alert/Alert.svelte +10 -2
- package/dist/primitives/Alert/Alert.svelte.d.ts +6 -4
- package/dist/primitives/Alert/Alert.svelte.d.ts.map +1 -1
- package/dist/primitives/Breadcrumb/Breadcrumb.svelte +9 -1
- package/dist/primitives/Breadcrumb/Breadcrumb.svelte.d.ts +13 -9
- package/dist/primitives/Breadcrumb/Breadcrumb.svelte.d.ts.map +1 -1
- package/dist/primitives/DarkModeToggle.svelte +16 -5
- package/dist/primitives/DarkModeToggle.svelte.d.ts +9 -3
- package/dist/primitives/DarkModeToggle.svelte.d.ts.map +1 -1
- package/dist/primitives/Dropdown/Dropdown.svelte +11 -2
- package/dist/primitives/Dropdown/Dropdown.svelte.d.ts +7 -4
- package/dist/primitives/Dropdown/Dropdown.svelte.d.ts.map +1 -1
- package/dist/primitives/Input/Input.svelte +19 -6
- package/dist/primitives/Input/Input.svelte.d.ts.map +1 -1
- package/dist/primitives/NumberInput/NumberInput.svelte +10 -2
- package/dist/primitives/NumberInput/NumberInput.svelte.d.ts.map +1 -1
- package/dist/primitives/Pagination/Pagination.svelte +21 -7
- package/dist/primitives/Pagination/Pagination.svelte.d.ts +14 -6
- package/dist/primitives/Pagination/Pagination.svelte.d.ts.map +1 -1
- package/dist/primitives/Skeleton/CardPlaceholder.svelte +11 -2
- package/dist/primitives/Skeleton/CardPlaceholder.svelte.d.ts +8 -5
- package/dist/primitives/Skeleton/CardPlaceholder.svelte.d.ts.map +1 -1
- package/dist/primitives/Skeleton/ImagePlaceholder.svelte +11 -2
- package/dist/primitives/Skeleton/ImagePlaceholder.svelte.d.ts +8 -5
- package/dist/primitives/Skeleton/ImagePlaceholder.svelte.d.ts.map +1 -1
- package/dist/primitives/Skeleton/ListPlaceholder.svelte +11 -2
- package/dist/primitives/Skeleton/ListPlaceholder.svelte.d.ts +8 -5
- package/dist/primitives/Skeleton/ListPlaceholder.svelte.d.ts.map +1 -1
- package/dist/primitives/Skeleton/Skeleton.svelte +11 -2
- package/dist/primitives/Skeleton/Skeleton.svelte.d.ts +7 -4
- package/dist/primitives/Skeleton/Skeleton.svelte.d.ts.map +1 -1
- package/dist/primitives/Spinner/Spinner.svelte +9 -1
- package/dist/primitives/Spinner/Spinner.svelte.d.ts +6 -4
- package/dist/primitives/Spinner/Spinner.svelte.d.ts.map +1 -1
- package/dist/recipes/ImageUploader/ImageUploader.svelte +5 -3
- package/dist/recipes/ImageUploader/ImageUploader.svelte.d.ts +1 -0
- package/dist/recipes/ImageUploader/ImageUploader.svelte.d.ts.map +1 -1
- package/dist/recipes/SuperLogin/SuperLogin.svelte +25 -23
- package/dist/recipes/SuperLogin/SuperLogin.svelte.d.ts.map +1 -1
- package/dist/recipes/feedback/EmptyState/EmptyState.svelte +12 -3
- package/dist/recipes/feedback/EmptyState/EmptyState.svelte.d.ts +7 -4
- package/dist/recipes/feedback/EmptyState/EmptyState.svelte.d.ts.map +1 -1
- package/dist/recipes/inputs/MultiSelect.svelte +10 -2
- package/dist/recipes/inputs/MultiSelect.svelte.d.ts.map +1 -1
- package/dist/recipes/inputs/OTPInput.svelte +14 -3
- package/dist/recipes/inputs/OTPInput.svelte.d.ts +14 -12
- package/dist/recipes/inputs/OTPInput.svelte.d.ts.map +1 -1
- package/dist/recipes/inputs/PasswordInput.svelte +10 -1
- package/dist/recipes/inputs/PasswordInput.svelte.d.ts +7 -4
- package/dist/recipes/inputs/PasswordInput.svelte.d.ts.map +1 -1
- package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +21 -10
- package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte.d.ts +8 -3
- package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte.d.ts.map +1 -1
- package/dist/recipes/inputs/PhoneInput.svelte +254 -0
- package/dist/recipes/inputs/PhoneInput.svelte.d.ts +40 -0
- package/dist/recipes/inputs/PhoneInput.svelte.d.ts.map +1 -0
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +22 -9
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte.d.ts +21 -16
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte.d.ts.map +1 -1
- package/dist/recipes/inputs/Search.svelte +10 -2
- package/dist/recipes/inputs/Search.svelte.d.ts +7 -5
- package/dist/recipes/inputs/Search.svelte.d.ts.map +1 -1
- package/dist/recipes/inputs/index.d.ts +1 -0
- package/dist/recipes/inputs/index.js +1 -0
- package/dist/recipes/inputs/phoneInput/CountrySelector.svelte +240 -0
- package/dist/recipes/inputs/phoneInput/CountrySelector.svelte.d.ts +15 -0
- package/dist/recipes/inputs/phoneInput/CountrySelector.svelte.d.ts.map +1 -0
- package/dist/recipes/inputs/phoneInput/countryData.d.ts +18 -0
- package/dist/recipes/inputs/phoneInput/countryData.d.ts.map +1 -0
- package/dist/recipes/inputs/phoneInput/countryData.js +211 -0
- package/dist/recipes/modals/AlertModal.svelte +11 -2
- package/dist/recipes/modals/AlertModal.svelte.d.ts +4 -2
- package/dist/recipes/modals/AlertModal.svelte.d.ts.map +1 -1
- package/dist/recipes/modals/ConfirmationModal.svelte +8 -1
- package/dist/recipes/modals/ConfirmationModal.svelte.d.ts +2 -0
- package/dist/recipes/modals/ConfirmationModal.svelte.d.ts.map +1 -1
- package/dist/recipes/modals/InputModal.svelte +19 -7
- package/dist/recipes/modals/InputModal.svelte.d.ts +6 -4
- package/dist/recipes/modals/InputModal.svelte.d.ts.map +1 -1
- package/dist/recipes/modals/StatusModal.svelte +14 -4
- package/dist/recipes/modals/StatusModal.svelte.d.ts +4 -2
- package/dist/recipes/modals/StatusModal.svelte.d.ts.map +1 -1
- package/dist/tokens/__tests__/variants.test.js +12 -4
- package/dist/tokens/variants.d.ts +4 -4
- package/dist/tokens/variants.js +4 -4
- package/dist/utils/formatters.d.ts +6 -0
- package/dist/utils/formatters.d.ts.map +1 -1
- package/dist/utils/formatters.js +8 -0
- package/dist/utils/phoneUtils.d.ts +35 -0
- package/dist/utils/phoneUtils.d.ts.map +1 -0
- package/dist/utils/phoneUtils.js +104 -0
- package/dist/utils/utils.js +25 -16
- package/package.json +6 -1
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onMount, tick } from "svelte";
|
|
3
|
+
import { ChevronDownOutline } from "../../../primitives/Icons";
|
|
4
|
+
import { typography } from "../../../tokens/typography";
|
|
5
|
+
import { bloom } from "../../../utils/transitions.js";
|
|
6
|
+
import { COUNTRIES, type Country } from "./countryData";
|
|
7
|
+
|
|
8
|
+
interface Props {
|
|
9
|
+
country?: Country;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
size?: "sm" | "md" | "lg";
|
|
12
|
+
labels?: {
|
|
13
|
+
searchPlaceholder?: string;
|
|
14
|
+
noResults?: string;
|
|
15
|
+
countrySelector?: string;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const defaultLabels = {
|
|
20
|
+
searchPlaceholder: 'Search...',
|
|
21
|
+
noResults: 'No countries found',
|
|
22
|
+
countrySelector: 'Select country',
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
let {
|
|
26
|
+
country = $bindable(COUNTRIES.find((c) => c.code === 'US')!),
|
|
27
|
+
disabled = false,
|
|
28
|
+
size = "md",
|
|
29
|
+
labels: userLabels = {},
|
|
30
|
+
}: Props = $props();
|
|
31
|
+
|
|
32
|
+
let labels = $derived({ ...defaultLabels, ...userLabels });
|
|
33
|
+
|
|
34
|
+
let isOpen = $state(false);
|
|
35
|
+
let searchQuery = $state('');
|
|
36
|
+
let triggerElement = $state<HTMLButtonElement | null>(null);
|
|
37
|
+
let dropdownElement = $state<HTMLDivElement | null>(null);
|
|
38
|
+
let searchInputElement = $state<HTMLInputElement | null>(null);
|
|
39
|
+
let focusedIndex = $state(-1);
|
|
40
|
+
let dropdownPosition = $state({ top: 0, left: 0, width: 0 });
|
|
41
|
+
|
|
42
|
+
const instanceId = Math.random().toString(36).substring(2, 9);
|
|
43
|
+
|
|
44
|
+
let filteredCountries = $derived.by(() => {
|
|
45
|
+
if (!searchQuery) return COUNTRIES;
|
|
46
|
+
const q = searchQuery.toLowerCase();
|
|
47
|
+
return COUNTRIES.filter(
|
|
48
|
+
(c) =>
|
|
49
|
+
c.name.toLowerCase().includes(q) ||
|
|
50
|
+
c.dialCode.includes(q) ||
|
|
51
|
+
c.code.toLowerCase().includes(q)
|
|
52
|
+
);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
const sizeMap = {
|
|
56
|
+
sm: 'h-9 px-2 text-sm gap-1',
|
|
57
|
+
md: 'h-10 px-2.5 text-sm gap-1.5',
|
|
58
|
+
lg: 'h-12 px-3 text-base gap-2',
|
|
59
|
+
} as const;
|
|
60
|
+
|
|
61
|
+
let sizeClass = $derived(sizeMap[size] || sizeMap.md);
|
|
62
|
+
|
|
63
|
+
function updateDropdownPosition() {
|
|
64
|
+
if (!triggerElement) return;
|
|
65
|
+
const rect = triggerElement.getBoundingClientRect();
|
|
66
|
+
dropdownPosition = {
|
|
67
|
+
top: rect.bottom + 4,
|
|
68
|
+
left: rect.left,
|
|
69
|
+
width: Math.max(280, rect.width),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function toggle() {
|
|
74
|
+
if (disabled) return;
|
|
75
|
+
isOpen = !isOpen;
|
|
76
|
+
if (isOpen) {
|
|
77
|
+
searchQuery = '';
|
|
78
|
+
focusedIndex = -1;
|
|
79
|
+
window.dispatchEvent(new CustomEvent('select-opened', { detail: { instanceId } }));
|
|
80
|
+
await tick();
|
|
81
|
+
updateDropdownPosition();
|
|
82
|
+
searchInputElement?.focus();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function handleOtherSelectOpened(event: Event) {
|
|
87
|
+
const customEvent = event as CustomEvent<{ instanceId: string }>;
|
|
88
|
+
if (customEvent.detail.instanceId !== instanceId && isOpen) {
|
|
89
|
+
close();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function close() {
|
|
94
|
+
isOpen = false;
|
|
95
|
+
searchQuery = '';
|
|
96
|
+
focusedIndex = -1;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function selectCountry(c: Country) {
|
|
100
|
+
country = c;
|
|
101
|
+
close();
|
|
102
|
+
triggerElement?.focus();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function handleKeydown(event: KeyboardEvent) {
|
|
106
|
+
if (disabled) return;
|
|
107
|
+
|
|
108
|
+
switch (event.key) {
|
|
109
|
+
case "Enter":
|
|
110
|
+
event.preventDefault();
|
|
111
|
+
if (isOpen && focusedIndex >= 0 && focusedIndex < filteredCountries.length) {
|
|
112
|
+
selectCountry(filteredCountries[focusedIndex]);
|
|
113
|
+
} else if (!isOpen) {
|
|
114
|
+
toggle();
|
|
115
|
+
}
|
|
116
|
+
break;
|
|
117
|
+
case "ArrowDown":
|
|
118
|
+
event.preventDefault();
|
|
119
|
+
if (!isOpen) {
|
|
120
|
+
toggle();
|
|
121
|
+
} else {
|
|
122
|
+
focusedIndex = Math.min(focusedIndex + 1, filteredCountries.length - 1);
|
|
123
|
+
scrollToFocused();
|
|
124
|
+
}
|
|
125
|
+
break;
|
|
126
|
+
case "ArrowUp":
|
|
127
|
+
event.preventDefault();
|
|
128
|
+
if (isOpen) {
|
|
129
|
+
focusedIndex = Math.max(focusedIndex - 1, 0);
|
|
130
|
+
scrollToFocused();
|
|
131
|
+
}
|
|
132
|
+
break;
|
|
133
|
+
case "Escape":
|
|
134
|
+
event.preventDefault();
|
|
135
|
+
close();
|
|
136
|
+
triggerElement?.focus();
|
|
137
|
+
break;
|
|
138
|
+
case "Tab":
|
|
139
|
+
close();
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function scrollToFocused() {
|
|
145
|
+
tick().then(() => {
|
|
146
|
+
const el = dropdownElement?.querySelector(`[data-index="${focusedIndex}"]`);
|
|
147
|
+
el?.scrollIntoView({ block: 'nearest' });
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function handleClickOutside(event: MouseEvent) {
|
|
152
|
+
if (!isOpen) return;
|
|
153
|
+
const target = event.target as Node;
|
|
154
|
+
const clickedOutsideTrigger = triggerElement && !triggerElement.contains(target);
|
|
155
|
+
const clickedOutsideDropdown = !dropdownElement || !dropdownElement.contains(target);
|
|
156
|
+
if (clickedOutsideTrigger && clickedOutsideDropdown) {
|
|
157
|
+
close();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
onMount(() => {
|
|
162
|
+
document.addEventListener("click", handleClickOutside, true);
|
|
163
|
+
window.addEventListener("select-opened", handleOtherSelectOpened);
|
|
164
|
+
window.addEventListener("scroll", updateDropdownPosition, true);
|
|
165
|
+
window.addEventListener("resize", updateDropdownPosition);
|
|
166
|
+
|
|
167
|
+
return () => {
|
|
168
|
+
document.removeEventListener("click", handleClickOutside, true);
|
|
169
|
+
window.removeEventListener("select-opened", handleOtherSelectOpened);
|
|
170
|
+
window.removeEventListener("scroll", updateDropdownPosition, true);
|
|
171
|
+
window.removeEventListener("resize", updateDropdownPosition);
|
|
172
|
+
};
|
|
173
|
+
});
|
|
174
|
+
</script>
|
|
175
|
+
|
|
176
|
+
<div class="relative shrink-0">
|
|
177
|
+
<button
|
|
178
|
+
type="button"
|
|
179
|
+
bind:this={triggerElement}
|
|
180
|
+
class="flex items-center {sizeClass} bg-gray-50 dark:bg-gray-800 border border-r-0 rounded-l-lg cursor-pointer transition-colors text-left focus:outline-hidden focus:ring-4 focus:ring-blue-300 dark:focus:ring-blue-800 border-gray-300 dark:border-gray-600 hover:border-blue-500 dark:hover:border-blue-500 {disabled ? 'opacity-50 cursor-not-allowed' : ''}"
|
|
181
|
+
{disabled}
|
|
182
|
+
aria-haspopup="listbox"
|
|
183
|
+
aria-expanded={isOpen}
|
|
184
|
+
aria-label={labels.countrySelector}
|
|
185
|
+
onclick={toggle}
|
|
186
|
+
onkeydown={handleKeydown}
|
|
187
|
+
>
|
|
188
|
+
<span class="text-lg leading-none">{country.flag}</span>
|
|
189
|
+
<span class={`${typography.sm} whitespace-nowrap`}>{country.dialCode}</span>
|
|
190
|
+
<ChevronDownOutline class="w-3 h-3 shrink-0 {typography.iconMuted} transition-transform duration-200 {isOpen ? 'rotate-180' : ''}" />
|
|
191
|
+
</button>
|
|
192
|
+
|
|
193
|
+
{#if isOpen}
|
|
194
|
+
<!-- svelte-ignore a11y_no_noninteractive_tabindex -->
|
|
195
|
+
<div
|
|
196
|
+
bind:this={dropdownElement}
|
|
197
|
+
class="fixed z-[9999] bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg shadow-lg overflow-hidden"
|
|
198
|
+
style="top: {dropdownPosition.top}px; left: {dropdownPosition.left}px; width: {dropdownPosition.width}px;"
|
|
199
|
+
role="listbox"
|
|
200
|
+
tabindex="-1"
|
|
201
|
+
aria-label={labels.countrySelector}
|
|
202
|
+
transition:bloom={{ origin: "top left" }}
|
|
203
|
+
>
|
|
204
|
+
<!-- Search -->
|
|
205
|
+
<div class="p-2 border-b border-gray-200 dark:border-gray-600">
|
|
206
|
+
<input
|
|
207
|
+
bind:this={searchInputElement}
|
|
208
|
+
type="text"
|
|
209
|
+
class="w-full px-3 py-2 text-sm bg-gray-50 dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg text-gray-900 dark:text-white focus:outline-hidden focus:ring-2 focus:ring-blue-300 dark:focus:ring-blue-800 placeholder-gray-400 dark:placeholder-gray-500"
|
|
210
|
+
placeholder={labels.searchPlaceholder}
|
|
211
|
+
bind:value={searchQuery}
|
|
212
|
+
onkeydown={handleKeydown}
|
|
213
|
+
/>
|
|
214
|
+
</div>
|
|
215
|
+
|
|
216
|
+
<!-- List -->
|
|
217
|
+
<div class="max-h-60 overflow-y-auto py-1">
|
|
218
|
+
{#each filteredCountries as c, idx}
|
|
219
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
220
|
+
<li
|
|
221
|
+
class={`flex items-center gap-3 px-3 py-2 cursor-pointer ${typography.sm} transition-colors ${c.code === country.code ? '' : typography.textMuted} ${idx === focusedIndex ? 'bg-gray-100 dark:bg-gray-600' : 'hover:bg-gray-100 dark:hover:bg-gray-600'}`}
|
|
222
|
+
role="option"
|
|
223
|
+
aria-selected={c.code === country.code}
|
|
224
|
+
data-index={idx}
|
|
225
|
+
onclick={() => selectCountry(c)}
|
|
226
|
+
onmouseenter={() => (focusedIndex = idx)}
|
|
227
|
+
>
|
|
228
|
+
<span class="text-lg leading-none">{c.flag}</span>
|
|
229
|
+
<span class="flex-1">{c.name}</span>
|
|
230
|
+
<span class={typography.textMuted}>{c.dialCode}</span>
|
|
231
|
+
</li>
|
|
232
|
+
{:else}
|
|
233
|
+
<div class={`px-3 py-4 text-center ${typography.textMuted}`}>
|
|
234
|
+
{labels.noResults}
|
|
235
|
+
</div>
|
|
236
|
+
{/each}
|
|
237
|
+
</div>
|
|
238
|
+
</div>
|
|
239
|
+
{/if}
|
|
240
|
+
</div>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Country } from "./countryData";
|
|
2
|
+
interface Props {
|
|
3
|
+
country?: Country;
|
|
4
|
+
disabled?: boolean;
|
|
5
|
+
size?: "sm" | "md" | "lg";
|
|
6
|
+
labels?: {
|
|
7
|
+
searchPlaceholder?: string;
|
|
8
|
+
noResults?: string;
|
|
9
|
+
countrySelector?: string;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
declare const CountrySelector: import("svelte").Component<Props, {}, "country">;
|
|
13
|
+
type CountrySelector = ReturnType<typeof CountrySelector>;
|
|
14
|
+
export default CountrySelector;
|
|
15
|
+
//# sourceMappingURL=CountrySelector.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CountrySelector.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/recipes/inputs/phoneInput/CountrySelector.svelte.ts"],"names":[],"mappings":"AAOA,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAGtD,UAAU,KAAK;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE;QACP,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AA0MH,QAAA,MAAM,eAAe,kDAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface Country {
|
|
2
|
+
/** ISO 3166-1 alpha-2 code */
|
|
3
|
+
code: string;
|
|
4
|
+
/** Display name */
|
|
5
|
+
name: string;
|
|
6
|
+
/** Dial code with + prefix */
|
|
7
|
+
dialCode: string;
|
|
8
|
+
/** Emoji flag */
|
|
9
|
+
flag: string;
|
|
10
|
+
/** Priority for shared dial codes (lower = higher priority) */
|
|
11
|
+
priority?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare const COUNTRIES: Country[];
|
|
14
|
+
/** Get a country by ISO code */
|
|
15
|
+
export declare function getCountry(code: string): Country | undefined;
|
|
16
|
+
/** Get the suggested countries (pinned to top of selector) */
|
|
17
|
+
export declare function getSuggestedCountries(): Country[];
|
|
18
|
+
//# sourceMappingURL=countryData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"countryData.d.ts","sourceRoot":"","sources":["../../../../src/lib/recipes/inputs/phoneInput/countryData.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,SAAS,EAAE,OAAO,EAwM9B,CAAC;AAEF,gCAAgC;AAChC,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAE5D;AAKD,8DAA8D;AAC9D,wBAAgB,qBAAqB,IAAI,OAAO,EAAE,CAEjD"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
export const COUNTRIES = [
|
|
2
|
+
{ code: 'US', name: 'United States', dialCode: '+1', flag: '🇺🇸', priority: 0 },
|
|
3
|
+
{ code: 'AF', name: 'Afghanistan', dialCode: '+93', flag: '🇦🇫' },
|
|
4
|
+
{ code: 'AL', name: 'Albania', dialCode: '+355', flag: '🇦🇱' },
|
|
5
|
+
{ code: 'DZ', name: 'Algeria', dialCode: '+213', flag: '🇩🇿' },
|
|
6
|
+
{ code: 'AD', name: 'Andorra', dialCode: '+376', flag: '🇦🇩' },
|
|
7
|
+
{ code: 'AO', name: 'Angola', dialCode: '+244', flag: '🇦🇴' },
|
|
8
|
+
{ code: 'AG', name: 'Antigua and Barbuda', dialCode: '+1268', flag: '🇦🇬' },
|
|
9
|
+
{ code: 'AR', name: 'Argentina', dialCode: '+54', flag: '🇦🇷' },
|
|
10
|
+
{ code: 'AM', name: 'Armenia', dialCode: '+374', flag: '🇦🇲' },
|
|
11
|
+
{ code: 'AU', name: 'Australia', dialCode: '+61', flag: '🇦🇺' },
|
|
12
|
+
{ code: 'AT', name: 'Austria', dialCode: '+43', flag: '🇦🇹' },
|
|
13
|
+
{ code: 'AZ', name: 'Azerbaijan', dialCode: '+994', flag: '🇦🇿' },
|
|
14
|
+
{ code: 'BS', name: 'Bahamas', dialCode: '+1242', flag: '🇧🇸' },
|
|
15
|
+
{ code: 'BH', name: 'Bahrain', dialCode: '+973', flag: '🇧🇭' },
|
|
16
|
+
{ code: 'BD', name: 'Bangladesh', dialCode: '+880', flag: '🇧🇩' },
|
|
17
|
+
{ code: 'BB', name: 'Barbados', dialCode: '+1246', flag: '🇧🇧' },
|
|
18
|
+
{ code: 'BY', name: 'Belarus', dialCode: '+375', flag: '🇧🇾' },
|
|
19
|
+
{ code: 'BE', name: 'Belgium', dialCode: '+32', flag: '🇧🇪' },
|
|
20
|
+
{ code: 'BZ', name: 'Belize', dialCode: '+501', flag: '🇧🇿' },
|
|
21
|
+
{ code: 'BJ', name: 'Benin', dialCode: '+229', flag: '🇧🇯' },
|
|
22
|
+
{ code: 'BT', name: 'Bhutan', dialCode: '+975', flag: '🇧🇹' },
|
|
23
|
+
{ code: 'BO', name: 'Bolivia', dialCode: '+591', flag: '🇧🇴' },
|
|
24
|
+
{ code: 'BA', name: 'Bosnia and Herzegovina', dialCode: '+387', flag: '🇧🇦' },
|
|
25
|
+
{ code: 'BW', name: 'Botswana', dialCode: '+267', flag: '🇧🇼' },
|
|
26
|
+
{ code: 'BR', name: 'Brazil', dialCode: '+55', flag: '🇧🇷' },
|
|
27
|
+
{ code: 'BN', name: 'Brunei', dialCode: '+673', flag: '🇧🇳' },
|
|
28
|
+
{ code: 'BG', name: 'Bulgaria', dialCode: '+359', flag: '🇧🇬' },
|
|
29
|
+
{ code: 'BF', name: 'Burkina Faso', dialCode: '+226', flag: '🇧🇫' },
|
|
30
|
+
{ code: 'BI', name: 'Burundi', dialCode: '+257', flag: '🇧🇮' },
|
|
31
|
+
{ code: 'CV', name: 'Cabo Verde', dialCode: '+238', flag: '🇨🇻' },
|
|
32
|
+
{ code: 'KH', name: 'Cambodia', dialCode: '+855', flag: '🇰🇭' },
|
|
33
|
+
{ code: 'CM', name: 'Cameroon', dialCode: '+237', flag: '🇨🇲' },
|
|
34
|
+
{ code: 'CA', name: 'Canada', dialCode: '+1', flag: '🇨🇦', priority: 1 },
|
|
35
|
+
{ code: 'CF', name: 'Central African Republic', dialCode: '+236', flag: '🇨🇫' },
|
|
36
|
+
{ code: 'TD', name: 'Chad', dialCode: '+235', flag: '🇹🇩' },
|
|
37
|
+
{ code: 'CL', name: 'Chile', dialCode: '+56', flag: '🇨🇱' },
|
|
38
|
+
{ code: 'CN', name: 'China', dialCode: '+86', flag: '🇨🇳' },
|
|
39
|
+
{ code: 'CO', name: 'Colombia', dialCode: '+57', flag: '🇨🇴' },
|
|
40
|
+
{ code: 'KM', name: 'Comoros', dialCode: '+269', flag: '🇰🇲' },
|
|
41
|
+
{ code: 'CG', name: 'Congo', dialCode: '+242', flag: '🇨🇬' },
|
|
42
|
+
{ code: 'CD', name: 'Congo (DRC)', dialCode: '+243', flag: '🇨🇩' },
|
|
43
|
+
{ code: 'CR', name: 'Costa Rica', dialCode: '+506', flag: '🇨🇷' },
|
|
44
|
+
{ code: 'CI', name: "Côte d'Ivoire", dialCode: '+225', flag: '🇨🇮' },
|
|
45
|
+
{ code: 'HR', name: 'Croatia', dialCode: '+385', flag: '🇭🇷' },
|
|
46
|
+
{ code: 'CU', name: 'Cuba', dialCode: '+53', flag: '🇨🇺' },
|
|
47
|
+
{ code: 'CY', name: 'Cyprus', dialCode: '+357', flag: '🇨🇾' },
|
|
48
|
+
{ code: 'CZ', name: 'Czech Republic', dialCode: '+420', flag: '🇨🇿' },
|
|
49
|
+
{ code: 'DK', name: 'Denmark', dialCode: '+45', flag: '🇩🇰' },
|
|
50
|
+
{ code: 'DJ', name: 'Djibouti', dialCode: '+253', flag: '🇩🇯' },
|
|
51
|
+
{ code: 'DM', name: 'Dominica', dialCode: '+1767', flag: '🇩🇲' },
|
|
52
|
+
{ code: 'DO', name: 'Dominican Republic', dialCode: '+1809', flag: '🇩🇴' },
|
|
53
|
+
{ code: 'EC', name: 'Ecuador', dialCode: '+593', flag: '🇪🇨' },
|
|
54
|
+
{ code: 'EG', name: 'Egypt', dialCode: '+20', flag: '🇪🇬' },
|
|
55
|
+
{ code: 'SV', name: 'El Salvador', dialCode: '+503', flag: '🇸🇻' },
|
|
56
|
+
{ code: 'GQ', name: 'Equatorial Guinea', dialCode: '+240', flag: '🇬🇶' },
|
|
57
|
+
{ code: 'ER', name: 'Eritrea', dialCode: '+291', flag: '🇪🇷' },
|
|
58
|
+
{ code: 'EE', name: 'Estonia', dialCode: '+372', flag: '🇪🇪' },
|
|
59
|
+
{ code: 'SZ', name: 'Eswatini', dialCode: '+268', flag: '🇸🇿' },
|
|
60
|
+
{ code: 'ET', name: 'Ethiopia', dialCode: '+251', flag: '🇪🇹' },
|
|
61
|
+
{ code: 'FJ', name: 'Fiji', dialCode: '+679', flag: '🇫🇯' },
|
|
62
|
+
{ code: 'FI', name: 'Finland', dialCode: '+358', flag: '🇫🇮' },
|
|
63
|
+
{ code: 'FR', name: 'France', dialCode: '+33', flag: '🇫🇷' },
|
|
64
|
+
{ code: 'GA', name: 'Gabon', dialCode: '+241', flag: '🇬🇦' },
|
|
65
|
+
{ code: 'GM', name: 'Gambia', dialCode: '+220', flag: '🇬🇲' },
|
|
66
|
+
{ code: 'GE', name: 'Georgia', dialCode: '+995', flag: '🇬🇪' },
|
|
67
|
+
{ code: 'DE', name: 'Germany', dialCode: '+49', flag: '🇩🇪' },
|
|
68
|
+
{ code: 'GH', name: 'Ghana', dialCode: '+233', flag: '🇬🇭' },
|
|
69
|
+
{ code: 'GR', name: 'Greece', dialCode: '+30', flag: '🇬🇷' },
|
|
70
|
+
{ code: 'GD', name: 'Grenada', dialCode: '+1473', flag: '🇬🇩' },
|
|
71
|
+
{ code: 'GT', name: 'Guatemala', dialCode: '+502', flag: '🇬🇹' },
|
|
72
|
+
{ code: 'GN', name: 'Guinea', dialCode: '+224', flag: '🇬🇳' },
|
|
73
|
+
{ code: 'GW', name: 'Guinea-Bissau', dialCode: '+245', flag: '🇬🇼' },
|
|
74
|
+
{ code: 'GY', name: 'Guyana', dialCode: '+592', flag: '🇬🇾' },
|
|
75
|
+
{ code: 'HT', name: 'Haiti', dialCode: '+509', flag: '🇭🇹' },
|
|
76
|
+
{ code: 'HN', name: 'Honduras', dialCode: '+504', flag: '🇭🇳' },
|
|
77
|
+
{ code: 'HK', name: 'Hong Kong', dialCode: '+852', flag: '🇭🇰' },
|
|
78
|
+
{ code: 'HU', name: 'Hungary', dialCode: '+36', flag: '🇭🇺' },
|
|
79
|
+
{ code: 'IS', name: 'Iceland', dialCode: '+354', flag: '🇮🇸' },
|
|
80
|
+
{ code: 'IN', name: 'India', dialCode: '+91', flag: '🇮🇳' },
|
|
81
|
+
{ code: 'ID', name: 'Indonesia', dialCode: '+62', flag: '🇮🇩' },
|
|
82
|
+
{ code: 'IR', name: 'Iran', dialCode: '+98', flag: '🇮🇷' },
|
|
83
|
+
{ code: 'IQ', name: 'Iraq', dialCode: '+964', flag: '🇮🇶' },
|
|
84
|
+
{ code: 'IE', name: 'Ireland', dialCode: '+353', flag: '🇮🇪' },
|
|
85
|
+
{ code: 'IL', name: 'Israel', dialCode: '+972', flag: '🇮🇱' },
|
|
86
|
+
{ code: 'IT', name: 'Italy', dialCode: '+39', flag: '🇮🇹' },
|
|
87
|
+
{ code: 'JM', name: 'Jamaica', dialCode: '+1876', flag: '🇯🇲' },
|
|
88
|
+
{ code: 'JP', name: 'Japan', dialCode: '+81', flag: '🇯🇵' },
|
|
89
|
+
{ code: 'JO', name: 'Jordan', dialCode: '+962', flag: '🇯🇴' },
|
|
90
|
+
{ code: 'KZ', name: 'Kazakhstan', dialCode: '+7', flag: '🇰🇿', priority: 1 },
|
|
91
|
+
{ code: 'KE', name: 'Kenya', dialCode: '+254', flag: '🇰🇪' },
|
|
92
|
+
{ code: 'KI', name: 'Kiribati', dialCode: '+686', flag: '🇰🇮' },
|
|
93
|
+
{ code: 'KP', name: 'North Korea', dialCode: '+850', flag: '🇰🇵' },
|
|
94
|
+
{ code: 'KR', name: 'South Korea', dialCode: '+82', flag: '🇰🇷' },
|
|
95
|
+
{ code: 'KW', name: 'Kuwait', dialCode: '+965', flag: '🇰🇼' },
|
|
96
|
+
{ code: 'KG', name: 'Kyrgyzstan', dialCode: '+996', flag: '🇰🇬' },
|
|
97
|
+
{ code: 'LA', name: 'Laos', dialCode: '+856', flag: '🇱🇦' },
|
|
98
|
+
{ code: 'LV', name: 'Latvia', dialCode: '+371', flag: '🇱🇻' },
|
|
99
|
+
{ code: 'LB', name: 'Lebanon', dialCode: '+961', flag: '🇱🇧' },
|
|
100
|
+
{ code: 'LS', name: 'Lesotho', dialCode: '+266', flag: '🇱🇸' },
|
|
101
|
+
{ code: 'LR', name: 'Liberia', dialCode: '+231', flag: '🇱🇷' },
|
|
102
|
+
{ code: 'LY', name: 'Libya', dialCode: '+218', flag: '🇱🇾' },
|
|
103
|
+
{ code: 'LI', name: 'Liechtenstein', dialCode: '+423', flag: '🇱🇮' },
|
|
104
|
+
{ code: 'LT', name: 'Lithuania', dialCode: '+370', flag: '🇱🇹' },
|
|
105
|
+
{ code: 'LU', name: 'Luxembourg', dialCode: '+352', flag: '🇱🇺' },
|
|
106
|
+
{ code: 'MO', name: 'Macao', dialCode: '+853', flag: '🇲🇴' },
|
|
107
|
+
{ code: 'MG', name: 'Madagascar', dialCode: '+261', flag: '🇲🇬' },
|
|
108
|
+
{ code: 'MW', name: 'Malawi', dialCode: '+265', flag: '🇲🇼' },
|
|
109
|
+
{ code: 'MY', name: 'Malaysia', dialCode: '+60', flag: '🇲🇾' },
|
|
110
|
+
{ code: 'MV', name: 'Maldives', dialCode: '+960', flag: '🇲🇻' },
|
|
111
|
+
{ code: 'ML', name: 'Mali', dialCode: '+223', flag: '🇲🇱' },
|
|
112
|
+
{ code: 'MT', name: 'Malta', dialCode: '+356', flag: '🇲🇹' },
|
|
113
|
+
{ code: 'MH', name: 'Marshall Islands', dialCode: '+692', flag: '🇲🇭' },
|
|
114
|
+
{ code: 'MR', name: 'Mauritania', dialCode: '+222', flag: '🇲🇷' },
|
|
115
|
+
{ code: 'MU', name: 'Mauritius', dialCode: '+230', flag: '🇲🇺' },
|
|
116
|
+
{ code: 'MX', name: 'Mexico', dialCode: '+52', flag: '🇲🇽' },
|
|
117
|
+
{ code: 'FM', name: 'Micronesia', dialCode: '+691', flag: '🇫🇲' },
|
|
118
|
+
{ code: 'MD', name: 'Moldova', dialCode: '+373', flag: '🇲🇩' },
|
|
119
|
+
{ code: 'MC', name: 'Monaco', dialCode: '+377', flag: '🇲🇨' },
|
|
120
|
+
{ code: 'MN', name: 'Mongolia', dialCode: '+976', flag: '🇲🇳' },
|
|
121
|
+
{ code: 'ME', name: 'Montenegro', dialCode: '+382', flag: '🇲🇪' },
|
|
122
|
+
{ code: 'MA', name: 'Morocco', dialCode: '+212', flag: '🇲🇦' },
|
|
123
|
+
{ code: 'MZ', name: 'Mozambique', dialCode: '+258', flag: '🇲🇿' },
|
|
124
|
+
{ code: 'MM', name: 'Myanmar', dialCode: '+95', flag: '🇲🇲' },
|
|
125
|
+
{ code: 'NA', name: 'Namibia', dialCode: '+264', flag: '🇳🇦' },
|
|
126
|
+
{ code: 'NR', name: 'Nauru', dialCode: '+674', flag: '🇳🇷' },
|
|
127
|
+
{ code: 'NP', name: 'Nepal', dialCode: '+977', flag: '🇳🇵' },
|
|
128
|
+
{ code: 'NL', name: 'Netherlands', dialCode: '+31', flag: '🇳🇱' },
|
|
129
|
+
{ code: 'NZ', name: 'New Zealand', dialCode: '+64', flag: '🇳🇿' },
|
|
130
|
+
{ code: 'NI', name: 'Nicaragua', dialCode: '+505', flag: '🇳🇮' },
|
|
131
|
+
{ code: 'NE', name: 'Niger', dialCode: '+227', flag: '🇳🇪' },
|
|
132
|
+
{ code: 'NG', name: 'Nigeria', dialCode: '+234', flag: '🇳🇬' },
|
|
133
|
+
{ code: 'MK', name: 'North Macedonia', dialCode: '+389', flag: '🇲🇰' },
|
|
134
|
+
{ code: 'NO', name: 'Norway', dialCode: '+47', flag: '🇳🇴' },
|
|
135
|
+
{ code: 'OM', name: 'Oman', dialCode: '+968', flag: '🇴🇲' },
|
|
136
|
+
{ code: 'PK', name: 'Pakistan', dialCode: '+92', flag: '🇵🇰' },
|
|
137
|
+
{ code: 'PW', name: 'Palau', dialCode: '+680', flag: '🇵🇼' },
|
|
138
|
+
{ code: 'PS', name: 'Palestine', dialCode: '+970', flag: '🇵🇸' },
|
|
139
|
+
{ code: 'PA', name: 'Panama', dialCode: '+507', flag: '🇵🇦' },
|
|
140
|
+
{ code: 'PG', name: 'Papua New Guinea', dialCode: '+675', flag: '🇵🇬' },
|
|
141
|
+
{ code: 'PY', name: 'Paraguay', dialCode: '+595', flag: '🇵🇾' },
|
|
142
|
+
{ code: 'PE', name: 'Peru', dialCode: '+51', flag: '🇵🇪' },
|
|
143
|
+
{ code: 'PH', name: 'Philippines', dialCode: '+63', flag: '🇵🇭' },
|
|
144
|
+
{ code: 'PL', name: 'Poland', dialCode: '+48', flag: '🇵🇱' },
|
|
145
|
+
{ code: 'PT', name: 'Portugal', dialCode: '+351', flag: '🇵🇹' },
|
|
146
|
+
{ code: 'PR', name: 'Puerto Rico', dialCode: '+1787', flag: '🇵🇷' },
|
|
147
|
+
{ code: 'QA', name: 'Qatar', dialCode: '+974', flag: '🇶🇦' },
|
|
148
|
+
{ code: 'RO', name: 'Romania', dialCode: '+40', flag: '🇷🇴' },
|
|
149
|
+
{ code: 'RU', name: 'Russia', dialCode: '+7', flag: '🇷🇺', priority: 0 },
|
|
150
|
+
{ code: 'RW', name: 'Rwanda', dialCode: '+250', flag: '🇷🇼' },
|
|
151
|
+
{ code: 'KN', name: 'Saint Kitts and Nevis', dialCode: '+1869', flag: '🇰🇳' },
|
|
152
|
+
{ code: 'LC', name: 'Saint Lucia', dialCode: '+1758', flag: '🇱🇨' },
|
|
153
|
+
{ code: 'VC', name: 'Saint Vincent and the Grenadines', dialCode: '+1784', flag: '🇻🇨' },
|
|
154
|
+
{ code: 'WS', name: 'Samoa', dialCode: '+685', flag: '🇼🇸' },
|
|
155
|
+
{ code: 'SM', name: 'San Marino', dialCode: '+378', flag: '🇸🇲' },
|
|
156
|
+
{ code: 'ST', name: 'São Tomé and Príncipe', dialCode: '+239', flag: '🇸🇹' },
|
|
157
|
+
{ code: 'SA', name: 'Saudi Arabia', dialCode: '+966', flag: '🇸🇦' },
|
|
158
|
+
{ code: 'SN', name: 'Senegal', dialCode: '+221', flag: '🇸🇳' },
|
|
159
|
+
{ code: 'RS', name: 'Serbia', dialCode: '+381', flag: '🇷🇸' },
|
|
160
|
+
{ code: 'SC', name: 'Seychelles', dialCode: '+248', flag: '🇸🇨' },
|
|
161
|
+
{ code: 'SL', name: 'Sierra Leone', dialCode: '+232', flag: '🇸🇱' },
|
|
162
|
+
{ code: 'SG', name: 'Singapore', dialCode: '+65', flag: '🇸🇬' },
|
|
163
|
+
{ code: 'SK', name: 'Slovakia', dialCode: '+421', flag: '🇸🇰' },
|
|
164
|
+
{ code: 'SI', name: 'Slovenia', dialCode: '+386', flag: '🇸🇮' },
|
|
165
|
+
{ code: 'SB', name: 'Solomon Islands', dialCode: '+677', flag: '🇸🇧' },
|
|
166
|
+
{ code: 'SO', name: 'Somalia', dialCode: '+252', flag: '🇸🇴' },
|
|
167
|
+
{ code: 'ZA', name: 'South Africa', dialCode: '+27', flag: '🇿🇦' },
|
|
168
|
+
{ code: 'SS', name: 'South Sudan', dialCode: '+211', flag: '🇸🇸' },
|
|
169
|
+
{ code: 'ES', name: 'Spain', dialCode: '+34', flag: '🇪🇸' },
|
|
170
|
+
{ code: 'LK', name: 'Sri Lanka', dialCode: '+94', flag: '🇱🇰' },
|
|
171
|
+
{ code: 'SD', name: 'Sudan', dialCode: '+249', flag: '🇸🇩' },
|
|
172
|
+
{ code: 'SR', name: 'Suriname', dialCode: '+597', flag: '🇸🇷' },
|
|
173
|
+
{ code: 'SE', name: 'Sweden', dialCode: '+46', flag: '🇸🇪' },
|
|
174
|
+
{ code: 'CH', name: 'Switzerland', dialCode: '+41', flag: '🇨🇭' },
|
|
175
|
+
{ code: 'SY', name: 'Syria', dialCode: '+963', flag: '🇸🇾' },
|
|
176
|
+
{ code: 'TW', name: 'Taiwan', dialCode: '+886', flag: '🇹🇼' },
|
|
177
|
+
{ code: 'TJ', name: 'Tajikistan', dialCode: '+992', flag: '🇹🇯' },
|
|
178
|
+
{ code: 'TZ', name: 'Tanzania', dialCode: '+255', flag: '🇹🇿' },
|
|
179
|
+
{ code: 'TH', name: 'Thailand', dialCode: '+66', flag: '🇹🇭' },
|
|
180
|
+
{ code: 'TL', name: 'Timor-Leste', dialCode: '+670', flag: '🇹🇱' },
|
|
181
|
+
{ code: 'TG', name: 'Togo', dialCode: '+228', flag: '🇹🇬' },
|
|
182
|
+
{ code: 'TO', name: 'Tonga', dialCode: '+676', flag: '🇹🇴' },
|
|
183
|
+
{ code: 'TT', name: 'Trinidad and Tobago', dialCode: '+1868', flag: '🇹🇹' },
|
|
184
|
+
{ code: 'TN', name: 'Tunisia', dialCode: '+216', flag: '🇹🇳' },
|
|
185
|
+
{ code: 'TR', name: 'Turkey', dialCode: '+90', flag: '🇹🇷' },
|
|
186
|
+
{ code: 'TM', name: 'Turkmenistan', dialCode: '+993', flag: '🇹🇲' },
|
|
187
|
+
{ code: 'TV', name: 'Tuvalu', dialCode: '+688', flag: '🇹🇻' },
|
|
188
|
+
{ code: 'UG', name: 'Uganda', dialCode: '+256', flag: '🇺🇬' },
|
|
189
|
+
{ code: 'UA', name: 'Ukraine', dialCode: '+380', flag: '🇺🇦' },
|
|
190
|
+
{ code: 'AE', name: 'United Arab Emirates', dialCode: '+971', flag: '🇦🇪' },
|
|
191
|
+
{ code: 'GB', name: 'United Kingdom', dialCode: '+44', flag: '🇬🇧' },
|
|
192
|
+
{ code: 'UY', name: 'Uruguay', dialCode: '+598', flag: '🇺🇾' },
|
|
193
|
+
{ code: 'UZ', name: 'Uzbekistan', dialCode: '+998', flag: '🇺🇿' },
|
|
194
|
+
{ code: 'VU', name: 'Vanuatu', dialCode: '+678', flag: '🇻🇺' },
|
|
195
|
+
{ code: 'VA', name: 'Vatican City', dialCode: '+379', flag: '🇻🇦' },
|
|
196
|
+
{ code: 'VE', name: 'Venezuela', dialCode: '+58', flag: '🇻🇪' },
|
|
197
|
+
{ code: 'VN', name: 'Vietnam', dialCode: '+84', flag: '🇻🇳' },
|
|
198
|
+
{ code: 'YE', name: 'Yemen', dialCode: '+967', flag: '🇾🇪' },
|
|
199
|
+
{ code: 'ZM', name: 'Zambia', dialCode: '+260', flag: '🇿🇲' },
|
|
200
|
+
{ code: 'ZW', name: 'Zimbabwe', dialCode: '+263', flag: '🇿🇼' },
|
|
201
|
+
];
|
|
202
|
+
/** Get a country by ISO code */
|
|
203
|
+
export function getCountry(code) {
|
|
204
|
+
return COUNTRIES.find((c) => c.code === code);
|
|
205
|
+
}
|
|
206
|
+
/** Country codes pinned to top of the country selector */
|
|
207
|
+
const SUGGESTED_CODES = ['US', 'CA', 'GB', 'AU'];
|
|
208
|
+
/** Get the suggested countries (pinned to top of selector) */
|
|
209
|
+
export function getSuggestedCountries() {
|
|
210
|
+
return SUGGESTED_CODES.map((code) => COUNTRIES.find((c) => c.code === code)).filter(Boolean);
|
|
211
|
+
}
|
|
@@ -19,6 +19,10 @@
|
|
|
19
19
|
import { CheckOutline, CloseOutline, ExclamationTriangleOutline, InfoCircleOutline } from '../../primitives/Icons';
|
|
20
20
|
import { typography } from '../../tokens/typography';
|
|
21
21
|
|
|
22
|
+
const defaultLabels = {
|
|
23
|
+
ok: 'OK',
|
|
24
|
+
};
|
|
25
|
+
|
|
22
26
|
let {
|
|
23
27
|
/** Whether the modal is visible */
|
|
24
28
|
open = $bindable(false),
|
|
@@ -29,7 +33,7 @@
|
|
|
29
33
|
/** Alert message */
|
|
30
34
|
message = '',
|
|
31
35
|
/** Button text */
|
|
32
|
-
buttonText =
|
|
36
|
+
buttonText = undefined,
|
|
33
37
|
/** Auto-close delay in milliseconds (0 to disable) */
|
|
34
38
|
autoClose = 0,
|
|
35
39
|
/** Modal size */
|
|
@@ -37,8 +41,13 @@
|
|
|
37
41
|
/** Callbacks */
|
|
38
42
|
onclose,
|
|
39
43
|
onconfirm,
|
|
44
|
+
/** Override user-visible strings */
|
|
45
|
+
labels: userLabels = {},
|
|
40
46
|
} = $props();
|
|
41
47
|
|
|
48
|
+
let labels = $derived({ ...defaultLabels, ...userLabels });
|
|
49
|
+
let effectiveButtonText = $derived(buttonText ?? labels.ok);
|
|
50
|
+
|
|
42
51
|
// Variant styles
|
|
43
52
|
const variantStyles = {
|
|
44
53
|
success: {
|
|
@@ -123,7 +132,7 @@
|
|
|
123
132
|
variant={styles.button}
|
|
124
133
|
onclick={handleConfirm}
|
|
125
134
|
>
|
|
126
|
-
{
|
|
135
|
+
{effectiveButtonText}
|
|
127
136
|
</Button>
|
|
128
137
|
</div>
|
|
129
138
|
{/snippet}
|
|
@@ -8,21 +8,23 @@ declare const AlertModal: import("svelte").Component<{
|
|
|
8
8
|
variant?: string;
|
|
9
9
|
title?: string;
|
|
10
10
|
message?: string;
|
|
11
|
-
buttonText?:
|
|
11
|
+
buttonText?: any;
|
|
12
12
|
autoClose?: number;
|
|
13
13
|
size?: string;
|
|
14
14
|
onclose: any;
|
|
15
15
|
onconfirm: any;
|
|
16
|
+
labels?: Record<string, any>;
|
|
16
17
|
}, {}, "open">;
|
|
17
18
|
type $$ComponentProps = {
|
|
18
19
|
open?: boolean;
|
|
19
20
|
variant?: string;
|
|
20
21
|
title?: string;
|
|
21
22
|
message?: string;
|
|
22
|
-
buttonText?:
|
|
23
|
+
buttonText?: any;
|
|
23
24
|
autoClose?: number;
|
|
24
25
|
size?: string;
|
|
25
26
|
onclose: any;
|
|
26
27
|
onconfirm: any;
|
|
28
|
+
labels?: Record<string, any>;
|
|
27
29
|
};
|
|
28
30
|
//# sourceMappingURL=AlertModal.svelte.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AlertModal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/recipes/modals/AlertModal.svelte.js"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"AlertModal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/recipes/modals/AlertModal.svelte.js"],"names":[],"mappings":";;;;;AAmJA;WAjH4B,OAAO;cAAY,MAAM;YAAU,MAAM;cAAY,MAAM;iBAAe,GAAG;gBAAc,MAAM;WAAS,MAAM;aAAW,GAAG;eAAa,GAAG;aAAW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;eAiH/I;wBAjHtC;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,GAAG,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC;IAAC,SAAS,EAAE,GAAG,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAE"}
|
|
@@ -5,6 +5,10 @@
|
|
|
5
5
|
import { typography } from '../../tokens/typography';
|
|
6
6
|
import { triggerHaptic } from '../../utils/haptic.js';
|
|
7
7
|
|
|
8
|
+
const defaultLabels = {
|
|
9
|
+
close: 'Close',
|
|
10
|
+
};
|
|
11
|
+
|
|
8
12
|
let {
|
|
9
13
|
open = $bindable(false),
|
|
10
14
|
size = "md",
|
|
@@ -25,9 +29,12 @@
|
|
|
25
29
|
onconfirm,
|
|
26
30
|
oncancel,
|
|
27
31
|
onclose,
|
|
32
|
+
labels: userLabels = {},
|
|
28
33
|
...restProps
|
|
29
34
|
} = $props();
|
|
30
35
|
|
|
36
|
+
let labels = $derived({ ...defaultLabels, ...userLabels });
|
|
37
|
+
|
|
31
38
|
let resolvedIcon = $derived(customIcon || icon);
|
|
32
39
|
|
|
33
40
|
let resolvedActions = $derived(actions.length > 0 ? actions : buildActionsFromProps());
|
|
@@ -113,7 +120,7 @@
|
|
|
113
120
|
{#if closeBtn}
|
|
114
121
|
<div class="flex justify-end -mt-2 -mr-2 mb-2">
|
|
115
122
|
<Button variant="icon" size="xs" onclick={handleClose} {disabled}>
|
|
116
|
-
<img src={Cancel} alt=
|
|
123
|
+
<img src={Cancel} alt={labels.close} class="w-5 h-5" />
|
|
117
124
|
</Button>
|
|
118
125
|
</div>
|
|
119
126
|
{/if}
|
|
@@ -22,6 +22,7 @@ declare const ConfirmationModal: import("svelte").Component<{
|
|
|
22
22
|
onconfirm: any;
|
|
23
23
|
oncancel: any;
|
|
24
24
|
onclose: any;
|
|
25
|
+
labels?: Record<string, any>;
|
|
25
26
|
} & Record<string, any>, {}, "open">;
|
|
26
27
|
type $$ComponentProps = {
|
|
27
28
|
open?: boolean;
|
|
@@ -42,5 +43,6 @@ type $$ComponentProps = {
|
|
|
42
43
|
onconfirm: any;
|
|
43
44
|
oncancel: any;
|
|
44
45
|
onclose: any;
|
|
46
|
+
labels?: Record<string, any>;
|
|
45
47
|
} & Record<string, any>;
|
|
46
48
|
//# sourceMappingURL=ConfirmationModal.svelte.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmationModal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/recipes/modals/ConfirmationModal.svelte.js"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"ConfirmationModal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/recipes/modals/ConfirmationModal.svelte.js"],"names":[],"mappings":";;;;;AA8KA;WA1J4B,OAAO;WAAS,MAAM;YAAU,MAAM;kBAAgB,MAAM;kBAAgB,MAAM;cAAY,GAAG,EAAE;WAAS,GAAG;iBAAe,GAAG;eAAa,OAAO;wBAAsB,MAAM;0BAAwB,MAAM;cAAY,MAAM;cAAY,OAAO;eAAa,OAAO;aAAW,OAAO;eAAa,GAAG;cAAY,GAAG;aAAW,GAAG;aAAW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;qCA0JjU;wBA1J7C;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,GAAG,CAAC;IAAC,UAAU,CAAC,EAAE,GAAG,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,GAAG,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC"}
|