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,589 @@
1
+ "use strict";
2
+ /**
3
+ * Confetti Engine - Core Canvas-based animation system
4
+ *
5
+ * This module provides the main confetti animation engine that manages
6
+ * particle creation, physics updates, and rendering using the Canvas API.
7
+ *
8
+ * Features:
9
+ * - High-performance requestAnimationFrame loop
10
+ * - Automatic DPR (Device Pixel Ratio) handling
11
+ * - Directional burst support
12
+ * - Continuous/recycle mode (like react-confetti)
13
+ * - Firework mode with secondary explosions
14
+ * - Spawn area support
15
+ * - Memory-efficient particle pooling
16
+ * - Automatic cleanup
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.ConfettiEngine = void 0;
20
+ exports.createConfettiExplosion = createConfettiExplosion;
21
+ exports.fireFromElement = fireFromElement;
22
+ exports.getActiveAnimationCount = getActiveAnimationCount;
23
+ exports.forceCleanup = forceCleanup;
24
+ const particle_1 = require("./particle");
25
+ const utils_1 = require("./utils");
26
+ const constants_1 = require("./constants");
27
+ /**
28
+ * Global canvas element for reuse
29
+ */
30
+ let globalCanvas = null;
31
+ let globalCtx = null;
32
+ let activeAnimations = 0;
33
+ let resizeHandler = null;
34
+ /**
35
+ * Creates or gets the shared canvas element
36
+ */
37
+ function getOrCreateCanvas(zIndex, canvasConfig) {
38
+ if (!(0, utils_1.isBrowser)()) {
39
+ throw new Error('ConfettiEngine requires a browser environment');
40
+ }
41
+ const config = { ...constants_1.DEFAULT_CANVAS, ...canvasConfig };
42
+ const dpr = config.pixelRatio ?? (0, utils_1.getDevicePixelRatio)(constants_1.PERFORMANCE.MAX_DPR);
43
+ if (!globalCanvas) {
44
+ globalCanvas = document.createElement('canvas');
45
+ globalCanvas.style.cssText = `
46
+ position: fixed;
47
+ top: 0;
48
+ left: 0;
49
+ width: 100%;
50
+ height: 100%;
51
+ pointer-events: none;
52
+ z-index: ${zIndex};
53
+ `;
54
+ globalCtx = globalCanvas.getContext('2d', {
55
+ alpha: true,
56
+ desynchronized: true, // Hint for better performance
57
+ });
58
+ if (!globalCtx) {
59
+ throw new Error('Failed to get canvas 2D context');
60
+ }
61
+ document.body.appendChild(globalCanvas);
62
+ // Set up auto-resize handler
63
+ if (config.autoResize) {
64
+ resizeHandler = () => {
65
+ if (globalCanvas && globalCtx) {
66
+ const width = config.width ?? window.innerWidth;
67
+ const height = config.height ?? window.innerHeight;
68
+ globalCanvas.width = width * dpr;
69
+ globalCanvas.height = height * dpr;
70
+ globalCanvas.style.width = `${width}px`;
71
+ globalCanvas.style.height = `${height}px`;
72
+ globalCtx.scale(dpr, dpr);
73
+ }
74
+ };
75
+ window.addEventListener('resize', resizeHandler);
76
+ }
77
+ }
78
+ // Update z-index if different
79
+ globalCanvas.style.zIndex = String(zIndex);
80
+ // Resize canvas to match viewport or specified dimensions
81
+ const width = config.width ?? window.innerWidth;
82
+ const height = config.height ?? window.innerHeight;
83
+ if (globalCanvas.width !== width * dpr || globalCanvas.height !== height * dpr) {
84
+ globalCanvas.width = width * dpr;
85
+ globalCanvas.height = height * dpr;
86
+ globalCanvas.style.width = `${width}px`;
87
+ globalCanvas.style.height = `${height}px`;
88
+ globalCtx.scale(dpr, dpr);
89
+ }
90
+ return {
91
+ canvas: globalCanvas,
92
+ ctx: globalCtx,
93
+ width,
94
+ height,
95
+ dpr,
96
+ };
97
+ }
98
+ /**
99
+ * Cleans up the canvas when no animations are running
100
+ */
101
+ function cleanupCanvas() {
102
+ if (globalCanvas && activeAnimations === 0) {
103
+ setTimeout(() => {
104
+ if (activeAnimations === 0 && globalCanvas) {
105
+ if (resizeHandler) {
106
+ window.removeEventListener('resize', resizeHandler);
107
+ resizeHandler = null;
108
+ }
109
+ globalCanvas.remove();
110
+ globalCanvas = null;
111
+ globalCtx = null;
112
+ }
113
+ }, constants_1.CLEANUP_DELAY);
114
+ }
115
+ }
116
+ /**
117
+ * Gets a random point within a spawn area
118
+ */
119
+ function getSpawnPoint(area, _canvasWidth, _canvasHeight) {
120
+ const { type, x, y, w, h } = area;
121
+ switch (type) {
122
+ case 'point':
123
+ return { x, y };
124
+ case 'rect':
125
+ return {
126
+ x: (0, utils_1.randomInRange)(x, x + (w ?? 0)),
127
+ y: (0, utils_1.randomInRange)(y, y + (h ?? 0)),
128
+ };
129
+ case 'line':
130
+ const t = (0, utils_1.secureRandom)();
131
+ return {
132
+ x: x + t * (w ?? 0),
133
+ y: y + t * (h ?? 0),
134
+ };
135
+ case 'circle':
136
+ const angle = (0, utils_1.secureRandom)() * constants_1.MATH_CONSTANTS.TWO_PI;
137
+ const radius = Math.sqrt((0, utils_1.secureRandom)()) * (w ?? 50); // sqrt for uniform distribution
138
+ return {
139
+ x: x + Math.cos(angle) * radius,
140
+ y: y + Math.sin(angle) * radius,
141
+ };
142
+ default:
143
+ return { x, y };
144
+ }
145
+ }
146
+ /**
147
+ * Main confetti engine class
148
+ */
149
+ class ConfettiEngine {
150
+ constructor(origin, options) {
151
+ this.particles = [];
152
+ this.canvasContext = null;
153
+ this.animationFrameId = null;
154
+ this.lastFrameTime = 0;
155
+ this.lastSpawnTime = 0;
156
+ this.isRunning = false;
157
+ this.isPaused = false;
158
+ this.deferred = (0, utils_1.createDeferred)();
159
+ this.frameInterval = 0;
160
+ this.lastRenderTime = 0;
161
+ /**
162
+ * Main animation loop
163
+ */
164
+ this.animate = () => {
165
+ if (!this.isRunning || !this.canvasContext) {
166
+ return;
167
+ }
168
+ // Check if running is disabled in continuous mode
169
+ if ((this.mode === 'continuous' || this.mode === 'snow' || this.mode === 'rain') &&
170
+ !this.continuousConfig.run) {
171
+ this.animationFrameId = requestAnimationFrame(this.animate);
172
+ this.lastFrameTime = performance.now();
173
+ return;
174
+ }
175
+ if (this.isPaused) {
176
+ this.animationFrameId = requestAnimationFrame(this.animate);
177
+ this.lastFrameTime = performance.now();
178
+ return;
179
+ }
180
+ const currentTime = performance.now();
181
+ const deltaTime = currentTime - this.lastFrameTime;
182
+ this.lastFrameTime = currentTime;
183
+ // Frame rate limiting
184
+ if (this.frameInterval > 0) {
185
+ if (currentTime - this.lastRenderTime < this.frameInterval) {
186
+ this.animationFrameId = requestAnimationFrame(this.animate);
187
+ return;
188
+ }
189
+ this.lastRenderTime = currentTime;
190
+ }
191
+ const { ctx, width, height, dpr } = this.canvasContext;
192
+ // Clear canvas
193
+ ctx.setTransform(1, 0, 0, 1, 0, 0);
194
+ ctx.clearRect(0, 0, width * dpr, height * dpr);
195
+ ctx.scale(dpr, dpr);
196
+ // Update and render particles
197
+ const { physics, particle } = this.config;
198
+ for (const p of this.particles) {
199
+ if (p.active) {
200
+ (0, particle_1.updateParticle)(p, deltaTime, physics, particle.fadeOut, particle.scaleDown);
201
+ // Check for firework rocket reaching target
202
+ if (p.data?.isRocket && p.y <= p.data.targetY) {
203
+ p.active = false;
204
+ this.explodeFirework(p.x, p.y, p.data);
205
+ }
206
+ // Check for secondary explosions (low velocity means particle is falling)
207
+ const velocity = Math.sqrt(p.vx * p.vx + p.vy * p.vy);
208
+ if (p.data?.willExplode && !p.data.hasExploded && velocity < 1) {
209
+ p.data.hasExploded = true;
210
+ this.explodeFirework(p.x, p.y, { burstCount: 15, spread: 360, burstColors: p.data.burstColors });
211
+ }
212
+ (0, particle_1.renderParticle)(ctx, p, { customDraw: this.drawShape });
213
+ }
214
+ }
215
+ // Handle continuous mode spawning and recycling
216
+ if (this.mode === 'continuous' || this.mode === 'snow' || this.mode === 'rain') {
217
+ const timeSinceLastSpawn = currentTime - this.lastSpawnTime;
218
+ const spawnInterval = 1000 / (this.continuousConfig.spawnRate ?? 10);
219
+ if (timeSinceLastSpawn >= spawnInterval) {
220
+ const activeCount = (0, particle_1.countActiveParticles)(this.particles);
221
+ if (this.continuousConfig.recycle) {
222
+ // Recycle dead particles
223
+ const deadParticles = this.particles.filter(p => !p.active);
224
+ const toRecycle = Math.min(deadParticles.length, this.continuousConfig.numberOfPieces - activeCount);
225
+ if (toRecycle > 0) {
226
+ // Remove old dead particles and spawn new ones
227
+ this.particles = this.particles.filter(p => p.active);
228
+ this.spawnParticles(toRecycle);
229
+ }
230
+ }
231
+ else if (activeCount < this.continuousConfig.numberOfPieces) {
232
+ // Just spawn more if under limit
233
+ this.spawnParticles(Math.min(3, this.continuousConfig.numberOfPieces - activeCount));
234
+ }
235
+ this.lastSpawnTime = currentTime;
236
+ }
237
+ }
238
+ // Handle firework mode - launch new fireworks
239
+ if (this.mode === 'firework') {
240
+ const activeRockets = this.particles.filter(p => p.active && p.data?.isRocket).length;
241
+ const timeSinceLastSpawn = currentTime - this.lastSpawnTime;
242
+ if (activeRockets === 0 && timeSinceLastSpawn >= (this.fireworkConfig.burstDelay ?? 500)) {
243
+ this.launchFirework();
244
+ this.lastSpawnTime = currentTime;
245
+ }
246
+ }
247
+ // Check if animation is complete (not for continuous/infinite modes)
248
+ if (this.mode === 'burst' || this.mode === 'cannon' || this.mode === 'explosion') {
249
+ if ((0, particle_1.areAllParticlesInactive)(this.particles)) {
250
+ this.complete();
251
+ return;
252
+ }
253
+ }
254
+ // Continue animation
255
+ this.animationFrameId = requestAnimationFrame(this.animate);
256
+ };
257
+ this.origin = origin;
258
+ this.config = (0, utils_1.mergeConfig)(options);
259
+ // Set up mode-specific configuration
260
+ this.mode = options?.mode ?? 'burst';
261
+ this.spawnArea = options?.spawnArea;
262
+ this.continuousConfig = { ...constants_1.DEFAULT_CONTINUOUS, ...options?.continuous };
263
+ this.fireworkConfig = { ...constants_1.DEFAULT_FIREWORK, ...options?.firework };
264
+ this.canvasConfig = { ...constants_1.DEFAULT_CANVAS, ...options?.canvas };
265
+ this.drawShape = options?.particle?.drawShape;
266
+ // Frame rate control
267
+ if (this.canvasConfig.frameRate) {
268
+ this.frameInterval = 1000 / this.canvasConfig.frameRate;
269
+ }
270
+ }
271
+ /**
272
+ * Starts the confetti animation
273
+ */
274
+ start() {
275
+ if (this.isRunning) {
276
+ return this.createHandle();
277
+ }
278
+ if (!(0, utils_1.isBrowser)()) {
279
+ console.warn('ConfettiEngine: Cannot start animation in non-browser environment');
280
+ this.deferred.resolve();
281
+ return this.createHandle();
282
+ }
283
+ this.isRunning = true;
284
+ activeAnimations++;
285
+ // Get or create canvas
286
+ this.canvasContext = getOrCreateCanvas(this.config.zIndex, this.canvasConfig);
287
+ // Create initial particles based on mode
288
+ if (this.mode === 'continuous' || this.mode === 'snow' || this.mode === 'rain') {
289
+ // For continuous modes, spawn initial batch
290
+ const initialCount = Math.min(this.continuousConfig.numberOfPieces, Math.floor(this.continuousConfig.numberOfPieces * 0.5));
291
+ this.spawnParticles(initialCount);
292
+ }
293
+ else if (this.mode === 'firework') {
294
+ // For firework, launch the first firework
295
+ this.launchFirework();
296
+ }
297
+ else {
298
+ // Standard burst mode
299
+ this.createParticles();
300
+ }
301
+ // Fire onStart callback
302
+ this.config.onStart?.();
303
+ // Start animation loop
304
+ this.lastFrameTime = performance.now();
305
+ this.lastSpawnTime = performance.now();
306
+ this.lastRenderTime = performance.now();
307
+ this.animate();
308
+ return this.createHandle();
309
+ }
310
+ /**
311
+ * Creates particles for the burst
312
+ */
313
+ createParticles() {
314
+ const { particleCount, particle, direction, physics } = this.config;
315
+ const { x, y } = this.origin;
316
+ // Limit particles for performance
317
+ const count = Math.min(particleCount, constants_1.PERFORMANCE.MAX_PARTICLES);
318
+ for (let i = 0; i < count; i++) {
319
+ // Calculate direction angle with spread
320
+ let angle;
321
+ if (direction.direction === 'radial') {
322
+ // Full 360° spread for radial
323
+ angle = (0, utils_1.secureRandom)() * constants_1.MATH_CONSTANTS.TWO_PI;
324
+ }
325
+ else {
326
+ // Directional burst with spread
327
+ const baseAngle = (0, utils_1.getDirectionAngle)(direction.direction, direction.angle);
328
+ const spreadRad = (0, utils_1.degToRad)(direction.spread);
329
+ angle = baseAngle + ((0, utils_1.secureRandom)() - 0.5) * spreadRad;
330
+ }
331
+ // Random velocity within range
332
+ const velocity = (0, utils_1.randomInRange)(direction.velocity[0], direction.velocity[1]);
333
+ const newParticle = (0, particle_1.createParticle)(x, y, angle, velocity, particle.colors, particle.shapes, particle.size, particle.opacity, particle.lifespan, physics.rotationSpeed, {
334
+ images: particle.images,
335
+ tiltRange: particle.tilt,
336
+ spinSpeedRange: particle.spinSpeed,
337
+ depth3D: particle.depth3D,
338
+ });
339
+ this.particles.push(newParticle);
340
+ }
341
+ }
342
+ /**
343
+ * Spawns particles for continuous mode
344
+ */
345
+ spawnParticles(count) {
346
+ if (!this.canvasContext)
347
+ return;
348
+ const { particle, physics } = this.config;
349
+ const { width, height } = this.canvasContext;
350
+ for (let i = 0; i < count; i++) {
351
+ // Get spawn position
352
+ let spawnPoint;
353
+ if (this.spawnArea) {
354
+ spawnPoint = getSpawnPoint(this.spawnArea, width, height);
355
+ }
356
+ else if (this.mode === 'snow' || this.mode === 'rain') {
357
+ // Spawn from top of screen
358
+ spawnPoint = { x: (0, utils_1.randomInRange)(0, width), y: -20 };
359
+ }
360
+ else {
361
+ // Default to top center area
362
+ spawnPoint = { x: (0, utils_1.randomInRange)(0, width), y: (0, utils_1.randomInRange)(-20, 0) };
363
+ }
364
+ // Calculate angle based on mode
365
+ let angle;
366
+ let velocity;
367
+ if (this.mode === 'snow') {
368
+ angle = (0, utils_1.degToRad)((0, utils_1.randomInRange)(-20, 20) - 90); // Mostly down with some drift
369
+ velocity = (0, utils_1.randomInRange)(0.5, 2);
370
+ }
371
+ else if (this.mode === 'rain') {
372
+ angle = (0, utils_1.degToRad)(-90); // Straight down
373
+ velocity = (0, utils_1.randomInRange)(8, 15);
374
+ }
375
+ else {
376
+ angle = (0, utils_1.secureRandom)() * constants_1.MATH_CONSTANTS.TWO_PI;
377
+ velocity = (0, utils_1.randomInRange)(2, 6);
378
+ }
379
+ const newParticle = (0, particle_1.createParticle)(spawnPoint.x, spawnPoint.y, angle, velocity, particle.colors, particle.shapes, particle.size, particle.opacity, particle.lifespan, physics.rotationSpeed, {
380
+ images: particle.images,
381
+ tiltRange: particle.tilt,
382
+ spinSpeedRange: particle.spinSpeed,
383
+ depth3D: particle.depth3D,
384
+ });
385
+ this.particles.push(newParticle);
386
+ }
387
+ }
388
+ /**
389
+ * Launches a firework
390
+ */
391
+ launchFirework() {
392
+ if (!this.canvasContext)
393
+ return;
394
+ const { width, height } = this.canvasContext;
395
+ const { launchHeight, burstCount, spread, secondaryExplosions, rocketColors, burstColors, trailLength } = this.fireworkConfig;
396
+ // Launch point at bottom of screen
397
+ const launchX = this.spawnArea
398
+ ? getSpawnPoint(this.spawnArea, width, height).x
399
+ : (0, utils_1.randomInRange)(width * 0.2, width * 0.8);
400
+ // Target explosion point
401
+ const targetY = height * (1 - launchHeight);
402
+ const targetX = launchX + (0, utils_1.randomInRange)(-50, 50);
403
+ // Create rocket particle (goes up, then triggers explosion)
404
+ const rocketParticle = (0, particle_1.createParticle)(launchX, height, (0, utils_1.degToRad)(-90 + (0, utils_1.randomInRange)(-10, 10)), (0, utils_1.randomInRange)(15, 25), rocketColors, ['circle'], [3, 5], [1, 1], 2000, 0);
405
+ // Mark as firework rocket with target
406
+ rocketParticle.data = {
407
+ isRocket: true,
408
+ targetY,
409
+ targetX,
410
+ burstCount,
411
+ spread,
412
+ burstColors,
413
+ secondaryExplosions,
414
+ trailLength,
415
+ };
416
+ this.particles.push(rocketParticle);
417
+ }
418
+ /**
419
+ * Triggers a firework explosion at a position
420
+ */
421
+ explodeFirework(x, y, data) {
422
+ const { burstCount = 80, spread = 360, burstColors, secondaryExplosions } = data;
423
+ const colors = burstColors ?? this.config.particle.colors;
424
+ // Create burst particles
425
+ const spreadRad = (0, utils_1.degToRad)(spread);
426
+ for (let i = 0; i < burstCount; i++) {
427
+ const angle = (i / burstCount) * spreadRad - spreadRad / 2 + (0, utils_1.degToRad)(-90);
428
+ const velocity = (0, utils_1.randomInRange)(4, 12);
429
+ const burstParticle = (0, particle_1.createParticle)(x, y, angle, velocity, colors, this.config.particle.shapes, [2, 6], [0.8, 1], 1500, this.config.physics.rotationSpeed);
430
+ // Mark for secondary explosion
431
+ if (secondaryExplosions && (0, utils_1.secureRandom)() < 0.1) {
432
+ burstParticle.data = { willExplode: true, burstColors: colors };
433
+ }
434
+ this.particles.push(burstParticle);
435
+ }
436
+ }
437
+ /**
438
+ * Stops the animation immediately
439
+ */
440
+ stop() {
441
+ if (!this.isRunning)
442
+ return;
443
+ if (this.animationFrameId !== null) {
444
+ cancelAnimationFrame(this.animationFrameId);
445
+ this.animationFrameId = null;
446
+ }
447
+ this.cleanup();
448
+ this.deferred.resolve();
449
+ }
450
+ /**
451
+ * Pauses the animation
452
+ */
453
+ pause() {
454
+ this.isPaused = true;
455
+ }
456
+ /**
457
+ * Resumes a paused animation
458
+ */
459
+ resume() {
460
+ this.isPaused = false;
461
+ }
462
+ /**
463
+ * Called when animation completes naturally
464
+ */
465
+ complete() {
466
+ this.config.onComplete?.();
467
+ this.cleanup();
468
+ this.deferred.resolve();
469
+ }
470
+ /**
471
+ * Cleans up resources
472
+ */
473
+ cleanup() {
474
+ this.isRunning = false;
475
+ this.isPaused = false;
476
+ this.particles = [];
477
+ this.canvasContext = null;
478
+ activeAnimations--;
479
+ if (this.config.autoCleanup) {
480
+ cleanupCanvas();
481
+ }
482
+ }
483
+ /**
484
+ * Adds more particles to the animation
485
+ */
486
+ addParticles(count) {
487
+ if (!this.isRunning || !this.canvasContext)
488
+ return;
489
+ if (this.mode === 'continuous' || this.mode === 'snow' || this.mode === 'rain') {
490
+ this.spawnParticles(count);
491
+ }
492
+ else {
493
+ // For burst mode, create from original origin
494
+ const { particle, direction, physics } = this.config;
495
+ const { x, y } = this.origin;
496
+ for (let i = 0; i < count; i++) {
497
+ let angle;
498
+ if (direction.direction === 'radial') {
499
+ angle = (0, utils_1.secureRandom)() * constants_1.MATH_CONSTANTS.TWO_PI;
500
+ }
501
+ else {
502
+ const baseAngle = (0, utils_1.getDirectionAngle)(direction.direction, direction.angle);
503
+ const spreadRad = (0, utils_1.degToRad)(direction.spread);
504
+ angle = baseAngle + ((0, utils_1.secureRandom)() - 0.5) * spreadRad;
505
+ }
506
+ const velocity = (0, utils_1.randomInRange)(direction.velocity[0], direction.velocity[1]);
507
+ const newParticle = (0, particle_1.createParticle)(x, y, angle, velocity, particle.colors, particle.shapes, particle.size, particle.opacity, particle.lifespan, physics.rotationSpeed);
508
+ this.particles.push(newParticle);
509
+ }
510
+ }
511
+ }
512
+ /**
513
+ * Clears all particles
514
+ */
515
+ clear() {
516
+ this.particles = [];
517
+ }
518
+ /**
519
+ * Gets current particle count
520
+ */
521
+ getParticleCount() {
522
+ return (0, particle_1.countActiveParticles)(this.particles);
523
+ }
524
+ /**
525
+ * Gets the current state
526
+ */
527
+ getState() {
528
+ if (!this.isRunning)
529
+ return 'stopped';
530
+ if (this.isPaused)
531
+ return 'paused';
532
+ return 'running';
533
+ }
534
+ /**
535
+ * Creates the explosion handle for external control
536
+ */
537
+ createHandle() {
538
+ return {
539
+ stop: () => this.stop(),
540
+ pause: () => this.pause(),
541
+ resume: () => this.resume(),
542
+ promise: this.deferred.promise,
543
+ addParticles: (count) => this.addParticles(count),
544
+ clear: () => this.clear(),
545
+ getParticleCount: () => this.getParticleCount(),
546
+ getState: () => this.getState(),
547
+ };
548
+ }
549
+ }
550
+ exports.ConfettiEngine = ConfettiEngine;
551
+ /**
552
+ * Creates and starts a confetti explosion
553
+ */
554
+ function createConfettiExplosion(origin, options) {
555
+ const engine = new ConfettiEngine(origin, options);
556
+ return engine.start();
557
+ }
558
+ /**
559
+ * Fires confetti from an element's center
560
+ */
561
+ function fireFromElement(element, options) {
562
+ if (!element || !(0, utils_1.isBrowser)()) {
563
+ return null;
564
+ }
565
+ const rect = element.getBoundingClientRect();
566
+ const origin = {
567
+ x: rect.left + rect.width / 2,
568
+ y: rect.top + rect.height / 2,
569
+ };
570
+ return createConfettiExplosion(origin, options);
571
+ }
572
+ /**
573
+ * Gets the current number of active animations
574
+ */
575
+ function getActiveAnimationCount() {
576
+ return activeAnimations;
577
+ }
578
+ /**
579
+ * Forces cleanup of all resources
580
+ */
581
+ function forceCleanup() {
582
+ if (globalCanvas) {
583
+ globalCanvas.remove();
584
+ globalCanvas = null;
585
+ globalCtx = null;
586
+ }
587
+ activeAnimations = 0;
588
+ }
589
+ //# sourceMappingURL=confetti-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confetti-engine.js","sourceRoot":"","sources":["../../src/confetti-engine.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AA0sBH,0DAMC;AAKD,0CAeC;AAKD,0DAEC;AAKD,oCAOC;AAtuBD,yCAMoB;AAEpB,mCASiB;AAEjB,2CAOqB;AAErB;;GAEG;AACH,IAAI,YAAY,GAA6B,IAAI,CAAC;AAClD,IAAI,SAAS,GAAoC,IAAI,CAAC;AACtD,IAAI,gBAAgB,GAAG,CAAC,CAAC;AACzB,IAAI,aAAa,GAAwB,IAAI,CAAC;AAE9C;;GAEG;AACH,SAAS,iBAAiB,CAAC,MAAc,EAAE,YAAoC;IAC7E,IAAI,CAAC,IAAA,iBAAS,GAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,MAAM,GAAG,EAAE,GAAG,0BAAc,EAAE,GAAG,YAAY,EAAE,CAAC;IACtD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,IAAI,IAAA,2BAAmB,EAAC,uBAAW,CAAC,OAAO,CAAC,CAAC;IAE1E,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,YAAY,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;iBAOhB,MAAM;KAClB,CAAC;QAEF,SAAS,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE;YACxC,KAAK,EAAE,IAAI;YACX,cAAc,EAAE,IAAI,EAAE,8BAA8B;SACrD,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAExC,6BAA6B;QAC7B,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,aAAa,GAAG,GAAG,EAAE;gBACnB,IAAI,YAAY,IAAI,SAAS,EAAE,CAAC;oBAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC;oBAChD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,CAAC;oBACnD,YAAY,CAAC,KAAK,GAAG,KAAK,GAAG,GAAG,CAAC;oBACjC,YAAY,CAAC,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC;oBACnC,YAAY,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,KAAK,IAAI,CAAC;oBACxC,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC;oBAC1C,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC,CAAC;YACF,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAE3C,0DAA0D;IAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,CAAC;IAEnD,IAAI,YAAY,CAAC,KAAK,KAAK,KAAK,GAAG,GAAG,IAAI,YAAY,CAAC,MAAM,KAAK,MAAM,GAAG,GAAG,EAAE,CAAC;QAC/E,YAAY,CAAC,KAAK,GAAG,KAAK,GAAG,GAAG,CAAC;QACjC,YAAY,CAAC,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC;QACnC,YAAY,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,KAAK,IAAI,CAAC;QACxC,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC;QAC1C,SAAU,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,MAAM,EAAE,YAAY;QACpB,GAAG,EAAE,SAAU;QACf,KAAK;QACL,MAAM;QACN,GAAG;KACJ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,aAAa;IACpB,IAAI,YAAY,IAAI,gBAAgB,KAAK,CAAC,EAAE,CAAC;QAC3C,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,gBAAgB,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC;gBAC3C,IAAI,aAAa,EAAE,CAAC;oBAClB,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;oBACpD,aAAa,GAAG,IAAI,CAAC;gBACvB,CAAC;gBACD,YAAY,CAAC,MAAM,EAAE,CAAC;gBACtB,YAAY,GAAG,IAAI,CAAC;gBACpB,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;QACH,CAAC,EAAE,yBAAa,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,IAAe,EAAE,YAAoB,EAAE,aAAqB;IACjF,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;IAElC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO;YACV,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAClB,KAAK,MAAM;YACT,OAAO;gBACL,CAAC,EAAE,IAAA,qBAAa,EAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACjC,CAAC,EAAE,IAAA,qBAAa,EAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;aAClC,CAAC;QACJ,KAAK,MAAM;YACT,MAAM,CAAC,GAAG,IAAA,oBAAY,GAAE,CAAC;YACzB,OAAO;gBACL,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;aACpB,CAAC;QACJ,KAAK,QAAQ;YACX,MAAM,KAAK,GAAG,IAAA,oBAAY,GAAE,GAAG,0BAAc,CAAC,MAAM,CAAC;YACrD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAA,oBAAY,GAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,gCAAgC;YACtF,OAAO;gBACL,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM;gBAC/B,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM;aAChC,CAAC;QACJ;YACE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACpB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAa,cAAc;IAsBzB,YAAY,MAAmB,EAAE,OAA8B;QArBvD,cAAS,GAAoB,EAAE,CAAC;QAGhC,kBAAa,GAAyB,IAAI,CAAC;QAC3C,qBAAgB,GAAkB,IAAI,CAAC;QACvC,kBAAa,GAAW,CAAC,CAAC;QAC1B,kBAAa,GAAW,CAAC,CAAC;QAC1B,cAAS,GAAY,KAAK,CAAC;QAC3B,aAAQ,GAAY,KAAK,CAAC;QAC1B,aAAQ,GAAG,IAAA,sBAAc,GAAQ,CAAC;QASlC,kBAAa,GAAW,CAAC,CAAC;QAC1B,mBAAc,GAAW,CAAC,CAAC;QAqQnC;;WAEG;QACK,YAAO,GAAG,GAAS,EAAE;YAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC3C,OAAO;YACT,CAAC;YAED,kDAAkD;YAClD,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;gBAC5E,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC;gBAC/B,IAAI,CAAC,gBAAgB,GAAG,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC5D,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBACvC,OAAO;YACT,CAAC;YAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,IAAI,CAAC,gBAAgB,GAAG,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC5D,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBACvC,OAAO;YACT,CAAC;YAED,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YACtC,MAAM,SAAS,GAAG,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC;YACnD,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC;YAEjC,sBAAsB;YACtB,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;gBAC3B,IAAI,WAAW,GAAG,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;oBAC3D,IAAI,CAAC,gBAAgB,GAAG,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAC5D,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC;YACpC,CAAC;YAED,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;YAEvD,eAAe;YACf,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACnC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,GAAG,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC;YAC/C,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAEpB,8BAA8B;YAC9B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;YAE1C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC/B,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;oBACb,IAAA,yBAAc,EAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;oBAE5E,4CAA4C;oBAC5C,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAK,CAAC,CAAC,IAAI,CAAC,OAAkB,EAAE,CAAC;wBAC1D,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC;wBACjB,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;oBACzC,CAAC;oBAED,0EAA0E;oBAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;oBACtD,IAAI,CAAC,CAAC,IAAI,EAAE,WAAW,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;wBAC/D,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;wBAC1B,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;oBACnG,CAAC;oBAED,IAAA,yBAAc,EAAC,GAAG,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;YAED,gDAAgD;YAChD,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC/E,MAAM,kBAAkB,GAAG,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC;gBAC5D,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;gBAErE,IAAI,kBAAkB,IAAI,aAAa,EAAE,CAAC;oBACxC,MAAM,WAAW,GAAG,IAAA,+BAAoB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAEzD,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;wBAClC,yBAAyB;wBACzB,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;wBAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,aAAa,CAAC,MAAM,EACpB,IAAI,CAAC,gBAAgB,CAAC,cAAc,GAAG,WAAW,CACnD,CAAC;wBAEF,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;4BAClB,+CAA+C;4BAC/C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;4BACtD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;wBACjC,CAAC;oBACH,CAAC;yBAAM,IAAI,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC;wBAC9D,iCAAiC;wBACjC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC;oBACvF,CAAC;oBAED,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC;gBACnC,CAAC;YACH,CAAC;YAED,8CAA8C;YAC9C,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC;gBACtF,MAAM,kBAAkB,GAAG,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC;gBAE5D,IAAI,aAAa,KAAK,CAAC,IAAI,kBAAkB,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,IAAI,GAAG,CAAC,EAAE,CAAC;oBACzF,IAAI,CAAC,cAAc,EAAE,CAAC;oBACtB,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC;gBACnC,CAAC;YACH,CAAC;YAED,qEAAqE;YACrE,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACjF,IAAI,IAAA,kCAAuB,EAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAChB,OAAO;gBACT,CAAC;YACH,CAAC;YAED,qBAAqB;YACrB,IAAI,CAAC,gBAAgB,GAAG,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9D,CAAC,CAAC;QAvXA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAA,mBAAW,EAAC,OAAO,CAAC,CAAC;QAEnC,qCAAqC;QACrC,IAAI,CAAC,IAAI,GAAI,OAAe,EAAE,IAAI,IAAI,OAAO,CAAC;QAC9C,IAAI,CAAC,SAAS,GAAI,OAAe,EAAE,SAAS,CAAC;QAC7C,IAAI,CAAC,gBAAgB,GAAG,EAAE,GAAG,8BAAkB,EAAE,GAAI,OAAe,EAAE,UAAU,EAAE,CAAC;QACnF,IAAI,CAAC,cAAc,GAAG,EAAE,GAAG,4BAAgB,EAAE,GAAI,OAAe,EAAE,QAAQ,EAAE,CAAC;QAC7E,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,0BAAc,EAAE,GAAI,OAAe,EAAE,MAAM,EAAE,CAAC;QACvE,IAAI,CAAC,SAAS,GAAI,OAAe,EAAE,QAAQ,EAAE,SAAS,CAAC;QAEvD,qBAAqB;QACrB,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;QAC1D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,IAAA,iBAAS,GAAE,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;YAClF,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,gBAAgB,EAAE,CAAC;QAEnB,uBAAuB;QACvB,IAAI,CAAC,aAAa,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAE9E,yCAAyC;QACzC,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC/E,4CAA4C;YAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAC3B,IAAI,CAAC,gBAAgB,CAAC,cAAc,EACpC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,cAAc,GAAG,GAAG,CAAC,CACvD,CAAC;YACF,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QACpC,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACpC,0CAA0C;YAC1C,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,sBAAsB;YACtB,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;QAED,wBAAwB;QACxB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAExB,uBAAuB;QACvB,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACvC,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACxC,IAAI,CAAC,OAAO,EAAE,CAAC;QAEf,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACK,eAAe;QACrB,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QACpE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QAE7B,kCAAkC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,uBAAW,CAAC,aAAa,CAAC,CAAC;QAEjE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,wCAAwC;YACxC,IAAI,KAAa,CAAC;YAElB,IAAI,SAAS,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;gBACrC,8BAA8B;gBAC9B,KAAK,GAAG,IAAA,oBAAY,GAAE,GAAG,0BAAc,CAAC,MAAM,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACN,gCAAgC;gBAChC,MAAM,SAAS,GAAG,IAAA,yBAAiB,EAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;gBAC1E,MAAM,SAAS,GAAG,IAAA,gBAAQ,EAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC7C,KAAK,GAAG,SAAS,GAAG,CAAC,IAAA,oBAAY,GAAE,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC;YACzD,CAAC;YAED,+BAA+B;YAC/B,MAAM,QAAQ,GAAG,IAAA,qBAAa,EAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAE7E,MAAM,WAAW,GAAG,IAAA,yBAAc,EAChC,CAAC,EACD,CAAC,EACD,KAAK,EACL,QAAQ,EACR,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,IAAI,EACb,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,QAAQ,EACjB,OAAO,CAAC,aAAa,EACrB;gBACE,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,SAAS,EAAE,QAAQ,CAAC,IAAI;gBACxB,cAAc,EAAE,QAAQ,CAAC,SAAS;gBAClC,OAAO,EAAE,QAAQ,CAAC,OAAO;aAC1B,CACF,CAAC;YAEF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,KAAa;QAClC,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO;QAEhC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;QAE7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,qBAAqB;YACrB,IAAI,UAAuB,CAAC;YAE5B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAC5D,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACxD,2BAA2B;gBAC3B,UAAU,GAAG,EAAE,CAAC,EAAE,IAAA,qBAAa,EAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,6BAA6B;gBAC7B,UAAU,GAAG,EAAE,CAAC,EAAE,IAAA,qBAAa,EAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,IAAA,qBAAa,EAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;YACxE,CAAC;YAED,gCAAgC;YAChC,IAAI,KAAa,CAAC;YAClB,IAAI,QAAgB,CAAC;YAErB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACzB,KAAK,GAAG,IAAA,gBAAQ,EAAC,IAAA,qBAAa,EAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,8BAA8B;gBAC7E,QAAQ,GAAG,IAAA,qBAAa,EAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACnC,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAChC,KAAK,GAAG,IAAA,gBAAQ,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB;gBACvC,QAAQ,GAAG,IAAA,qBAAa,EAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,KAAK,GAAG,IAAA,oBAAY,GAAE,GAAG,0BAAc,CAAC,MAAM,CAAC;gBAC/C,QAAQ,GAAG,IAAA,qBAAa,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACjC,CAAC;YAED,MAAM,WAAW,GAAG,IAAA,yBAAc,EAChC,UAAU,CAAC,CAAC,EACZ,UAAU,CAAC,CAAC,EACZ,KAAK,EACL,QAAQ,EACR,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,IAAI,EACb,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,QAAQ,EACjB,OAAO,CAAC,aAAa,EACrB;gBACE,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,SAAS,EAAE,QAAQ,CAAC,IAAI;gBACxB,cAAc,EAAE,QAAQ,CAAC,SAAS;gBAClC,OAAO,EAAE,QAAQ,CAAC,OAAO;aAC1B,CACF,CAAC;YAEF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,cAAc;QACpB,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO;QAEhC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;QAC7C,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC;QAE9H,mCAAmC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS;YAC5B,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;YAChD,CAAC,CAAC,IAAA,qBAAa,EAAC,KAAK,GAAG,GAAG,EAAE,KAAK,GAAG,GAAG,CAAC,CAAC;QAE5C,yBAAyB;QACzB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,YAAa,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,OAAO,GAAG,IAAA,qBAAa,EAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAEjD,4DAA4D;QAC5D,MAAM,cAAc,GAAG,IAAA,yBAAc,EACnC,OAAO,EACP,MAAM,EACN,IAAA,gBAAQ,EAAC,CAAC,EAAE,GAAG,IAAA,qBAAa,EAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EACtC,IAAA,qBAAa,EAAC,EAAE,EAAE,EAAE,CAAC,EACrB,YAAa,EACb,CAAC,QAAQ,CAAC,EACV,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,IAAI,EACJ,CAAC,CACF,CAAC;QAEF,sCAAsC;QACtC,cAAc,CAAC,IAAI,GAAG;YACpB,QAAQ,EAAE,IAAI;YACd,OAAO;YACP,OAAO;YACP,UAAU;YACV,MAAM;YACN,WAAW;YACX,mBAAmB;YACnB,WAAW;SACZ,CAAC;QAEF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,CAAS,EAAE,CAAS,EAAE,IAAS;QACrD,MAAM,EAAE,UAAU,GAAG,EAAE,EAAE,MAAM,GAAG,GAAG,EAAE,WAAW,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC;QACjF,MAAM,MAAM,GAAG,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAE1D,yBAAyB;QACzB,MAAM,SAAS,GAAG,IAAA,gBAAQ,EAAC,MAAM,CAAC,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,SAAS,GAAG,SAAS,GAAG,CAAC,GAAG,IAAA,gBAAQ,EAAC,CAAC,EAAE,CAAC,CAAC;YAC3E,MAAM,QAAQ,GAAG,IAAA,qBAAa,EAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAEtC,MAAM,aAAa,GAAG,IAAA,yBAAc,EAClC,CAAC,EACD,CAAC,EACD,KAAK,EACL,QAAQ,EACR,MAAM,EACN,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAC3B,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,CAAC,GAAG,EAAE,CAAC,CAAC,EACR,IAAI,EACJ,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAClC,CAAC;YAEF,+BAA+B;YAC/B,IAAI,mBAAmB,IAAI,IAAA,oBAAY,GAAE,GAAG,GAAG,EAAE,CAAC;gBAChD,aAAa,CAAC,IAAI,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;YAClE,CAAC;YAED,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAyHD;;OAEG;IACH,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAE5B,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;YACnC,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC5C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IAED;;OAEG;IACK,QAAQ;QACd,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,OAAO;QACb,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAE1B,gBAAgB,EAAE,CAAC;QAEnB,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC5B,aAAa,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,KAAa;QACxB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO;QAEnD,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC/E,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,8CAA8C;YAC9C,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;YACrD,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;YAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/B,IAAI,KAAa,CAAC;gBAClB,IAAI,SAAS,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;oBACrC,KAAK,GAAG,IAAA,oBAAY,GAAE,GAAG,0BAAc,CAAC,MAAM,CAAC;gBACjD,CAAC;qBAAM,CAAC;oBACN,MAAM,SAAS,GAAG,IAAA,yBAAiB,EAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;oBAC1E,MAAM,SAAS,GAAG,IAAA,gBAAQ,EAAC,SAAS,CAAC,MAAM,CAAC,CAAC;oBAC7C,KAAK,GAAG,SAAS,GAAG,CAAC,IAAA,oBAAY,GAAE,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC;gBACzD,CAAC;gBAED,MAAM,QAAQ,GAAG,IAAA,qBAAa,EAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7E,MAAM,WAAW,GAAG,IAAA,yBAAc,EAChC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EACrB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAChC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,EAC/B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,aAAa,CACzC,CAAC;gBACF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAA,+BAAoB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,SAAS,CAAC;QACtC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,QAAQ,CAAC;QACnC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,YAAY;QAClB,OAAO;YACL,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE;YACvB,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE;YACzB,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE;YAC3B,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO;YAC9B,YAAY,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;YACzD,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE;YACzB,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC/C,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE;SAChC,CAAC;IACJ,CAAC;CACF;AA/gBD,wCA+gBC;AAED;;GAEG;AACH,SAAgB,uBAAuB,CACrC,MAAmB,EACnB,OAA8B;IAE9B,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAC7B,OAA2B,EAC3B,OAA8B;IAE9B,IAAI,CAAC,OAAO,IAAI,CAAC,IAAA,iBAAS,GAAE,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAgB;QAC1B,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC;QAC7B,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;KAC9B,CAAC;IAEF,OAAO,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB;IACrC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY;IAC1B,IAAI,YAAY,EAAE,CAAC;QACjB,YAAY,CAAC,MAAM,EAAE,CAAC;QACtB,YAAY,GAAG,IAAI,CAAC;QACpB,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IACD,gBAAgB,GAAG,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Functional Confetti API
3
+ *
4
+ * Provides a canvas-confetti compatible function-based API for
5
+ * imperative confetti control without React components.
6
+ *
7
+ * @module confetti
8
+ */
9
+ import type { CanvasConfettiOptions, ConfettiCreateOptions } from './types';
10
+ /**
11
+ * Main confetti function - canvas-confetti compatible API
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * // Basic confetti burst
16
+ * confetti();
17
+ *
18
+ * // Customized confetti
19
+ * confetti({
20
+ * particleCount: 100,
21
+ * spread: 70,
22
+ * origin: { x: 0.5, y: 0.5 }
23
+ * });
24
+ *
25
+ * // Wait for completion
26
+ * await confetti({ particleCount: 200 });
27
+ * console.log('Confetti finished!');
28
+ * ```
29
+ *
30
+ * @param options - Confetti configuration options
31
+ * @returns Promise that resolves when animation completes
32
+ */
33
+ export declare function confetti(options?: CanvasConfettiOptions): Promise<void> | null;
34
+ export declare namespace confetti {
35
+ var create: (canvas: HTMLCanvasElement, globalOptions?: ConfettiCreateOptions) => ((options?: CanvasConfettiOptions) => Promise<void> | null) & {
36
+ reset: () => void;
37
+ };
38
+ var reset: () => void;
39
+ var fireworks: (options?: Partial<CanvasConfettiOptions>) => Promise<void>;
40
+ var schoolPride: (options?: Partial<CanvasConfettiOptions>) => void;
41
+ var snow: (options?: {
42
+ duration?: number;
43
+ } & Partial<CanvasConfettiOptions>) => void;
44
+ var burst: (origin: {
45
+ x: number;
46
+ y: number;
47
+ }, options?: Partial<CanvasConfettiOptions>) => Promise<void> | null;
48
+ }
49
+ export default confetti;
50
+ //# sourceMappingURL=confetti.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confetti.d.ts","sourceRoot":"","sources":["../../src/confetti.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,SAAS,CAAC;AAmRjB;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,QAAQ,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CA6BlF;yBA7Be,QAAQ;yBAoDd,iBAAiB,kBACV,qBAAqB,KACnC,CAAC,CAAC,OAAO,CAAC,EAAE,qBAAqB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG;QAAE,KAAK,EAAE,MAAM,IAAI,CAAA;KAAE;qBA+DzD,IAAI;8BAwBY,OAAO,CAAC,qBAAqB,CAAC,KAAQ,OAAO,CAAC,IAAI,CAAC;gCA8BvD,OAAO,CAAC,qBAAqB,CAAC,KAAQ,IAAI;yBAsCjD;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,KAAQ,IAAI;wBAsC1F;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,YACvB,OAAO,CAAC,qBAAqB,CAAC,KACtC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;;AAavB,eAAe,QAAQ,CAAC"}