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,581 @@
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 { createParticle, updateParticle, renderParticle, areAllParticlesInactive, countActiveParticles, } from './particle';
18
+ import { mergeConfig, getDirectionAngle, randomInRange, degToRad, createDeferred, isBrowser, getDevicePixelRatio, secureRandom, } from './utils';
19
+ import { PERFORMANCE, CLEANUP_DELAY, MATH_CONSTANTS, DEFAULT_CONTINUOUS, DEFAULT_FIREWORK, DEFAULT_CANVAS, } from './constants';
20
+ /**
21
+ * Global canvas element for reuse
22
+ */
23
+ let globalCanvas = null;
24
+ let globalCtx = null;
25
+ let activeAnimations = 0;
26
+ let resizeHandler = null;
27
+ /**
28
+ * Creates or gets the shared canvas element
29
+ */
30
+ function getOrCreateCanvas(zIndex, canvasConfig) {
31
+ if (!isBrowser()) {
32
+ throw new Error('ConfettiEngine requires a browser environment');
33
+ }
34
+ const config = { ...DEFAULT_CANVAS, ...canvasConfig };
35
+ const dpr = config.pixelRatio ?? getDevicePixelRatio(PERFORMANCE.MAX_DPR);
36
+ if (!globalCanvas) {
37
+ globalCanvas = document.createElement('canvas');
38
+ globalCanvas.style.cssText = `
39
+ position: fixed;
40
+ top: 0;
41
+ left: 0;
42
+ width: 100%;
43
+ height: 100%;
44
+ pointer-events: none;
45
+ z-index: ${zIndex};
46
+ `;
47
+ globalCtx = globalCanvas.getContext('2d', {
48
+ alpha: true,
49
+ desynchronized: true, // Hint for better performance
50
+ });
51
+ if (!globalCtx) {
52
+ throw new Error('Failed to get canvas 2D context');
53
+ }
54
+ document.body.appendChild(globalCanvas);
55
+ // Set up auto-resize handler
56
+ if (config.autoResize) {
57
+ resizeHandler = () => {
58
+ if (globalCanvas && globalCtx) {
59
+ const width = config.width ?? window.innerWidth;
60
+ const height = config.height ?? window.innerHeight;
61
+ globalCanvas.width = width * dpr;
62
+ globalCanvas.height = height * dpr;
63
+ globalCanvas.style.width = `${width}px`;
64
+ globalCanvas.style.height = `${height}px`;
65
+ globalCtx.scale(dpr, dpr);
66
+ }
67
+ };
68
+ window.addEventListener('resize', resizeHandler);
69
+ }
70
+ }
71
+ // Update z-index if different
72
+ globalCanvas.style.zIndex = String(zIndex);
73
+ // Resize canvas to match viewport or specified dimensions
74
+ const width = config.width ?? window.innerWidth;
75
+ const height = config.height ?? window.innerHeight;
76
+ if (globalCanvas.width !== width * dpr || globalCanvas.height !== height * dpr) {
77
+ globalCanvas.width = width * dpr;
78
+ globalCanvas.height = height * dpr;
79
+ globalCanvas.style.width = `${width}px`;
80
+ globalCanvas.style.height = `${height}px`;
81
+ globalCtx.scale(dpr, dpr);
82
+ }
83
+ return {
84
+ canvas: globalCanvas,
85
+ ctx: globalCtx,
86
+ width,
87
+ height,
88
+ dpr,
89
+ };
90
+ }
91
+ /**
92
+ * Cleans up the canvas when no animations are running
93
+ */
94
+ function cleanupCanvas() {
95
+ if (globalCanvas && activeAnimations === 0) {
96
+ setTimeout(() => {
97
+ if (activeAnimations === 0 && globalCanvas) {
98
+ if (resizeHandler) {
99
+ window.removeEventListener('resize', resizeHandler);
100
+ resizeHandler = null;
101
+ }
102
+ globalCanvas.remove();
103
+ globalCanvas = null;
104
+ globalCtx = null;
105
+ }
106
+ }, CLEANUP_DELAY);
107
+ }
108
+ }
109
+ /**
110
+ * Gets a random point within a spawn area
111
+ */
112
+ function getSpawnPoint(area, _canvasWidth, _canvasHeight) {
113
+ const { type, x, y, w, h } = area;
114
+ switch (type) {
115
+ case 'point':
116
+ return { x, y };
117
+ case 'rect':
118
+ return {
119
+ x: randomInRange(x, x + (w ?? 0)),
120
+ y: randomInRange(y, y + (h ?? 0)),
121
+ };
122
+ case 'line':
123
+ const t = secureRandom();
124
+ return {
125
+ x: x + t * (w ?? 0),
126
+ y: y + t * (h ?? 0),
127
+ };
128
+ case 'circle':
129
+ const angle = secureRandom() * MATH_CONSTANTS.TWO_PI;
130
+ const radius = Math.sqrt(secureRandom()) * (w ?? 50); // sqrt for uniform distribution
131
+ return {
132
+ x: x + Math.cos(angle) * radius,
133
+ y: y + Math.sin(angle) * radius,
134
+ };
135
+ default:
136
+ return { x, y };
137
+ }
138
+ }
139
+ /**
140
+ * Main confetti engine class
141
+ */
142
+ export class ConfettiEngine {
143
+ constructor(origin, options) {
144
+ this.particles = [];
145
+ this.canvasContext = null;
146
+ this.animationFrameId = null;
147
+ this.lastFrameTime = 0;
148
+ this.lastSpawnTime = 0;
149
+ this.isRunning = false;
150
+ this.isPaused = false;
151
+ this.deferred = createDeferred();
152
+ this.frameInterval = 0;
153
+ this.lastRenderTime = 0;
154
+ /**
155
+ * Main animation loop
156
+ */
157
+ this.animate = () => {
158
+ if (!this.isRunning || !this.canvasContext) {
159
+ return;
160
+ }
161
+ // Check if running is disabled in continuous mode
162
+ if ((this.mode === 'continuous' || this.mode === 'snow' || this.mode === 'rain') &&
163
+ !this.continuousConfig.run) {
164
+ this.animationFrameId = requestAnimationFrame(this.animate);
165
+ this.lastFrameTime = performance.now();
166
+ return;
167
+ }
168
+ if (this.isPaused) {
169
+ this.animationFrameId = requestAnimationFrame(this.animate);
170
+ this.lastFrameTime = performance.now();
171
+ return;
172
+ }
173
+ const currentTime = performance.now();
174
+ const deltaTime = currentTime - this.lastFrameTime;
175
+ this.lastFrameTime = currentTime;
176
+ // Frame rate limiting
177
+ if (this.frameInterval > 0) {
178
+ if (currentTime - this.lastRenderTime < this.frameInterval) {
179
+ this.animationFrameId = requestAnimationFrame(this.animate);
180
+ return;
181
+ }
182
+ this.lastRenderTime = currentTime;
183
+ }
184
+ const { ctx, width, height, dpr } = this.canvasContext;
185
+ // Clear canvas
186
+ ctx.setTransform(1, 0, 0, 1, 0, 0);
187
+ ctx.clearRect(0, 0, width * dpr, height * dpr);
188
+ ctx.scale(dpr, dpr);
189
+ // Update and render particles
190
+ const { physics, particle } = this.config;
191
+ for (const p of this.particles) {
192
+ if (p.active) {
193
+ updateParticle(p, deltaTime, physics, particle.fadeOut, particle.scaleDown);
194
+ // Check for firework rocket reaching target
195
+ if (p.data?.isRocket && p.y <= p.data.targetY) {
196
+ p.active = false;
197
+ this.explodeFirework(p.x, p.y, p.data);
198
+ }
199
+ // Check for secondary explosions (low velocity means particle is falling)
200
+ const velocity = Math.sqrt(p.vx * p.vx + p.vy * p.vy);
201
+ if (p.data?.willExplode && !p.data.hasExploded && velocity < 1) {
202
+ p.data.hasExploded = true;
203
+ this.explodeFirework(p.x, p.y, { burstCount: 15, spread: 360, burstColors: p.data.burstColors });
204
+ }
205
+ renderParticle(ctx, p, { customDraw: this.drawShape });
206
+ }
207
+ }
208
+ // Handle continuous mode spawning and recycling
209
+ if (this.mode === 'continuous' || this.mode === 'snow' || this.mode === 'rain') {
210
+ const timeSinceLastSpawn = currentTime - this.lastSpawnTime;
211
+ const spawnInterval = 1000 / (this.continuousConfig.spawnRate ?? 10);
212
+ if (timeSinceLastSpawn >= spawnInterval) {
213
+ const activeCount = countActiveParticles(this.particles);
214
+ if (this.continuousConfig.recycle) {
215
+ // Recycle dead particles
216
+ const deadParticles = this.particles.filter(p => !p.active);
217
+ const toRecycle = Math.min(deadParticles.length, this.continuousConfig.numberOfPieces - activeCount);
218
+ if (toRecycle > 0) {
219
+ // Remove old dead particles and spawn new ones
220
+ this.particles = this.particles.filter(p => p.active);
221
+ this.spawnParticles(toRecycle);
222
+ }
223
+ }
224
+ else if (activeCount < this.continuousConfig.numberOfPieces) {
225
+ // Just spawn more if under limit
226
+ this.spawnParticles(Math.min(3, this.continuousConfig.numberOfPieces - activeCount));
227
+ }
228
+ this.lastSpawnTime = currentTime;
229
+ }
230
+ }
231
+ // Handle firework mode - launch new fireworks
232
+ if (this.mode === 'firework') {
233
+ const activeRockets = this.particles.filter(p => p.active && p.data?.isRocket).length;
234
+ const timeSinceLastSpawn = currentTime - this.lastSpawnTime;
235
+ if (activeRockets === 0 && timeSinceLastSpawn >= (this.fireworkConfig.burstDelay ?? 500)) {
236
+ this.launchFirework();
237
+ this.lastSpawnTime = currentTime;
238
+ }
239
+ }
240
+ // Check if animation is complete (not for continuous/infinite modes)
241
+ if (this.mode === 'burst' || this.mode === 'cannon' || this.mode === 'explosion') {
242
+ if (areAllParticlesInactive(this.particles)) {
243
+ this.complete();
244
+ return;
245
+ }
246
+ }
247
+ // Continue animation
248
+ this.animationFrameId = requestAnimationFrame(this.animate);
249
+ };
250
+ this.origin = origin;
251
+ this.config = mergeConfig(options);
252
+ // Set up mode-specific configuration
253
+ this.mode = options?.mode ?? 'burst';
254
+ this.spawnArea = options?.spawnArea;
255
+ this.continuousConfig = { ...DEFAULT_CONTINUOUS, ...options?.continuous };
256
+ this.fireworkConfig = { ...DEFAULT_FIREWORK, ...options?.firework };
257
+ this.canvasConfig = { ...DEFAULT_CANVAS, ...options?.canvas };
258
+ this.drawShape = options?.particle?.drawShape;
259
+ // Frame rate control
260
+ if (this.canvasConfig.frameRate) {
261
+ this.frameInterval = 1000 / this.canvasConfig.frameRate;
262
+ }
263
+ }
264
+ /**
265
+ * Starts the confetti animation
266
+ */
267
+ start() {
268
+ if (this.isRunning) {
269
+ return this.createHandle();
270
+ }
271
+ if (!isBrowser()) {
272
+ console.warn('ConfettiEngine: Cannot start animation in non-browser environment');
273
+ this.deferred.resolve();
274
+ return this.createHandle();
275
+ }
276
+ this.isRunning = true;
277
+ activeAnimations++;
278
+ // Get or create canvas
279
+ this.canvasContext = getOrCreateCanvas(this.config.zIndex, this.canvasConfig);
280
+ // Create initial particles based on mode
281
+ if (this.mode === 'continuous' || this.mode === 'snow' || this.mode === 'rain') {
282
+ // For continuous modes, spawn initial batch
283
+ const initialCount = Math.min(this.continuousConfig.numberOfPieces, Math.floor(this.continuousConfig.numberOfPieces * 0.5));
284
+ this.spawnParticles(initialCount);
285
+ }
286
+ else if (this.mode === 'firework') {
287
+ // For firework, launch the first firework
288
+ this.launchFirework();
289
+ }
290
+ else {
291
+ // Standard burst mode
292
+ this.createParticles();
293
+ }
294
+ // Fire onStart callback
295
+ this.config.onStart?.();
296
+ // Start animation loop
297
+ this.lastFrameTime = performance.now();
298
+ this.lastSpawnTime = performance.now();
299
+ this.lastRenderTime = performance.now();
300
+ this.animate();
301
+ return this.createHandle();
302
+ }
303
+ /**
304
+ * Creates particles for the burst
305
+ */
306
+ createParticles() {
307
+ const { particleCount, particle, direction, physics } = this.config;
308
+ const { x, y } = this.origin;
309
+ // Limit particles for performance
310
+ const count = Math.min(particleCount, PERFORMANCE.MAX_PARTICLES);
311
+ for (let i = 0; i < count; i++) {
312
+ // Calculate direction angle with spread
313
+ let angle;
314
+ if (direction.direction === 'radial') {
315
+ // Full 360° spread for radial
316
+ angle = secureRandom() * MATH_CONSTANTS.TWO_PI;
317
+ }
318
+ else {
319
+ // Directional burst with spread
320
+ const baseAngle = getDirectionAngle(direction.direction, direction.angle);
321
+ const spreadRad = degToRad(direction.spread);
322
+ angle = baseAngle + (secureRandom() - 0.5) * spreadRad;
323
+ }
324
+ // Random velocity within range
325
+ const velocity = randomInRange(direction.velocity[0], direction.velocity[1]);
326
+ const newParticle = createParticle(x, y, angle, velocity, particle.colors, particle.shapes, particle.size, particle.opacity, particle.lifespan, physics.rotationSpeed, {
327
+ images: particle.images,
328
+ tiltRange: particle.tilt,
329
+ spinSpeedRange: particle.spinSpeed,
330
+ depth3D: particle.depth3D,
331
+ });
332
+ this.particles.push(newParticle);
333
+ }
334
+ }
335
+ /**
336
+ * Spawns particles for continuous mode
337
+ */
338
+ spawnParticles(count) {
339
+ if (!this.canvasContext)
340
+ return;
341
+ const { particle, physics } = this.config;
342
+ const { width, height } = this.canvasContext;
343
+ for (let i = 0; i < count; i++) {
344
+ // Get spawn position
345
+ let spawnPoint;
346
+ if (this.spawnArea) {
347
+ spawnPoint = getSpawnPoint(this.spawnArea, width, height);
348
+ }
349
+ else if (this.mode === 'snow' || this.mode === 'rain') {
350
+ // Spawn from top of screen
351
+ spawnPoint = { x: randomInRange(0, width), y: -20 };
352
+ }
353
+ else {
354
+ // Default to top center area
355
+ spawnPoint = { x: randomInRange(0, width), y: randomInRange(-20, 0) };
356
+ }
357
+ // Calculate angle based on mode
358
+ let angle;
359
+ let velocity;
360
+ if (this.mode === 'snow') {
361
+ angle = degToRad(randomInRange(-20, 20) - 90); // Mostly down with some drift
362
+ velocity = randomInRange(0.5, 2);
363
+ }
364
+ else if (this.mode === 'rain') {
365
+ angle = degToRad(-90); // Straight down
366
+ velocity = randomInRange(8, 15);
367
+ }
368
+ else {
369
+ angle = secureRandom() * MATH_CONSTANTS.TWO_PI;
370
+ velocity = randomInRange(2, 6);
371
+ }
372
+ const newParticle = createParticle(spawnPoint.x, spawnPoint.y, angle, velocity, particle.colors, particle.shapes, particle.size, particle.opacity, particle.lifespan, physics.rotationSpeed, {
373
+ images: particle.images,
374
+ tiltRange: particle.tilt,
375
+ spinSpeedRange: particle.spinSpeed,
376
+ depth3D: particle.depth3D,
377
+ });
378
+ this.particles.push(newParticle);
379
+ }
380
+ }
381
+ /**
382
+ * Launches a firework
383
+ */
384
+ launchFirework() {
385
+ if (!this.canvasContext)
386
+ return;
387
+ const { width, height } = this.canvasContext;
388
+ const { launchHeight, burstCount, spread, secondaryExplosions, rocketColors, burstColors, trailLength } = this.fireworkConfig;
389
+ // Launch point at bottom of screen
390
+ const launchX = this.spawnArea
391
+ ? getSpawnPoint(this.spawnArea, width, height).x
392
+ : randomInRange(width * 0.2, width * 0.8);
393
+ // Target explosion point
394
+ const targetY = height * (1 - launchHeight);
395
+ const targetX = launchX + randomInRange(-50, 50);
396
+ // Create rocket particle (goes up, then triggers explosion)
397
+ const rocketParticle = createParticle(launchX, height, degToRad(-90 + randomInRange(-10, 10)), randomInRange(15, 25), rocketColors, ['circle'], [3, 5], [1, 1], 2000, 0);
398
+ // Mark as firework rocket with target
399
+ rocketParticle.data = {
400
+ isRocket: true,
401
+ targetY,
402
+ targetX,
403
+ burstCount,
404
+ spread,
405
+ burstColors,
406
+ secondaryExplosions,
407
+ trailLength,
408
+ };
409
+ this.particles.push(rocketParticle);
410
+ }
411
+ /**
412
+ * Triggers a firework explosion at a position
413
+ */
414
+ explodeFirework(x, y, data) {
415
+ const { burstCount = 80, spread = 360, burstColors, secondaryExplosions } = data;
416
+ const colors = burstColors ?? this.config.particle.colors;
417
+ // Create burst particles
418
+ const spreadRad = degToRad(spread);
419
+ for (let i = 0; i < burstCount; i++) {
420
+ const angle = (i / burstCount) * spreadRad - spreadRad / 2 + degToRad(-90);
421
+ const velocity = randomInRange(4, 12);
422
+ const burstParticle = createParticle(x, y, angle, velocity, colors, this.config.particle.shapes, [2, 6], [0.8, 1], 1500, this.config.physics.rotationSpeed);
423
+ // Mark for secondary explosion
424
+ if (secondaryExplosions && secureRandom() < 0.1) {
425
+ burstParticle.data = { willExplode: true, burstColors: colors };
426
+ }
427
+ this.particles.push(burstParticle);
428
+ }
429
+ }
430
+ /**
431
+ * Stops the animation immediately
432
+ */
433
+ stop() {
434
+ if (!this.isRunning)
435
+ return;
436
+ if (this.animationFrameId !== null) {
437
+ cancelAnimationFrame(this.animationFrameId);
438
+ this.animationFrameId = null;
439
+ }
440
+ this.cleanup();
441
+ this.deferred.resolve();
442
+ }
443
+ /**
444
+ * Pauses the animation
445
+ */
446
+ pause() {
447
+ this.isPaused = true;
448
+ }
449
+ /**
450
+ * Resumes a paused animation
451
+ */
452
+ resume() {
453
+ this.isPaused = false;
454
+ }
455
+ /**
456
+ * Called when animation completes naturally
457
+ */
458
+ complete() {
459
+ this.config.onComplete?.();
460
+ this.cleanup();
461
+ this.deferred.resolve();
462
+ }
463
+ /**
464
+ * Cleans up resources
465
+ */
466
+ cleanup() {
467
+ this.isRunning = false;
468
+ this.isPaused = false;
469
+ this.particles = [];
470
+ this.canvasContext = null;
471
+ activeAnimations--;
472
+ if (this.config.autoCleanup) {
473
+ cleanupCanvas();
474
+ }
475
+ }
476
+ /**
477
+ * Adds more particles to the animation
478
+ */
479
+ addParticles(count) {
480
+ if (!this.isRunning || !this.canvasContext)
481
+ return;
482
+ if (this.mode === 'continuous' || this.mode === 'snow' || this.mode === 'rain') {
483
+ this.spawnParticles(count);
484
+ }
485
+ else {
486
+ // For burst mode, create from original origin
487
+ const { particle, direction, physics } = this.config;
488
+ const { x, y } = this.origin;
489
+ for (let i = 0; i < count; i++) {
490
+ let angle;
491
+ if (direction.direction === 'radial') {
492
+ angle = secureRandom() * MATH_CONSTANTS.TWO_PI;
493
+ }
494
+ else {
495
+ const baseAngle = getDirectionAngle(direction.direction, direction.angle);
496
+ const spreadRad = degToRad(direction.spread);
497
+ angle = baseAngle + (secureRandom() - 0.5) * spreadRad;
498
+ }
499
+ const velocity = randomInRange(direction.velocity[0], direction.velocity[1]);
500
+ const newParticle = createParticle(x, y, angle, velocity, particle.colors, particle.shapes, particle.size, particle.opacity, particle.lifespan, physics.rotationSpeed);
501
+ this.particles.push(newParticle);
502
+ }
503
+ }
504
+ }
505
+ /**
506
+ * Clears all particles
507
+ */
508
+ clear() {
509
+ this.particles = [];
510
+ }
511
+ /**
512
+ * Gets current particle count
513
+ */
514
+ getParticleCount() {
515
+ return countActiveParticles(this.particles);
516
+ }
517
+ /**
518
+ * Gets the current state
519
+ */
520
+ getState() {
521
+ if (!this.isRunning)
522
+ return 'stopped';
523
+ if (this.isPaused)
524
+ return 'paused';
525
+ return 'running';
526
+ }
527
+ /**
528
+ * Creates the explosion handle for external control
529
+ */
530
+ createHandle() {
531
+ return {
532
+ stop: () => this.stop(),
533
+ pause: () => this.pause(),
534
+ resume: () => this.resume(),
535
+ promise: this.deferred.promise,
536
+ addParticles: (count) => this.addParticles(count),
537
+ clear: () => this.clear(),
538
+ getParticleCount: () => this.getParticleCount(),
539
+ getState: () => this.getState(),
540
+ };
541
+ }
542
+ }
543
+ /**
544
+ * Creates and starts a confetti explosion
545
+ */
546
+ export function createConfettiExplosion(origin, options) {
547
+ const engine = new ConfettiEngine(origin, options);
548
+ return engine.start();
549
+ }
550
+ /**
551
+ * Fires confetti from an element's center
552
+ */
553
+ export function fireFromElement(element, options) {
554
+ if (!element || !isBrowser()) {
555
+ return null;
556
+ }
557
+ const rect = element.getBoundingClientRect();
558
+ const origin = {
559
+ x: rect.left + rect.width / 2,
560
+ y: rect.top + rect.height / 2,
561
+ };
562
+ return createConfettiExplosion(origin, options);
563
+ }
564
+ /**
565
+ * Gets the current number of active animations
566
+ */
567
+ export function getActiveAnimationCount() {
568
+ return activeAnimations;
569
+ }
570
+ /**
571
+ * Forces cleanup of all resources
572
+ */
573
+ export function forceCleanup() {
574
+ if (globalCanvas) {
575
+ globalCanvas.remove();
576
+ globalCanvas = null;
577
+ globalCtx = null;
578
+ }
579
+ activeAnimations = 0;
580
+ }
581
+ //# sourceMappingURL=confetti-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confetti-engine.js","sourceRoot":"","sources":["../../src/confetti-engine.ts"],"names":[],"mappings":"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"}