react-confetti-burst 1.0.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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +303 -0
  3. package/dist/cjs/components.d.ts +219 -0
  4. package/dist/cjs/components.d.ts.map +1 -0
  5. package/dist/cjs/components.js +341 -0
  6. package/dist/cjs/components.js.map +1 -0
  7. package/dist/cjs/confetti-engine.d.ts +122 -0
  8. package/dist/cjs/confetti-engine.d.ts.map +1 -0
  9. package/dist/cjs/confetti-engine.js +589 -0
  10. package/dist/cjs/confetti-engine.js.map +1 -0
  11. package/dist/cjs/confetti.d.ts +50 -0
  12. package/dist/cjs/confetti.d.ts.map +1 -0
  13. package/dist/cjs/confetti.js +446 -0
  14. package/dist/cjs/confetti.js.map +1 -0
  15. package/dist/cjs/constants.d.ts +147 -0
  16. package/dist/cjs/constants.d.ts.map +1 -0
  17. package/dist/cjs/constants.js +609 -0
  18. package/dist/cjs/constants.js.map +1 -0
  19. package/dist/cjs/hooks.d.ts +94 -0
  20. package/dist/cjs/hooks.d.ts.map +1 -0
  21. package/dist/cjs/hooks.js +225 -0
  22. package/dist/cjs/hooks.js.map +1 -0
  23. package/dist/cjs/index.d.ts +34 -0
  24. package/dist/cjs/index.d.ts.map +1 -0
  25. package/dist/cjs/index.js +180 -0
  26. package/dist/cjs/index.js.map +1 -0
  27. package/dist/cjs/particle.d.ts +50 -0
  28. package/dist/cjs/particle.d.ts.map +1 -0
  29. package/dist/cjs/particle.js +475 -0
  30. package/dist/cjs/particle.js.map +1 -0
  31. package/dist/cjs/shapes.d.ts +190 -0
  32. package/dist/cjs/shapes.d.ts.map +1 -0
  33. package/dist/cjs/shapes.js +272 -0
  34. package/dist/cjs/shapes.js.map +1 -0
  35. package/dist/cjs/types.d.ts +720 -0
  36. package/dist/cjs/types.d.ts.map +1 -0
  37. package/dist/cjs/types.js +25 -0
  38. package/dist/cjs/types.js.map +1 -0
  39. package/dist/cjs/utils.d.ts +90 -0
  40. package/dist/cjs/utils.d.ts.map +1 -0
  41. package/dist/cjs/utils.js +330 -0
  42. package/dist/cjs/utils.js.map +1 -0
  43. package/dist/esm/components.js +334 -0
  44. package/dist/esm/components.js.map +1 -0
  45. package/dist/esm/confetti-engine.js +581 -0
  46. package/dist/esm/confetti-engine.js.map +1 -0
  47. package/dist/esm/confetti.js +443 -0
  48. package/dist/esm/confetti.js.map +1 -0
  49. package/dist/esm/constants.js +605 -0
  50. package/dist/esm/constants.js.map +1 -0
  51. package/dist/esm/hooks.js +218 -0
  52. package/dist/esm/hooks.js.map +1 -0
  53. package/dist/esm/index.js +146 -0
  54. package/dist/esm/index.js.map +1 -0
  55. package/dist/esm/particle.js +465 -0
  56. package/dist/esm/particle.js.map +1 -0
  57. package/dist/esm/shapes.js +265 -0
  58. package/dist/esm/shapes.js.map +1 -0
  59. package/dist/esm/types.js +24 -0
  60. package/dist/esm/types.js.map +1 -0
  61. package/dist/esm/utils.js +309 -0
  62. package/dist/esm/utils.js.map +1 -0
  63. package/dist/types/components.d.ts +219 -0
  64. package/dist/types/components.d.ts.map +1 -0
  65. package/dist/types/confetti-engine.d.ts +122 -0
  66. package/dist/types/confetti-engine.d.ts.map +1 -0
  67. package/dist/types/confetti.d.ts +50 -0
  68. package/dist/types/confetti.d.ts.map +1 -0
  69. package/dist/types/constants.d.ts +147 -0
  70. package/dist/types/constants.d.ts.map +1 -0
  71. package/dist/types/hooks.d.ts +94 -0
  72. package/dist/types/hooks.d.ts.map +1 -0
  73. package/dist/types/index.d.ts +34 -0
  74. package/dist/types/index.d.ts.map +1 -0
  75. package/dist/types/particle.d.ts +50 -0
  76. package/dist/types/particle.d.ts.map +1 -0
  77. package/dist/types/shapes.d.ts +190 -0
  78. package/dist/types/shapes.d.ts.map +1 -0
  79. package/dist/types/types.d.ts +720 -0
  80. package/dist/types/types.d.ts.map +1 -0
  81. package/dist/types/utils.d.ts +90 -0
  82. package/dist/types/utils.d.ts.map +1 -0
  83. package/package.json +73 -0
@@ -0,0 +1,341 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConfettiButton = exports.ConfettiTrigger = void 0;
4
+ exports.ConfettiBurst = ConfettiBurst;
5
+ exports.ConfettiOnMount = ConfettiOnMount;
6
+ exports.ConfettiCannon = ConfettiCannon;
7
+ exports.Confetti = Confetti;
8
+ const jsx_runtime_1 = require("react/jsx-runtime");
9
+ /**
10
+ * React components for confetti animations
11
+ *
12
+ * Provides declarative components for easy integration of confetti
13
+ * effects into React applications.
14
+ */
15
+ const react_1 = require("react");
16
+ const hooks_1 = require("./hooks");
17
+ /**
18
+ * Declarative confetti component that fires when active prop changes
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * const [celebrate, setCelebrate] = useState(false);
23
+ *
24
+ * return (
25
+ * <>
26
+ * <ConfettiBurst
27
+ * active={celebrate}
28
+ * origin={{ x: 500, y: 300 }}
29
+ * onComplete={() => setCelebrate(false)}
30
+ * />
31
+ * <button onClick={() => setCelebrate(true)}>
32
+ * Celebrate!
33
+ * </button>
34
+ * </>
35
+ * );
36
+ * ```
37
+ */
38
+ function ConfettiBurst({ active, origin, triggerRef, options, onComplete, }) {
39
+ const { fire, fireFromElement } = (0, hooks_1.useConfetti)();
40
+ const hasFired = (0, react_1.useRef)(false);
41
+ (0, react_1.useEffect)(() => {
42
+ if (active && !hasFired.current) {
43
+ hasFired.current = true;
44
+ let handle = null;
45
+ if (triggerRef?.current) {
46
+ handle = fireFromElement(triggerRef.current, options);
47
+ }
48
+ else if (origin) {
49
+ handle = fire(origin, options);
50
+ }
51
+ if (handle) {
52
+ handle.promise.then(() => {
53
+ onComplete?.();
54
+ });
55
+ }
56
+ }
57
+ }, [active, origin, triggerRef, options, fire, fireFromElement, onComplete]);
58
+ // Reset when active becomes false
59
+ (0, react_1.useEffect)(() => {
60
+ if (!active) {
61
+ hasFired.current = false;
62
+ }
63
+ }, [active]);
64
+ return null;
65
+ }
66
+ /**
67
+ * Invisible trigger component that fires confetti from its position
68
+ *
69
+ * @example
70
+ * ```tsx
71
+ * const triggerRef = useRef<ConfettiTriggerHandle>(null);
72
+ *
73
+ * return (
74
+ * <div style={{ position: 'relative' }}>
75
+ * <ConfettiTrigger ref={triggerRef} options={{ particleCount: 100 }} />
76
+ * <button onClick={() => triggerRef.current?.fire()}>
77
+ * Fire!
78
+ * </button>
79
+ * </div>
80
+ * );
81
+ * ```
82
+ */
83
+ exports.ConfettiTrigger = (0, react_1.forwardRef)(({ options, style }, ref) => {
84
+ const containerRef = (0, react_1.useRef)(null);
85
+ const { fireFromElement } = (0, hooks_1.useConfetti)();
86
+ (0, react_1.useImperativeHandle)(ref, () => ({
87
+ fire: () => fireFromElement(containerRef.current, options),
88
+ }));
89
+ return ((0, jsx_runtime_1.jsx)("div", { ref: containerRef, style: {
90
+ position: 'absolute',
91
+ width: 1,
92
+ height: 1,
93
+ pointerEvents: 'none',
94
+ ...style,
95
+ }, "aria-hidden": "true" }));
96
+ });
97
+ exports.ConfettiTrigger.displayName = 'ConfettiTrigger';
98
+ /**
99
+ * Button component that automatically fires confetti on click
100
+ *
101
+ * @example
102
+ * ```tsx
103
+ * <ConfettiButton
104
+ * confettiOptions={{
105
+ * particleCount: 30,
106
+ * direction: { direction: 'up' }
107
+ * }}
108
+ * >
109
+ * Submit
110
+ * </ConfettiButton>
111
+ * ```
112
+ */
113
+ exports.ConfettiButton = (0, react_1.forwardRef)(({ children, confettiOptions, fireOnClick = true, onClick, ...buttonProps }, forwardedRef) => {
114
+ const internalRef = (0, react_1.useRef)(null);
115
+ const { fireFromElement } = (0, hooks_1.useConfetti)();
116
+ // Combine refs
117
+ const setRef = (0, react_1.useCallback)((node) => {
118
+ internalRef.current = node;
119
+ if (typeof forwardedRef === 'function') {
120
+ forwardedRef(node);
121
+ }
122
+ else if (forwardedRef) {
123
+ forwardedRef.current = node;
124
+ }
125
+ }, [forwardedRef]);
126
+ const handleClick = (0, react_1.useCallback)((event) => {
127
+ if (fireOnClick && internalRef.current) {
128
+ fireFromElement(internalRef.current, confettiOptions);
129
+ }
130
+ onClick?.(event);
131
+ }, [fireOnClick, fireFromElement, confettiOptions, onClick]);
132
+ return ((0, jsx_runtime_1.jsx)("button", { ref: setRef, onClick: handleClick, ...buttonProps, children: children }));
133
+ });
134
+ exports.ConfettiButton.displayName = 'ConfettiButton';
135
+ /**
136
+ * Component that fires confetti when mounted
137
+ *
138
+ * @example
139
+ * ```tsx
140
+ * // Fire confetti when a success page loads
141
+ * function SuccessPage() {
142
+ * return (
143
+ * <div>
144
+ * <ConfettiOnMount
145
+ * origin={{ x: window.innerWidth / 2, y: window.innerHeight / 3 }}
146
+ * options={{ particleCount: 100 }}
147
+ * />
148
+ * <h1>Success!</h1>
149
+ * </div>
150
+ * );
151
+ * }
152
+ * ```
153
+ */
154
+ function ConfettiOnMount({ origin, options, onComplete, delay = 0, }) {
155
+ const { fire } = (0, hooks_1.useConfetti)();
156
+ const hasFired = (0, react_1.useRef)(false);
157
+ (0, react_1.useEffect)(() => {
158
+ if (hasFired.current)
159
+ return;
160
+ hasFired.current = true;
161
+ const burstOrigin = origin ?? {
162
+ x: typeof window !== 'undefined' ? window.innerWidth / 2 : 0,
163
+ y: typeof window !== 'undefined' ? window.innerHeight / 2 : 0,
164
+ };
165
+ const timeoutId = setTimeout(() => {
166
+ const handle = fire(burstOrigin, options);
167
+ handle.promise.then(() => onComplete?.());
168
+ }, delay);
169
+ return () => clearTimeout(timeoutId);
170
+ }, [fire, origin, options, onComplete, delay]);
171
+ return null;
172
+ }
173
+ /**
174
+ * Positioned cannon component for directional confetti bursts
175
+ *
176
+ * @example
177
+ * ```tsx
178
+ * <ConfettiCannon
179
+ * left="10%"
180
+ * top="80%"
181
+ * angle={60}
182
+ * fire={shouldFire}
183
+ * options={{ particleCount: 50 }}
184
+ * />
185
+ * ```
186
+ */
187
+ function ConfettiCannon({ left = 0, top = 0, angle = 90, options, fire: shouldFire = false, onComplete, }) {
188
+ const { fire } = (0, hooks_1.useConfetti)();
189
+ const hasFired = (0, react_1.useRef)(false);
190
+ (0, react_1.useEffect)(() => {
191
+ if (!shouldFire || hasFired.current)
192
+ return;
193
+ if (typeof window === 'undefined')
194
+ return;
195
+ hasFired.current = true;
196
+ // Calculate position
197
+ const x = typeof left === 'string' && left.endsWith('%')
198
+ ? (parseFloat(left) / 100) * window.innerWidth
199
+ : typeof left === 'number'
200
+ ? left
201
+ : parseFloat(left) || 0;
202
+ const y = typeof top === 'string' && top.endsWith('%')
203
+ ? (parseFloat(top) / 100) * window.innerHeight
204
+ : typeof top === 'number'
205
+ ? top
206
+ : parseFloat(top) || 0;
207
+ const handle = fire({ x, y }, {
208
+ ...options,
209
+ direction: {
210
+ ...options?.direction,
211
+ direction: 'custom',
212
+ angle,
213
+ },
214
+ });
215
+ handle.promise.then(() => onComplete?.());
216
+ }, [shouldFire, left, top, angle, options, fire, onComplete]);
217
+ // Reset when fire becomes false
218
+ (0, react_1.useEffect)(() => {
219
+ if (!shouldFire) {
220
+ hasFired.current = false;
221
+ }
222
+ }, [shouldFire]);
223
+ return null;
224
+ }
225
+ function Confetti({ width, height, numberOfPieces = 200, confettiSource, initialVelocityX, initialVelocityY, recycle = true, run = true, gravity = 0.3, wind = 0, opacity = 1, drawShape, tweenDuration = 100, colors, onConfettiComplete, frameRate,
226
+ // style and className are for API compatibility but not used in canvas
227
+ }) {
228
+ const { fire } = (0, hooks_1.useConfetti)();
229
+ const handleRef = (0, react_1.useRef)(null);
230
+ const hasStarted = (0, react_1.useRef)(false);
231
+ (0, react_1.useEffect)(() => {
232
+ if (!run) {
233
+ if (handleRef.current) {
234
+ handleRef.current.stop();
235
+ handleRef.current = null;
236
+ }
237
+ hasStarted.current = false;
238
+ return;
239
+ }
240
+ if (hasStarted.current)
241
+ return;
242
+ hasStarted.current = true;
243
+ // Calculate spawn area
244
+ const spawnArea = confettiSource
245
+ ? {
246
+ type: 'rect',
247
+ x: confettiSource.x,
248
+ y: confettiSource.y,
249
+ w: confettiSource.w ?? window.innerWidth,
250
+ h: confettiSource.h ?? 10,
251
+ }
252
+ : {
253
+ type: 'rect',
254
+ x: 0,
255
+ y: 0,
256
+ w: width ?? window.innerWidth,
257
+ h: 10,
258
+ };
259
+ // Convert velocity props
260
+ const velX = typeof initialVelocityX === 'number'
261
+ ? [initialVelocityX * 0.5, initialVelocityX * 1.5]
262
+ : initialVelocityX
263
+ ? [initialVelocityX.min, initialVelocityX.max]
264
+ : [4, 10];
265
+ const velY = typeof initialVelocityY === 'number'
266
+ ? [initialVelocityY * 0.5, initialVelocityY * 1.5]
267
+ : initialVelocityY
268
+ ? [initialVelocityY.min, initialVelocityY.max]
269
+ : [10, 30];
270
+ // Start the continuous confetti
271
+ const centerX = (width ?? window.innerWidth) / 2;
272
+ const centerY = 0;
273
+ handleRef.current = fire({ x: centerX, y: centerY }, {
274
+ particleCount: numberOfPieces,
275
+ particle: {
276
+ colors: colors ?? ['#ff0000', '#00ff00', '#0000ff', '#ffff00', '#ff00ff', '#00ffff'],
277
+ opacity: [opacity * 0.8, opacity],
278
+ shapes: ['square', 'circle', 'rectangle'],
279
+ drawShape,
280
+ },
281
+ physics: {
282
+ gravity: gravity * 10, // Scale to match react-confetti
283
+ wind: wind * 5,
284
+ windVariation: velX[1] - velX[0], // Use horizontal velocity as wind variation
285
+ },
286
+ direction: {
287
+ velocity: velY,
288
+ },
289
+ mode: 'continuous',
290
+ spawnArea,
291
+ continuous: {
292
+ recycle,
293
+ numberOfPieces,
294
+ spawnRate: 30,
295
+ run,
296
+ tweenDuration,
297
+ },
298
+ canvas: {
299
+ width,
300
+ height,
301
+ frameRate,
302
+ autoResize: !width && !height,
303
+ },
304
+ onComplete: onConfettiComplete,
305
+ });
306
+ return () => {
307
+ if (handleRef.current) {
308
+ handleRef.current.stop();
309
+ handleRef.current = null;
310
+ }
311
+ };
312
+ }, [
313
+ run,
314
+ width,
315
+ height,
316
+ numberOfPieces,
317
+ confettiSource,
318
+ initialVelocityX,
319
+ initialVelocityY,
320
+ recycle,
321
+ gravity,
322
+ wind,
323
+ opacity,
324
+ drawShape,
325
+ tweenDuration,
326
+ colors,
327
+ onConfettiComplete,
328
+ frameRate,
329
+ fire,
330
+ ]);
331
+ // Handle recycle changes
332
+ (0, react_1.useEffect)(() => {
333
+ if (handleRef.current && !recycle) {
334
+ // Stop recycling - animation will end naturally
335
+ // This is handled in the engine
336
+ }
337
+ }, [recycle]);
338
+ return null;
339
+ }
340
+ Confetti.displayName = 'Confetti';
341
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../../src/components.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Confetti Engine - Core Canvas-based animation system
3
+ *
4
+ * This module provides the main confetti animation engine that manages
5
+ * particle creation, physics updates, and rendering using the Canvas API.
6
+ *
7
+ * Features:
8
+ * - High-performance requestAnimationFrame loop
9
+ * - Automatic DPR (Device Pixel Ratio) handling
10
+ * - Directional burst support
11
+ * - Continuous/recycle mode (like react-confetti)
12
+ * - Firework mode with secondary explosions
13
+ * - Spawn area support
14
+ * - Memory-efficient particle pooling
15
+ * - Automatic cleanup
16
+ */
17
+ import type { ConfettiBurstOptions, BurstOrigin, ExplosionHandle } from './types';
18
+ /**
19
+ * Main confetti engine class
20
+ */
21
+ export declare class ConfettiEngine {
22
+ private particles;
23
+ private config;
24
+ private origin;
25
+ private canvasContext;
26
+ private animationFrameId;
27
+ private lastFrameTime;
28
+ private lastSpawnTime;
29
+ private isRunning;
30
+ private isPaused;
31
+ private deferred;
32
+ private mode;
33
+ private spawnArea?;
34
+ private continuousConfig;
35
+ private fireworkConfig;
36
+ private canvasConfig;
37
+ private drawShape?;
38
+ private frameInterval;
39
+ private lastRenderTime;
40
+ constructor(origin: BurstOrigin, options?: ConfettiBurstOptions);
41
+ /**
42
+ * Starts the confetti animation
43
+ */
44
+ start(): ExplosionHandle;
45
+ /**
46
+ * Creates particles for the burst
47
+ */
48
+ private createParticles;
49
+ /**
50
+ * Spawns particles for continuous mode
51
+ */
52
+ private spawnParticles;
53
+ /**
54
+ * Launches a firework
55
+ */
56
+ private launchFirework;
57
+ /**
58
+ * Triggers a firework explosion at a position
59
+ */
60
+ private explodeFirework;
61
+ /**
62
+ * Main animation loop
63
+ */
64
+ private animate;
65
+ /**
66
+ * Stops the animation immediately
67
+ */
68
+ stop(): void;
69
+ /**
70
+ * Pauses the animation
71
+ */
72
+ pause(): void;
73
+ /**
74
+ * Resumes a paused animation
75
+ */
76
+ resume(): void;
77
+ /**
78
+ * Called when animation completes naturally
79
+ */
80
+ private complete;
81
+ /**
82
+ * Cleans up resources
83
+ */
84
+ private cleanup;
85
+ /**
86
+ * Adds more particles to the animation
87
+ */
88
+ addParticles(count: number): void;
89
+ /**
90
+ * Clears all particles
91
+ */
92
+ clear(): void;
93
+ /**
94
+ * Gets current particle count
95
+ */
96
+ getParticleCount(): number;
97
+ /**
98
+ * Gets the current state
99
+ */
100
+ getState(): 'running' | 'paused' | 'stopped';
101
+ /**
102
+ * Creates the explosion handle for external control
103
+ */
104
+ private createHandle;
105
+ }
106
+ /**
107
+ * Creates and starts a confetti explosion
108
+ */
109
+ export declare function createConfettiExplosion(origin: BurstOrigin, options?: ConfettiBurstOptions): ExplosionHandle;
110
+ /**
111
+ * Fires confetti from an element's center
112
+ */
113
+ export declare function fireFromElement(element: HTMLElement | null, options?: ConfettiBurstOptions): ExplosionHandle | null;
114
+ /**
115
+ * Gets the current number of active animations
116
+ */
117
+ export declare function getActiveAnimationCount(): number;
118
+ /**
119
+ * Forces cleanup of all resources
120
+ */
121
+ export declare function forceCleanup(): void;
122
+ //# sourceMappingURL=confetti-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confetti-engine.d.ts","sourceRoot":"","sources":["../../src/confetti-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAEV,oBAAoB,EACpB,WAAW,EAGX,eAAe,EAOhB,MAAM,SAAS,CAAC;AAoKjB;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,QAAQ,CAA0B;IAG1C,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,SAAS,CAAC,CAAY;IAC9B,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,SAAS,CAAC,CAAqB;IACvC,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,cAAc,CAAa;gBAEvB,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,oBAAoB;IAkB/D;;OAEG;IACH,KAAK,IAAI,eAAe;IA6CxB;;OAEG;IACH,OAAO,CAAC,eAAe;IA+CvB;;OAEG;IACH,OAAO,CAAC,cAAc;IA0DtB;;OAEG;IACH,OAAO,CAAC,cAAc;IA4CtB;;OAEG;IACH,OAAO,CAAC,eAAe;IAgCvB;;OAEG;IACH,OAAO,CAAC,OAAO,CAkHb;IAEF;;OAEG;IACH,IAAI,IAAI,IAAI;IAYZ;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,MAAM,IAAI,IAAI;IAId;;OAEG;IACH,OAAO,CAAC,QAAQ;IAMhB;;OAEG;IACH,OAAO,CAAC,OAAO;IAaf;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAgCjC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,QAAQ,IAAI,SAAS,GAAG,QAAQ,GAAG,SAAS;IAM5C;;OAEG;IACH,OAAO,CAAC,YAAY;CAYrB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,eAAe,CAGjB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,GAAG,IAAI,EAC3B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,eAAe,GAAG,IAAI,CAYxB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAOnC"}