@getmicdrop/svelte-components 5.3.6 → 5.3.10
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 -8
- package/dist/calendar/AboutShow/AboutShow.svelte.d.ts.map +1 -1
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte +9 -8
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte.d.ts.map +1 -1
- package/dist/calendar/FAQs/FAQs.svelte +6 -5
- package/dist/calendar/FAQs/FAQs.svelte.d.ts.map +1 -1
- package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte +3 -2
- package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte.d.ts.map +1 -1
- package/dist/calendar/OrderSummary/OrderSummary.svelte +19 -18
- package/dist/calendar/OrderSummary/OrderSummary.svelte.d.ts.map +1 -1
- package/dist/calendar/PublicCard/PublicCard.svelte +7 -9
- package/dist/calendar/PublicCard/PublicCard.svelte.d.ts.map +1 -1
- package/dist/calendar/ShowCard/ShowCard.svelte +11 -10
- package/dist/calendar/ShowCard/ShowCard.svelte.d.ts.map +1 -1
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +5 -3
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte.d.ts.map +1 -1
- package/dist/components/Layout/Section.svelte +4 -4
- package/dist/components/Layout/Section.svelte.d.ts.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +9 -0
- package/dist/patterns/data/DataTable.svelte +4 -2
- package/dist/patterns/data/DataTable.svelte.d.ts.map +1 -1
- package/dist/patterns/forms/FormSection.svelte +4 -2
- package/dist/patterns/forms/FormSection.svelte.d.ts.map +1 -1
- package/dist/patterns/navigation/BottomNav.svelte +4 -3
- package/dist/patterns/navigation/BottomNav.svelte.d.ts.map +1 -1
- package/dist/patterns/navigation/Header.svelte +11 -10
- package/dist/patterns/navigation/Header.svelte.d.ts.map +1 -1
- package/dist/patterns/page/PageHeader.svelte +3 -2
- package/dist/patterns/page/PageHeader.svelte.d.ts.map +1 -1
- package/dist/patterns/page/PageLayout.svelte +2 -1
- package/dist/patterns/page/PageLayout.svelte.d.ts.map +1 -1
- package/dist/patterns/page/PageLoader.svelte +2 -1
- package/dist/patterns/page/PageLoader.svelte.d.ts.map +1 -1
- package/dist/patterns/page/SectionHeader.svelte +5 -3
- package/dist/patterns/page/SectionHeader.svelte.d.ts.map +1 -1
- package/dist/primitives/Accordion/Accordion.svelte +2 -1
- package/dist/primitives/Accordion/Accordion.svelte.d.ts.map +1 -1
- package/dist/primitives/Accordion/AccordionItem.svelte +5 -4
- package/dist/primitives/Accordion/AccordionItem.svelte.d.ts.map +1 -1
- package/dist/primitives/BottomSheet/BottomSheet.svelte +2 -1
- package/dist/primitives/BottomSheet/BottomSheet.svelte.d.ts.map +1 -1
- package/dist/primitives/Breadcrumb/Breadcrumb.svelte +6 -5
- package/dist/primitives/Breadcrumb/Breadcrumb.svelte.d.ts.map +1 -1
- package/dist/primitives/Button/Button.svelte +16 -8
- package/dist/primitives/Button/Button.svelte.d.ts.map +1 -1
- package/dist/primitives/Button/ButtonSaveDemo.svelte +2 -1
- package/dist/primitives/Button/ButtonSaveDemo.svelte.d.ts.map +1 -1
- package/dist/primitives/Card.svelte +1 -1
- package/dist/primitives/DarkModeToggle.svelte +43 -44
- package/dist/primitives/DarkModeToggle.svelte.d.ts.map +1 -1
- package/dist/primitives/Drawer/Drawer.svelte +121 -47
- package/dist/primitives/Drawer/Drawer.svelte.d.ts +4 -0
- package/dist/primitives/Drawer/Drawer.svelte.d.ts.map +1 -1
- package/dist/primitives/Input/Input.svelte +41 -80
- package/dist/primitives/Input/Input.svelte.d.ts +4 -6
- package/dist/primitives/Input/Input.svelte.d.ts.map +1 -1
- package/dist/primitives/Input/Select.svelte +66 -13
- package/dist/primitives/Input/Select.svelte.d.ts +2 -0
- package/dist/primitives/Input/Select.svelte.d.ts.map +1 -1
- package/dist/primitives/Input/Textarea.svelte +5 -3
- package/dist/primitives/Input/Textarea.svelte.d.ts.map +1 -1
- package/dist/primitives/Modal/Modal.svelte +13 -1
- package/dist/primitives/Modal/Modal.svelte.d.ts.map +1 -1
- package/dist/primitives/Pagination/Pagination.svelte +3 -2
- package/dist/primitives/Pagination/Pagination.svelte.d.ts.map +1 -1
- package/dist/primitives/Tabs/Tabs.svelte +4 -3
- package/dist/primitives/Tabs/Tabs.svelte.d.ts.map +1 -1
- package/dist/recipes/CropImage/CropImage.svelte +10 -5
- package/dist/recipes/CropImage/CropImage.svelte.d.ts.map +1 -1
- package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -0
- package/dist/recipes/ImageUploader/ImageUploader.stories.svelte.d.ts +28 -0
- package/dist/recipes/ImageUploader/ImageUploader.stories.svelte.d.ts.map +1 -0
- package/dist/recipes/ImageUploader/ImageUploader.svelte +939 -0
- package/dist/recipes/ImageUploader/ImageUploader.svelte.d.ts +60 -0
- package/dist/recipes/ImageUploader/ImageUploader.svelte.d.ts.map +1 -0
- package/dist/recipes/SuperLogin/SuperLogin.svelte +37 -40
- package/dist/recipes/SuperLogin/SuperLogin.svelte.d.ts.map +1 -1
- package/dist/recipes/feedback/EmptyState/EmptyState.svelte +3 -2
- package/dist/recipes/feedback/EmptyState/EmptyState.svelte.d.ts.map +1 -1
- package/dist/recipes/fields/CheckboxField.svelte +3 -2
- package/dist/recipes/fields/CheckboxField.svelte.d.ts.map +1 -1
- package/dist/recipes/fields/FormField.svelte +12 -4
- package/dist/recipes/fields/FormField.svelte.d.ts +3 -1
- package/dist/recipes/fields/FormField.svelte.d.ts.map +1 -1
- package/dist/recipes/fields/RadioGroup.svelte +13 -4
- package/dist/recipes/fields/RadioGroup.svelte.d.ts +4 -1
- package/dist/recipes/fields/RadioGroup.svelte.d.ts.map +1 -1
- package/dist/recipes/fields/SelectField.svelte +12 -3
- package/dist/recipes/fields/SelectField.svelte.d.ts +4 -1
- package/dist/recipes/fields/SelectField.svelte.d.ts.map +1 -1
- package/dist/recipes/fields/TextareaField.svelte +2 -1
- package/dist/recipes/fields/TextareaField.svelte.d.ts.map +1 -1
- package/dist/recipes/fields/ToggleField.svelte +3 -2
- package/dist/recipes/fields/ToggleField.svelte.d.ts.map +1 -1
- package/dist/recipes/inputs/MultiSelect.svelte +8 -7
- package/dist/recipes/inputs/MultiSelect.svelte.d.ts.map +1 -1
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +9 -9
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte.d.ts.map +1 -1
- package/dist/recipes/inputs/Search.svelte +7 -6
- package/dist/recipes/inputs/Search.svelte.d.ts.map +1 -1
- package/dist/recipes/modals/AlertModal.svelte +3 -2
- package/dist/recipes/modals/AlertModal.svelte.d.ts.map +1 -1
- package/dist/recipes/modals/ConfirmationModal.svelte +4 -3
- package/dist/recipes/modals/ConfirmationModal.svelte.d.ts.map +1 -1
- package/dist/recipes/modals/InputModal.svelte +9 -8
- package/dist/recipes/modals/InputModal.svelte.d.ts.map +1 -1
- package/dist/recipes/modals/ModalStateManager.svelte +4 -3
- package/dist/recipes/modals/ModalStateManager.svelte.d.ts.map +1 -1
- package/dist/recipes/modals/StatusModal.svelte +5 -4
- package/dist/recipes/modals/StatusModal.svelte.d.ts.map +1 -1
- package/dist/stories/ButtonAuditReview.svelte +361 -397
- package/dist/stories/ButtonAuditReview.svelte.d.ts +24 -4
- package/dist/stories/ButtonAuditReview.svelte.d.ts.map +1 -1
- package/dist/tokens/index.d.ts +4 -8
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +4 -8
- package/dist/tokens/typography.d.ts +76 -169
- package/dist/tokens/typography.d.ts.map +1 -1
- package/dist/tokens/typography.js +93 -62
- package/package.json +4 -2
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
<script>
|
|
2
|
-
import { onMount } from "svelte";
|
|
3
|
-
import { ChevronDownOutline
|
|
2
|
+
import { onMount, tick } from "svelte";
|
|
3
|
+
import { ChevronDownOutline } from "../Icons";
|
|
4
|
+
import { portal as portalAction } from "../../utils/portal.js";
|
|
5
|
+
import { typography } from "../../tokens/typography";
|
|
4
6
|
|
|
5
7
|
let {
|
|
6
8
|
value = $bindable(""),
|
|
@@ -13,6 +15,7 @@
|
|
|
13
15
|
name = "",
|
|
14
16
|
id = "",
|
|
15
17
|
size = "md",
|
|
18
|
+
portal = false,
|
|
16
19
|
onchange,
|
|
17
20
|
...restProps
|
|
18
21
|
} = $props();
|
|
@@ -21,6 +24,7 @@
|
|
|
21
24
|
let triggerElement = $state(null);
|
|
22
25
|
let dropdownElement = $state(null);
|
|
23
26
|
let focusedIndex = $state(-1);
|
|
27
|
+
let dropdownPosition = $state({ top: 0, left: 0, width: 0 });
|
|
24
28
|
|
|
25
29
|
const instanceId = Math.random().toString(36).substring(2, 9);
|
|
26
30
|
|
|
@@ -35,12 +39,26 @@
|
|
|
35
39
|
|
|
36
40
|
let sizeClass = $derived(sizeClasses[size] || sizeClasses.md);
|
|
37
41
|
|
|
38
|
-
function
|
|
42
|
+
function updateDropdownPosition() {
|
|
43
|
+
if (!triggerElement || !portal) return;
|
|
44
|
+
const rect = triggerElement.getBoundingClientRect();
|
|
45
|
+
dropdownPosition = {
|
|
46
|
+
top: rect.bottom + 4,
|
|
47
|
+
left: rect.left,
|
|
48
|
+
width: rect.width
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async function toggle() {
|
|
39
53
|
if (disabled) return;
|
|
40
54
|
isOpen = !isOpen;
|
|
41
55
|
if (isOpen) {
|
|
42
56
|
focusedIndex = items.findIndex((item) => item.value === value);
|
|
43
57
|
window.dispatchEvent(new CustomEvent('select-opened', { detail: { instanceId } }));
|
|
58
|
+
if (portal) {
|
|
59
|
+
await tick();
|
|
60
|
+
updateDropdownPosition();
|
|
61
|
+
}
|
|
44
62
|
}
|
|
45
63
|
}
|
|
46
64
|
|
|
@@ -112,9 +130,20 @@
|
|
|
112
130
|
onMount(() => {
|
|
113
131
|
document.addEventListener("click", handleClickOutside, true);
|
|
114
132
|
window.addEventListener("select-opened", handleOtherSelectOpened);
|
|
133
|
+
|
|
134
|
+
// Update position on scroll/resize when portal is enabled
|
|
135
|
+
if (portal) {
|
|
136
|
+
window.addEventListener("scroll", updateDropdownPosition, true);
|
|
137
|
+
window.addEventListener("resize", updateDropdownPosition);
|
|
138
|
+
}
|
|
139
|
+
|
|
115
140
|
return () => {
|
|
116
141
|
document.removeEventListener("click", handleClickOutside, true);
|
|
117
142
|
window.removeEventListener("select-opened", handleOtherSelectOpened);
|
|
143
|
+
if (portal) {
|
|
144
|
+
window.removeEventListener("scroll", updateDropdownPosition, true);
|
|
145
|
+
window.removeEventListener("resize", updateDropdownPosition);
|
|
146
|
+
}
|
|
118
147
|
};
|
|
119
148
|
});
|
|
120
149
|
</script>
|
|
@@ -122,7 +151,7 @@
|
|
|
122
151
|
<div class="w-full flex flex-col gap-2" {...restProps}>
|
|
123
152
|
{#if label}
|
|
124
153
|
<div class="flex justify-start items-center gap-1">
|
|
125
|
-
<label for={id || name} class=
|
|
154
|
+
<label for={id || name} class={typography.label}>
|
|
126
155
|
{label}{#if required}<span class="text-red-500 font-medium text-sm ml-0.5">*</span>{/if}
|
|
127
156
|
</label>
|
|
128
157
|
</div>
|
|
@@ -134,7 +163,7 @@
|
|
|
134
163
|
bind:this={triggerElement}
|
|
135
164
|
{id}
|
|
136
165
|
{name}
|
|
137
|
-
class="flex items-center justify-between w-full {sizeClass} bg-gray-50 dark:bg-gray-700 border rounded-lg cursor-pointer transition-colors text-left focus:outline-none focus:ring-4 focus:ring-blue-300 dark:focus:ring-blue-800 {error ? 'border-red-500 dark:border-red-500' : 'border-gray-300 dark:border-gray-600 hover:border-blue-500 dark:hover:border-blue-500'} {disabled ? 'opacity-50 cursor-not-allowed' : ''} {!selectedItem ?
|
|
166
|
+
class="flex items-center justify-between w-full {sizeClass} bg-gray-50 dark:bg-gray-700 border rounded-lg cursor-pointer transition-colors text-left focus:outline-none focus:ring-4 focus:ring-blue-300 dark:focus:ring-blue-800 {error ? 'border-red-500 dark:border-red-500' : 'border-gray-300 dark:border-gray-600 hover:border-blue-500 dark:hover:border-blue-500'} {disabled ? 'opacity-50 cursor-not-allowed' : ''} {!selectedItem ? `${typography.textMuted}` : `${typography.body}`}"
|
|
138
167
|
{disabled}
|
|
139
168
|
aria-haspopup="listbox"
|
|
140
169
|
aria-expanded={isOpen}
|
|
@@ -142,10 +171,10 @@
|
|
|
142
171
|
onkeydown={handleKeydown}
|
|
143
172
|
>
|
|
144
173
|
<span class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap">{displayText}</span>
|
|
145
|
-
<ChevronDownOutline class="w-4 h-4 shrink-0
|
|
174
|
+
<ChevronDownOutline class="w-4 h-4 shrink-0 {typography.iconMuted} transition-transform duration-200 {isOpen ? 'rotate-180' : ''}" />
|
|
146
175
|
</button>
|
|
147
176
|
|
|
148
|
-
{#if isOpen}
|
|
177
|
+
{#if isOpen && !portal}
|
|
149
178
|
<!-- svelte-ignore a11y_no_noninteractive_tabindex -->
|
|
150
179
|
<ul
|
|
151
180
|
bind:this={dropdownElement}
|
|
@@ -157,16 +186,13 @@
|
|
|
157
186
|
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
158
187
|
<li
|
|
159
188
|
id="{id || name}-option-{index}"
|
|
160
|
-
class=
|
|
189
|
+
class={`px-4 py-2 cursor-pointer ${typography.sm} transition-colors ${item.value === value ? '' : `${typography.textMuted}`} ${index === focusedIndex ? 'bg-gray-100 dark:bg-gray-600' : 'hover:bg-gray-100 dark:hover:bg-gray-600'}`}
|
|
161
190
|
role="option"
|
|
162
191
|
aria-selected={item.value === value}
|
|
163
192
|
onclick={() => selectItem(item)}
|
|
164
193
|
onmouseenter={() => (focusedIndex = index)}
|
|
165
194
|
>
|
|
166
|
-
|
|
167
|
-
{#if item.value === value}
|
|
168
|
-
<CheckOutline class="w-4 h-4 shrink-0 text-blue-600" />
|
|
169
|
-
{/if}
|
|
195
|
+
{item.name}
|
|
170
196
|
</li>
|
|
171
197
|
{/each}
|
|
172
198
|
</ul>
|
|
@@ -174,6 +200,33 @@
|
|
|
174
200
|
</div>
|
|
175
201
|
|
|
176
202
|
{#if error}
|
|
177
|
-
<p class=
|
|
203
|
+
<p class={typography.error}>{error}</p>
|
|
178
204
|
{/if}
|
|
179
205
|
</div>
|
|
206
|
+
|
|
207
|
+
{#if isOpen && portal}
|
|
208
|
+
<!-- Portal dropdown - truly moved to document.body to escape overflow containers and transforms -->
|
|
209
|
+
<!-- svelte-ignore a11y_no_noninteractive_tabindex -->
|
|
210
|
+
<ul
|
|
211
|
+
bind:this={dropdownElement}
|
|
212
|
+
use:portalAction
|
|
213
|
+
class="fixed z-[9999] bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg shadow-lg max-h-60 overflow-y-auto py-1"
|
|
214
|
+
style="top: {dropdownPosition.top}px; left: {dropdownPosition.left}px; width: {dropdownPosition.width}px;"
|
|
215
|
+
role="listbox"
|
|
216
|
+
tabindex="-1"
|
|
217
|
+
>
|
|
218
|
+
{#each items as item, index}
|
|
219
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
220
|
+
<li
|
|
221
|
+
id="{id || name}-option-{index}"
|
|
222
|
+
class={`px-4 py-2 cursor-pointer ${typography.sm} transition-colors ${item.value === value ? '' : `${typography.textMuted}`} ${index === focusedIndex ? 'bg-gray-100 dark:bg-gray-600' : 'hover:bg-gray-100 dark:hover:bg-gray-600'}`}
|
|
223
|
+
role="option"
|
|
224
|
+
aria-selected={item.value === value}
|
|
225
|
+
onclick={() => selectItem(item)}
|
|
226
|
+
onmouseenter={() => (focusedIndex = index)}
|
|
227
|
+
>
|
|
228
|
+
{item.name}
|
|
229
|
+
</li>
|
|
230
|
+
{/each}
|
|
231
|
+
</ul>
|
|
232
|
+
{/if}
|
|
@@ -14,6 +14,7 @@ declare const Select: import("svelte").Component<{
|
|
|
14
14
|
name?: string;
|
|
15
15
|
id?: string;
|
|
16
16
|
size?: string;
|
|
17
|
+
portal?: boolean;
|
|
17
18
|
onchange: any;
|
|
18
19
|
} & Record<string, any>, {}, "value">;
|
|
19
20
|
type $$ComponentProps = {
|
|
@@ -27,6 +28,7 @@ type $$ComponentProps = {
|
|
|
27
28
|
name?: string;
|
|
28
29
|
id?: string;
|
|
29
30
|
size?: string;
|
|
31
|
+
portal?: boolean;
|
|
30
32
|
onchange: any;
|
|
31
33
|
} & Record<string, any>;
|
|
32
34
|
//# sourceMappingURL=Select.svelte.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Input/Select.svelte.js"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"Select.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Input/Select.svelte.js"],"names":[],"mappings":";;;;;AA8MA;YAhM6B,MAAM;YAAU,GAAG,EAAE;kBAAgB,MAAM;YAAU,MAAM;eAAa,OAAO;eAAa,OAAO;YAAU,MAAM;WAAS,MAAM;SAAO,MAAM;WAAS,MAAM;aAAW,OAAO;cAAY,GAAG;sCAgMvK;wBAhMlC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
<script>
|
|
2
|
+
import { typography } from "../../tokens/typography";
|
|
3
|
+
|
|
2
4
|
let {
|
|
3
5
|
value = $bindable(""),
|
|
4
6
|
placeholder = "",
|
|
@@ -43,7 +45,7 @@
|
|
|
43
45
|
|
|
44
46
|
<div class="flex flex-col gap-2 w-full">
|
|
45
47
|
{#if label}
|
|
46
|
-
<label for={id || name} class=
|
|
48
|
+
<label for={id || name} class={`${typography.label} leading-tight`}>
|
|
47
49
|
{label}{#if required}<span class="text-red-500 font-medium text-sm ml-0.5">*</span>{/if}
|
|
48
50
|
</label>
|
|
49
51
|
{/if}
|
|
@@ -57,7 +59,7 @@
|
|
|
57
59
|
{readonly}
|
|
58
60
|
{maxlength}
|
|
59
61
|
{minlength}
|
|
60
|
-
class="w-full p-2.5 bg-gray-50 dark:bg-gray-700
|
|
62
|
+
class="{typography.sm} w-full p-2.5 bg-gray-50 dark:bg-gray-700 leading-normal border rounded-lg resize-y transition-colors focus:outline-none focus:ring-4 focus:ring-blue-300 dark:focus:ring-blue-800 placeholder-gray-500 dark:placeholder-gray-400 {error ? 'border-red-500' : 'border-gray-300 dark:border-gray-600 hover:border-blue-500 focus:border-blue-500'} {disabled ? 'opacity-50 cursor-not-allowed' : ''} {className}"
|
|
61
63
|
bind:value
|
|
62
64
|
oninput={handleInput}
|
|
63
65
|
onchange={handleChange}
|
|
@@ -72,6 +74,6 @@
|
|
|
72
74
|
></textarea>
|
|
73
75
|
|
|
74
76
|
{#if error}
|
|
75
|
-
<p class=
|
|
77
|
+
<p class={typography.error}>{error}</p>
|
|
76
78
|
{/if}
|
|
77
79
|
</div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Textarea.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Input/Textarea.svelte.js"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"Textarea.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Input/Textarea.svelte.js"],"names":[],"mappings":";;;;;AAkEA;YA1D6B,MAAM;kBAAgB,MAAM;WAAS,MAAM;eAAa,OAAO;eAAa,OAAO;eAAa,OAAO;SAAO,MAAM;WAAS,MAAM;YAAU,MAAM;YAAU,MAAM;gBAAc,GAAG;gBAAc,GAAG;YAAU,MAAM;aAAW,GAAG;cAAY,GAAG;YAAU,GAAG;aAAW,GAAG;eAAa,GAAG;aAAW,GAAG;gBAAc,GAAG;sCA0DlS;wBA1DpC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,GAAG,CAAC;IAAC,SAAS,CAAC,EAAE,GAAG,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC;IAAC,SAAS,EAAE,GAAG,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC;IAAC,UAAU,EAAE,GAAG,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC"}
|
|
@@ -99,7 +99,19 @@
|
|
|
99
99
|
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
100
100
|
<div
|
|
101
101
|
class="fixed inset-0 flex bg-black/50 z-50 items-end justify-center md:items-center md:p-4 touch-none overscroll-none"
|
|
102
|
-
|
|
102
|
+
onmousedown={(e) => {
|
|
103
|
+
// Only track direct clicks on backdrop, not drags that end on backdrop
|
|
104
|
+
if (e.target === e.currentTarget && !persistent) {
|
|
105
|
+
e.currentTarget.dataset.clickStartedOnBackdrop = 'true';
|
|
106
|
+
}
|
|
107
|
+
}}
|
|
108
|
+
onmouseup={(e) => {
|
|
109
|
+
// Only close if both mousedown and mouseup were on the backdrop
|
|
110
|
+
if (e.target === e.currentTarget && e.currentTarget.dataset.clickStartedOnBackdrop === 'true' && !persistent) {
|
|
111
|
+
resetModal();
|
|
112
|
+
}
|
|
113
|
+
delete e.currentTarget.dataset.clickStartedOnBackdrop;
|
|
114
|
+
}}
|
|
103
115
|
transition:fade={{ duration: 300 }}
|
|
104
116
|
role="dialog"
|
|
105
117
|
aria-modal="true"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Modal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Modal/Modal.svelte.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"Modal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Modal/Modal.svelte.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAqKA;;WAZW,OAAO;mBACC,OAAO;gBACV,OAAO;WACZ,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ;iBAClC,OAAO;eACT,MAAM,IAAI;aACZ,GAAG;WACL,GAAG;aACD,GAAG;YACJ,MAAM;eAGkC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
3
|
import { ChevronLeftOutline, ChevronRightOutline } from "../Icons";
|
|
4
|
+
import { typography } from "../../tokens/typography";
|
|
4
5
|
|
|
5
6
|
interface Props {
|
|
6
7
|
currentPage?: number;
|
|
@@ -112,8 +113,8 @@
|
|
|
112
113
|
|
|
113
114
|
{#if variant === 'table'}
|
|
114
115
|
<div class="flex flex-col items-center gap-3 sm:flex-row sm:justify-between {className}" {...restProps}>
|
|
115
|
-
<span class=
|
|
116
|
-
Showing <span class=
|
|
116
|
+
<span class={`${typography.sm} text-gray-700 dark:text-gray-400`}>
|
|
117
|
+
Showing <span class={`font-semibold ${typography.sm}`}>{startItem}</span> to <span class={`font-semibold ${typography.sm}`}>{endItem}</span> of <span class={`font-semibold ${typography.sm}`}>{totalItems}</span> entries
|
|
117
118
|
</span>
|
|
118
119
|
<nav class="inline-flex -space-x-px rtl:space-x-reverse" aria-label="Pagination">
|
|
119
120
|
{#if effectiveShowPrevNext}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pagination.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Pagination/Pagination.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"Pagination.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Pagination/Pagination.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAKpC,UAAU,KAAK;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAC9B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC9C,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAoMH,QAAA,MAAM,UAAU,sDAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
3
|
import { setContext } from "svelte";
|
|
4
4
|
import { writable } from "svelte/store";
|
|
5
|
+
import { typography } from "../../tokens/typography";
|
|
5
6
|
|
|
6
7
|
interface Props {
|
|
7
8
|
tabStyle?: 'underline' | 'pills' | 'full';
|
|
@@ -74,9 +75,9 @@
|
|
|
74
75
|
|
|
75
76
|
// Tab list classes by style
|
|
76
77
|
const tabListClasses = {
|
|
77
|
-
underline:
|
|
78
|
-
pills:
|
|
79
|
-
full:
|
|
78
|
+
underline: `flex flex-wrap -mb-px ${typography.sm} font-medium text-center border-b border-gray-200 dark:border-gray-700 overflow-x-auto scrollbar-none`,
|
|
79
|
+
pills: `flex flex-wrap ${typography.smMuted} font-medium text-center gap-2`,
|
|
80
|
+
full: `flex flex-wrap ${typography.smMuted} font-medium text-center divide-x divide-gray-200 dark:divide-gray-700 rounded-lg shadow overflow-hidden`
|
|
80
81
|
};
|
|
81
82
|
|
|
82
83
|
// Tab button classes by style
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tabs.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Tabs/Tabs.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"Tabs.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Tabs/Tabs.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAMpC,UAAU,KAAK;IACb,QAAQ,CAAC,EAAE,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAqHH,QAAA,MAAM,IAAI,yDAAwC,CAAC;AACnD,KAAK,IAAI,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;AACpC,eAAe,IAAI,CAAC"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import Cropper from 'svelte-easy-crop';
|
|
3
3
|
import { CloseOutline, MinusOutline, PlusOutline } from "../../primitives/Icons";
|
|
4
4
|
import Button from '../../primitives/Button/Button.svelte';
|
|
5
|
+
import { typography } from '../../tokens/typography';
|
|
5
6
|
|
|
6
7
|
interface Props {
|
|
7
8
|
/** Whether to show the modal */
|
|
@@ -36,6 +37,7 @@
|
|
|
36
37
|
zoom = 1;
|
|
37
38
|
croppedAreaPixels = null;
|
|
38
39
|
isLoading = true;
|
|
40
|
+
isSaving = false; // Reset saving state when modal opens with new image
|
|
39
41
|
}
|
|
40
42
|
});
|
|
41
43
|
|
|
@@ -67,7 +69,10 @@
|
|
|
67
69
|
const image = new Image();
|
|
68
70
|
image.addEventListener('load', () => resolve(image));
|
|
69
71
|
image.addEventListener('error', (error) => reject(error));
|
|
70
|
-
|
|
72
|
+
// Only set crossOrigin for non-blob URLs (blob URLs don't need CORS)
|
|
73
|
+
if (!url.startsWith('blob:')) {
|
|
74
|
+
image.setAttribute('crossOrigin', 'anonymous');
|
|
75
|
+
}
|
|
71
76
|
image.src = url;
|
|
72
77
|
});
|
|
73
78
|
}
|
|
@@ -133,7 +138,7 @@
|
|
|
133
138
|
<div class="relative w-full max-w-lg max-h-full">
|
|
134
139
|
<div class="relative bg-white rounded-lg shadow-xl dark:bg-gray-800">
|
|
135
140
|
<div class="flex items-center justify-between p-4 border-b border-gray-200 rounded-t-lg dark:border-gray-600">
|
|
136
|
-
<h3 class=
|
|
141
|
+
<h3 class={typography.h2}>
|
|
137
142
|
Crop image
|
|
138
143
|
</h3>
|
|
139
144
|
<Button
|
|
@@ -150,7 +155,7 @@
|
|
|
150
155
|
<div class="relative w-full aspect-square sm:aspect-[4/3] max-h-80 sm:max-h-96 bg-gray-800 rounded-lg overflow-hidden">
|
|
151
156
|
{#if isLoading}
|
|
152
157
|
<div class="absolute inset-0 flex items-center justify-center bg-gray-200 dark:bg-gray-700 z-10">
|
|
153
|
-
<span class=
|
|
158
|
+
<span class={typography.smMuted}>Loading...</span>
|
|
154
159
|
</div>
|
|
155
160
|
{/if}
|
|
156
161
|
<Cropper
|
|
@@ -161,11 +166,11 @@
|
|
|
161
166
|
minZoom={1}
|
|
162
167
|
maxZoom={3}
|
|
163
168
|
showGrid={true}
|
|
164
|
-
|
|
169
|
+
oncropcomplete={handleCropComplete}
|
|
165
170
|
/>
|
|
166
171
|
</div>
|
|
167
172
|
|
|
168
|
-
<p class=
|
|
173
|
+
<p class={`${typography.smMuted} text-center`}>
|
|
169
174
|
Drag to position. Pinch or use slider to zoom.
|
|
170
175
|
</p>
|
|
171
176
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CropImage.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/recipes/CropImage/CropImage.svelte.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CropImage.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/recipes/CropImage/CropImage.svelte.ts"],"names":[],"mappings":"AASE,UAAU,KAAK;IACb,gCAAgC;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,KAAK,IAAI,CAAC;IACtC,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAgLH,QAAA,MAAM,SAAS,iEAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
<script module>
|
|
2
|
+
import { defineMeta } from '@storybook/addon-svelte-csf';
|
|
3
|
+
import ImageUploader from './ImageUploader.svelte';
|
|
4
|
+
|
|
5
|
+
const { Story } = defineMeta({
|
|
6
|
+
title: 'Recipes/ImageUploader',
|
|
7
|
+
component: ImageUploader,
|
|
8
|
+
tags: ['autodocs'],
|
|
9
|
+
argTypes: {
|
|
10
|
+
shape: {
|
|
11
|
+
control: 'select',
|
|
12
|
+
options: ['square', 'wide'],
|
|
13
|
+
description: 'Shape of the dropzone/images',
|
|
14
|
+
},
|
|
15
|
+
maxImages: {
|
|
16
|
+
control: { type: 'number', min: 1, max: 12 },
|
|
17
|
+
description: 'Maximum number of images (1 for single mode)',
|
|
18
|
+
},
|
|
19
|
+
enableCrop: {
|
|
20
|
+
control: 'boolean',
|
|
21
|
+
description: 'Enable cropping step after file selection',
|
|
22
|
+
},
|
|
23
|
+
enableReorder: {
|
|
24
|
+
control: 'boolean',
|
|
25
|
+
description: 'Enable drag-to-reorder in multi-image mode',
|
|
26
|
+
},
|
|
27
|
+
showMainBadge: {
|
|
28
|
+
control: 'boolean',
|
|
29
|
+
description: 'Show "Main" badge on first image in multi mode',
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// Mock upload function
|
|
35
|
+
async function mockUpload(file) {
|
|
36
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
37
|
+
return URL.createObjectURL(file);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Sample images for demo
|
|
41
|
+
const sampleImages = [
|
|
42
|
+
'https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=400&h=400&fit=crop',
|
|
43
|
+
'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=400&h=400&fit=crop',
|
|
44
|
+
'https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=400&h=400&fit=crop',
|
|
45
|
+
];
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
<!-- Single Square (Default) - Uses args pattern -->
|
|
49
|
+
<Story
|
|
50
|
+
name="Single Square (Default)"
|
|
51
|
+
args={{
|
|
52
|
+
images: '',
|
|
53
|
+
maxImages: 1,
|
|
54
|
+
shape: 'square',
|
|
55
|
+
onUpload: mockUpload,
|
|
56
|
+
helperText: 'Upload a profile picture',
|
|
57
|
+
}}
|
|
58
|
+
/>
|
|
59
|
+
|
|
60
|
+
<!-- Wide Dropzone (Event Poster) -->
|
|
61
|
+
<Story
|
|
62
|
+
name="Wide Dropzone (Event Poster)"
|
|
63
|
+
args={{
|
|
64
|
+
images: '',
|
|
65
|
+
maxImages: 1,
|
|
66
|
+
shape: 'wide',
|
|
67
|
+
enableCrop: true,
|
|
68
|
+
cropAspectRatio: '16:9',
|
|
69
|
+
onUpload: mockUpload,
|
|
70
|
+
helperText: 'Recommended size: 1920x1080 or 16:9 aspect ratio',
|
|
71
|
+
}}
|
|
72
|
+
/>
|
|
73
|
+
|
|
74
|
+
<!-- Multi-Image Grid (Performer Photos) -->
|
|
75
|
+
<Story
|
|
76
|
+
name="Multi-Image Grid (Performer Photos)"
|
|
77
|
+
args={{
|
|
78
|
+
images: [],
|
|
79
|
+
maxImages: 6,
|
|
80
|
+
shape: 'square',
|
|
81
|
+
enableCrop: true,
|
|
82
|
+
enableReorder: true,
|
|
83
|
+
showMainBadge: true,
|
|
84
|
+
onUpload: mockUpload,
|
|
85
|
+
helperText: 'Upload up to 6 photos. Drag to reorder.',
|
|
86
|
+
}}
|
|
87
|
+
/>
|
|
88
|
+
|
|
89
|
+
<!-- Pre-populated -->
|
|
90
|
+
<Story
|
|
91
|
+
name="Pre-populated"
|
|
92
|
+
args={{
|
|
93
|
+
images: sampleImages,
|
|
94
|
+
maxImages: 6,
|
|
95
|
+
shape: 'square',
|
|
96
|
+
enableReorder: true,
|
|
97
|
+
showMainBadge: true,
|
|
98
|
+
onUpload: mockUpload,
|
|
99
|
+
helperText: 'These images came from props',
|
|
100
|
+
}}
|
|
101
|
+
/>
|
|
102
|
+
|
|
103
|
+
<!-- Disabled State -->
|
|
104
|
+
<Story
|
|
105
|
+
name="Disabled"
|
|
106
|
+
args={{
|
|
107
|
+
images: sampleImages.slice(0, 2),
|
|
108
|
+
maxImages: 6,
|
|
109
|
+
shape: 'square',
|
|
110
|
+
disabled: true,
|
|
111
|
+
helperText: 'This uploader is disabled',
|
|
112
|
+
}}
|
|
113
|
+
/>
|
|
114
|
+
|
|
115
|
+
<!-- With Error -->
|
|
116
|
+
<Story
|
|
117
|
+
name="With Error"
|
|
118
|
+
args={{
|
|
119
|
+
images: '',
|
|
120
|
+
maxImages: 1,
|
|
121
|
+
shape: 'square',
|
|
122
|
+
onUpload: mockUpload,
|
|
123
|
+
error: 'File is too large. Maximum size is 10MB.',
|
|
124
|
+
}}
|
|
125
|
+
/>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export default ImageUploader;
|
|
2
|
+
type ImageUploader = SvelteComponent<{
|
|
3
|
+
[x: string]: never;
|
|
4
|
+
}, {
|
|
5
|
+
[evt: string]: CustomEvent<any>;
|
|
6
|
+
}, {}> & {
|
|
7
|
+
$$bindings?: string | undefined;
|
|
8
|
+
};
|
|
9
|
+
declare const ImageUploader: $$__sveltets_2_IsomorphicComponent<{
|
|
10
|
+
[x: string]: never;
|
|
11
|
+
}, {
|
|
12
|
+
[evt: string]: CustomEvent<any>;
|
|
13
|
+
}, {}, {}, string>;
|
|
14
|
+
import ImageUploader from './ImageUploader.svelte';
|
|
15
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
16
|
+
new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
|
|
17
|
+
$$bindings?: Bindings;
|
|
18
|
+
} & Exports;
|
|
19
|
+
(internal: unknown, props: {
|
|
20
|
+
$$events?: Events;
|
|
21
|
+
$$slots?: Slots;
|
|
22
|
+
}): Exports & {
|
|
23
|
+
$set?: any;
|
|
24
|
+
$on?: any;
|
|
25
|
+
};
|
|
26
|
+
z_$$bindings?: Bindings;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=ImageUploader.stories.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImageUploader.stories.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/recipes/ImageUploader/ImageUploader.stories.svelte.js"],"names":[],"mappings":";;;;;;;;AAyHA;;;;mBAAyH;0BArH7F,wBAAwB;6CA4GP,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,OAAO,OAAO,QAAQ;IAC3L,cAAc,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,WAAW,OAAO,SAAS;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,eAAe,QAAQ,CAAC"}
|