@getmicdrop/svelte-components 2.6.4 → 2.8.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/__LIB_STORES__.js +30 -2
- package/dist/components/AboutShow/AboutShow.svelte +278 -0
- package/dist/components/AboutShow/AboutShow.svelte.d.ts +43 -0
- package/dist/components/AboutShow/AboutShow.svelte.d.ts.map +1 -0
- package/dist/components/Accordion/Accordion.svelte +44 -0
- package/dist/components/Accordion/Accordion.svelte.d.ts +42 -0
- package/dist/components/Accordion/Accordion.svelte.d.ts.map +1 -0
- package/dist/components/Accordion/AccordionItem.svelte +141 -0
- package/dist/components/Accordion/AccordionItem.svelte.d.ts +50 -0
- package/dist/components/Accordion/AccordionItem.svelte.d.ts.map +1 -0
- package/dist/components/Badges/Badge.svelte +268 -17
- package/dist/components/Badges/Badge.svelte.d.ts +18 -2
- package/dist/components/Badges/Badge.svelte.d.ts.map +1 -1
- package/dist/components/Breadcrumb/Breadcrumb.svelte +65 -36
- package/dist/components/Breadcrumb/Breadcrumb.svelte.d.ts +16 -2
- package/dist/components/Breadcrumb/Breadcrumb.svelte.d.ts.map +1 -1
- package/dist/components/Button/Button.svelte +136 -3
- package/dist/components/Button/Button.svelte.d.ts +2 -0
- package/dist/components/Button/Button.svelte.d.ts.map +1 -1
- package/dist/components/Calendar/MiniMonthCalendar.svelte +1446 -0
- package/dist/components/Calendar/{Calendar.svelte.d.ts → MiniMonthCalendar.svelte.d.ts} +20 -21
- package/dist/components/Calendar/MiniMonthCalendar.svelte.d.ts.map +1 -0
- package/dist/components/Card.svelte +2 -2
- package/dist/components/Card.svelte.d.ts +2 -2
- package/dist/components/Card.svelte.d.ts.map +1 -1
- package/dist/components/Checkbox/Checkbox.svelte +90 -0
- package/dist/components/Checkbox/Checkbox.svelte.d.ts +64 -0
- package/dist/components/Checkbox/Checkbox.svelte.d.ts.map +1 -0
- package/dist/components/DarkModeToggle.svelte +41 -52
- package/dist/components/DarkModeToggle.svelte.d.ts +0 -2
- package/dist/components/DarkModeToggle.svelte.d.ts.map +1 -1
- package/dist/components/Drawer/Drawer.svelte +207 -0
- package/dist/components/Drawer/Drawer.svelte.d.ts +74 -0
- package/dist/components/Drawer/Drawer.svelte.d.ts.map +1 -0
- package/dist/components/Dropdown/Dropdown.svelte +193 -0
- package/dist/components/Dropdown/Dropdown.svelte.d.ts +50 -0
- package/dist/components/Dropdown/Dropdown.svelte.d.ts.map +1 -0
- package/dist/components/Dropdown/DropdownItem.svelte +111 -0
- package/dist/components/Dropdown/DropdownItem.svelte.d.ts +48 -0
- package/dist/components/Dropdown/DropdownItem.svelte.d.ts.map +1 -0
- package/dist/components/Dropdown/SelectDropdown.svelte +301 -0
- package/dist/components/Dropdown/SelectDropdown.svelte.d.ts +51 -0
- package/dist/components/Dropdown/SelectDropdown.svelte.d.ts.map +1 -0
- package/dist/components/EmptyState/EmptyState.svelte +80 -0
- package/dist/components/{Calendar/QuarterView.stories.svelte.d.ts → EmptyState/EmptyState.svelte.d.ts} +17 -21
- package/dist/components/EmptyState/EmptyState.svelte.d.ts.map +1 -0
- package/dist/components/ErrorDisplay.svelte.d.ts +2 -2
- package/dist/components/FAQs/FAQs.svelte +49 -0
- package/dist/components/{Calendar/QuarterView.svelte.d.ts → FAQs/FAQs.svelte.d.ts} +10 -10
- package/dist/components/FAQs/FAQs.svelte.d.ts.map +1 -0
- package/dist/components/Input/Input.svelte +107 -12
- package/dist/components/Input/Input.svelte.d.ts +28 -12
- package/dist/components/Input/Input.svelte.d.ts.map +1 -1
- package/dist/components/Input/MultiSelect.svelte +4 -5
- package/dist/components/Input/MultiSelect.svelte.d.ts +8 -8
- package/dist/components/Input/MultiSelect.svelte.d.ts.map +1 -1
- package/dist/components/Input/OTPInput.svelte +1 -1
- package/dist/components/Input/Search.svelte +173 -0
- package/dist/components/Input/Search.svelte.d.ts +68 -0
- package/dist/components/Input/Search.svelte.d.ts.map +1 -0
- package/dist/components/Input/Select.svelte +42 -12
- package/dist/components/Input/Select.svelte.d.ts +8 -8
- package/dist/components/Input/Select.svelte.d.ts.map +1 -1
- package/dist/components/Input/Textarea.svelte +160 -0
- package/dist/components/Input/Textarea.svelte.d.ts +69 -0
- package/dist/components/Input/Textarea.svelte.d.ts.map +1 -0
- package/dist/components/Label/Label.svelte +60 -0
- package/dist/components/Label/Label.svelte.d.ts +48 -0
- package/dist/components/Label/Label.svelte.d.ts.map +1 -0
- package/dist/components/Layout/Header.svelte +14 -4
- package/dist/components/Layout/PageLayout.svelte +64 -0
- package/dist/components/Layout/PageLayout.svelte.d.ts +58 -0
- package/dist/components/Layout/PageLayout.svelte.d.ts.map +1 -0
- package/dist/components/Modal/ConfirmationModal.svelte +69 -17
- package/dist/components/Modal/ConfirmationModal.svelte.d.ts +22 -0
- package/dist/components/Modal/ConfirmationModal.svelte.d.ts.map +1 -1
- package/dist/components/Modal/InputModal.svelte +180 -0
- package/dist/components/Modal/InputModal.svelte.d.ts +77 -0
- package/dist/components/Modal/InputModal.svelte.d.ts.map +1 -0
- package/dist/components/Modal/Modal.svelte +41 -9
- package/dist/components/Modal/Modal.svelte.d.ts +2 -0
- package/dist/components/Modal/Modal.svelte.d.ts.map +1 -1
- package/dist/components/Modal/StatusModal.svelte +221 -0
- package/dist/components/Modal/StatusModal.svelte.d.ts +59 -0
- package/dist/components/Modal/StatusModal.svelte.d.ts.map +1 -0
- package/dist/components/MonthSwitcher/MonthSwitcher.svelte +206 -0
- package/dist/components/MonthSwitcher/MonthSwitcher.svelte.d.ts +37 -0
- package/dist/components/MonthSwitcher/MonthSwitcher.svelte.d.ts.map +1 -0
- package/dist/components/OrderSummary/OrderSummary.svelte +553 -0
- package/dist/components/OrderSummary/OrderSummary.svelte.d.ts +65 -0
- package/dist/components/OrderSummary/OrderSummary.svelte.d.ts.map +1 -0
- package/dist/components/Pagination/Pagination.svelte +197 -0
- package/dist/components/Pagination/Pagination.svelte.d.ts +53 -0
- package/dist/components/Pagination/Pagination.svelte.d.ts.map +1 -0
- package/dist/components/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte.d.ts +2 -2
- package/dist/components/PublicCard/PublicCard.svelte +267 -0
- package/dist/components/{pages/performers/AvailabilityCalendarModal.svelte.d.ts → PublicCard/PublicCard.svelte.d.ts} +12 -14
- package/dist/components/PublicCard/PublicCard.svelte.d.ts.map +1 -0
- package/dist/components/Radio/Radio.svelte +119 -0
- package/dist/components/Radio/Radio.svelte.d.ts +54 -0
- package/dist/components/Radio/Radio.svelte.d.ts.map +1 -0
- package/dist/components/ShowCard/ShowCard.svelte +240 -0
- package/dist/components/ShowCard/ShowCard.svelte.d.ts +39 -0
- package/dist/components/ShowCard/ShowCard.svelte.d.ts.map +1 -0
- package/dist/components/ShowTimeCard/ShowTimeCard.svelte +92 -0
- package/dist/components/ShowTimeCard/ShowTimeCard.svelte.d.ts +37 -0
- package/dist/components/ShowTimeCard/ShowTimeCard.svelte.d.ts.map +1 -0
- package/dist/components/Skeleton/Skeleton.svelte +68 -0
- package/dist/components/Skeleton/Skeleton.svelte.d.ts +37 -0
- package/dist/components/{Calendar/QuarterView.svelte.d.ts.map → Skeleton/Skeleton.svelte.d.ts.map} +1 -1
- package/dist/components/Spinner/Spinner.svelte +73 -17
- package/dist/components/Spinner/Spinner.svelte.d.ts +5 -3
- package/dist/components/Spinner/Spinner.svelte.d.ts.map +1 -1
- package/dist/components/SuperLogin/SuperLogin.svelte +1282 -0
- package/dist/components/SuperLogin/SuperLogin.svelte.d.ts +44 -0
- package/dist/components/SuperLogin/SuperLogin.svelte.d.ts.map +1 -0
- package/dist/components/SuperLogin/index.d.ts +2 -0
- package/dist/components/SuperLogin/index.d.ts.map +1 -0
- package/dist/components/SuperLogin/index.js +1 -0
- package/dist/components/Tabs/TabItem.svelte +39 -0
- package/dist/components/Tabs/TabItem.svelte.d.ts +52 -0
- package/dist/components/Tabs/TabItem.svelte.d.ts.map +1 -0
- package/dist/components/Tabs/Tabs.svelte +181 -0
- package/dist/components/Tabs/Tabs.svelte.d.ts +46 -0
- package/dist/components/Tabs/Tabs.svelte.d.ts.map +1 -0
- package/dist/components/Typography/Typography.svelte +50 -0
- package/dist/components/Typography/Typography.svelte.d.ts +48 -0
- package/dist/components/Typography/Typography.svelte.d.ts.map +1 -0
- package/dist/components/pages/performers/ShowDetails.svelte.d.ts +4 -4
- package/dist/components/pages/performers/ShowItemCard.svelte.d.ts +8 -8
- package/dist/components/pages/performers/SwitchOption.svelte.d.ts +2 -2
- package/dist/components/pages/performers/VenueInfo.svelte.d.ts +2 -2
- package/dist/components/pages/performers/VenueItemCard.svelte +2 -2
- package/dist/components/pages/performers/VenueItemCard.svelte.d.ts +4 -4
- package/dist/components/pages/profile/profile-form.svelte +1 -1
- package/dist/components/pages/settings/tabs/CustomImageDropzone.svelte.d.ts +2 -2
- package/dist/components/pages/shows/TabNavigation.svelte +7 -8
- package/dist/constants/formOptions.d.ts +5 -2
- package/dist/constants/formOptions.d.ts.map +1 -1
- package/dist/constants/formOptions.js +2 -1
- package/dist/constants/validation.d.ts +55 -0
- package/dist/constants/validation.d.ts.map +1 -0
- package/dist/constants/validation.js +91 -0
- package/dist/constants/validation.spec.d.ts +2 -0
- package/dist/constants/validation.spec.d.ts.map +1 -0
- package/dist/constants/validation.spec.js +64 -0
- package/dist/index.d.ts +30 -4
- package/dist/index.js +37 -30
- package/dist/services/EventService.js +75 -75
- package/dist/services/EventService.spec.js +217 -217
- package/dist/services/ShowService.spec.js +342 -342
- package/package.json +160 -160
- package/dist/components/Calendar/Calendar.spec.d.ts +0 -2
- package/dist/components/Calendar/Calendar.spec.d.ts.map +0 -1
- package/dist/components/Calendar/Calendar.spec.js +0 -131
- package/dist/components/Calendar/Calendar.svelte +0 -1115
- package/dist/components/Calendar/Calendar.svelte.d.ts.map +0 -1
- package/dist/components/Calendar/QuarterView.spec.d.ts +0 -2
- package/dist/components/Calendar/QuarterView.spec.d.ts.map +0 -1
- package/dist/components/Calendar/QuarterView.spec.js +0 -394
- package/dist/components/Calendar/QuarterView.stories.svelte +0 -134
- package/dist/components/Calendar/QuarterView.stories.svelte.d.ts.map +0 -1
- package/dist/components/Calendar/QuarterView.svelte +0 -736
- package/dist/components/pages/performers/AvailabilityCalendarModal.svelte +0 -632
- package/dist/components/pages/performers/AvailabilityCalendarModal.svelte.d.ts.map +0 -1
|
@@ -5,21 +5,68 @@
|
|
|
5
5
|
import Modal from "./Modal.svelte";
|
|
6
6
|
|
|
7
7
|
export let show = false;
|
|
8
|
+
export let size = "default"; // "small" | "default" | "large"
|
|
8
9
|
export let title = "";
|
|
9
10
|
export let description = "";
|
|
10
11
|
export let warningText = "";
|
|
11
12
|
export let actions = [];
|
|
12
13
|
export let icon = null;
|
|
14
|
+
export let customIcon = null; // Alias for icon (used by some wrappers)
|
|
13
15
|
export let closeBtn = false; // To show close button
|
|
14
16
|
|
|
17
|
+
// Simple props-based API (alternative to actions array)
|
|
18
|
+
export let primaryButtonText = "";
|
|
19
|
+
export let secondaryButtonText = "";
|
|
20
|
+
export let variant = "default"; // "default" | "danger"
|
|
21
|
+
|
|
22
|
+
// Loading/disabled state
|
|
23
|
+
export let loading = false;
|
|
24
|
+
export let disabled = false;
|
|
25
|
+
|
|
15
26
|
const dispatch = createEventDispatcher();
|
|
16
27
|
|
|
28
|
+
// Resolve icon (support both prop names)
|
|
29
|
+
$: resolvedIcon = customIcon || icon;
|
|
30
|
+
|
|
31
|
+
// Build actions from simple props if actions array is empty
|
|
32
|
+
$: resolvedActions = actions.length > 0 ? actions : buildActionsFromProps();
|
|
33
|
+
|
|
34
|
+
function buildActionsFromProps() {
|
|
35
|
+
const result = [];
|
|
36
|
+
|
|
37
|
+
if (secondaryButtonText) {
|
|
38
|
+
result.push({
|
|
39
|
+
label: secondaryButtonText,
|
|
40
|
+
variant: "gray-outline",
|
|
41
|
+
onClick: () => dispatch("cancel")
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (primaryButtonText) {
|
|
46
|
+
result.push({
|
|
47
|
+
label: primaryButtonText,
|
|
48
|
+
variant: variant === "danger" ? "red-solid" : "blue-solid",
|
|
49
|
+
onClick: () => dispatch("confirm"),
|
|
50
|
+
primary: true
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
|
|
17
57
|
const handleAction = (action) => {
|
|
18
|
-
|
|
58
|
+
if (disabled || loading) return;
|
|
59
|
+
action.onClick?.();
|
|
19
60
|
dispatch(action.label.toLowerCase());
|
|
20
61
|
show = false;
|
|
21
62
|
};
|
|
22
63
|
|
|
64
|
+
const handleClose = () => {
|
|
65
|
+
if (disabled || loading) return;
|
|
66
|
+
dispatch("close");
|
|
67
|
+
show = false;
|
|
68
|
+
};
|
|
69
|
+
|
|
23
70
|
const getVariant = (action) => {
|
|
24
71
|
// If variant is already specified, use it
|
|
25
72
|
if (action.variant) return action.variant;
|
|
@@ -48,54 +95,59 @@
|
|
|
48
95
|
onClick,
|
|
49
96
|
beforeIcon,
|
|
50
97
|
afterIcon,
|
|
98
|
+
primary,
|
|
51
99
|
...rest
|
|
52
100
|
} = action;
|
|
53
101
|
return rest;
|
|
54
102
|
};
|
|
55
103
|
</script>
|
|
56
104
|
|
|
57
|
-
<Modal bind:show>
|
|
58
|
-
<div slot="header" class="
|
|
105
|
+
<Modal bind:show {size}>
|
|
106
|
+
<div slot="header" class="text-center">
|
|
59
107
|
{#if closeBtn}
|
|
60
|
-
<div class="flex justify-end">
|
|
61
|
-
<button
|
|
62
|
-
|
|
108
|
+
<div class="flex justify-end -mt-2 -mr-2 mb-2">
|
|
109
|
+
<button
|
|
110
|
+
class="p-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none transition-colors"
|
|
111
|
+
on:click={handleClose}
|
|
112
|
+
{disabled}
|
|
113
|
+
>
|
|
114
|
+
<img src={Cancel} alt="Close" class="w-5 h-5" />
|
|
63
115
|
</button>
|
|
64
116
|
</div>
|
|
65
117
|
{/if}
|
|
66
|
-
{#if
|
|
67
|
-
<div class="flex justify-center
|
|
68
|
-
<img src={
|
|
118
|
+
{#if resolvedIcon}
|
|
119
|
+
<div class="flex justify-center mb-4">
|
|
120
|
+
<img src={resolvedIcon} alt="" class="w-12 h-12" />
|
|
69
121
|
</div>
|
|
70
122
|
{/if}
|
|
71
123
|
{#if title}
|
|
72
|
-
<h2 class="text-xl text-
|
|
124
|
+
<h2 class="text-xl font-medium text-gray-900 dark:text-white">{title}</h2>
|
|
73
125
|
{/if}
|
|
74
126
|
</div>
|
|
75
127
|
|
|
76
|
-
<div slot="body" class="
|
|
128
|
+
<div slot="body" class="text-center mt-4">
|
|
77
129
|
{#if description}
|
|
78
|
-
<p class="text-
|
|
130
|
+
<p class="text-sm text-gray-500 dark:text-gray-400 leading-relaxed">
|
|
79
131
|
{description}
|
|
80
132
|
</p>
|
|
81
133
|
{/if}
|
|
82
134
|
{#if warningText}
|
|
83
|
-
<p
|
|
84
|
-
class="text-accent-Danger text-center text-sm leading-[22px] font-bold"
|
|
85
|
-
>
|
|
135
|
+
<p class="mt-3 text-sm font-medium text-red-600 dark:text-red-400">
|
|
86
136
|
{warningText}
|
|
87
137
|
</p>
|
|
88
138
|
{/if}
|
|
89
139
|
</div>
|
|
90
140
|
|
|
91
|
-
<div slot="footer" class="flex
|
|
92
|
-
{#each
|
|
141
|
+
<div slot="footer" class="flex gap-3">
|
|
142
|
+
{#each resolvedActions as action}
|
|
93
143
|
<Button
|
|
94
144
|
size="full"
|
|
95
145
|
variant={getVariant(action)}
|
|
96
146
|
{...cleanActionProps(action)}
|
|
97
147
|
beforeIcon={action.beforeIcon}
|
|
98
148
|
afterIcon={action.afterIcon}
|
|
149
|
+
disabled={disabled || action.disabled}
|
|
150
|
+
loading={action.primary && loading}
|
|
99
151
|
on:click={() => handleAction(action)}
|
|
100
152
|
>
|
|
101
153
|
{action.label}
|
|
@@ -1,26 +1,48 @@
|
|
|
1
1
|
export default ConfirmationModal;
|
|
2
2
|
type ConfirmationModal = SvelteComponent<{
|
|
3
3
|
title?: string | undefined;
|
|
4
|
+
size?: string | undefined;
|
|
5
|
+
variant?: string | undefined;
|
|
4
6
|
actions?: any[] | undefined;
|
|
5
7
|
show?: boolean | undefined;
|
|
8
|
+
disabled?: boolean | undefined;
|
|
9
|
+
loading?: boolean | undefined;
|
|
6
10
|
icon?: null | undefined;
|
|
7
11
|
description?: string | undefined;
|
|
8
12
|
warningText?: string | undefined;
|
|
13
|
+
customIcon?: null | undefined;
|
|
9
14
|
closeBtn?: boolean | undefined;
|
|
15
|
+
primaryButtonText?: string | undefined;
|
|
16
|
+
secondaryButtonText?: string | undefined;
|
|
10
17
|
}, {
|
|
18
|
+
cancel: CustomEvent<any>;
|
|
19
|
+
confirm: CustomEvent<any>;
|
|
20
|
+
close: CustomEvent<any>;
|
|
21
|
+
} & {
|
|
11
22
|
[evt: string]: CustomEvent<any>;
|
|
12
23
|
}, {}> & {
|
|
13
24
|
$$bindings?: string | undefined;
|
|
14
25
|
};
|
|
15
26
|
declare const ConfirmationModal: $$__sveltets_2_IsomorphicComponent<{
|
|
16
27
|
title?: string | undefined;
|
|
28
|
+
size?: string | undefined;
|
|
29
|
+
variant?: string | undefined;
|
|
17
30
|
actions?: any[] | undefined;
|
|
18
31
|
show?: boolean | undefined;
|
|
32
|
+
disabled?: boolean | undefined;
|
|
33
|
+
loading?: boolean | undefined;
|
|
19
34
|
icon?: null | undefined;
|
|
20
35
|
description?: string | undefined;
|
|
21
36
|
warningText?: string | undefined;
|
|
37
|
+
customIcon?: null | undefined;
|
|
22
38
|
closeBtn?: boolean | undefined;
|
|
39
|
+
primaryButtonText?: string | undefined;
|
|
40
|
+
secondaryButtonText?: string | undefined;
|
|
23
41
|
}, {
|
|
42
|
+
cancel: CustomEvent<any>;
|
|
43
|
+
confirm: CustomEvent<any>;
|
|
44
|
+
close: CustomEvent<any>;
|
|
45
|
+
} & {
|
|
24
46
|
[evt: string]: CustomEvent<any>;
|
|
25
47
|
}, {}, {}, string>;
|
|
26
48
|
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> {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmationModal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Modal/ConfirmationModal.svelte.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ConfirmationModal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Modal/ConfirmationModal.svelte.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAoKA;;;;;;;;;;;;;;;;;;;;;mBAAoS;6CATvP,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,KAAK,GAAG;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;IAC9G,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import { createEventDispatcher } from "svelte";
|
|
3
|
+
import Button from "../Button/Button.svelte";
|
|
4
|
+
import Cancel from "../../assets/svg/cancel.svg";
|
|
5
|
+
import Modal from "./Modal.svelte";
|
|
6
|
+
|
|
7
|
+
export let show = false;
|
|
8
|
+
export let size = "default"; // "small" | "default" | "large"
|
|
9
|
+
export let title = "";
|
|
10
|
+
export let description = "";
|
|
11
|
+
export let closeBtn = false; // To show close button
|
|
12
|
+
export let persistent = false; // When true, prevents closing by clicking backdrop or pressing Escape
|
|
13
|
+
|
|
14
|
+
// Input configuration
|
|
15
|
+
export let inputLabel = "";
|
|
16
|
+
export let inputPlaceholder = "";
|
|
17
|
+
export let inputType = "text"; // text | email | password | textarea
|
|
18
|
+
export let inputValue = "";
|
|
19
|
+
export let inputRequired = false;
|
|
20
|
+
export let inputRows = 4; // For textarea
|
|
21
|
+
export let inputIcon = null; // SVG component for input prefix icon
|
|
22
|
+
export let helpText = ""; // Helper text below input
|
|
23
|
+
|
|
24
|
+
// Validation
|
|
25
|
+
export let errorMessage = "";
|
|
26
|
+
export let showError = false;
|
|
27
|
+
export let validateEmail = false; // Auto-validate email format
|
|
28
|
+
|
|
29
|
+
// Buttons
|
|
30
|
+
export let primaryButtonText = "Confirm";
|
|
31
|
+
export let secondaryButtonText = "Cancel";
|
|
32
|
+
export let primaryButtonVariant = "blue-solid"; // blue-solid | red-solid
|
|
33
|
+
|
|
34
|
+
// State
|
|
35
|
+
export let disabled = false;
|
|
36
|
+
export let loading = false;
|
|
37
|
+
|
|
38
|
+
const dispatch = createEventDispatcher();
|
|
39
|
+
|
|
40
|
+
// Email validation
|
|
41
|
+
const isValidEmail = (email) => {
|
|
42
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
43
|
+
return emailRegex.test(email);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
$: emailError = validateEmail && inputValue && !isValidEmail(inputValue);
|
|
47
|
+
$: isEmpty = inputRequired && (!inputValue || inputValue.trim() === "");
|
|
48
|
+
$: hasError = showError || emailError;
|
|
49
|
+
$: isDisabled = disabled || loading || isEmpty || emailError;
|
|
50
|
+
|
|
51
|
+
const handlePrimaryAction = () => {
|
|
52
|
+
if (!isDisabled) {
|
|
53
|
+
dispatch("confirm", { value: inputValue });
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const handleSecondaryAction = () => {
|
|
58
|
+
if (!disabled && !loading) {
|
|
59
|
+
dispatch("cancel");
|
|
60
|
+
closeModal();
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const closeModal = () => {
|
|
65
|
+
show = false;
|
|
66
|
+
dispatch("close");
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const handleClose = () => {
|
|
70
|
+
if (disabled || loading) return;
|
|
71
|
+
closeModal();
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
// Reset input when modal closes
|
|
75
|
+
$: if (!show) {
|
|
76
|
+
// Optionally reset - controlled externally via inputValue prop
|
|
77
|
+
}
|
|
78
|
+
</script>
|
|
79
|
+
|
|
80
|
+
<Modal bind:show {size} {persistent}>
|
|
81
|
+
<div slot="header" class="text-left">
|
|
82
|
+
{#if closeBtn}
|
|
83
|
+
<div class="flex justify-end -mt-2 -mr-2 mb-2">
|
|
84
|
+
<button
|
|
85
|
+
class="p-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none transition-colors"
|
|
86
|
+
on:click={handleClose}
|
|
87
|
+
{disabled}
|
|
88
|
+
>
|
|
89
|
+
<img src={Cancel} alt="Close" class="w-5 h-5" />
|
|
90
|
+
</button>
|
|
91
|
+
</div>
|
|
92
|
+
{/if}
|
|
93
|
+
{#if title}
|
|
94
|
+
<h3 class="text-xl font-medium text-gray-900 dark:text-white">{title}</h3>
|
|
95
|
+
{/if}
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
<div slot="body" class="text-left mt-4">
|
|
99
|
+
{#if description}
|
|
100
|
+
<p class="text-sm text-gray-500 dark:text-gray-400 leading-relaxed mb-4">
|
|
101
|
+
{description}
|
|
102
|
+
</p>
|
|
103
|
+
{/if}
|
|
104
|
+
|
|
105
|
+
<div>
|
|
106
|
+
{#if inputLabel}
|
|
107
|
+
<label
|
|
108
|
+
for="modal-input"
|
|
109
|
+
class="block text-sm font-medium text-gray-900 dark:text-white mb-2"
|
|
110
|
+
>
|
|
111
|
+
{inputLabel}
|
|
112
|
+
</label>
|
|
113
|
+
{/if}
|
|
114
|
+
|
|
115
|
+
{#if inputType === "textarea"}
|
|
116
|
+
<textarea
|
|
117
|
+
id="modal-input"
|
|
118
|
+
bind:value={inputValue}
|
|
119
|
+
placeholder={inputPlaceholder}
|
|
120
|
+
rows={inputRows}
|
|
121
|
+
class="w-full px-3 py-2 border {hasError ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'} bg-gray-50 dark:bg-gray-700 text-gray-900 dark:text-white rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent resize-none"
|
|
122
|
+
disabled={disabled || loading}
|
|
123
|
+
></textarea>
|
|
124
|
+
{:else}
|
|
125
|
+
<div class="relative">
|
|
126
|
+
{#if inputIcon}
|
|
127
|
+
<div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
|
|
128
|
+
<svelte:component this={inputIcon} class="w-5 h-5 text-gray-500 dark:text-gray-400" />
|
|
129
|
+
</div>
|
|
130
|
+
{/if}
|
|
131
|
+
<input
|
|
132
|
+
id="modal-input"
|
|
133
|
+
type={inputType}
|
|
134
|
+
bind:value={inputValue}
|
|
135
|
+
placeholder={inputPlaceholder}
|
|
136
|
+
required={inputRequired}
|
|
137
|
+
disabled={disabled || loading}
|
|
138
|
+
class="w-full {inputIcon ? 'pl-10' : 'px-3'} py-2 border {hasError ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'} rounded-lg text-gray-900 dark:text-white bg-white dark:bg-gray-700 focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:opacity-50 disabled:cursor-not-allowed"
|
|
139
|
+
/>
|
|
140
|
+
</div>
|
|
141
|
+
{/if}
|
|
142
|
+
|
|
143
|
+
{#if hasError && (errorMessage || emailError)}
|
|
144
|
+
<p class="mt-2 text-sm text-red-600 dark:text-red-400 font-medium flex items-center gap-1">
|
|
145
|
+
<svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
146
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
|
|
147
|
+
</svg>
|
|
148
|
+
{emailError ? "Please enter a valid email address" : errorMessage}
|
|
149
|
+
</p>
|
|
150
|
+
{:else if helpText && !hasError}
|
|
151
|
+
<p class="text-xs font-normal text-gray-500 dark:text-gray-400 pt-2">
|
|
152
|
+
{helpText}
|
|
153
|
+
</p>
|
|
154
|
+
{/if}
|
|
155
|
+
</div>
|
|
156
|
+
</div>
|
|
157
|
+
|
|
158
|
+
<div slot="footer" class="flex gap-3">
|
|
159
|
+
{#if secondaryButtonText}
|
|
160
|
+
<Button
|
|
161
|
+
size="full"
|
|
162
|
+
variant="gray-outline"
|
|
163
|
+
on:click={handleSecondaryAction}
|
|
164
|
+
disabled={disabled || loading}
|
|
165
|
+
>
|
|
166
|
+
{secondaryButtonText}
|
|
167
|
+
</Button>
|
|
168
|
+
{/if}
|
|
169
|
+
|
|
170
|
+
<Button
|
|
171
|
+
size="full"
|
|
172
|
+
variant={primaryButtonVariant}
|
|
173
|
+
on:click={handlePrimaryAction}
|
|
174
|
+
disabled={isDisabled}
|
|
175
|
+
{loading}
|
|
176
|
+
>
|
|
177
|
+
{primaryButtonText}
|
|
178
|
+
</Button>
|
|
179
|
+
</div>
|
|
180
|
+
</Modal>
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export default InputModal;
|
|
2
|
+
type InputModal = SvelteComponent<{
|
|
3
|
+
title?: string | undefined;
|
|
4
|
+
size?: string | undefined;
|
|
5
|
+
show?: boolean | undefined;
|
|
6
|
+
disabled?: boolean | undefined;
|
|
7
|
+
loading?: boolean | undefined;
|
|
8
|
+
persistent?: boolean | undefined;
|
|
9
|
+
description?: string | undefined;
|
|
10
|
+
closeBtn?: boolean | undefined;
|
|
11
|
+
primaryButtonText?: string | undefined;
|
|
12
|
+
secondaryButtonText?: string | undefined;
|
|
13
|
+
inputLabel?: string | undefined;
|
|
14
|
+
inputPlaceholder?: string | undefined;
|
|
15
|
+
inputType?: string | undefined;
|
|
16
|
+
inputValue?: string | undefined;
|
|
17
|
+
inputRequired?: boolean | undefined;
|
|
18
|
+
inputRows?: number | undefined;
|
|
19
|
+
inputIcon?: null | undefined;
|
|
20
|
+
helpText?: string | undefined;
|
|
21
|
+
errorMessage?: string | undefined;
|
|
22
|
+
showError?: boolean | undefined;
|
|
23
|
+
validateEmail?: boolean | undefined;
|
|
24
|
+
primaryButtonVariant?: string | undefined;
|
|
25
|
+
}, {
|
|
26
|
+
confirm: CustomEvent<any>;
|
|
27
|
+
cancel: CustomEvent<any>;
|
|
28
|
+
close: CustomEvent<any>;
|
|
29
|
+
} & {
|
|
30
|
+
[evt: string]: CustomEvent<any>;
|
|
31
|
+
}, {}> & {
|
|
32
|
+
$$bindings?: string | undefined;
|
|
33
|
+
};
|
|
34
|
+
declare const InputModal: $$__sveltets_2_IsomorphicComponent<{
|
|
35
|
+
title?: string | undefined;
|
|
36
|
+
size?: string | undefined;
|
|
37
|
+
show?: boolean | undefined;
|
|
38
|
+
disabled?: boolean | undefined;
|
|
39
|
+
loading?: boolean | undefined;
|
|
40
|
+
persistent?: boolean | undefined;
|
|
41
|
+
description?: string | undefined;
|
|
42
|
+
closeBtn?: boolean | undefined;
|
|
43
|
+
primaryButtonText?: string | undefined;
|
|
44
|
+
secondaryButtonText?: string | undefined;
|
|
45
|
+
inputLabel?: string | undefined;
|
|
46
|
+
inputPlaceholder?: string | undefined;
|
|
47
|
+
inputType?: string | undefined;
|
|
48
|
+
inputValue?: string | undefined;
|
|
49
|
+
inputRequired?: boolean | undefined;
|
|
50
|
+
inputRows?: number | undefined;
|
|
51
|
+
inputIcon?: null | undefined;
|
|
52
|
+
helpText?: string | undefined;
|
|
53
|
+
errorMessage?: string | undefined;
|
|
54
|
+
showError?: boolean | undefined;
|
|
55
|
+
validateEmail?: boolean | undefined;
|
|
56
|
+
primaryButtonVariant?: string | undefined;
|
|
57
|
+
}, {
|
|
58
|
+
confirm: CustomEvent<any>;
|
|
59
|
+
cancel: CustomEvent<any>;
|
|
60
|
+
close: CustomEvent<any>;
|
|
61
|
+
} & {
|
|
62
|
+
[evt: string]: CustomEvent<any>;
|
|
63
|
+
}, {}, {}, string>;
|
|
64
|
+
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> {
|
|
65
|
+
new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
|
|
66
|
+
$$bindings?: Bindings;
|
|
67
|
+
} & Exports;
|
|
68
|
+
(internal: unknown, props: Props & {
|
|
69
|
+
$$events?: Events;
|
|
70
|
+
$$slots?: Slots;
|
|
71
|
+
}): Exports & {
|
|
72
|
+
$set?: any;
|
|
73
|
+
$on?: any;
|
|
74
|
+
};
|
|
75
|
+
z_$$bindings?: Bindings;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=InputModal.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InputModal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Modal/InputModal.svelte.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAAka;6CATrX,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,KAAK,GAAG;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;IAC9G,eAAe,QAAQ,CAAC"}
|
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
export let show = false;
|
|
8
8
|
export let isProcessing = false;
|
|
9
9
|
export let isSuccess = false;
|
|
10
|
-
export let size = "default"; // "default" | "small" | "large"
|
|
10
|
+
export let size = "default"; // "default" | "small" | "large" | "xlarge"
|
|
11
|
+
export let persistent = false; // When true, prevents closing by clicking backdrop or pressing Escape
|
|
11
12
|
|
|
12
13
|
const dispatch = createEventDispatcher();
|
|
13
14
|
|
|
@@ -16,7 +17,7 @@
|
|
|
16
17
|
|
|
17
18
|
// Handle escape key
|
|
18
19
|
function handleKeydown(event) {
|
|
19
|
-
if (event.key === "Escape" && show) {
|
|
20
|
+
if (event.key === "Escape" && show && !persistent) {
|
|
20
21
|
resetModal();
|
|
21
22
|
}
|
|
22
23
|
}
|
|
@@ -72,7 +73,7 @@
|
|
|
72
73
|
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
|
73
74
|
<div
|
|
74
75
|
class="modal-backdrop"
|
|
75
|
-
on:click={resetModal}
|
|
76
|
+
on:click={persistent ? null : resetModal}
|
|
76
77
|
transition:fade={{ duration: 300 }}
|
|
77
78
|
role="dialog"
|
|
78
79
|
aria-modal="true"
|
|
@@ -85,6 +86,7 @@
|
|
|
85
86
|
class="modal-sheet"
|
|
86
87
|
class:small={sizeClass === "small"}
|
|
87
88
|
class:large={sizeClass === "large"}
|
|
89
|
+
class:xlarge={sizeClass === "xlarge"}
|
|
88
90
|
on:click|stopPropagation
|
|
89
91
|
transition:fly={{ y: 300, duration: 300, easing: cubicOut }}
|
|
90
92
|
>
|
|
@@ -109,6 +111,7 @@
|
|
|
109
111
|
class="modal-centered"
|
|
110
112
|
class:small={sizeClass === "small"}
|
|
111
113
|
class:large={sizeClass === "large"}
|
|
114
|
+
class:xlarge={sizeClass === "xlarge"}
|
|
112
115
|
on:click|stopPropagation
|
|
113
116
|
transition:fly={{ y: 20, duration: 200 }}
|
|
114
117
|
>
|
|
@@ -122,12 +125,17 @@
|
|
|
122
125
|
{/if}
|
|
123
126
|
|
|
124
127
|
<style>
|
|
128
|
+
/*
|
|
129
|
+
* Modal uses Tailwind-compatible colors with dark mode support.
|
|
130
|
+
* Works across projects without requiring CSS variable synchronization.
|
|
131
|
+
*/
|
|
132
|
+
|
|
125
133
|
.modal-backdrop {
|
|
126
134
|
position: fixed;
|
|
127
135
|
inset: 0;
|
|
128
136
|
display: flex;
|
|
129
137
|
background-color: rgba(0, 0, 0, 0.5);
|
|
130
|
-
z-index:
|
|
138
|
+
z-index: 50;
|
|
131
139
|
|
|
132
140
|
/* iOS scroll lock - prevent scroll bleed-through */
|
|
133
141
|
touch-action: none;
|
|
@@ -149,7 +157,7 @@
|
|
|
149
157
|
|
|
150
158
|
/* Mobile: Bottom sheet style */
|
|
151
159
|
.modal-sheet {
|
|
152
|
-
background-color:
|
|
160
|
+
background-color: #ffffff;
|
|
153
161
|
border-radius: 1.5rem 1.5rem 0 0;
|
|
154
162
|
width: 100%;
|
|
155
163
|
max-height: 90vh;
|
|
@@ -164,6 +172,10 @@
|
|
|
164
172
|
overscroll-behavior: contain;
|
|
165
173
|
}
|
|
166
174
|
|
|
175
|
+
:global(.dark) .modal-sheet {
|
|
176
|
+
background-color: #1f2937; /* gray-800 */
|
|
177
|
+
}
|
|
178
|
+
|
|
167
179
|
/* Hide sheet on desktop */
|
|
168
180
|
@media (min-width: 768px) {
|
|
169
181
|
.modal-sheet {
|
|
@@ -181,13 +193,18 @@
|
|
|
181
193
|
.sheet-handle {
|
|
182
194
|
width: 2.5rem;
|
|
183
195
|
height: 0.25rem;
|
|
184
|
-
background-color:
|
|
196
|
+
background-color: #d1d5db; /* gray-300 */
|
|
185
197
|
border-radius: 0.125rem;
|
|
186
198
|
}
|
|
187
199
|
|
|
200
|
+
:global(.dark) .sheet-handle {
|
|
201
|
+
background-color: #4b5563; /* gray-600 */
|
|
202
|
+
}
|
|
203
|
+
|
|
188
204
|
.modal-inner {
|
|
189
|
-
padding:
|
|
190
|
-
|
|
205
|
+
padding: 1.5rem;
|
|
206
|
+
/* Account for bottom nav bars (~70px) plus safe area */
|
|
207
|
+
padding-bottom: calc(5rem + env(safe-area-inset-bottom, 0px));
|
|
191
208
|
overflow-y: auto;
|
|
192
209
|
flex: 1;
|
|
193
210
|
}
|
|
@@ -195,13 +212,18 @@
|
|
|
195
212
|
/* Desktop: Centered modal style */
|
|
196
213
|
.modal-centered {
|
|
197
214
|
display: none;
|
|
198
|
-
background-color:
|
|
215
|
+
background-color: #ffffff;
|
|
199
216
|
padding: 1.5rem;
|
|
200
217
|
border-radius: 1rem;
|
|
201
218
|
max-width: 420px;
|
|
202
219
|
width: 100%;
|
|
203
220
|
max-height: calc(100vh - 4rem);
|
|
204
221
|
overflow-y: auto;
|
|
222
|
+
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
:global(.dark) .modal-centered {
|
|
226
|
+
background-color: #1f2937; /* gray-800 */
|
|
205
227
|
}
|
|
206
228
|
|
|
207
229
|
@media (min-width: 768px) {
|
|
@@ -218,11 +240,21 @@
|
|
|
218
240
|
max-width: 560px;
|
|
219
241
|
}
|
|
220
242
|
|
|
243
|
+
.modal-centered.xlarge {
|
|
244
|
+
max-width: 700px;
|
|
245
|
+
}
|
|
246
|
+
|
|
221
247
|
.modal-footer {
|
|
222
248
|
width: 100%;
|
|
223
249
|
display: flex;
|
|
224
250
|
flex-direction: column;
|
|
225
251
|
gap: 0.75rem;
|
|
252
|
+
margin-top: 1.5rem; /* 24px - consistent gap before buttons */
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
.modal-footer:empty {
|
|
256
|
+
display: none;
|
|
257
|
+
margin-top: 0;
|
|
226
258
|
}
|
|
227
259
|
|
|
228
260
|
@media (min-width: 768px) {
|
|
@@ -4,6 +4,7 @@ type Modal = SvelteComponent<{
|
|
|
4
4
|
show?: boolean | undefined;
|
|
5
5
|
isSuccess?: boolean | undefined;
|
|
6
6
|
isProcessing?: boolean | undefined;
|
|
7
|
+
persistent?: boolean | undefined;
|
|
7
8
|
}, {
|
|
8
9
|
click: PointerEvent;
|
|
9
10
|
cancel: CustomEvent<any>;
|
|
@@ -21,6 +22,7 @@ declare const Modal: $$__sveltets_2_IsomorphicComponent<{
|
|
|
21
22
|
show?: boolean | undefined;
|
|
22
23
|
isSuccess?: boolean | undefined;
|
|
23
24
|
isProcessing?: boolean | undefined;
|
|
25
|
+
persistent?: boolean | undefined;
|
|
24
26
|
}, {
|
|
25
27
|
click: PointerEvent;
|
|
26
28
|
cancel: CustomEvent<any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Modal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Modal/Modal.svelte.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Modal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Modal/Modal.svelte.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAmIA;;;;;;;;;;;;;;;eAAgL;6CAdnI,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,KAAK,GAAG;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;IAC9G,eAAe,QAAQ,CAAC"}
|