@getmicdrop/svelte-components 5.21.3 → 5.22.0

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.
Files changed (79) hide show
  1. package/dist/components/Toast/ToastItem.svelte +695 -0
  2. package/dist/components/Toast/ToastItem.svelte.d.ts +8 -0
  3. package/dist/components/Toast/ToastItem.svelte.d.ts.map +1 -0
  4. package/dist/components/Toast/Toaster.svelte +184 -0
  5. package/dist/components/Toast/Toaster.svelte.d.ts +11 -0
  6. package/dist/components/Toast/Toaster.svelte.d.ts.map +1 -0
  7. package/dist/components/Toast/index.d.ts +9 -0
  8. package/dist/components/Toast/index.d.ts.map +1 -0
  9. package/dist/components/Toast/index.js +13 -0
  10. package/dist/components/Toast/toast.svelte.d.ts +93 -0
  11. package/dist/components/Toast/toast.svelte.d.ts.map +1 -0
  12. package/dist/components/Toast/toast.svelte.js +386 -0
  13. package/dist/components/index.d.ts +1 -0
  14. package/dist/components/index.js +3 -0
  15. package/dist/primitives/Icons/CancelledIcon.svelte +8 -0
  16. package/dist/primitives/Icons/CancelledIcon.svelte.d.ts +16 -0
  17. package/dist/primitives/Icons/CancelledIcon.svelte.d.ts.map +1 -0
  18. package/dist/primitives/Icons/CartIcon.svelte +12 -0
  19. package/dist/primitives/Icons/CartIcon.svelte.d.ts +16 -0
  20. package/dist/primitives/Icons/CartIcon.svelte.d.ts.map +1 -0
  21. package/dist/primitives/Icons/ConfirmedIcon.svelte +8 -0
  22. package/dist/primitives/Icons/ConfirmedIcon.svelte.d.ts +16 -0
  23. package/dist/primitives/Icons/ConfirmedIcon.svelte.d.ts.map +1 -0
  24. package/dist/primitives/Icons/InvitedIcon.svelte +7 -0
  25. package/dist/primitives/Icons/InvitedIcon.svelte.d.ts +16 -0
  26. package/dist/primitives/Icons/InvitedIcon.svelte.d.ts.map +1 -0
  27. package/dist/primitives/Icons/TicketIcon.svelte +12 -0
  28. package/dist/primitives/Icons/TicketIcon.svelte.d.ts +16 -0
  29. package/dist/primitives/Icons/TicketIcon.svelte.d.ts.map +1 -0
  30. package/dist/primitives/Icons/ToastErrorIcon.svelte +9 -0
  31. package/dist/primitives/Icons/ToastErrorIcon.svelte.d.ts +16 -0
  32. package/dist/primitives/Icons/ToastErrorIcon.svelte.d.ts.map +1 -0
  33. package/dist/primitives/Icons/ToastInfoIcon.svelte +9 -0
  34. package/dist/primitives/Icons/ToastInfoIcon.svelte.d.ts +16 -0
  35. package/dist/primitives/Icons/ToastInfoIcon.svelte.d.ts.map +1 -0
  36. package/dist/primitives/Icons/ToastLoadingIcon.svelte +14 -0
  37. package/dist/primitives/Icons/ToastLoadingIcon.svelte.d.ts +16 -0
  38. package/dist/primitives/Icons/ToastLoadingIcon.svelte.d.ts.map +1 -0
  39. package/dist/primitives/Icons/ToastSuccessIcon.svelte +8 -0
  40. package/dist/primitives/Icons/ToastSuccessIcon.svelte.d.ts +16 -0
  41. package/dist/primitives/Icons/ToastSuccessIcon.svelte.d.ts.map +1 -0
  42. package/dist/primitives/Icons/ToastWarningIcon.svelte +9 -0
  43. package/dist/primitives/Icons/ToastWarningIcon.svelte.d.ts +16 -0
  44. package/dist/primitives/Icons/ToastWarningIcon.svelte.d.ts.map +1 -0
  45. package/dist/primitives/Icons/index.d.ts +10 -0
  46. package/dist/primitives/Icons/index.d.ts.map +1 -1
  47. package/dist/primitives/Icons/index.js +12 -0
  48. package/dist/recipes/Toaster/Toaster.stories.svelte +9 -28
  49. package/dist/recipes/Toaster/Toaster.stories.svelte.d.ts +1 -1
  50. package/dist/recipes/Toaster/Toaster.stories.svelte.d.ts.map +1 -1
  51. package/dist/schemas/auth.d.ts +17 -107
  52. package/dist/schemas/auth.d.ts.map +1 -1
  53. package/dist/schemas/common.d.ts +13 -41
  54. package/dist/schemas/common.d.ts.map +1 -1
  55. package/dist/schemas/event.d.ts +41 -147
  56. package/dist/schemas/event.d.ts.map +1 -1
  57. package/dist/schemas/order.d.ts +51 -208
  58. package/dist/schemas/order.d.ts.map +1 -1
  59. package/dist/schemas/performer.d.ts +44 -199
  60. package/dist/schemas/performer.d.ts.map +1 -1
  61. package/dist/schemas/promo.d.ts +55 -221
  62. package/dist/schemas/promo.d.ts.map +1 -1
  63. package/dist/schemas/ticket.d.ts +61 -187
  64. package/dist/schemas/ticket.d.ts.map +1 -1
  65. package/dist/schemas/user.d.ts +54 -114
  66. package/dist/schemas/user.d.ts.map +1 -1
  67. package/dist/schemas/venue.d.ts +20 -238
  68. package/dist/schemas/venue.d.ts.map +1 -1
  69. package/dist/stores/formSave.svelte.js +4 -4
  70. package/dist/stores/formSave.svelte.spec.js +10 -6
  71. package/dist/stores/index.d.ts +0 -1
  72. package/dist/stores/index.js +0 -1
  73. package/package.json +5 -4
  74. package/dist/stores/toaster.d.ts +0 -4
  75. package/dist/stores/toaster.d.ts.map +0 -1
  76. package/dist/stores/toaster.js +0 -13
  77. package/dist/stores/toaster.spec.d.ts +0 -2
  78. package/dist/stores/toaster.spec.d.ts.map +0 -1
  79. package/dist/stores/toaster.spec.js +0 -59
@@ -0,0 +1,184 @@
1
+ <script lang="ts">
2
+ import { getToasts, toast } from './toast.svelte';
3
+ import ToastItem from './ToastItem.svelte';
4
+
5
+ interface Props {
6
+ position?:
7
+ | 'top-right'
8
+ | 'top-left'
9
+ | 'bottom-right'
10
+ | 'bottom-left'
11
+ | 'top-center'
12
+ | 'bottom-center';
13
+ offset?: string;
14
+ gap?: string;
15
+ /** Max toasts visible before older ones drop off the visible stack */
16
+ visibleCount?: number;
17
+ }
18
+
19
+ let {
20
+ position = 'top-right',
21
+ offset = '16px',
22
+ gap = '14px',
23
+ visibleCount = 3,
24
+ }: Props = $props();
25
+
26
+ // Get reactive toasts (newest at index 0)
27
+ let toasts = $derived(getToasts());
28
+
29
+ // Hover state — when true, stack expands and all toasts show full size
30
+ let isExpanded = $state(false);
31
+
32
+ // Heights of each toast, indexed by toast id (for expanded mode positioning)
33
+ let heights = $state<Record<string, number>>({});
34
+
35
+ // Measure each toast's natural height with a ResizeObserver action
36
+ function measureHeight(node: HTMLDivElement, id: string) {
37
+ const update = () => {
38
+ const h = node.offsetHeight;
39
+ if (h && heights[id] !== h) {
40
+ heights = { ...heights, [id]: h };
41
+ }
42
+ };
43
+ update();
44
+ const observer = new ResizeObserver(update);
45
+ observer.observe(node);
46
+ return {
47
+ destroy() {
48
+ observer.disconnect();
49
+ // Clean up height entry
50
+ const { [id]: _, ...rest } = heights;
51
+ heights = rest;
52
+ },
53
+ };
54
+ }
55
+
56
+ // Whether the stack grows from the top (top-*) or bottom (bottom-*)
57
+ let isTop = $derived(position.startsWith('top'));
58
+
59
+ // Position classes for the container
60
+ const positionClasses: Record<string, string> = {
61
+ 'top-right': 'top-0 right-0',
62
+ 'top-left': 'top-0 left-0',
63
+ 'bottom-right': 'bottom-0 right-0',
64
+ 'bottom-left': 'bottom-0 left-0',
65
+ 'top-center': 'top-0 left-1/2 -translate-x-1/2',
66
+ 'bottom-center': 'bottom-0 left-1/2 -translate-x-1/2',
67
+ };
68
+
69
+ let positionClass = $derived(
70
+ positionClasses[position] || positionClasses['top-right']
71
+ );
72
+
73
+ // Compute the cumulative offset for a toast at the given index when expanded.
74
+ // Sums the heights of all toasts in front of it (closer to the front of the stack)
75
+ // plus the gap between each.
76
+ function getExpandedOffset(index: number): number {
77
+ if (index === 0) return 0;
78
+ let total = 0;
79
+ const gapPx = parseInt(gap, 10) || 14;
80
+ for (let i = 0; i < index; i++) {
81
+ const t = toasts[i];
82
+ if (t) {
83
+ total += (heights[t.id] || 60) + gapPx;
84
+ }
85
+ }
86
+ return total;
87
+ }
88
+
89
+ function handleMouseEnter() {
90
+ isExpanded = true;
91
+ // Pause all toasts while hovering
92
+ for (const t of toasts) {
93
+ if (t.duration !== Infinity) toast.pause(t.id);
94
+ }
95
+ }
96
+
97
+ function handleMouseLeave() {
98
+ isExpanded = false;
99
+ for (const t of toasts) {
100
+ if (t.duration !== Infinity && t.pausedAt) toast.resume(t.id);
101
+ }
102
+ }
103
+ </script>
104
+
105
+ <!--
106
+ Sonner-style toast stack.
107
+ - Container is fixed, holds toasts in absolute positioning so they overlap
108
+ - Front toast (index 0) is at z-index top, fully visible
109
+ - Toasts behind peek out by ~14px each, scaled down 5% per depth
110
+ - On hover, stack expands: all toasts return to full size, spaced by their actual heights
111
+ -->
112
+ <div
113
+ class="toast-stack fixed z-70 pointer-events-none {positionClass}"
114
+ class:is-top={isTop}
115
+ class:is-expanded={isExpanded}
116
+ style:padding={offset}
117
+ role="region"
118
+ aria-label="Notifications"
119
+ onmouseenter={handleMouseEnter}
120
+ onmouseleave={handleMouseLeave}
121
+ >
122
+ <!-- Inner wrapper provides a relative coordinate system for absolute toasts -->
123
+ <div class="toast-stack-inner">
124
+ {#each toasts as toastData, index (toastData.id)}
125
+ {@const lift = 14}
126
+ {@const collapsedY = isTop ? index * lift : -index * lift}
127
+ {@const expandedOffset = getExpandedOffset(index)}
128
+ {@const expandedY = isTop ? expandedOffset : -expandedOffset}
129
+ {@const y = isExpanded ? expandedY : collapsedY}
130
+ {@const scale = isExpanded ? 1 : Math.max(0.85, 1 - index * 0.05)}
131
+ {@const isHidden = index >= visibleCount && !isExpanded}
132
+ <div
133
+ class="toast-stack-item pointer-events-auto"
134
+ class:hidden-from-stack={isHidden}
135
+ style:--y="{y}px"
136
+ style:--scale={scale}
137
+ style:z-index={1000 - index}
138
+ use:measureHeight={toastData.id}
139
+ >
140
+ <ToastItem data={toastData} />
141
+ </div>
142
+ {/each}
143
+ </div>
144
+ </div>
145
+
146
+ <style>
147
+ .toast-stack {
148
+ /* Container is the hover region */
149
+ width: auto;
150
+ }
151
+
152
+ .toast-stack-inner {
153
+ position: relative;
154
+ width: 320px;
155
+ }
156
+
157
+ .toast-stack-item {
158
+ position: absolute;
159
+ right: 0;
160
+ width: 100%;
161
+ transform: translateY(var(--y, 0)) scale(var(--scale, 1));
162
+ transition:
163
+ transform 400ms cubic-bezier(0.22, 1, 0.36, 1),
164
+ opacity 400ms cubic-bezier(0.22, 1, 0.36, 1);
165
+ }
166
+
167
+ /* Top-positioned stacks anchor toasts to the top, grow downward */
168
+ .toast-stack.is-top .toast-stack-item {
169
+ top: 0;
170
+ transform-origin: top center;
171
+ }
172
+
173
+ /* Bottom-positioned stacks anchor to the bottom, grow upward */
174
+ .toast-stack:not(.is-top) .toast-stack-item {
175
+ bottom: 0;
176
+ transform-origin: bottom center;
177
+ }
178
+
179
+ /* Hidden toasts (beyond visibleCount in collapsed mode) */
180
+ .toast-stack-item.hidden-from-stack {
181
+ pointer-events: none;
182
+ opacity: 0;
183
+ }
184
+ </style>
@@ -0,0 +1,11 @@
1
+ interface Props {
2
+ position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top-center' | 'bottom-center';
3
+ offset?: string;
4
+ gap?: string;
5
+ /** Max toasts visible before older ones drop off the visible stack */
6
+ visibleCount?: number;
7
+ }
8
+ declare const Toaster: import("svelte").Component<Props, {}, "">;
9
+ type Toaster = ReturnType<typeof Toaster>;
10
+ export default Toaster;
11
+ //# sourceMappingURL=Toaster.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toaster.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Toast/Toaster.svelte.ts"],"names":[],"mappings":"AAOE,UAAU,KAAK;IACb,QAAQ,CAAC,EACL,WAAW,GACX,UAAU,GACV,cAAc,GACd,aAAa,GACb,YAAY,GACZ,eAAe,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAmHH,QAAA,MAAM,OAAO,2CAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { default as Toaster } from "./Toaster.svelte";
2
+ export { default as ToastItem } from "./ToastItem.svelte";
3
+ export type Toast = import("./toast.svelte").Toast;
4
+ export type ToastType = import("./toast.svelte").ToastType;
5
+ export type ToastOptions = import("./toast.svelte").ToastOptions;
6
+ export type ToastAction = import("./toast.svelte").ToastAction;
7
+ export type NotificationToastOptions = import("./toast.svelte").NotificationToastOptions;
8
+ export { toast, getToasts } from "./toast.svelte";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Toast/index.js"],"names":[],"mappings":";;oBAOa,OAAO,gBAAgB,EAAE,KAAK;wBAC9B,OAAO,gBAAgB,EAAE,SAAS;2BAClC,OAAO,gBAAgB,EAAE,YAAY;0BACrC,OAAO,gBAAgB,EAAE,WAAW;uCACpC,OAAO,gBAAgB,EAAE,wBAAwB"}
@@ -0,0 +1,13 @@
1
+ // Toast notification system
2
+ export { default as Toaster } from './Toaster.svelte';
3
+ export { default as ToastItem } from './ToastItem.svelte';
4
+ export { toast, getToasts } from './toast.svelte';
5
+
6
+ // Re-export all types for consumers
7
+ /**
8
+ * @typedef {import('./toast.svelte').Toast} Toast
9
+ * @typedef {import('./toast.svelte').ToastType} ToastType
10
+ * @typedef {import('./toast.svelte').ToastOptions} ToastOptions
11
+ * @typedef {import('./toast.svelte').ToastAction} ToastAction
12
+ * @typedef {import('./toast.svelte').NotificationToastOptions} NotificationToastOptions
13
+ */
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Micdrop Toast System
3
+ * A modern, macOS-style toast notification system built with Svelte 5 runes.
4
+ * Supports both simple toasts and rich notification-style toasts.
5
+ *
6
+ * Features:
7
+ * - Smart batching for sales notifications (prevents spam during busy periods)
8
+ * - Desktop notification support (browser API)
9
+ * - Swipe-to-dismiss on mobile
10
+ * - Haptic feedback on toast display (QOL Bible)
11
+ */
12
+ export type ToastType = 'success' | 'error' | 'warning' | 'info' | 'loading' | 'notification';
13
+ export interface ToastAction {
14
+ label: string;
15
+ onClick: () => void;
16
+ }
17
+ export interface ToastOptions {
18
+ description?: string;
19
+ duration?: number;
20
+ dismissible?: boolean;
21
+ onClick?: () => void;
22
+ action?: ToastAction;
23
+ }
24
+ export interface NotificationToastOptions {
25
+ name: string;
26
+ displayName?: string;
27
+ event: string;
28
+ status: string;
29
+ avatar: string;
30
+ message?: string;
31
+ performerMessage?: string;
32
+ eventId?: string;
33
+ duration?: number;
34
+ dismissible?: boolean;
35
+ onClick?: () => void;
36
+ }
37
+ export interface Toast {
38
+ id: string;
39
+ type: ToastType;
40
+ title?: string;
41
+ description?: string;
42
+ notification?: {
43
+ name: string;
44
+ displayName?: string;
45
+ event: string;
46
+ status: string;
47
+ avatar: string;
48
+ message?: string;
49
+ performerMessage?: string;
50
+ eventId?: string;
51
+ batchCount?: number;
52
+ batchTotal?: number;
53
+ };
54
+ duration: number;
55
+ dismissible: boolean;
56
+ showProgress?: boolean;
57
+ onClick?: () => void;
58
+ action?: ToastAction;
59
+ createdAt: number;
60
+ pausedAt?: number;
61
+ remainingTime?: number;
62
+ }
63
+ type PushPreferenceChecker = (status: string) => boolean;
64
+ declare function toast(title: string, options?: ToastOptions): string;
65
+ declare namespace toast {
66
+ var success: (title: string, options?: ToastOptions) => string;
67
+ var error: (title: string, options?: ToastOptions) => string;
68
+ var warning: (title: string, options?: ToastOptions) => string;
69
+ var info: (title: string, options?: ToastOptions) => string;
70
+ var loading: (title: string, options?: ToastOptions) => string;
71
+ var notification: (options: NotificationToastOptions) => string;
72
+ var dismiss: (id: string) => void;
73
+ var dismissAll: () => void;
74
+ var pause: (id: string) => void;
75
+ var resume: (id: string) => void;
76
+ var requestDesktopPermission: () => Promise<boolean>;
77
+ var getDesktopPermission: () => NotificationPermission;
78
+ var isDesktopEnabled: () => boolean;
79
+ var setPushPreferenceChecker: (checker: PushPreferenceChecker) => void;
80
+ var STATUS_TO_PREFERENCE: Record<string, {
81
+ category: "admin" | "performer";
82
+ key: string;
83
+ }>;
84
+ var promise: <T>(promise: Promise<T>, options: PromiseOptions) => Promise<T>;
85
+ }
86
+ interface PromiseOptions {
87
+ loading: string;
88
+ success: string;
89
+ error: string;
90
+ }
91
+ export declare function getToasts(): Toast[];
92
+ export { toast };
93
+ //# sourceMappingURL=toast.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Toast/toast.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,OAAO,GACP,SAAS,GACT,MAAM,GACN,SAAS,GACT,cAAc,CAAC;AAEnB,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAEhB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,YAAY,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IAEF,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA2DD,KAAK,qBAAqB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;AAkXzD,iBAAS,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM,CAE5D;kBAFQ,KAAK;yBAIU,MAAM,YAAY,YAAY;uBAEhC,MAAM,YAAY,YAAY;yBAE5B,MAAM,YAAY,YAAY;sBAEjC,MAAM,YAAY,YAAY;yBAE3B,MAAM,YAAY,YAAY;gCAEvB,wBAAwB;sBAzElC,MAAM;;oBAeR,MAAM;qBAkBL,MAAM;wCAzWiB,OAAO,CAAC,OAAO,CAAC;;;4CAqDhB,qBAAqB;;kBA9BlD,OAAO,GAAG,WAAW;aAAO,MAAM;;kBAgZzB,CAAC,WACb,OAAO,CAAC,CAAC,CAAC,WACV,cAAc,KACtB,OAAO,CAAC,CAAC,CAAC;;AATb,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAqBD,wBAAgB,SAAS,IAAI,KAAK,EAAE,CAEnC;AAED,OAAO,EAAE,KAAK,EAAE,CAAC"}