react-confetti-burst 1.0.1 → 1.0.3

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 (82) hide show
  1. package/README.md +6 -0
  2. package/dist/cjs/index.js +17 -180
  3. package/dist/esm/index.js +17 -146
  4. package/dist/types/index.d.ts +988 -25
  5. package/package.json +17 -7
  6. package/dist/cjs/components.d.ts +0 -219
  7. package/dist/cjs/components.d.ts.map +0 -1
  8. package/dist/cjs/components.js +0 -341
  9. package/dist/cjs/components.js.map +0 -1
  10. package/dist/cjs/confetti-engine.d.ts +0 -122
  11. package/dist/cjs/confetti-engine.d.ts.map +0 -1
  12. package/dist/cjs/confetti-engine.js +0 -589
  13. package/dist/cjs/confetti-engine.js.map +0 -1
  14. package/dist/cjs/confetti.d.ts +0 -50
  15. package/dist/cjs/confetti.d.ts.map +0 -1
  16. package/dist/cjs/confetti.js +0 -446
  17. package/dist/cjs/confetti.js.map +0 -1
  18. package/dist/cjs/constants.d.ts +0 -147
  19. package/dist/cjs/constants.d.ts.map +0 -1
  20. package/dist/cjs/constants.js +0 -609
  21. package/dist/cjs/constants.js.map +0 -1
  22. package/dist/cjs/hooks.d.ts +0 -94
  23. package/dist/cjs/hooks.d.ts.map +0 -1
  24. package/dist/cjs/hooks.js +0 -225
  25. package/dist/cjs/hooks.js.map +0 -1
  26. package/dist/cjs/index.d.ts +0 -34
  27. package/dist/cjs/index.d.ts.map +0 -1
  28. package/dist/cjs/index.js.map +0 -1
  29. package/dist/cjs/particle.d.ts +0 -50
  30. package/dist/cjs/particle.d.ts.map +0 -1
  31. package/dist/cjs/particle.js +0 -475
  32. package/dist/cjs/particle.js.map +0 -1
  33. package/dist/cjs/shapes.d.ts +0 -190
  34. package/dist/cjs/shapes.d.ts.map +0 -1
  35. package/dist/cjs/shapes.js +0 -272
  36. package/dist/cjs/shapes.js.map +0 -1
  37. package/dist/cjs/types.d.ts +0 -720
  38. package/dist/cjs/types.d.ts.map +0 -1
  39. package/dist/cjs/types.js +0 -25
  40. package/dist/cjs/types.js.map +0 -1
  41. package/dist/cjs/utils.d.ts +0 -90
  42. package/dist/cjs/utils.d.ts.map +0 -1
  43. package/dist/cjs/utils.js +0 -330
  44. package/dist/cjs/utils.js.map +0 -1
  45. package/dist/esm/components.js +0 -334
  46. package/dist/esm/components.js.map +0 -1
  47. package/dist/esm/confetti-engine.js +0 -581
  48. package/dist/esm/confetti-engine.js.map +0 -1
  49. package/dist/esm/confetti.js +0 -443
  50. package/dist/esm/confetti.js.map +0 -1
  51. package/dist/esm/constants.js +0 -605
  52. package/dist/esm/constants.js.map +0 -1
  53. package/dist/esm/hooks.js +0 -218
  54. package/dist/esm/hooks.js.map +0 -1
  55. package/dist/esm/index.js.map +0 -1
  56. package/dist/esm/particle.js +0 -465
  57. package/dist/esm/particle.js.map +0 -1
  58. package/dist/esm/shapes.js +0 -265
  59. package/dist/esm/shapes.js.map +0 -1
  60. package/dist/esm/types.js +0 -24
  61. package/dist/esm/types.js.map +0 -1
  62. package/dist/esm/utils.js +0 -309
  63. package/dist/esm/utils.js.map +0 -1
  64. package/dist/types/components.d.ts +0 -219
  65. package/dist/types/components.d.ts.map +0 -1
  66. package/dist/types/confetti-engine.d.ts +0 -122
  67. package/dist/types/confetti-engine.d.ts.map +0 -1
  68. package/dist/types/confetti.d.ts +0 -50
  69. package/dist/types/confetti.d.ts.map +0 -1
  70. package/dist/types/constants.d.ts +0 -147
  71. package/dist/types/constants.d.ts.map +0 -1
  72. package/dist/types/hooks.d.ts +0 -94
  73. package/dist/types/hooks.d.ts.map +0 -1
  74. package/dist/types/index.d.ts.map +0 -1
  75. package/dist/types/particle.d.ts +0 -50
  76. package/dist/types/particle.d.ts.map +0 -1
  77. package/dist/types/shapes.d.ts +0 -190
  78. package/dist/types/shapes.d.ts.map +0 -1
  79. package/dist/types/types.d.ts +0 -720
  80. package/dist/types/types.d.ts.map +0 -1
  81. package/dist/types/utils.d.ts +0 -90
  82. package/dist/types/utils.d.ts.map +0 -1
package/README.md CHANGED
@@ -296,6 +296,12 @@ async function handleSubmit(data: FormData) {
296
296
  - Safari 11+
297
297
  - Edge 79+
298
298
 
299
+ ## Support
300
+
301
+ If you find this package helpful, consider buying me a coffee! ☕
302
+
303
+ <p><a href="https://www.buymeacoffee.com/akalankaih4"> <img align="left" src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" height="50" width="210" alt="akalankaih4" /></a></p><br><br>
304
+
299
305
  ## License
300
306
 
301
307
  MIT © [ihakalanka](https://github.com/ihakalanka)
package/dist/cjs/index.js CHANGED
@@ -1,180 +1,17 @@
1
- "use strict";
2
- /**
3
- * react-confetti-burst
4
- *
5
- * A high-performance, zero-dependency React confetti component
6
- * with directional bursts using the native Canvas API.
7
- * Exceeds the feature set of both react-confetti and canvas-confetti.
8
- *
9
- * @packageDocumentation
10
- */
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.default = exports.confetti = exports.isBrowser = exports.mergeConfig = exports.getElementCenter = exports.getDirectionAngle = exports.radToDeg = exports.degToRad = exports.lerp = exports.clamp = exports.randomFromArray = exports.randomInt = exports.randomInRange = exports.rgbaToString = exports.parseColor = exports.ConfettiButton = exports.ConfettiBurst = exports.useConfetti = exports.forceCleanup = exports.getActiveAnimationCount = exports.fireFromElement = exports.createConfettiExplosion = exports.ConfettiEngine = exports.COLOR_PALETTES = exports.EASING_FUNCTIONS = exports.DIRECTION_ANGLES = exports.DEFAULT_CONFIG = exports.DEFAULT_PARTICLE = exports.DEFAULT_DIRECTION = exports.DEFAULT_PHYSICS = exports.DEFAULT_COLORS = void 0;
13
- // Basic Constants
14
- var constants_1 = require("./constants");
15
- Object.defineProperty(exports, "DEFAULT_COLORS", { enumerable: true, get: function () { return constants_1.DEFAULT_COLORS; } });
16
- Object.defineProperty(exports, "DEFAULT_PHYSICS", { enumerable: true, get: function () { return constants_1.DEFAULT_PHYSICS; } });
17
- Object.defineProperty(exports, "DEFAULT_DIRECTION", { enumerable: true, get: function () { return constants_1.DEFAULT_DIRECTION; } });
18
- Object.defineProperty(exports, "DEFAULT_PARTICLE", { enumerable: true, get: function () { return constants_1.DEFAULT_PARTICLE; } });
19
- Object.defineProperty(exports, "DEFAULT_CONFIG", { enumerable: true, get: function () { return constants_1.DEFAULT_CONFIG; } });
20
- Object.defineProperty(exports, "DIRECTION_ANGLES", { enumerable: true, get: function () { return constants_1.DIRECTION_ANGLES; } });
21
- Object.defineProperty(exports, "EASING_FUNCTIONS", { enumerable: true, get: function () { return constants_1.EASING_FUNCTIONS; } });
22
- Object.defineProperty(exports, "COLOR_PALETTES", { enumerable: true, get: function () { return constants_1.COLOR_PALETTES; } });
23
- // Core engine (Basic)
24
- var confetti_engine_1 = require("./confetti-engine");
25
- Object.defineProperty(exports, "ConfettiEngine", { enumerable: true, get: function () { return confetti_engine_1.ConfettiEngine; } });
26
- Object.defineProperty(exports, "createConfettiExplosion", { enumerable: true, get: function () { return confetti_engine_1.createConfettiExplosion; } });
27
- Object.defineProperty(exports, "fireFromElement", { enumerable: true, get: function () { return confetti_engine_1.fireFromElement; } });
28
- Object.defineProperty(exports, "getActiveAnimationCount", { enumerable: true, get: function () { return confetti_engine_1.getActiveAnimationCount; } });
29
- Object.defineProperty(exports, "forceCleanup", { enumerable: true, get: function () { return confetti_engine_1.forceCleanup; } });
30
- // Basic React hooks
31
- var hooks_1 = require("./hooks");
32
- Object.defineProperty(exports, "useConfetti", { enumerable: true, get: function () { return hooks_1.useConfetti; } });
33
- // Basic React components
34
- var components_1 = require("./components");
35
- Object.defineProperty(exports, "ConfettiBurst", { enumerable: true, get: function () { return components_1.ConfettiBurst; } });
36
- Object.defineProperty(exports, "ConfettiButton", { enumerable: true, get: function () { return components_1.ConfettiButton; } });
37
- // Basic Utility functions
38
- var utils_1 = require("./utils");
39
- Object.defineProperty(exports, "parseColor", { enumerable: true, get: function () { return utils_1.parseColor; } });
40
- Object.defineProperty(exports, "rgbaToString", { enumerable: true, get: function () { return utils_1.rgbaToString; } });
41
- Object.defineProperty(exports, "randomInRange", { enumerable: true, get: function () { return utils_1.randomInRange; } });
42
- Object.defineProperty(exports, "randomInt", { enumerable: true, get: function () { return utils_1.randomInt; } });
43
- Object.defineProperty(exports, "randomFromArray", { enumerable: true, get: function () { return utils_1.randomFromArray; } });
44
- Object.defineProperty(exports, "clamp", { enumerable: true, get: function () { return utils_1.clamp; } });
45
- Object.defineProperty(exports, "lerp", { enumerable: true, get: function () { return utils_1.lerp; } });
46
- Object.defineProperty(exports, "degToRad", { enumerable: true, get: function () { return utils_1.degToRad; } });
47
- Object.defineProperty(exports, "radToDeg", { enumerable: true, get: function () { return utils_1.radToDeg; } });
48
- Object.defineProperty(exports, "getDirectionAngle", { enumerable: true, get: function () { return utils_1.getDirectionAngle; } });
49
- Object.defineProperty(exports, "getElementCenter", { enumerable: true, get: function () { return utils_1.getElementCenter; } });
50
- Object.defineProperty(exports, "mergeConfig", { enumerable: true, get: function () { return utils_1.mergeConfig; } });
51
- Object.defineProperty(exports, "isBrowser", { enumerable: true, get: function () { return utils_1.isBrowser; } });
52
- // Basic Functional API
53
- var confetti_1 = require("./confetti");
54
- Object.defineProperty(exports, "confetti", { enumerable: true, get: function () { return confetti_1.confetti; } });
55
- Object.defineProperty(exports, "default", { enumerable: true, get: function () { return confetti_1.confetti; } });
56
- // ============================================================================
57
- // v1.1.0 - REACT HOOKS (Uncomment when releasing)
58
- // ============================================================================
59
- /*
60
- export {
61
- useConfettiTrigger,
62
- useConfettiOnCondition,
63
- useConfettiSequence,
64
- useConfettiCenter,
65
- } from './hooks';
66
-
67
- export {
68
- ConfettiTrigger,
69
- } from './components';
70
-
71
- export type { ConfettiTriggerHandle } from './components';
72
- */
73
- // ============================================================================
74
- // v1.2.0 - BUILT-IN PRESETS (Uncomment when releasing)
75
- // ============================================================================
76
- /*
77
- export type {
78
- PresetName,
79
- PresetConfig,
80
- } from './types';
81
-
82
- export {
83
- PRESETS,
84
- getPreset,
85
- } from './constants';
86
- */
87
- // ============================================================================
88
- // v1.3.0 - CANVAS-CONFETTI API (Uncomment when releasing)
89
- // ============================================================================
90
- /*
91
- export type {
92
- NormalizedOrigin,
93
- AccessibilityConfig,
94
- CanvasConfettiOptions,
95
- ConfettiCreateOptions,
96
- CanvasConfig,
97
- ConfettiProps,
98
- } from './types';
99
-
100
- export {
101
- DEFAULT_CANVAS,
102
- DEFAULT_ACCESSIBILITY,
103
- } from './constants';
104
-
105
- export {
106
- ConfettiOnMount,
107
- ConfettiCannon,
108
- Confetti,
109
- } from './components';
110
-
111
- export type { ConfettiComponentProps } from './components';
112
- */
113
- // ============================================================================
114
- // v1.4.0 - CUSTOM SHAPES (Uncomment when releasing)
115
- // ============================================================================
116
- /*
117
- export type {
118
- DrawContext,
119
- CustomDrawFunction,
120
- PathShape,
121
- TextShape,
122
- CustomShape,
123
- ShapeInput,
124
- PathBounds,
125
- } from './types';
126
-
127
- export {
128
- EMOJI_SETS,
129
- } from './constants';
130
-
131
- export {
132
- shapeFromPath,
133
- shapeFromText,
134
- shapeFromImage,
135
- shapesFromEmoji,
136
- pathShapes,
137
- emojiShapes,
138
- } from './shapes';
139
-
140
- export type {
141
- ShapeFromPathOptions,
142
- ShapeFromTextOptions,
143
- } from './shapes';
144
- */
145
- // ============================================================================
146
- // v1.5.0 - ADVANCED EFFECTS (Uncomment when releasing)
147
- // ============================================================================
148
- /*
149
- export type {
150
- EffectMode,
151
- SpawnArea,
152
- TrailConfig,
153
- GlowConfig,
154
- ImageParticle,
155
- ContinuousConfig,
156
- FireworkConfig,
157
- } from './types';
158
-
159
- export {
160
- DEFAULT_TRAIL,
161
- DEFAULT_GLOW,
162
- DEFAULT_CONTINUOUS,
163
- DEFAULT_FIREWORK,
164
- } from './constants';
165
- */
166
- // ============================================================================
167
- // v1.6.0 - PARTICLE UTILITIES (Uncomment when releasing)
168
- // ============================================================================
169
- /*
170
- export {
171
- createParticle,
172
- updateParticle,
173
- renderParticle,
174
- areAllParticlesInactive,
175
- countActiveParticles,
176
- loadImage,
177
- clearImageCache,
178
- } from './particle';
179
- */
180
- //# sourceMappingURL=index.js.map
1
+ "use strict";var de=Object.defineProperty;var je=Object.getOwnPropertyDescriptor;var Ve=Object.getOwnPropertyNames;var Xe=Object.prototype.hasOwnProperty;var Ze=(e,n)=>{for(var t in n)de(e,t,{get:n[t],enumerable:!0})},Je=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of Ve(n))!Xe.call(e,o)&&o!==t&&de(e,o,{get:()=>n[o],enumerable:!(r=je(n,o))||r.enumerable});return e};var Ke=e=>Je(de({},"__esModule",{value:!0}),e);var Tt={};Ze(Tt,{ConfettiBurst:()=>We,ConfettiButton:()=>Ce,ConfettiEngine:()=>re,DEFAULT_COLORS:()=>se,DEFAULT_CONFIG:()=>B,DEFAULT_DIRECTION:()=>K,DEFAULT_PARTICLE:()=>Q,DEFAULT_PHYSICS:()=>J,DIRECTION_ANGLES:()=>le,EASING_FUNCTIONS:()=>Te,clamp:()=>_,confetti:()=>R,createConfettiExplosion:()=>oe,default:()=>R,degToRad:()=>I,fireFromElement:()=>ue,forceCleanup:()=>ze,getActiveAnimationCount:()=>Ne,getDirectionAngle:()=>te,getElementCenter:()=>Se,isBrowser:()=>z,lerp:()=>xe,mergeConfig:()=>ce,parseColor:()=>$,radToDeg:()=>Ie,randomFromArray:()=>G,randomInRange:()=>h,randomInt:()=>Re,rgbaToString:()=>Y,useConfetti:()=>W});module.exports=Ke(Tt);var se=["#FF6B6B","#4ECDC4","#FFE66D","#95E1D3","#F38181","#AA96DA","#FCBAD3","#A8D8EA","#FF9A8B","#88D8B0"],J={gravity:.25,drag:.035,friction:.985,rotationSpeed:1.5,wind:0,windVariation:.02,tumble:!0,decay:.99,bounce:0,floor:null,wobble:!0,wobbleSpeed:1.5,flutter:!0,flutterSpeed:2.5,flutterIntensity:.4,airResistance:.03,swayAmplitude:15,swayFrequency:2},K={direction:"up",spread:55,velocity:[25,50],velocityDecay:.92},Q={colors:se,shapes:["square","rectangle","circle"],size:[6,14],opacity:[.85,1],lifespan:4e3,fadeOut:!0,scaleDown:!1,spin:!0,spinSpeed:[-15,15],tilt:[-30,30],depth3D:.6,aspectRatio:[.5,1.5],shimmer:!0},N={enabled:!1,length:10,fade:.5,width:.5},me={enabled:!1,blur:10,color:null,intensity:.5},Pe={recycle:!1,numberOfPieces:200,spawnRate:50,run:!0,tweenDuration:5e3},Fe={secondaryExplosions:!0,burstCount:80,burstDelay:500,spread:360,launchHeight:.6,rocketColors:["#ffd700","#ff6b35","#ff0000"],burstColors:["#ff0000","#00ff00","#0000ff","#ffff00","#ff00ff","#00ffff"],trailLength:10,riseDuration:1e3,showRocket:!0},pe={width:null,height:null,autoResize:!0,resizeDebounce:100,frameRate:null,pixelRatio:null,useWorker:!1,useOffscreen:!1};var B={particleCount:50,particle:Q,physics:J,direction:K,mode:"burst",easing:"easeOut",zIndex:9999,autoCleanup:!0,scalar:1,drift:0,flat:!1},le={up:90,down:270,left:180,right:0},P={DEG_TO_RAD:Math.PI/180,RAD_TO_DEG:180/Math.PI,TWO_PI:Math.PI*2,HALF_PI:Math.PI/2},Te={linear:e=>e,easeIn:e=>e*e*e,easeOut:e=>1-Math.pow(1-e,3),easeInOut:e=>e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2,bounce:e=>e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375,elastic:e=>{let n=2*Math.PI/3;return e===0?0:e===1?1:Math.pow(2,-10*e)*Math.sin((e*10-.75)*n)+1},back:e=>1+2.70158*Math.pow(e-1,3)+1.70158*Math.pow(e-1,2),circ:e=>Math.sqrt(1-Math.pow(e-1,2)),expo:e=>e===1?1:1-Math.pow(2,-10*e)};var ee={r:0,g:0,b:0,a:0},q={MAX_PARTICLES:500,FRAME_BUDGET:16.67,MIN_OPACITY:.01,MIN_SIZE:.5,MAX_DPR:2},Ee=100,he=5,Ae=.5,O={rainbow:se,pride:["#E40303","#FF8C00","#FFED00","#008026","#24408E","#732982"],christmas:["#C41E3A","#165B33","#FFD700","#FFFFFF","#BB2528"],halloween:["#FF6600","#000000","#8B008B","#00FF00","#FFD700"],pastel:["#FFB3BA","#FFDFBA","#FFFFBA","#BAFFC9","#BAE1FF"],neon:["#FF00FF","#00FFFF","#FF0080","#80FF00","#FF8000"],gold:["#FFD700","#DAA520","#B8860B","#FFC125","#FFDF00"],silver:["#C0C0C0","#A8A8A8","#D3D3D3","#DCDCDC","#E8E8E8"],hearts:["#FF69B4","#FF1493","#FF007F","#DC143C","#FFB6C1"],ocean:["#006994","#00CED1","#20B2AA","#48D1CC","#87CEEB"]},Z={celebration:["🎉","🎊","🥳","✨","🎈"],hearts:["❤️","💕","💖","💗","💓","💘"],stars:["⭐","🌟","✨","💫","⚡"],money:["💰","💵","💸","🤑","💎"],christmas:["🎄","🎅","🎁","❄️","⭐"],halloween:["🎃","👻","🦇","🕷️","💀"],birthday:["🎂","🎁","🎈","🎉","🥳"],food:["🍕","🍔","🍟","🌭","🍿"]},xt={default:{name:"default",description:"Default balanced confetti burst with realistic paper physics",options:{particleCount:60,particle:{shapes:["square","rectangle","circle"],size:[6,14],depth3D:.6,tilt:[-30,30]},physics:{gravity:.25,drag:.035,wobble:!0,wobbleSpeed:1.5}}},celebration:{name:"celebration",description:"Big celebration with lots of colorful confetti and realistic movement",options:{particleCount:120,particle:{colors:[...O.rainbow],shapes:["square","rectangle","circle","star"],size:[8,16],lifespan:5e3,depth3D:.7,tilt:[-35,35]},direction:{direction:"radial",spread:360,velocity:[30,55]},physics:{gravity:.22,drag:.04,wobble:!0,wobbleSpeed:2,windVariation:.03}}},firework:{name:"firework",description:"Firework-style explosion with secondary bursts",options:{mode:"firework",particleCount:80,particle:{colors:[...O.neon],shapes:["circle","star"],size:[4,8],trail:{enabled:!0,length:8,fade:.6},glow:{enabled:!0,blur:8,intensity:.7}},firework:{secondaryExplosions:!0,burstCount:80}}},snow:{name:"snow",description:"Gentle falling snowflakes",options:{mode:"snow",particleCount:150,particle:{colors:["#FFFFFF","#F0F8FF","#E0FFFF"],shapes:["circle"],size:[3,8],lifespan:8e3,opacity:[.6,1]},physics:{gravity:.05,wind:.3,windVariation:.2,wobble:!0,wobbleSpeed:2},continuous:{recycle:!0,numberOfPieces:150}}},rain:{name:"rain",description:"Rainfall effect",options:{mode:"rain",particleCount:200,particle:{colors:["#6CA0DC","#4A90D9","#2E7BB9"],shapes:["line"],size:[2,4],lifespan:2e3},physics:{gravity:.8,wind:.1},direction:{direction:"down",spread:10,velocity:[30,50]},continuous:{recycle:!0}}},sparkle:{name:"sparkle",description:"Sparkling stars with glow effect",options:{particleCount:40,particle:{colors:[...O.gold],shapes:["star"],size:[6,12],glow:{enabled:!0,blur:15,intensity:.8}},physics:{gravity:.1}}},confetti:{name:"confetti",description:"Classic confetti falling with realistic paper flutter",options:{mode:"continuous",particleCount:200,particle:{shapes:["square","rectangle"],size:[6,14],depth3D:.8,tilt:[-40,40],lifespan:6e3},physics:{gravity:.18,drag:.045,wind:.08,windVariation:.04,wobble:!0,wobbleSpeed:2},continuous:{recycle:!0,numberOfPieces:200},spawnArea:{x:0,y:0,width:typeof window<"u"?window.innerWidth:1920,height:0}}},emoji:{name:"emoji",description:"Emoji celebration",options:{particleCount:30,particle:{images:Z.celebration.map(e=>({src:e,isEmoji:!0,scale:1.5})),size:[20,30],lifespan:4e3},direction:{direction:"up",spread:60,velocity:[20,35]}}},hearts:{name:"hearts",description:"Floating hearts",options:{particleCount:50,particle:{colors:[...O.hearts],shapes:["heart"],size:[12,20],lifespan:5e3},physics:{gravity:-.1,wobble:!0},direction:{direction:"up",spread:90,velocity:[10,20]}}},stars:{name:"stars",description:"Shooting stars",options:{particleCount:60,particle:{colors:[...O.gold,"#FFFFFF"],shapes:["star"],size:[8,16],trail:{enabled:!0,length:12,fade:.4}},direction:{direction:"radial",spread:360,velocity:[30,60]}}},money:{name:"money",description:"Money rain",options:{particleCount:40,particle:{colors:["#85BB65","#228B22","#32CD32"],images:Z.money.map(e=>({src:e,isEmoji:!0})),size:[20,30],lifespan:4e3},physics:{gravity:.15,wobble:!0}}},pride:{name:"pride",description:"Pride rainbow celebration",options:{particleCount:100,particle:{colors:[...O.pride],shapes:["square","rectangle","heart"],size:[10,16]},direction:{direction:"radial",spread:360,velocity:[25,45]}}},christmas:{name:"christmas",description:"Christmas celebration",options:{particleCount:80,particle:{colors:[...O.christmas],shapes:["star","circle"],size:[8,14],images:Z.christmas.map(e=>({src:e,isEmoji:!0}))}}},halloween:{name:"halloween",description:"Spooky Halloween",options:{particleCount:60,particle:{colors:[...O.halloween],shapes:["circle","star"],images:Z.halloween.map(e=>({src:e,isEmoji:!0})),size:[15,25]},physics:{gravity:.2,wobble:!0}}},newYear:{name:"newYear",description:"New Year celebration with fireworks",options:{mode:"firework",particleCount:100,particle:{colors:[...O.gold,...O.silver],shapes:["star","circle"],size:[6,12],trail:{enabled:!0,length:10},glow:{enabled:!0,blur:12}},firework:{secondaryExplosions:!0,burstCount:100}}},birthday:{name:"birthday",description:"Birthday party celebration",options:{particleCount:80,particle:{colors:[...O.pastel,...O.rainbow],shapes:["star","circle","heart"],images:Z.birthday.map(e=>({src:e,isEmoji:!0})),size:[12,20],lifespan:5e3},direction:{direction:"up",spread:80,velocity:[25,45]}}}};function b(){if(typeof crypto<"u"&&crypto.getRandomValues){let e=new Uint32Array(1);return crypto.getRandomValues(e),e[0]/4294967296}return Math.random()}function h(e,n){return e+b()*(n-e)}function Re(e,n){return Math.floor(h(e,n+1))}function G(e){if(e.length===0)throw new Error("Cannot pick from empty array");return e[Math.floor(b()*e.length)]}function _(e,n,t){return Math.min(Math.max(e,n),t)}function xe(e,n,t){return e+(n-e)*_(t,0,1)}function I(e){return e*P.DEG_TO_RAD}function Ie(e){return e*P.RAD_TO_DEG}function $(e){if(typeof e=="object"&&"r"in e)return{r:_(Math.round(e.r),0,255),g:_(Math.round(e.g),0,255),b:_(Math.round(e.b),0,255),a:_(e.a,0,1)};if(typeof e=="object"&&"type"in e)return $(e.colors[0]);let n=e.trim().toLowerCase();return n.startsWith("#")?Qe(n):n.startsWith("rgb")?et(n):tt(n)}function Qe(e){let n=e.slice(1),t,r,o,i=1;switch(n.length){case 3:t=parseInt(n[0]+n[0],16),r=parseInt(n[1]+n[1],16),o=parseInt(n[2]+n[2],16);break;case 4:t=parseInt(n[0]+n[0],16),r=parseInt(n[1]+n[1],16),o=parseInt(n[2]+n[2],16),i=parseInt(n[3]+n[3],16)/255;break;case 6:t=parseInt(n.slice(0,2),16),r=parseInt(n.slice(2,4),16),o=parseInt(n.slice(4,6),16);break;case 8:t=parseInt(n.slice(0,2),16),r=parseInt(n.slice(2,4),16),o=parseInt(n.slice(4,6),16),i=parseInt(n.slice(6,8),16)/255;break;default:return ee}return isNaN(t)||isNaN(r)||isNaN(o)||isNaN(i)?ee:{r:t,g:r,b:o,a:i}}function et(e){let n=e.match(/rgba?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([\d.]+))?\s*\)/);return n?{r:_(parseInt(n[1],10),0,255),g:_(parseInt(n[2],10),0,255),b:_(parseInt(n[3],10),0,255),a:n[4]!==void 0?_(parseFloat(n[4]),0,1):1}:ee}function tt(e){let n={red:{r:255,g:0,b:0,a:1},green:{r:0,g:128,b:0,a:1},blue:{r:0,g:0,b:255,a:1},white:{r:255,g:255,b:255,a:1},black:{r:0,g:0,b:0,a:1},yellow:{r:255,g:255,b:0,a:1},cyan:{r:0,g:255,b:255,a:1},magenta:{r:255,g:0,b:255,a:1},orange:{r:255,g:165,b:0,a:1},purple:{r:128,g:0,b:128,a:1},pink:{r:255,g:192,b:203,a:1}};if(n[e])return n[e];if(typeof document<"u")try{let t=document.createElement("canvas");t.width=1,t.height=1;let r=t.getContext("2d");if(r){r.fillStyle=e,r.fillRect(0,0,1,1);let o=r.getImageData(0,0,1,1).data;return{r:o[0],g:o[1],b:o[2],a:o[3]/255}}}catch{}return ee}function Y(e){return`rgba(${e.r}, ${e.g}, ${e.b}, ${e.a})`}function te(e,n){if(e==="custom"&&n!==void 0)return I(n);if(e==="radial")return b()*P.TWO_PI;let t=le[e];return I(t??90)}function Se(e){let n=e.getBoundingClientRect();return{x:n.left+n.width/2,y:n.top+n.height/2}}function ce(e){if(!e)return B;let n={...Q,...e.particle},t={...J,...e.physics},r={...K,...e.direction};return{particleCount:e.particleCount??B.particleCount,particle:n,physics:t,direction:r,mode:e.mode??B.mode,spawnArea:e.spawnArea?{type:"rect",x:0,y:0,...e.spawnArea}:void 0,continuous:e.continuous,firework:e.firework,canvas:e.canvas,easing:e.easing??B.easing,zIndex:e.zIndex??B.zIndex,autoCleanup:e.autoCleanup??B.autoCleanup,scalar:e.scalar??B.scalar,drift:e.drift??B.drift,flat:e.flat??B.flat,onStart:e.onStart,onComplete:e.onComplete,onFrame:e.onFrame,onParticleCreate:e.onParticleCreate,onParticleDeath:e.onParticleDeath}}function z(){return typeof window<"u"&&typeof document<"u"}function De(e=2){return z()?Math.min(window.devicePixelRatio||1,e):1}function Me(){let e,n;return{promise:new Promise((r,o)=>{e=r,n=o}),resolve:e,reject:n}}var nt=0;function j(e,n,t,r,o,i,l,a,c,s,u){let d=h(l[0],l[1]),p=h(a[0],a[1]),m=G(o),S=typeof m=="string"?$(m):"type"in m?$(m.colors[0]):m,A=1+(b()-.5)*.3,F=Math.cos(t)*r*A,C=-Math.sin(t)*r*A,v;u?.images&&u.images.length>0&&(v=G(u.images));let f=u?.tiltRange??[-30,30],T=u?.spinSpeedRange??[-15,15],x=u?.aspectRatioRange??[.5,1.5],E=h(x[0],x[1]);return{id:nt++,x:e,y:n,vx:F,vy:C,size:d,originalSize:d,rotation:b()*P.TWO_PI,rotationSpeed:(b()-.5)*.3*s,color:S,shape:v?"custom":G(i),opacity:p,originalOpacity:p,life:c,maxLife:c,active:!0,image:v,imageElement:null,trail:[],wobblePhase:b()*P.TWO_PI,wobbleSpeed:h(.8,2.5),tilt:I(h(f[0],f[1])),tiltSpeed:h(T[0],T[1])*.015,depth:u?.depth3D??.6,hasExploded:!1,data:{},flutterPhase:b()*P.TWO_PI,flutterSpeed:h(1.5,3.5),swayPhase:b()*P.TWO_PI,aspectRatio:E,angularVelocity:(b()-.5)*.4,scaleX:1,scaleY:1,shimmerPhase:b()*P.TWO_PI,currentDrag:h(.02,.05)}}function Oe(e,n,t,r,o,i,l){if(!e.active)return;let a=n*.05988;if(i?.enabled??N.enabled){let w=e.trail;w.unshift({x:e.x,y:e.y,opacity:e.opacity,size:e.size});let M=i?.length??N.length;w.length>M&&w.pop()}let c=e.vx,s=e.vy,u=e.tilt,d=c*c+s*s,p=u-u*u*u*.166667,m=1+p*.15;if(s+=t.gravity*m*a,(t.flutter??!0)&&d>1){let w=t.flutterSpeed??2.5,M=t.flutterIntensity??.4;e.flutterPhase+=w*.05*a;let k=e.flutterPhase,ae=(k-k*k*k*.166667)*M*a,$e=1-u*u*.5;if(c+=ae*$e,(p<0?-p:p)>.7){let Ye=ae<0?-ae:ae;s-=Ye*.3}}let A=t.swayAmplitude??15,F=t.swayFrequency??2;e.swayPhase+=F*.03*a;let C=e.swayPhase,v=(C-C*C*C*.166667)*A*.01*a;c+=v;let f=t.windVariation,T=t.wind+f*(Math.random()-.5);c+=T*a;let x=t.airResistance??.03,E=1-u*u*.5,U=E<0?-E:E,ie=t.drag+U*x,L=d>0?Math.sqrt(d):0,X=Math.max(.9,1-ie*L*.01)*t.friction*t.decay;if(c*=X,s*=X,e.x+=c*a,e.y+=s*a,e.vx=c,e.vy=s,t.tumble&&(e.angularVelocity=(e.angularVelocity+c*.001*a)*.98,e.rotation+=(e.rotationSpeed+e.angularVelocity)*a),e.tiltSpeed=(e.tiltSpeed+(Math.random()-.5)*.002*a)*.995,e.tilt=(e.tilt+e.tiltSpeed*a)%P.TWO_PI,t.wobble){let w=e.wobblePhase+t.wobbleSpeed*.1*a;e.wobblePhase=w;let M=1-w*w*.5,k=w-w*w*w*.166667;e.scaleX=.3+.7*(M<0?-M:M),e.scaleY=.3+.7*(k<0?-k:k)}if(e.shimmerPhase+=.1*a,t.floor!==null&&t.bounce>0&&l){let w=t.floor??l,M=e.size*.5;e.y+M>=w&&(e.y=w-M,e.vy=-e.vy*t.bounce,e.vx*=.85,e.rotationSpeed+=(Math.random()-.5)*.1)}e.life-=n;let ye=1-e.life/e.maxLife;if(r){let w=ye,M=w*w*(3-2*w);e.opacity=e.originalOpacity*(1-M*.9)}o&&(e.size=e.originalSize*(1-ye*.5)),(e.life<=0||e.opacity<q.MIN_OPACITY||e.size<q.MIN_SIZE)&&(e.active=!1)}function Be(e,n,t){if(!n.active)return;let{x:r,y:o,size:i,rotation:l,color:a,shape:c,opacity:s,tilt:u,aspectRatio:d,scaleX:p,scaleY:m,shimmerPhase:S}=n;if(s<.02)return;let A=t?.trailConfig,F=t?.glowConfig;(A?.enabled??N.enabled)&&n.trail.length>0&&rt(e,n,A??N),e.save();let C=F?.enabled??me.enabled;C&&(e.shadowBlur=F?.blur??me.blur,e.shadowColor=F?.color??Y(a)),e.translate(r,o),e.rotate(l+u),n.depth>0&&e.scale(p,m);let f=1+(S-Math.floor(S))*.3-.15,T=.7+.3*(p*m<0?-(p*m):p*m),x=s*a.a*T*(C?F?.intensity??1:1);if(x<.02){e.restore();return}e.globalAlpha=x>1?1:x;let E=a.r*f,U=a.g*f,ie=a.b*f;if(e.fillStyle=`rgb(${E>255?255:E},${U>255?255:U},${ie>255?255:ie})`,n.image&&n.image.isEmoji)dt(e,n.image.src,i*(n.image.scale??1));else if(n.imageElement)mt(e,n.imageElement,i*(n.image?.scale??1));else if(c==="custom"&&t?.customDraw){let L={ctx:e,particle:n,progress:1-n.life/n.maxLife,elapsed:t.elapsed??0};t.customDraw(L)}else{let L=d??1;switch(c){case"square":case"rectangle":let fe=i*(c==="rectangle"?Math.max(1.5,L*1.5):Math.sqrt(L)),X=i/(c==="rectangle"?Math.max(1.5,L):Math.sqrt(L));e.fillRect(-fe*.5,-X*.5,fe,X);break;case"circle":e.beginPath(),e.arc(0,0,i*.5,0,P.TWO_PI),e.fill();break;case"triangle":ot(e,i);break;case"star":it(e,i);break;case"line":at(e,i);break;case"heart":st(e,i);break;case"diamond":lt(e,i);break;case"hexagon":ct(e,i);break;case"spiral":ut(e,i,a);break;case"ribbon":ft(e,i);break;default:e.fillRect(-i*.5,-i*.5,i,i)}}e.restore()}function rt(e,n,t){let r=t.fade??N.fade,o=t.width??N.width;e.save(),e.lineCap="round",e.lineJoin="round";for(let i=0;i<n.trail.length-1;i++){let l=n.trail[i],a=n.trail[i+1],c=l.opacity*Math.pow(r,i),s=l.size*o*Math.pow(r,i);c>.01&&s>.1&&(e.beginPath(),e.strokeStyle=Y({...n.color,a:c}),e.lineWidth=s,e.moveTo(l.x,l.y),e.lineTo(a.x,a.y),e.stroke())}e.restore()}function ot(e,n){let t=n/2;e.beginPath(),e.moveTo(0,-t),e.lineTo(t,t),e.lineTo(-t,t),e.closePath(),e.fill()}function it(e,n){let t=n/2,r=t*Ae,o=Math.PI/he;e.beginPath();for(let i=0;i<he*2;i++){let l=i%2===0?t:r,a=i*o-P.HALF_PI,c=Math.cos(a)*l,s=Math.sin(a)*l;i===0?e.moveTo(c,s):e.lineTo(c,s)}e.closePath(),e.fill()}function at(e,n){let t=n*2,r=n/4;e.fillRect(-t/2,-r/2,t,r)}function st(e,n){let t=n/30;e.save(),e.scale(t,t),e.beginPath(),e.moveTo(0,-8),e.bezierCurveTo(-10,-18,-25,-8,-15,5),e.lineTo(0,18),e.lineTo(15,5),e.bezierCurveTo(25,-8,10,-18,0,-8),e.closePath(),e.fill(),e.restore()}function lt(e,n){let t=n/2;e.beginPath(),e.moveTo(0,-t),e.lineTo(t*.6,0),e.lineTo(0,t),e.lineTo(-t*.6,0),e.closePath(),e.fill()}function ct(e,n){let t=n/2;e.beginPath();for(let r=0;r<6;r++){let o=Math.PI/3*r-Math.PI/6,i=Math.cos(o)*t,l=Math.sin(o)*t;r===0?e.moveTo(i,l):e.lineTo(i,l)}e.closePath(),e.fill()}function ut(e,n,t){e.strokeStyle=Y(t),e.lineWidth=n/8,e.lineCap="round",e.beginPath();for(let r=0;r<22;r++){let o=.35*r,i=(.2+1.5*o)*(n/20),l=i*Math.cos(o),a=i*Math.sin(o);r===0?e.moveTo(l,a):e.lineTo(l,a)}e.stroke()}function ft(e,n){let t=n,r=n/3,o=n/4;e.beginPath(),e.moveTo(-t/2,0),e.quadraticCurveTo(-t/4,-o,0,0),e.quadraticCurveTo(t/4,o,t/2,0),e.lineTo(t/2,r),e.quadraticCurveTo(t/4,r+o,0,r),e.quadraticCurveTo(-t/4,r-o,-t/2,r),e.closePath(),e.fill()}function dt(e,n,t){e.font=`${t}px serif`,e.textAlign="center",e.textBaseline="middle",e.fillText(n,0,0)}function mt(e,n,t){let r=t/2;e.drawImage(n,-r,-r,t,t)}function _e(e){return e.filter(n=>n.active).length}var g=null,H=null,V=0,ne=null,Le=[],pt=500;function ke(e){Le.length<pt&&(e.active=!1,e.trail.length=0,Le.push(e))}var ge=360,ht=new Float32Array(ge),gt=new Float32Array(ge);for(let e=0;e<ge;e++){let n=e*Math.PI/180;ht[e]=Math.sin(n),gt[e]=Math.cos(n)}function Ct(e,n){if(!z())throw new Error("ConfettiEngine requires a browser environment");let t={...pe,...n},r=t.pixelRatio??De(q.MAX_DPR);if(!g){if(g=document.createElement("canvas"),g.style.cssText=`
2
+ position: fixed;
3
+ top: 0;
4
+ left: 0;
5
+ width: 100%;
6
+ height: 100%;
7
+ pointer-events: none;
8
+ z-index: ${e};
9
+ `,H=g.getContext("2d",{alpha:!0,desynchronized:!0}),!H)throw new Error("Failed to get canvas 2D context");document.body.appendChild(g),t.autoResize&&(ne=()=>{if(g&&H){let l=t.width??window.innerWidth,a=t.height??window.innerHeight;g.width=l*r,g.height=a*r,g.style.width=`${l}px`,g.style.height=`${a}px`,H.scale(r,r)}},window.addEventListener("resize",ne))}g.style.zIndex=String(e);let o=t.width??window.innerWidth,i=t.height??window.innerHeight;return(g.width!==o*r||g.height!==i*r)&&(g.width=o*r,g.height=i*r,g.style.width=`${o}px`,g.style.height=`${i}px`,H.scale(r,r)),{canvas:g,ctx:H,width:o,height:i,dpr:r}}function bt(){g&&V===0&&setTimeout(()=>{V===0&&g&&(ne&&(window.removeEventListener("resize",ne),ne=null),g.remove(),g=null,H=null)},Ee)}function He(e,n,t){let{type:r,x:o,y:i,w:l,h:a}=e;switch(r){case"point":return{x:o,y:i};case"rect":return{x:h(o,o+(l??0)),y:h(i,i+(a??0))};case"line":let c=b();return{x:o+c*(l??0),y:i+c*(a??0)};case"circle":let s=b()*P.TWO_PI,u=Math.sqrt(b())*(l??50);return{x:o+Math.cos(s)*u,y:i+Math.sin(s)*u};default:return{x:o,y:i}}}var re=class{constructor(n,t){this.particles=[];this.canvasContext=null;this.animationFrameId=null;this.lastFrameTime=0;this.lastSpawnTime=0;this.isRunning=!1;this.isPaused=!1;this.deferred=Me();this.frameInterval=0;this.lastRenderTime=0;this.animate=()=>{if(!this.isRunning||!this.canvasContext)return;if((this.mode==="continuous"||this.mode==="snow"||this.mode==="rain")&&!this.continuousConfig.run){this.animationFrameId=requestAnimationFrame(this.animate),this.lastFrameTime=performance.now();return}if(this.isPaused){this.animationFrameId=requestAnimationFrame(this.animate),this.lastFrameTime=performance.now();return}let n=performance.now(),t=n-this.lastFrameTime;if(this.lastFrameTime=n,this.frameInterval>0){if(n-this.lastRenderTime<this.frameInterval){this.animationFrameId=requestAnimationFrame(this.animate);return}this.lastRenderTime=n}let{ctx:r,width:o,height:i,dpr:l}=this.canvasContext,{physics:a,particle:c}=this.config;r.setTransform(1,0,0,1,0,0),r.clearRect(0,0,o*l,i*l),r.scale(l,l);let s=this.particles,u=s.length,d=0,p=!0,m=100,S=-m,A=o+m,F=-m,C=i+m;for(let v=0;v<u;v++){let f=s[v];if(f.active){if(Oe(f,t,a,c.fadeOut,c.scaleDown),f.data?.isRocket&&f.y<=f.data.targetY){f.active=!1,this.explodeFirework(f.x,f.y,f.data);continue}if(f.data?.willExplode&&!f.data.hasExploded&&f.vx*f.vx+f.vy*f.vy<1&&(f.data.hasExploded=!0,this.explodeFirework(f.x,f.y,{burstCount:15,spread:360,burstColors:f.data.burstColors})),f.x<S||f.x>A||f.y<F||f.y>C){(f.y>C||f.x<S-200||f.x>A+200)&&(f.active=!1);continue}Be(r,f,{customDraw:this.drawShape}),d++,p=!1}}if(this.mode==="continuous"||this.mode==="snow"||this.mode==="rain"){let v=n-this.lastSpawnTime,f=1e3/(this.continuousConfig.spawnRate??10);if(v>=f){if(this.continuousConfig.recycle){let x=this.continuousConfig.numberOfPieces-d;if(x>0){for(let E=u-1;E>=0&&x>0;E--)s[E].active||(ke(s[E]),s.splice(E,1));this.spawnParticles(Math.min(x,5))}}else d<this.continuousConfig.numberOfPieces&&this.spawnParticles(Math.min(3,this.continuousConfig.numberOfPieces-d));this.lastSpawnTime=n}}if(this.mode==="firework"){let v=0;for(let T=0;T<u;T++)s[T].active&&s[T].data?.isRocket&&v++;let f=n-this.lastSpawnTime;v===0&&f>=(this.fireworkConfig.burstDelay??500)&&(this.launchFirework(),this.lastSpawnTime=n)}if((this.mode==="burst"||this.mode==="cannon"||this.mode==="explosion")&&p){this.complete();return}this.animationFrameId=requestAnimationFrame(this.animate)};this.origin=n,this.config=ce(t),this.mode=t?.mode??"burst",this.spawnArea=t?.spawnArea,this.continuousConfig={...Pe,...t?.continuous},this.fireworkConfig={...Fe,...t?.firework},this.canvasConfig={...pe,...t?.canvas},this.drawShape=t?.particle?.drawShape,this.canvasConfig.frameRate&&(this.frameInterval=1e3/this.canvasConfig.frameRate)}start(){if(this.isRunning)return this.createHandle();if(!z())return this.deferred.resolve(),this.createHandle();if(this.isRunning=!0,V++,this.canvasContext=Ct(this.config.zIndex,this.canvasConfig),this.mode==="continuous"||this.mode==="snow"||this.mode==="rain"){let n=Math.min(this.continuousConfig.numberOfPieces,Math.floor(this.continuousConfig.numberOfPieces*.5));this.spawnParticles(n)}else this.mode==="firework"?this.launchFirework():this.createParticles();return this.config.onStart?.(),this.lastFrameTime=performance.now(),this.lastSpawnTime=performance.now(),this.lastRenderTime=performance.now(),this.animate(),this.createHandle()}createParticles(){let{particleCount:n,particle:t,direction:r,physics:o}=this.config,{x:i,y:l}=this.origin,a=Math.min(n,q.MAX_PARTICLES);for(let c=0;c<a;c++){let s;if(r.direction==="radial")s=b()*P.TWO_PI;else{let p=te(r.direction,r.angle),m=I(r.spread);s=p+(b()-.5)*m}let u=h(r.velocity[0],r.velocity[1]),d=j(i,l,s,u,t.colors,t.shapes,t.size,t.opacity,t.lifespan,o.rotationSpeed,{images:t.images,tiltRange:t.tilt,spinSpeedRange:t.spinSpeed,depth3D:t.depth3D});this.particles.push(d)}}spawnParticles(n){if(!this.canvasContext)return;let{particle:t,physics:r}=this.config,{width:o,height:i}=this.canvasContext;for(let l=0;l<n;l++){let a;this.spawnArea?a=He(this.spawnArea,o,i):this.mode==="snow"||this.mode==="rain"?a={x:h(0,o),y:-20}:a={x:h(0,o),y:h(-20,0)};let c,s;this.mode==="snow"?(c=I(h(-20,20)-90),s=h(.5,2)):this.mode==="rain"?(c=I(-90),s=h(8,15)):(c=b()*P.TWO_PI,s=h(2,6));let u=j(a.x,a.y,c,s,t.colors,t.shapes,t.size,t.opacity,t.lifespan,r.rotationSpeed,{images:t.images,tiltRange:t.tilt,spinSpeedRange:t.spinSpeed,depth3D:t.depth3D});this.particles.push(u)}}launchFirework(){if(!this.canvasContext)return;let{width:n,height:t}=this.canvasContext,{launchHeight:r,burstCount:o,spread:i,secondaryExplosions:l,rocketColors:a,burstColors:c,trailLength:s}=this.fireworkConfig,u=this.spawnArea?He(this.spawnArea,n,t).x:h(n*.2,n*.8),d=t*(1-r),p=u+h(-50,50),m=j(u,t,I(-90+h(-10,10)),h(15,25),a,["circle"],[3,5],[1,1],2e3,0);m.data={isRocket:!0,targetY:d,targetX:p,burstCount:o,spread:i,burstColors:c,secondaryExplosions:l,trailLength:s},this.particles.push(m)}explodeFirework(n,t,r){let{burstCount:o=80,spread:i=360,burstColors:l,secondaryExplosions:a}=r,c=l??this.config.particle.colors,s=I(i);for(let u=0;u<o;u++){let d=u/o*s-s/2+I(-90),p=h(4,12),m=j(n,t,d,p,c,this.config.particle.shapes,[2,6],[.8,1],1500,this.config.physics.rotationSpeed);a&&b()<.1&&(m.data={willExplode:!0,burstColors:c}),this.particles.push(m)}}stop(){this.isRunning&&(this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.cleanup(),this.deferred.resolve())}pause(){this.isPaused=!0}resume(){this.isPaused=!1}complete(){this.config.onComplete?.(),this.cleanup(),this.deferred.resolve()}cleanup(){this.isRunning=!1,this.isPaused=!1;let n=this.particles;for(let t=n.length-1;t>=0;t--)ke(n[t]);this.particles=[],this.canvasContext=null,V--,this.config.autoCleanup&&bt()}addParticles(n){if(!(!this.isRunning||!this.canvasContext))if(this.mode==="continuous"||this.mode==="snow"||this.mode==="rain")this.spawnParticles(n);else{let{particle:t,direction:r,physics:o}=this.config,{x:i,y:l}=this.origin;for(let a=0;a<n;a++){let c;if(r.direction==="radial")c=b()*P.TWO_PI;else{let d=te(r.direction,r.angle),p=I(r.spread);c=d+(b()-.5)*p}let s=h(r.velocity[0],r.velocity[1]),u=j(i,l,c,s,t.colors,t.shapes,t.size,t.opacity,t.lifespan,o.rotationSpeed);this.particles.push(u)}}}clear(){this.particles=[]}getParticleCount(){return _e(this.particles)}getState(){return this.isRunning?this.isPaused?"paused":"running":"stopped"}createHandle(){return{stop:()=>this.stop(),pause:()=>this.pause(),resume:()=>this.resume(),promise:this.deferred.promise,addParticles:n=>this.addParticles(n),clear:()=>this.clear(),getParticleCount:()=>this.getParticleCount(),getState:()=>this.getState()}}};function oe(e,n){return new re(e,n).start()}function ue(e,n){if(!e||!z())return null;let t=e.getBoundingClientRect(),r={x:t.left+t.width/2,y:t.top+t.height/2};return oe(r,n)}function Ne(){return V}function ze(){g&&(g.remove(),g=null,H=null),V=0}var D=require("react");function W(){let[e,n]=(0,D.useState)(!1),t=(0,D.useRef)(new Set);(0,D.useEffect)(()=>()=>{t.current.forEach(s=>s.stop()),t.current.clear()},[]);let r=(0,D.useCallback)((s,u)=>{let d=oe(s,u);return t.current.add(d),n(!0),d.promise.then(()=>{t.current.delete(d),t.current.size===0&&n(!1)}),d},[]),o=(0,D.useCallback)((s,u)=>{if(!s)return null;let d=ue(s,u);return d&&(t.current.add(d),n(!0),d.promise.then(()=>{t.current.delete(d),t.current.size===0&&n(!1)})),d},[]),i=(0,D.useCallback)(()=>{t.current.forEach(s=>s.stop()),t.current.clear(),n(!1)},[]),l=(0,D.useCallback)(()=>{t.current.forEach(s=>s.pause())},[]),a=(0,D.useCallback)(()=>{t.current.forEach(s=>s.resume())},[]),c=(0,D.useCallback)(()=>Array.from(t.current),[]);return{fire:r,fireFromElement:o,isActive:e,stopAll:i,pauseAll:l,resumeAll:a,getActiveHandles:c}}var y=require("react");var be=require("react/jsx-runtime");function We({active:e,origin:n,triggerRef:t,options:r,onComplete:o}){let{fire:i,fireFromElement:l}=W(),a=(0,y.useRef)(!1);return(0,y.useEffect)(()=>{if(e&&!a.current){a.current=!0;let c=null;t?.current?c=l(t.current,r):n&&(c=i(n,r)),c&&c.promise.then(()=>{o?.()})}},[e,n,t,r,i,l,o]),(0,y.useEffect)(()=>{e||(a.current=!1)},[e]),null}var wt=(0,y.forwardRef)(({options:e,style:n},t)=>{let r=(0,y.useRef)(null),{fireFromElement:o}=W();return(0,y.useImperativeHandle)(t,()=>({fire:()=>o(r.current,e)})),(0,be.jsx)("div",{ref:r,style:{position:"absolute",width:1,height:1,pointerEvents:"none",...n},"aria-hidden":"true"})});wt.displayName="ConfettiTrigger";var Ce=(0,y.forwardRef)(({children:e,confettiOptions:n,fireOnClick:t=!0,onClick:r,...o},i)=>{let l=(0,y.useRef)(null),{fireFromElement:a}=W(),c=(0,y.useCallback)(u=>{l.current=u,typeof i=="function"?i(u):i&&(i.current=u)},[i]),s=(0,y.useCallback)(u=>{t&&l.current&&a(l.current,n),r?.(u)},[t,a,n,r]);return(0,be.jsx)("button",{ref:c,onClick:s,...o,children:e})});Ce.displayName="ConfettiButton";function vt({width:e,height:n,numberOfPieces:t=200,confettiSource:r,initialVelocityX:o,initialVelocityY:i,recycle:l=!0,run:a=!0,gravity:c=.3,wind:s=0,opacity:u=1,drawShape:d,tweenDuration:p=100,colors:m,onConfettiComplete:S,frameRate:A}){let{fire:F}=W(),C=(0,y.useRef)(null),v=(0,y.useRef)(!1);return(0,y.useEffect)(()=>{if(!a){C.current&&(C.current.stop(),C.current=null),v.current=!1;return}if(v.current)return;v.current=!0;let f=r?{type:"rect",x:r.x,y:r.y,w:r.w??window.innerWidth,h:r.h??10}:{type:"rect",x:0,y:0,w:e??window.innerWidth,h:10},T=typeof o=="number"?[o*.5,o*1.5]:o?[o.min,o.max]:[4,10],x=typeof i=="number"?[i*.5,i*1.5]:i?[i.min,i.max]:[10,30],E=(e??window.innerWidth)/2,U=0;return C.current=F({x:E,y:U},{particleCount:t,particle:{colors:m??["#ff0000","#00ff00","#0000ff","#ffff00","#ff00ff","#00ffff"],opacity:[u*.8,u],shapes:["square","circle","rectangle"],drawShape:d},physics:{gravity:c*10,wind:s*5,windVariation:T[1]-T[0]},direction:{velocity:x},mode:"continuous",spawnArea:f,continuous:{recycle:l,numberOfPieces:t,spawnRate:30,run:a,tweenDuration:p},canvas:{width:e,height:n,frameRate:A,autoResize:!e&&!n},onComplete:S}),()=>{C.current&&(C.current.stop(),C.current=null)}},[a,e,n,t,r,o,i,l,c,s,u,d,p,m,S,A,F]),(0,y.useEffect)(()=>{C.current},[l]),null}vt.displayName="Confetti";var we=new Map;function Ue(){return typeof window>"u"?!1:window.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1}function qe(e,n){let{angle:t=90,spread:r=45,startVelocity:o=45,decay:i=.9,gravity:l=1,drift:a=0,flat:c=!1,ticks:s=200,origin:u={x:.5,y:.5},colors:d=["#ff0000","#00ff00","#0000ff","#ffff00","#ff00ff","#00ffff"],shapes:p=["square","circle"],scalar:m=1}=n,S=(t-90)*(Math.PI/180),A=r*(Math.PI/180),F=S+(Math.random()-.5)*A,C=o*(.5+Math.random()*.5);return{x:u.x*e.width,y:u.y*e.height,vx:Math.cos(F)*C,vy:Math.sin(F)*C,tiltAngle:Math.random()*Math.PI*2,tiltSpeed:(Math.random()-.5)*.1,color:d[Math.floor(Math.random()*d.length)],shape:p[Math.floor(Math.random()*p.length)]??"circle",scalar:m,gravity:l*.5,drift:a,decay:i,flat:c,tick:0,totalTicks:s,wobble:Math.random()*10,wobbleSpeed:.1+Math.random()*.1}}function yt(e){return e.tick++,e.tick>=e.totalTicks?!1:(e.vy+=e.gravity,e.vx+=e.drift,e.vx*=e.decay,e.vy*=e.decay,e.x+=e.vx,e.y+=e.vy,e.wobble+=e.wobbleSpeed,e.flat||(e.tiltAngle+=e.tiltSpeed),!0)}function Pt(e,n){let r=1-n.tick/n.totalTicks,o=10*n.scalar;if(e.save(),e.translate(n.x,n.y),!n.flat){e.rotate(n.tiltAngle);let i=Math.sin(n.wobble)*.5;e.scale(1+i*.2,1)}e.globalAlpha=r,e.fillStyle=n.color,n.shape==="circle"?(e.beginPath(),e.arc(0,0,o/2,0,Math.PI*2),e.fill()):n.shape==="square"?e.fillRect(-o/2,-o/2,o,o):e.fillRect(-o/2,-o/3,o,o*.6),e.restore()}function ve(e){if(e.isDestroyed)return;let{canvas:n,ctx:t,particles:r}=e;t.clearRect(0,0,n.width,n.height);for(let o=r.length-1;o>=0;o--){let i=r[o];yt(i)?Pt(t,i):r.splice(o,1)}r.length>0?e.animationId=requestAnimationFrame(()=>ve(e)):(e.animationId=null,e.resolve?.(),e.resolve=null,e.promise=null)}function Ft(){let e=document.getElementById("confetti-canvas");return e||(e=document.createElement("canvas"),e.id="confetti-canvas",e.style.cssText=`
10
+ position: fixed;
11
+ top: 0;
12
+ left: 0;
13
+ width: 100%;
14
+ height: 100%;
15
+ pointer-events: none;
16
+ z-index: 2147483647;
17
+ `,document.body.appendChild(e)),e.width=window.innerWidth,e.height=window.innerHeight,e}function Ge(e,n={}){let t=we.get(e);if(!t){let r=e==="default"?Ft():e,o=r.getContext("2d");if(!o)return null;t={canvas:r,ctx:o,animationId:null,particles:[],options:n,promise:null,resolve:null,isDestroyed:!1},we.set(e,t),n.resize&&e==="default"&&window.addEventListener("resize",()=>{t.isDestroyed||(t.canvas.width=window.innerWidth,t.canvas.height=window.innerHeight)})}return t}function R(e={}){if(e.disableForReducedMotion&&Ue())return Promise.resolve();let n=Ge("default");if(!n)return null;let{particleCount:t=50}=e;for(let r=0;r<t;r++)n.particles.push(qe(n.canvas,e));return n.animationId||(n.promise=new Promise(r=>{n.resolve=r}),n.animationId=requestAnimationFrame(()=>ve(n))),n.promise}R.create=function(e,n={}){let t=Ge(e,n),r=(o={})=>{if(!t||t.isDestroyed)return null;if((o.disableForReducedMotion??n.disableForReducedMotion)&&Ue())return Promise.resolve();let{particleCount:l=50}=o;for(let a=0;a<l;a++)t.particles.push(qe(t.canvas,o));return t.animationId||(t.promise=new Promise(a=>{t.resolve=a}),t.animationId=requestAnimationFrame(()=>ve(t))),t.promise};return r.reset=()=>{t&&(t.animationId&&(cancelAnimationFrame(t.animationId),t.animationId=null),t.particles=[],t.ctx.clearRect(0,0,t.canvas.width,t.canvas.height),t.resolve?.(),t.resolve=null,t.promise=null)},r};R.reset=function(){let e=we.get("default");e&&(e.animationId&&(cancelAnimationFrame(e.animationId),e.animationId=null),e.particles=[],e.ctx.clearRect(0,0,e.canvas.width,e.canvas.height),e.resolve?.(),e.resolve=null,e.promise=null)};R.fireworks=async function(e={}){let n={particleCount:30,spread:55,...e};await Promise.all([R({...n,angle:60,origin:{x:0,y:.65}}),R({...n,angle:120,origin:{x:1,y:.65}})])};R.schoolPride=function(e={}){let n=Date.now()+3e3,t=e.colors??["#bb0000","#ffffff"];function r(){R({particleCount:2,angle:60,spread:55,origin:{x:0,y:.6},colors:t,...e}),R({particleCount:2,angle:120,spread:55,origin:{x:1,y:.6},colors:t,...e}),Date.now()<n&&requestAnimationFrame(r)}r()};R.snow=function(e={}){let{duration:n=5e3,...t}=e,r=Date.now()+n;function o(){R({particleCount:1,startVelocity:0,ticks:300,gravity:.3,origin:{x:Math.random(),y:0},colors:["#ffffff","#f0f8ff","#e6f3ff"],shapes:["circle"],scalar:.8+Math.random()*.4,drift:Math.random()-.5,...t}),Date.now()<r&&requestAnimationFrame(o)}o()};R.burst=function(e,n={}){return R({particleCount:80,spread:360,startVelocity:30,decay:.92,scalar:1.2,origin:e,...n})};
package/dist/esm/index.js CHANGED
@@ -1,146 +1,17 @@
1
- /**
2
- * react-confetti-burst
3
- *
4
- * A high-performance, zero-dependency React confetti component
5
- * with directional bursts using the native Canvas API.
6
- * Exceeds the feature set of both react-confetti and canvas-confetti.
7
- *
8
- * @packageDocumentation
9
- */
10
- // Basic Constants
11
- export { DEFAULT_COLORS, DEFAULT_PHYSICS, DEFAULT_DIRECTION, DEFAULT_PARTICLE, DEFAULT_CONFIG, DIRECTION_ANGLES, EASING_FUNCTIONS, COLOR_PALETTES, } from './constants';
12
- // Core engine (Basic)
13
- export { ConfettiEngine, createConfettiExplosion, fireFromElement, getActiveAnimationCount, forceCleanup, } from './confetti-engine';
14
- // Basic React hooks
15
- export { useConfetti, } from './hooks';
16
- // Basic React components
17
- export { ConfettiBurst, ConfettiButton, } from './components';
18
- // Basic Utility functions
19
- export { parseColor, rgbaToString, randomInRange, randomInt, randomFromArray, clamp, lerp, degToRad, radToDeg, getDirectionAngle, getElementCenter, mergeConfig, isBrowser, } from './utils';
20
- // Basic Functional API
21
- export { confetti, confetti as default } from './confetti';
22
- // ============================================================================
23
- // v1.1.0 - REACT HOOKS (Uncomment when releasing)
24
- // ============================================================================
25
- /*
26
- export {
27
- useConfettiTrigger,
28
- useConfettiOnCondition,
29
- useConfettiSequence,
30
- useConfettiCenter,
31
- } from './hooks';
32
-
33
- export {
34
- ConfettiTrigger,
35
- } from './components';
36
-
37
- export type { ConfettiTriggerHandle } from './components';
38
- */
39
- // ============================================================================
40
- // v1.2.0 - BUILT-IN PRESETS (Uncomment when releasing)
41
- // ============================================================================
42
- /*
43
- export type {
44
- PresetName,
45
- PresetConfig,
46
- } from './types';
47
-
48
- export {
49
- PRESETS,
50
- getPreset,
51
- } from './constants';
52
- */
53
- // ============================================================================
54
- // v1.3.0 - CANVAS-CONFETTI API (Uncomment when releasing)
55
- // ============================================================================
56
- /*
57
- export type {
58
- NormalizedOrigin,
59
- AccessibilityConfig,
60
- CanvasConfettiOptions,
61
- ConfettiCreateOptions,
62
- CanvasConfig,
63
- ConfettiProps,
64
- } from './types';
65
-
66
- export {
67
- DEFAULT_CANVAS,
68
- DEFAULT_ACCESSIBILITY,
69
- } from './constants';
70
-
71
- export {
72
- ConfettiOnMount,
73
- ConfettiCannon,
74
- Confetti,
75
- } from './components';
76
-
77
- export type { ConfettiComponentProps } from './components';
78
- */
79
- // ============================================================================
80
- // v1.4.0 - CUSTOM SHAPES (Uncomment when releasing)
81
- // ============================================================================
82
- /*
83
- export type {
84
- DrawContext,
85
- CustomDrawFunction,
86
- PathShape,
87
- TextShape,
88
- CustomShape,
89
- ShapeInput,
90
- PathBounds,
91
- } from './types';
92
-
93
- export {
94
- EMOJI_SETS,
95
- } from './constants';
96
-
97
- export {
98
- shapeFromPath,
99
- shapeFromText,
100
- shapeFromImage,
101
- shapesFromEmoji,
102
- pathShapes,
103
- emojiShapes,
104
- } from './shapes';
105
-
106
- export type {
107
- ShapeFromPathOptions,
108
- ShapeFromTextOptions,
109
- } from './shapes';
110
- */
111
- // ============================================================================
112
- // v1.5.0 - ADVANCED EFFECTS (Uncomment when releasing)
113
- // ============================================================================
114
- /*
115
- export type {
116
- EffectMode,
117
- SpawnArea,
118
- TrailConfig,
119
- GlowConfig,
120
- ImageParticle,
121
- ContinuousConfig,
122
- FireworkConfig,
123
- } from './types';
124
-
125
- export {
126
- DEFAULT_TRAIL,
127
- DEFAULT_GLOW,
128
- DEFAULT_CONTINUOUS,
129
- DEFAULT_FIREWORK,
130
- } from './constants';
131
- */
132
- // ============================================================================
133
- // v1.6.0 - PARTICLE UTILITIES (Uncomment when releasing)
134
- // ============================================================================
135
- /*
136
- export {
137
- createParticle,
138
- updateParticle,
139
- renderParticle,
140
- areAllParticlesInactive,
141
- countActiveParticles,
142
- loadImage,
143
- clearImageCache,
144
- } from './particle';
145
- */
146
- //# sourceMappingURL=index.js.map
1
+ var ce=["#FF6B6B","#4ECDC4","#FFE66D","#95E1D3","#F38181","#AA96DA","#FCBAD3","#A8D8EA","#FF9A8B","#88D8B0"],te={gravity:.25,drag:.035,friction:.985,rotationSpeed:1.5,wind:0,windVariation:.02,tumble:!0,decay:.99,bounce:0,floor:null,wobble:!0,wobbleSpeed:1.5,flutter:!0,flutterSpeed:2.5,flutterIntensity:.4,airResistance:.03,swayAmplitude:15,swayFrequency:2},ne={direction:"up",spread:55,velocity:[25,50],velocityDecay:.92},re={colors:ce,shapes:["square","rectangle","circle"],size:[6,14],opacity:[.85,1],lifespan:4e3,fadeOut:!0,scaleDown:!1,spin:!0,spinSpeed:[-15,15],tilt:[-30,30],depth3D:.6,aspectRatio:[.5,1.5],shimmer:!0},k={enabled:!1,length:10,fade:.5,width:.5},ue={enabled:!1,blur:10,color:null,intensity:.5},ve={recycle:!1,numberOfPieces:200,spawnRate:50,run:!0,tweenDuration:5e3},ye={secondaryExplosions:!0,burstCount:80,burstDelay:500,spread:360,launchHeight:.6,rocketColors:["#ffd700","#ff6b35","#ff0000"],burstColors:["#ff0000","#00ff00","#0000ff","#ffff00","#ff00ff","#00ffff"],trailLength:10,riseDuration:1e3,showRocket:!0},fe={width:null,height:null,autoResize:!0,resizeDebounce:100,frameRate:null,pixelRatio:null,useWorker:!1,useOffscreen:!1};var M={particleCount:50,particle:re,physics:te,direction:ne,mode:"burst",easing:"easeOut",zIndex:9999,autoCleanup:!0,scalar:1,drift:0,flat:!1},de={up:90,down:270,left:180,right:0},y={DEG_TO_RAD:Math.PI/180,RAD_TO_DEG:180/Math.PI,TWO_PI:Math.PI*2,HALF_PI:Math.PI/2},We={linear:e=>e,easeIn:e=>e*e*e,easeOut:e=>1-Math.pow(1-e,3),easeInOut:e=>e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2,bounce:e=>e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375,elastic:e=>{let n=2*Math.PI/3;return e===0?0:e===1?1:Math.pow(2,-10*e)*Math.sin((e*10-.75)*n)+1},back:e=>1+2.70158*Math.pow(e-1,3)+1.70158*Math.pow(e-1,2),circ:e=>Math.sqrt(1-Math.pow(e-1,2)),expo:e=>e===1?1:1-Math.pow(2,-10*e)};var j={r:0,g:0,b:0,a:0},N={MAX_PARTICLES:500,FRAME_BUDGET:16.67,MIN_OPACITY:.01,MIN_SIZE:.5,MAX_DPR:2},Pe=100,me=5,Fe=.5,D={rainbow:ce,pride:["#E40303","#FF8C00","#FFED00","#008026","#24408E","#732982"],christmas:["#C41E3A","#165B33","#FFD700","#FFFFFF","#BB2528"],halloween:["#FF6600","#000000","#8B008B","#00FF00","#FFD700"],pastel:["#FFB3BA","#FFDFBA","#FFFFBA","#BAFFC9","#BAE1FF"],neon:["#FF00FF","#00FFFF","#FF0080","#80FF00","#FF8000"],gold:["#FFD700","#DAA520","#B8860B","#FFC125","#FFDF00"],silver:["#C0C0C0","#A8A8A8","#D3D3D3","#DCDCDC","#E8E8E8"],hearts:["#FF69B4","#FF1493","#FF007F","#DC143C","#FFB6C1"],ocean:["#006994","#00CED1","#20B2AA","#48D1CC","#87CEEB"]},Y={celebration:["🎉","🎊","🥳","✨","🎈"],hearts:["❤️","💕","💖","💗","💓","💘"],stars:["⭐","🌟","✨","💫","⚡"],money:["💰","💵","💸","🤑","💎"],christmas:["🎄","🎅","🎁","❄️","⭐"],halloween:["🎃","👻","🦇","🕷️","💀"],birthday:["🎂","🎁","🎈","🎉","🥳"],food:["🍕","🍔","🍟","🌭","🍿"]},At={default:{name:"default",description:"Default balanced confetti burst with realistic paper physics",options:{particleCount:60,particle:{shapes:["square","rectangle","circle"],size:[6,14],depth3D:.6,tilt:[-30,30]},physics:{gravity:.25,drag:.035,wobble:!0,wobbleSpeed:1.5}}},celebration:{name:"celebration",description:"Big celebration with lots of colorful confetti and realistic movement",options:{particleCount:120,particle:{colors:[...D.rainbow],shapes:["square","rectangle","circle","star"],size:[8,16],lifespan:5e3,depth3D:.7,tilt:[-35,35]},direction:{direction:"radial",spread:360,velocity:[30,55]},physics:{gravity:.22,drag:.04,wobble:!0,wobbleSpeed:2,windVariation:.03}}},firework:{name:"firework",description:"Firework-style explosion with secondary bursts",options:{mode:"firework",particleCount:80,particle:{colors:[...D.neon],shapes:["circle","star"],size:[4,8],trail:{enabled:!0,length:8,fade:.6},glow:{enabled:!0,blur:8,intensity:.7}},firework:{secondaryExplosions:!0,burstCount:80}}},snow:{name:"snow",description:"Gentle falling snowflakes",options:{mode:"snow",particleCount:150,particle:{colors:["#FFFFFF","#F0F8FF","#E0FFFF"],shapes:["circle"],size:[3,8],lifespan:8e3,opacity:[.6,1]},physics:{gravity:.05,wind:.3,windVariation:.2,wobble:!0,wobbleSpeed:2},continuous:{recycle:!0,numberOfPieces:150}}},rain:{name:"rain",description:"Rainfall effect",options:{mode:"rain",particleCount:200,particle:{colors:["#6CA0DC","#4A90D9","#2E7BB9"],shapes:["line"],size:[2,4],lifespan:2e3},physics:{gravity:.8,wind:.1},direction:{direction:"down",spread:10,velocity:[30,50]},continuous:{recycle:!0}}},sparkle:{name:"sparkle",description:"Sparkling stars with glow effect",options:{particleCount:40,particle:{colors:[...D.gold],shapes:["star"],size:[6,12],glow:{enabled:!0,blur:15,intensity:.8}},physics:{gravity:.1}}},confetti:{name:"confetti",description:"Classic confetti falling with realistic paper flutter",options:{mode:"continuous",particleCount:200,particle:{shapes:["square","rectangle"],size:[6,14],depth3D:.8,tilt:[-40,40],lifespan:6e3},physics:{gravity:.18,drag:.045,wind:.08,windVariation:.04,wobble:!0,wobbleSpeed:2},continuous:{recycle:!0,numberOfPieces:200},spawnArea:{x:0,y:0,width:typeof window<"u"?window.innerWidth:1920,height:0}}},emoji:{name:"emoji",description:"Emoji celebration",options:{particleCount:30,particle:{images:Y.celebration.map(e=>({src:e,isEmoji:!0,scale:1.5})),size:[20,30],lifespan:4e3},direction:{direction:"up",spread:60,velocity:[20,35]}}},hearts:{name:"hearts",description:"Floating hearts",options:{particleCount:50,particle:{colors:[...D.hearts],shapes:["heart"],size:[12,20],lifespan:5e3},physics:{gravity:-.1,wobble:!0},direction:{direction:"up",spread:90,velocity:[10,20]}}},stars:{name:"stars",description:"Shooting stars",options:{particleCount:60,particle:{colors:[...D.gold,"#FFFFFF"],shapes:["star"],size:[8,16],trail:{enabled:!0,length:12,fade:.4}},direction:{direction:"radial",spread:360,velocity:[30,60]}}},money:{name:"money",description:"Money rain",options:{particleCount:40,particle:{colors:["#85BB65","#228B22","#32CD32"],images:Y.money.map(e=>({src:e,isEmoji:!0})),size:[20,30],lifespan:4e3},physics:{gravity:.15,wobble:!0}}},pride:{name:"pride",description:"Pride rainbow celebration",options:{particleCount:100,particle:{colors:[...D.pride],shapes:["square","rectangle","heart"],size:[10,16]},direction:{direction:"radial",spread:360,velocity:[25,45]}}},christmas:{name:"christmas",description:"Christmas celebration",options:{particleCount:80,particle:{colors:[...D.christmas],shapes:["star","circle"],size:[8,14],images:Y.christmas.map(e=>({src:e,isEmoji:!0}))}}},halloween:{name:"halloween",description:"Spooky Halloween",options:{particleCount:60,particle:{colors:[...D.halloween],shapes:["circle","star"],images:Y.halloween.map(e=>({src:e,isEmoji:!0})),size:[15,25]},physics:{gravity:.2,wobble:!0}}},newYear:{name:"newYear",description:"New Year celebration with fireworks",options:{mode:"firework",particleCount:100,particle:{colors:[...D.gold,...D.silver],shapes:["star","circle"],size:[6,12],trail:{enabled:!0,length:10},glow:{enabled:!0,blur:12}},firework:{secondaryExplosions:!0,burstCount:100}}},birthday:{name:"birthday",description:"Birthday party celebration",options:{particleCount:80,particle:{colors:[...D.pastel,...D.rainbow],shapes:["star","circle","heart"],images:Y.birthday.map(e=>({src:e,isEmoji:!0})),size:[12,20],lifespan:5e3},direction:{direction:"up",spread:80,velocity:[25,45]}}}};function b(){if(typeof crypto<"u"&&crypto.getRandomValues){let e=new Uint32Array(1);return crypto.getRandomValues(e),e[0]/4294967296}return Math.random()}function h(e,n){return e+b()*(n-e)}function Ue(e,n){return Math.floor(h(e,n+1))}function V(e){if(e.length===0)throw new Error("Cannot pick from empty array");return e[Math.floor(b()*e.length)]}function O(e,n,t){return Math.min(Math.max(e,n),t)}function qe(e,n,t){return e+(n-e)*O(t,0,1)}function I(e){return e*y.DEG_TO_RAD}function Ge(e){return e*y.RAD_TO_DEG}function X(e){if(typeof e=="object"&&"r"in e)return{r:O(Math.round(e.r),0,255),g:O(Math.round(e.g),0,255),b:O(Math.round(e.b),0,255),a:O(e.a,0,1)};if(typeof e=="object"&&"type"in e)return X(e.colors[0]);let n=e.trim().toLowerCase();return n.startsWith("#")?$e(n):n.startsWith("rgb")?Ye(n):je(n)}function $e(e){let n=e.slice(1),t,r,o,i=1;switch(n.length){case 3:t=parseInt(n[0]+n[0],16),r=parseInt(n[1]+n[1],16),o=parseInt(n[2]+n[2],16);break;case 4:t=parseInt(n[0]+n[0],16),r=parseInt(n[1]+n[1],16),o=parseInt(n[2]+n[2],16),i=parseInt(n[3]+n[3],16)/255;break;case 6:t=parseInt(n.slice(0,2),16),r=parseInt(n.slice(2,4),16),o=parseInt(n.slice(4,6),16);break;case 8:t=parseInt(n.slice(0,2),16),r=parseInt(n.slice(2,4),16),o=parseInt(n.slice(4,6),16),i=parseInt(n.slice(6,8),16)/255;break;default:return j}return isNaN(t)||isNaN(r)||isNaN(o)||isNaN(i)?j:{r:t,g:r,b:o,a:i}}function Ye(e){let n=e.match(/rgba?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([\d.]+))?\s*\)/);return n?{r:O(parseInt(n[1],10),0,255),g:O(parseInt(n[2],10),0,255),b:O(parseInt(n[3],10),0,255),a:n[4]!==void 0?O(parseFloat(n[4]),0,1):1}:j}function je(e){let n={red:{r:255,g:0,b:0,a:1},green:{r:0,g:128,b:0,a:1},blue:{r:0,g:0,b:255,a:1},white:{r:255,g:255,b:255,a:1},black:{r:0,g:0,b:0,a:1},yellow:{r:255,g:255,b:0,a:1},cyan:{r:0,g:255,b:255,a:1},magenta:{r:255,g:0,b:255,a:1},orange:{r:255,g:165,b:0,a:1},purple:{r:128,g:0,b:128,a:1},pink:{r:255,g:192,b:203,a:1}};if(n[e])return n[e];if(typeof document<"u")try{let t=document.createElement("canvas");t.width=1,t.height=1;let r=t.getContext("2d");if(r){r.fillStyle=e,r.fillRect(0,0,1,1);let o=r.getImageData(0,0,1,1).data;return{r:o[0],g:o[1],b:o[2],a:o[3]/255}}}catch{}return j}function Z(e){return`rgba(${e.r}, ${e.g}, ${e.b}, ${e.a})`}function oe(e,n){if(e==="custom"&&n!==void 0)return I(n);if(e==="radial")return b()*y.TWO_PI;let t=de[e];return I(t??90)}function Ve(e){let n=e.getBoundingClientRect();return{x:n.left+n.width/2,y:n.top+n.height/2}}function pe(e){if(!e)return M;let n={...re,...e.particle},t={...te,...e.physics},r={...ne,...e.direction};return{particleCount:e.particleCount??M.particleCount,particle:n,physics:t,direction:r,mode:e.mode??M.mode,spawnArea:e.spawnArea?{type:"rect",x:0,y:0,...e.spawnArea}:void 0,continuous:e.continuous,firework:e.firework,canvas:e.canvas,easing:e.easing??M.easing,zIndex:e.zIndex??M.zIndex,autoCleanup:e.autoCleanup??M.autoCleanup,scalar:e.scalar??M.scalar,drift:e.drift??M.drift,flat:e.flat??M.flat,onStart:e.onStart,onComplete:e.onComplete,onFrame:e.onFrame,onParticleCreate:e.onParticleCreate,onParticleDeath:e.onParticleDeath}}function z(){return typeof window<"u"&&typeof document<"u"}function Te(e=2){return z()?Math.min(window.devicePixelRatio||1,e):1}function Ee(){let e,n;return{promise:new Promise((r,o)=>{e=r,n=o}),resolve:e,reject:n}}var Xe=0;function W(e,n,t,r,o,i,l,a,c,s,u){let d=h(l[0],l[1]),p=h(a[0],a[1]),m=V(o),x=typeof m=="string"?X(m):"type"in m?X(m.colors[0]):m,E=1+(b()-.5)*.3,P=Math.cos(t)*r*E,C=-Math.sin(t)*r*E,v;u?.images&&u.images.length>0&&(v=V(u.images));let f=u?.tiltRange??[-30,30],F=u?.spinSpeedRange??[-15,15],A=u?.aspectRatioRange??[.5,1.5],T=h(A[0],A[1]);return{id:Xe++,x:e,y:n,vx:P,vy:C,size:d,originalSize:d,rotation:b()*y.TWO_PI,rotationSpeed:(b()-.5)*.3*s,color:x,shape:v?"custom":V(i),opacity:p,originalOpacity:p,life:c,maxLife:c,active:!0,image:v,imageElement:null,trail:[],wobblePhase:b()*y.TWO_PI,wobbleSpeed:h(.8,2.5),tilt:I(h(f[0],f[1])),tiltSpeed:h(F[0],F[1])*.015,depth:u?.depth3D??.6,hasExploded:!1,data:{},flutterPhase:b()*y.TWO_PI,flutterSpeed:h(1.5,3.5),swayPhase:b()*y.TWO_PI,aspectRatio:T,angularVelocity:(b()-.5)*.4,scaleX:1,scaleY:1,shimmerPhase:b()*y.TWO_PI,currentDrag:h(.02,.05)}}function Ae(e,n,t,r,o,i,l){if(!e.active)return;let a=n*.05988;if(i?.enabled??k.enabled){let w=e.trail;w.unshift({x:e.x,y:e.y,opacity:e.opacity,size:e.size});let S=i?.length??k.length;w.length>S&&w.pop()}let c=e.vx,s=e.vy,u=e.tilt,d=c*c+s*s,p=u-u*u*u*.166667,m=1+p*.15;if(s+=t.gravity*m*a,(t.flutter??!0)&&d>1){let w=t.flutterSpeed??2.5,S=t.flutterIntensity??.4;e.flutterPhase+=w*.05*a;let _=e.flutterPhase,ee=(_-_*_*_*.166667)*S*a,Ne=1-u*u*.5;if(c+=ee*Ne,(p<0?-p:p)>.7){let ze=ee<0?-ee:ee;s-=ze*.3}}let E=t.swayAmplitude??15,P=t.swayFrequency??2;e.swayPhase+=P*.03*a;let C=e.swayPhase,v=(C-C*C*C*.166667)*E*.01*a;c+=v;let f=t.windVariation,F=t.wind+f*(Math.random()-.5);c+=F*a;let A=t.airResistance??.03,T=1-u*u*.5,H=T<0?-T:T,Q=t.drag+H*A,B=d>0?Math.sqrt(d):0,$=Math.max(.9,1-Q*B*.01)*t.friction*t.decay;if(c*=$,s*=$,e.x+=c*a,e.y+=s*a,e.vx=c,e.vy=s,t.tumble&&(e.angularVelocity=(e.angularVelocity+c*.001*a)*.98,e.rotation+=(e.rotationSpeed+e.angularVelocity)*a),e.tiltSpeed=(e.tiltSpeed+(Math.random()-.5)*.002*a)*.995,e.tilt=(e.tilt+e.tiltSpeed*a)%y.TWO_PI,t.wobble){let w=e.wobblePhase+t.wobbleSpeed*.1*a;e.wobblePhase=w;let S=1-w*w*.5,_=w-w*w*w*.166667;e.scaleX=.3+.7*(S<0?-S:S),e.scaleY=.3+.7*(_<0?-_:_)}if(e.shimmerPhase+=.1*a,t.floor!==null&&t.bounce>0&&l){let w=t.floor??l,S=e.size*.5;e.y+S>=w&&(e.y=w-S,e.vy=-e.vy*t.bounce,e.vx*=.85,e.rotationSpeed+=(Math.random()-.5)*.1)}e.life-=n;let we=1-e.life/e.maxLife;if(r){let w=we,S=w*w*(3-2*w);e.opacity=e.originalOpacity*(1-S*.9)}o&&(e.size=e.originalSize*(1-we*.5)),(e.life<=0||e.opacity<N.MIN_OPACITY||e.size<N.MIN_SIZE)&&(e.active=!1)}function Re(e,n,t){if(!n.active)return;let{x:r,y:o,size:i,rotation:l,color:a,shape:c,opacity:s,tilt:u,aspectRatio:d,scaleX:p,scaleY:m,shimmerPhase:x}=n;if(s<.02)return;let E=t?.trailConfig,P=t?.glowConfig;(E?.enabled??k.enabled)&&n.trail.length>0&&Ze(e,n,E??k),e.save();let C=P?.enabled??ue.enabled;C&&(e.shadowBlur=P?.blur??ue.blur,e.shadowColor=P?.color??Z(a)),e.translate(r,o),e.rotate(l+u),n.depth>0&&e.scale(p,m);let f=1+(x-Math.floor(x))*.3-.15,F=.7+.3*(p*m<0?-(p*m):p*m),A=s*a.a*F*(C?P?.intensity??1:1);if(A<.02){e.restore();return}e.globalAlpha=A>1?1:A;let T=a.r*f,H=a.g*f,Q=a.b*f;if(e.fillStyle=`rgb(${T>255?255:T},${H>255?255:H},${Q>255?255:Q})`,n.image&&n.image.isEmoji)it(e,n.image.src,i*(n.image.scale??1));else if(n.imageElement)at(e,n.imageElement,i*(n.image?.scale??1));else if(c==="custom"&&t?.customDraw){let B={ctx:e,particle:n,progress:1-n.life/n.maxLife,elapsed:t.elapsed??0};t.customDraw(B)}else{let B=d??1;switch(c){case"square":case"rectangle":let le=i*(c==="rectangle"?Math.max(1.5,B*1.5):Math.sqrt(B)),$=i/(c==="rectangle"?Math.max(1.5,B):Math.sqrt(B));e.fillRect(-le*.5,-$*.5,le,$);break;case"circle":e.beginPath(),e.arc(0,0,i*.5,0,y.TWO_PI),e.fill();break;case"triangle":Je(e,i);break;case"star":Ke(e,i);break;case"line":Qe(e,i);break;case"heart":et(e,i);break;case"diamond":tt(e,i);break;case"hexagon":nt(e,i);break;case"spiral":rt(e,i,a);break;case"ribbon":ot(e,i);break;default:e.fillRect(-i*.5,-i*.5,i,i)}}e.restore()}function Ze(e,n,t){let r=t.fade??k.fade,o=t.width??k.width;e.save(),e.lineCap="round",e.lineJoin="round";for(let i=0;i<n.trail.length-1;i++){let l=n.trail[i],a=n.trail[i+1],c=l.opacity*Math.pow(r,i),s=l.size*o*Math.pow(r,i);c>.01&&s>.1&&(e.beginPath(),e.strokeStyle=Z({...n.color,a:c}),e.lineWidth=s,e.moveTo(l.x,l.y),e.lineTo(a.x,a.y),e.stroke())}e.restore()}function Je(e,n){let t=n/2;e.beginPath(),e.moveTo(0,-t),e.lineTo(t,t),e.lineTo(-t,t),e.closePath(),e.fill()}function Ke(e,n){let t=n/2,r=t*Fe,o=Math.PI/me;e.beginPath();for(let i=0;i<me*2;i++){let l=i%2===0?t:r,a=i*o-y.HALF_PI,c=Math.cos(a)*l,s=Math.sin(a)*l;i===0?e.moveTo(c,s):e.lineTo(c,s)}e.closePath(),e.fill()}function Qe(e,n){let t=n*2,r=n/4;e.fillRect(-t/2,-r/2,t,r)}function et(e,n){let t=n/30;e.save(),e.scale(t,t),e.beginPath(),e.moveTo(0,-8),e.bezierCurveTo(-10,-18,-25,-8,-15,5),e.lineTo(0,18),e.lineTo(15,5),e.bezierCurveTo(25,-8,10,-18,0,-8),e.closePath(),e.fill(),e.restore()}function tt(e,n){let t=n/2;e.beginPath(),e.moveTo(0,-t),e.lineTo(t*.6,0),e.lineTo(0,t),e.lineTo(-t*.6,0),e.closePath(),e.fill()}function nt(e,n){let t=n/2;e.beginPath();for(let r=0;r<6;r++){let o=Math.PI/3*r-Math.PI/6,i=Math.cos(o)*t,l=Math.sin(o)*t;r===0?e.moveTo(i,l):e.lineTo(i,l)}e.closePath(),e.fill()}function rt(e,n,t){e.strokeStyle=Z(t),e.lineWidth=n/8,e.lineCap="round",e.beginPath();for(let r=0;r<22;r++){let o=.35*r,i=(.2+1.5*o)*(n/20),l=i*Math.cos(o),a=i*Math.sin(o);r===0?e.moveTo(l,a):e.lineTo(l,a)}e.stroke()}function ot(e,n){let t=n,r=n/3,o=n/4;e.beginPath(),e.moveTo(-t/2,0),e.quadraticCurveTo(-t/4,-o,0,0),e.quadraticCurveTo(t/4,o,t/2,0),e.lineTo(t/2,r),e.quadraticCurveTo(t/4,r+o,0,r),e.quadraticCurveTo(-t/4,r-o,-t/2,r),e.closePath(),e.fill()}function it(e,n,t){e.font=`${t}px serif`,e.textAlign="center",e.textBaseline="middle",e.fillText(n,0,0)}function at(e,n,t){let r=t/2;e.drawImage(n,-r,-r,t,t)}function xe(e){return e.filter(n=>n.active).length}var g=null,L=null,U=0,J=null,Ie=[],st=500;function Se(e){Ie.length<st&&(e.active=!1,e.trail.length=0,Ie.push(e))}var he=360,lt=new Float32Array(he),ct=new Float32Array(he);for(let e=0;e<he;e++){let n=e*Math.PI/180;lt[e]=Math.sin(n),ct[e]=Math.cos(n)}function ut(e,n){if(!z())throw new Error("ConfettiEngine requires a browser environment");let t={...fe,...n},r=t.pixelRatio??Te(N.MAX_DPR);if(!g){if(g=document.createElement("canvas"),g.style.cssText=`
2
+ position: fixed;
3
+ top: 0;
4
+ left: 0;
5
+ width: 100%;
6
+ height: 100%;
7
+ pointer-events: none;
8
+ z-index: ${e};
9
+ `,L=g.getContext("2d",{alpha:!0,desynchronized:!0}),!L)throw new Error("Failed to get canvas 2D context");document.body.appendChild(g),t.autoResize&&(J=()=>{if(g&&L){let l=t.width??window.innerWidth,a=t.height??window.innerHeight;g.width=l*r,g.height=a*r,g.style.width=`${l}px`,g.style.height=`${a}px`,L.scale(r,r)}},window.addEventListener("resize",J))}g.style.zIndex=String(e);let o=t.width??window.innerWidth,i=t.height??window.innerHeight;return(g.width!==o*r||g.height!==i*r)&&(g.width=o*r,g.height=i*r,g.style.width=`${o}px`,g.style.height=`${i}px`,L.scale(r,r)),{canvas:g,ctx:L,width:o,height:i,dpr:r}}function ft(){g&&U===0&&setTimeout(()=>{U===0&&g&&(J&&(window.removeEventListener("resize",J),J=null),g.remove(),g=null,L=null)},Pe)}function De(e,n,t){let{type:r,x:o,y:i,w:l,h:a}=e;switch(r){case"point":return{x:o,y:i};case"rect":return{x:h(o,o+(l??0)),y:h(i,i+(a??0))};case"line":let c=b();return{x:o+c*(l??0),y:i+c*(a??0)};case"circle":let s=b()*y.TWO_PI,u=Math.sqrt(b())*(l??50);return{x:o+Math.cos(s)*u,y:i+Math.sin(s)*u};default:return{x:o,y:i}}}var ie=class{constructor(n,t){this.particles=[];this.canvasContext=null;this.animationFrameId=null;this.lastFrameTime=0;this.lastSpawnTime=0;this.isRunning=!1;this.isPaused=!1;this.deferred=Ee();this.frameInterval=0;this.lastRenderTime=0;this.animate=()=>{if(!this.isRunning||!this.canvasContext)return;if((this.mode==="continuous"||this.mode==="snow"||this.mode==="rain")&&!this.continuousConfig.run){this.animationFrameId=requestAnimationFrame(this.animate),this.lastFrameTime=performance.now();return}if(this.isPaused){this.animationFrameId=requestAnimationFrame(this.animate),this.lastFrameTime=performance.now();return}let n=performance.now(),t=n-this.lastFrameTime;if(this.lastFrameTime=n,this.frameInterval>0){if(n-this.lastRenderTime<this.frameInterval){this.animationFrameId=requestAnimationFrame(this.animate);return}this.lastRenderTime=n}let{ctx:r,width:o,height:i,dpr:l}=this.canvasContext,{physics:a,particle:c}=this.config;r.setTransform(1,0,0,1,0,0),r.clearRect(0,0,o*l,i*l),r.scale(l,l);let s=this.particles,u=s.length,d=0,p=!0,m=100,x=-m,E=o+m,P=-m,C=i+m;for(let v=0;v<u;v++){let f=s[v];if(f.active){if(Ae(f,t,a,c.fadeOut,c.scaleDown),f.data?.isRocket&&f.y<=f.data.targetY){f.active=!1,this.explodeFirework(f.x,f.y,f.data);continue}if(f.data?.willExplode&&!f.data.hasExploded&&f.vx*f.vx+f.vy*f.vy<1&&(f.data.hasExploded=!0,this.explodeFirework(f.x,f.y,{burstCount:15,spread:360,burstColors:f.data.burstColors})),f.x<x||f.x>E||f.y<P||f.y>C){(f.y>C||f.x<x-200||f.x>E+200)&&(f.active=!1);continue}Re(r,f,{customDraw:this.drawShape}),d++,p=!1}}if(this.mode==="continuous"||this.mode==="snow"||this.mode==="rain"){let v=n-this.lastSpawnTime,f=1e3/(this.continuousConfig.spawnRate??10);if(v>=f){if(this.continuousConfig.recycle){let A=this.continuousConfig.numberOfPieces-d;if(A>0){for(let T=u-1;T>=0&&A>0;T--)s[T].active||(Se(s[T]),s.splice(T,1));this.spawnParticles(Math.min(A,5))}}else d<this.continuousConfig.numberOfPieces&&this.spawnParticles(Math.min(3,this.continuousConfig.numberOfPieces-d));this.lastSpawnTime=n}}if(this.mode==="firework"){let v=0;for(let F=0;F<u;F++)s[F].active&&s[F].data?.isRocket&&v++;let f=n-this.lastSpawnTime;v===0&&f>=(this.fireworkConfig.burstDelay??500)&&(this.launchFirework(),this.lastSpawnTime=n)}if((this.mode==="burst"||this.mode==="cannon"||this.mode==="explosion")&&p){this.complete();return}this.animationFrameId=requestAnimationFrame(this.animate)};this.origin=n,this.config=pe(t),this.mode=t?.mode??"burst",this.spawnArea=t?.spawnArea,this.continuousConfig={...ve,...t?.continuous},this.fireworkConfig={...ye,...t?.firework},this.canvasConfig={...fe,...t?.canvas},this.drawShape=t?.particle?.drawShape,this.canvasConfig.frameRate&&(this.frameInterval=1e3/this.canvasConfig.frameRate)}start(){if(this.isRunning)return this.createHandle();if(!z())return this.deferred.resolve(),this.createHandle();if(this.isRunning=!0,U++,this.canvasContext=ut(this.config.zIndex,this.canvasConfig),this.mode==="continuous"||this.mode==="snow"||this.mode==="rain"){let n=Math.min(this.continuousConfig.numberOfPieces,Math.floor(this.continuousConfig.numberOfPieces*.5));this.spawnParticles(n)}else this.mode==="firework"?this.launchFirework():this.createParticles();return this.config.onStart?.(),this.lastFrameTime=performance.now(),this.lastSpawnTime=performance.now(),this.lastRenderTime=performance.now(),this.animate(),this.createHandle()}createParticles(){let{particleCount:n,particle:t,direction:r,physics:o}=this.config,{x:i,y:l}=this.origin,a=Math.min(n,N.MAX_PARTICLES);for(let c=0;c<a;c++){let s;if(r.direction==="radial")s=b()*y.TWO_PI;else{let p=oe(r.direction,r.angle),m=I(r.spread);s=p+(b()-.5)*m}let u=h(r.velocity[0],r.velocity[1]),d=W(i,l,s,u,t.colors,t.shapes,t.size,t.opacity,t.lifespan,o.rotationSpeed,{images:t.images,tiltRange:t.tilt,spinSpeedRange:t.spinSpeed,depth3D:t.depth3D});this.particles.push(d)}}spawnParticles(n){if(!this.canvasContext)return;let{particle:t,physics:r}=this.config,{width:o,height:i}=this.canvasContext;for(let l=0;l<n;l++){let a;this.spawnArea?a=De(this.spawnArea,o,i):this.mode==="snow"||this.mode==="rain"?a={x:h(0,o),y:-20}:a={x:h(0,o),y:h(-20,0)};let c,s;this.mode==="snow"?(c=I(h(-20,20)-90),s=h(.5,2)):this.mode==="rain"?(c=I(-90),s=h(8,15)):(c=b()*y.TWO_PI,s=h(2,6));let u=W(a.x,a.y,c,s,t.colors,t.shapes,t.size,t.opacity,t.lifespan,r.rotationSpeed,{images:t.images,tiltRange:t.tilt,spinSpeedRange:t.spinSpeed,depth3D:t.depth3D});this.particles.push(u)}}launchFirework(){if(!this.canvasContext)return;let{width:n,height:t}=this.canvasContext,{launchHeight:r,burstCount:o,spread:i,secondaryExplosions:l,rocketColors:a,burstColors:c,trailLength:s}=this.fireworkConfig,u=this.spawnArea?De(this.spawnArea,n,t).x:h(n*.2,n*.8),d=t*(1-r),p=u+h(-50,50),m=W(u,t,I(-90+h(-10,10)),h(15,25),a,["circle"],[3,5],[1,1],2e3,0);m.data={isRocket:!0,targetY:d,targetX:p,burstCount:o,spread:i,burstColors:c,secondaryExplosions:l,trailLength:s},this.particles.push(m)}explodeFirework(n,t,r){let{burstCount:o=80,spread:i=360,burstColors:l,secondaryExplosions:a}=r,c=l??this.config.particle.colors,s=I(i);for(let u=0;u<o;u++){let d=u/o*s-s/2+I(-90),p=h(4,12),m=W(n,t,d,p,c,this.config.particle.shapes,[2,6],[.8,1],1500,this.config.physics.rotationSpeed);a&&b()<.1&&(m.data={willExplode:!0,burstColors:c}),this.particles.push(m)}}stop(){this.isRunning&&(this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.cleanup(),this.deferred.resolve())}pause(){this.isPaused=!0}resume(){this.isPaused=!1}complete(){this.config.onComplete?.(),this.cleanup(),this.deferred.resolve()}cleanup(){this.isRunning=!1,this.isPaused=!1;let n=this.particles;for(let t=n.length-1;t>=0;t--)Se(n[t]);this.particles=[],this.canvasContext=null,U--,this.config.autoCleanup&&ft()}addParticles(n){if(!(!this.isRunning||!this.canvasContext))if(this.mode==="continuous"||this.mode==="snow"||this.mode==="rain")this.spawnParticles(n);else{let{particle:t,direction:r,physics:o}=this.config,{x:i,y:l}=this.origin;for(let a=0;a<n;a++){let c;if(r.direction==="radial")c=b()*y.TWO_PI;else{let d=oe(r.direction,r.angle),p=I(r.spread);c=d+(b()-.5)*p}let s=h(r.velocity[0],r.velocity[1]),u=W(i,l,c,s,t.colors,t.shapes,t.size,t.opacity,t.lifespan,o.rotationSpeed);this.particles.push(u)}}}clear(){this.particles=[]}getParticleCount(){return xe(this.particles)}getState(){return this.isRunning?this.isPaused?"paused":"running":"stopped"}createHandle(){return{stop:()=>this.stop(),pause:()=>this.pause(),resume:()=>this.resume(),promise:this.deferred.promise,addParticles:n=>this.addParticles(n),clear:()=>this.clear(),getParticleCount:()=>this.getParticleCount(),getState:()=>this.getState()}}};function ae(e,n){return new ie(e,n).start()}function ge(e,n){if(!e||!z())return null;let t=e.getBoundingClientRect(),r={x:t.left+t.width/2,y:t.top+t.height/2};return ae(r,n)}function dt(){return U}function mt(){g&&(g.remove(),g=null,L=null),U=0}import{useCallback as q,useRef as pt,useState as ht,useEffect as gt}from"react";function G(){let[e,n]=ht(!1),t=pt(new Set);gt(()=>()=>{t.current.forEach(s=>s.stop()),t.current.clear()},[]);let r=q((s,u)=>{let d=ae(s,u);return t.current.add(d),n(!0),d.promise.then(()=>{t.current.delete(d),t.current.size===0&&n(!1)}),d},[]),o=q((s,u)=>{if(!s)return null;let d=ge(s,u);return d&&(t.current.add(d),n(!0),d.promise.then(()=>{t.current.delete(d),t.current.size===0&&n(!1)})),d},[]),i=q(()=>{t.current.forEach(s=>s.stop()),t.current.clear(),n(!1)},[]),l=q(()=>{t.current.forEach(s=>s.pause())},[]),a=q(()=>{t.current.forEach(s=>s.resume())},[]),c=q(()=>Array.from(t.current),[]);return{fire:r,fireFromElement:o,isActive:e,stopAll:i,pauseAll:l,resumeAll:a,getActiveHandles:c}}import{useEffect as se,useRef as K,useCallback as Me,forwardRef as Oe,useImperativeHandle as Ct}from"react";import{jsx as _e}from"react/jsx-runtime";function bt({active:e,origin:n,triggerRef:t,options:r,onComplete:o}){let{fire:i,fireFromElement:l}=G(),a=K(!1);return se(()=>{if(e&&!a.current){a.current=!0;let c=null;t?.current?c=l(t.current,r):n&&(c=i(n,r)),c&&c.promise.then(()=>{o?.()})}},[e,n,t,r,i,l,o]),se(()=>{e||(a.current=!1)},[e]),null}var wt=Oe(({options:e,style:n},t)=>{let r=K(null),{fireFromElement:o}=G();return Ct(t,()=>({fire:()=>o(r.current,e)})),_e("div",{ref:r,style:{position:"absolute",width:1,height:1,pointerEvents:"none",...n},"aria-hidden":"true"})});wt.displayName="ConfettiTrigger";var Be=Oe(({children:e,confettiOptions:n,fireOnClick:t=!0,onClick:r,...o},i)=>{let l=K(null),{fireFromElement:a}=G(),c=Me(u=>{l.current=u,typeof i=="function"?i(u):i&&(i.current=u)},[i]),s=Me(u=>{t&&l.current&&a(l.current,n),r?.(u)},[t,a,n,r]);return _e("button",{ref:c,onClick:s,...o,children:e})});Be.displayName="ConfettiButton";function vt({width:e,height:n,numberOfPieces:t=200,confettiSource:r,initialVelocityX:o,initialVelocityY:i,recycle:l=!0,run:a=!0,gravity:c=.3,wind:s=0,opacity:u=1,drawShape:d,tweenDuration:p=100,colors:m,onConfettiComplete:x,frameRate:E}){let{fire:P}=G(),C=K(null),v=K(!1);return se(()=>{if(!a){C.current&&(C.current.stop(),C.current=null),v.current=!1;return}if(v.current)return;v.current=!0;let f=r?{type:"rect",x:r.x,y:r.y,w:r.w??window.innerWidth,h:r.h??10}:{type:"rect",x:0,y:0,w:e??window.innerWidth,h:10},F=typeof o=="number"?[o*.5,o*1.5]:o?[o.min,o.max]:[4,10],A=typeof i=="number"?[i*.5,i*1.5]:i?[i.min,i.max]:[10,30],T=(e??window.innerWidth)/2,H=0;return C.current=P({x:T,y:H},{particleCount:t,particle:{colors:m??["#ff0000","#00ff00","#0000ff","#ffff00","#ff00ff","#00ffff"],opacity:[u*.8,u],shapes:["square","circle","rectangle"],drawShape:d},physics:{gravity:c*10,wind:s*5,windVariation:F[1]-F[0]},direction:{velocity:A},mode:"continuous",spawnArea:f,continuous:{recycle:l,numberOfPieces:t,spawnRate:30,run:a,tweenDuration:p},canvas:{width:e,height:n,frameRate:E,autoResize:!e&&!n},onComplete:x}),()=>{C.current&&(C.current.stop(),C.current=null)}},[a,e,n,t,r,o,i,l,c,s,u,d,p,m,x,E,P]),se(()=>{C.current},[l]),null}vt.displayName="Confetti";var Ce=new Map;function Le(){return typeof window>"u"?!1:window.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1}function ke(e,n){let{angle:t=90,spread:r=45,startVelocity:o=45,decay:i=.9,gravity:l=1,drift:a=0,flat:c=!1,ticks:s=200,origin:u={x:.5,y:.5},colors:d=["#ff0000","#00ff00","#0000ff","#ffff00","#ff00ff","#00ffff"],shapes:p=["square","circle"],scalar:m=1}=n,x=(t-90)*(Math.PI/180),E=r*(Math.PI/180),P=x+(Math.random()-.5)*E,C=o*(.5+Math.random()*.5);return{x:u.x*e.width,y:u.y*e.height,vx:Math.cos(P)*C,vy:Math.sin(P)*C,tiltAngle:Math.random()*Math.PI*2,tiltSpeed:(Math.random()-.5)*.1,color:d[Math.floor(Math.random()*d.length)],shape:p[Math.floor(Math.random()*p.length)]??"circle",scalar:m,gravity:l*.5,drift:a,decay:i,flat:c,tick:0,totalTicks:s,wobble:Math.random()*10,wobbleSpeed:.1+Math.random()*.1}}function yt(e){return e.tick++,e.tick>=e.totalTicks?!1:(e.vy+=e.gravity,e.vx+=e.drift,e.vx*=e.decay,e.vy*=e.decay,e.x+=e.vx,e.y+=e.vy,e.wobble+=e.wobbleSpeed,e.flat||(e.tiltAngle+=e.tiltSpeed),!0)}function Pt(e,n){let r=1-n.tick/n.totalTicks,o=10*n.scalar;if(e.save(),e.translate(n.x,n.y),!n.flat){e.rotate(n.tiltAngle);let i=Math.sin(n.wobble)*.5;e.scale(1+i*.2,1)}e.globalAlpha=r,e.fillStyle=n.color,n.shape==="circle"?(e.beginPath(),e.arc(0,0,o/2,0,Math.PI*2),e.fill()):n.shape==="square"?e.fillRect(-o/2,-o/2,o,o):e.fillRect(-o/2,-o/3,o,o*.6),e.restore()}function be(e){if(e.isDestroyed)return;let{canvas:n,ctx:t,particles:r}=e;t.clearRect(0,0,n.width,n.height);for(let o=r.length-1;o>=0;o--){let i=r[o];yt(i)?Pt(t,i):r.splice(o,1)}r.length>0?e.animationId=requestAnimationFrame(()=>be(e)):(e.animationId=null,e.resolve?.(),e.resolve=null,e.promise=null)}function Ft(){let e=document.getElementById("confetti-canvas");return e||(e=document.createElement("canvas"),e.id="confetti-canvas",e.style.cssText=`
10
+ position: fixed;
11
+ top: 0;
12
+ left: 0;
13
+ width: 100%;
14
+ height: 100%;
15
+ pointer-events: none;
16
+ z-index: 2147483647;
17
+ `,document.body.appendChild(e)),e.width=window.innerWidth,e.height=window.innerHeight,e}function He(e,n={}){let t=Ce.get(e);if(!t){let r=e==="default"?Ft():e,o=r.getContext("2d");if(!o)return null;t={canvas:r,ctx:o,animationId:null,particles:[],options:n,promise:null,resolve:null,isDestroyed:!1},Ce.set(e,t),n.resize&&e==="default"&&window.addEventListener("resize",()=>{t.isDestroyed||(t.canvas.width=window.innerWidth,t.canvas.height=window.innerHeight)})}return t}function R(e={}){if(e.disableForReducedMotion&&Le())return Promise.resolve();let n=He("default");if(!n)return null;let{particleCount:t=50}=e;for(let r=0;r<t;r++)n.particles.push(ke(n.canvas,e));return n.animationId||(n.promise=new Promise(r=>{n.resolve=r}),n.animationId=requestAnimationFrame(()=>be(n))),n.promise}R.create=function(e,n={}){let t=He(e,n),r=(o={})=>{if(!t||t.isDestroyed)return null;if((o.disableForReducedMotion??n.disableForReducedMotion)&&Le())return Promise.resolve();let{particleCount:l=50}=o;for(let a=0;a<l;a++)t.particles.push(ke(t.canvas,o));return t.animationId||(t.promise=new Promise(a=>{t.resolve=a}),t.animationId=requestAnimationFrame(()=>be(t))),t.promise};return r.reset=()=>{t&&(t.animationId&&(cancelAnimationFrame(t.animationId),t.animationId=null),t.particles=[],t.ctx.clearRect(0,0,t.canvas.width,t.canvas.height),t.resolve?.(),t.resolve=null,t.promise=null)},r};R.reset=function(){let e=Ce.get("default");e&&(e.animationId&&(cancelAnimationFrame(e.animationId),e.animationId=null),e.particles=[],e.ctx.clearRect(0,0,e.canvas.width,e.canvas.height),e.resolve?.(),e.resolve=null,e.promise=null)};R.fireworks=async function(e={}){let n={particleCount:30,spread:55,...e};await Promise.all([R({...n,angle:60,origin:{x:0,y:.65}}),R({...n,angle:120,origin:{x:1,y:.65}})])};R.schoolPride=function(e={}){let n=Date.now()+3e3,t=e.colors??["#bb0000","#ffffff"];function r(){R({particleCount:2,angle:60,spread:55,origin:{x:0,y:.6},colors:t,...e}),R({particleCount:2,angle:120,spread:55,origin:{x:1,y:.6},colors:t,...e}),Date.now()<n&&requestAnimationFrame(r)}r()};R.snow=function(e={}){let{duration:n=5e3,...t}=e,r=Date.now()+n;function o(){R({particleCount:1,startVelocity:0,ticks:300,gravity:.3,origin:{x:Math.random(),y:0},colors:["#ffffff","#f0f8ff","#e6f3ff"],shapes:["circle"],scalar:.8+Math.random()*.4,drift:Math.random()-.5,...t}),Date.now()<r&&requestAnimationFrame(o)}o()};R.burst=function(e,n={}){return R({particleCount:80,spread:360,startVelocity:30,decay:.92,scalar:1.2,origin:e,...n})};export{bt as ConfettiBurst,Be as ConfettiButton,ie as ConfettiEngine,ce as DEFAULT_COLORS,M as DEFAULT_CONFIG,ne as DEFAULT_DIRECTION,re as DEFAULT_PARTICLE,te as DEFAULT_PHYSICS,de as DIRECTION_ANGLES,We as EASING_FUNCTIONS,O as clamp,R as confetti,ae as createConfettiExplosion,R as default,I as degToRad,ge as fireFromElement,mt as forceCleanup,dt as getActiveAnimationCount,oe as getDirectionAngle,Ve as getElementCenter,z as isBrowser,qe as lerp,pe as mergeConfig,X as parseColor,Ge as radToDeg,V as randomFromArray,h as randomInRange,Ue as randomInt,Z as rgbaToString,G as useConfetti};