react-confetti-burst 1.0.4 → 1.0.5
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.
- package/dist/cjs/index.js +3 -3
- package/dist/esm/index.js +3 -3
- package/package.json +1 -1
package/dist/cjs/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var Ee=Object.defineProperty;var St=Object.getOwnPropertyDescriptor;var Mt=Object.getOwnPropertyNames;var Ot=Object.prototype.hasOwnProperty;var Bt=(e,t)=>{for(var n in t)Ee(e,n,{get:t[n],enumerable:!0})},kt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Mt(t))!Ot.call(e,i)&&i!==n&&Ee(e,i,{get:()=>t[i],enumerable:!(r=St(t,i))||r.enumerable});return e};var _t=e=>kt(Ee({},"__esModule",{value:!0}),e);var cn={};Bt(cn,{ConfettiBurst:()=>yt,ConfettiButton:()=>Me,ConfettiEngine:()=>de,DEFAULT_COLORS:()=>ge,DEFAULT_CONFIG:()=>_,DEFAULT_DIRECTION:()=>ae,DEFAULT_PARTICLE:()=>se,DEFAULT_PHYSICS:()=>oe,DIRECTION_ANGLES:()=>be,EASING_FUNCTIONS:()=>it,clamp:()=>z,confetti:()=>F,createConfettiExplosion:()=>fe,default:()=>F,degToRad:()=>S,fireFromElement:()=>ve,forceCleanup:()=>wt,getActiveAnimationCount:()=>vt,getDirectionAngle:()=>ce,getElementCenter:()=>ut,isBrowser:()=>$,lerp:()=>lt,mergeConfig:()=>Ce,parseColor:()=>J,radToDeg:()=>ct,randomFromArray:()=>Z,randomInRange:()=>m,randomInt:()=>st,rgbaToString:()=>K,useConfetti:()=>j});module.exports=_t(cn);var ge=["#FF6B6B","#4ECDC4","#FFE66D","#95E1D3","#F38181","#AA96DA","#FCBAD3","#A8D8EA","#FF9A8B","#88D8B0"],oe={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},ae={direction:"up",spread:55,velocity:[25,50],velocityDecay:.92},se={colors:ge,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},V={enabled:!1,length:10,fade:.5,width:.5},Fe={enabled:!1,blur:10,color:null,intensity:.5},nt={recycle:!1,numberOfPieces:200,spawnRate:50,run:!0,tweenDuration:5e3},rt={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},Ae={width:null,height:null,autoResize:!0,resizeDebounce:100,frameRate:null,pixelRatio:null,useWorker:!1,useOffscreen:!1};var _={particleCount:50,particle:se,physics:oe,direction:ae,mode:"burst",easing:"easeOut",zIndex:9999,autoCleanup:!0,scalar:1,drift:0,flat:!1},be={up:90,down:270,left:180,right:0},x={DEG_TO_RAD:Math.PI/180,RAD_TO_DEG:180/Math.PI,TWO_PI:Math.PI*2,HALF_PI:Math.PI/2},it={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 t=2*Math.PI/3;return e===0?0:e===1?1:Math.pow(2,-10*e)*Math.sin((e*10-.75)*t)+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 le={r:0,g:0,b:0,a:0},X={MAX_PARTICLES:500,FRAME_BUDGET:16.67,MIN_OPACITY:.01,MIN_SIZE:.5,MAX_DPR:2},ot=100,De=5,at=.5,k={rainbow:ge,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"]},ie={celebration:["🎉","🎊","🥳","✨","🎈"],hearts:["❤️","💕","💖","💗","💓","💘"],stars:["⭐","🌟","✨","💫","⚡"],money:["💰","💵","💸","🤑","💎"],christmas:["🎄","🎅","🎁","❄️","⭐"],halloween:["🎃","👻","🦇","🕷️","💀"],birthday:["🎂","🎁","🎈","🎉","🥳"],food:["🍕","🍔","🍟","🌭","🍿"]},pn={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:[...k.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:[...k.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:[...k.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:ie.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:[...k.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:[...k.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:ie.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:[...k.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:[...k.christmas],shapes:["star","circle"],size:[8,14],images:ie.christmas.map(e=>({src:e,isEmoji:!0}))}}},halloween:{name:"halloween",description:"Spooky Halloween",options:{particleCount:60,particle:{colors:[...k.halloween],shapes:["circle","star"],images:ie.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:[...k.gold,...k.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:[...k.pastel,...k.rainbow],shapes:["star","circle","heart"],images:ie.birthday.map(e=>({src:e,isEmoji:!0})),size:[12,20],lifespan:5e3},direction:{direction:"up",spread:80,velocity:[25,45]}}}};function C(){if(typeof crypto<"u"&&crypto.getRandomValues){let e=new Uint32Array(1);return crypto.getRandomValues(e),e[0]/4294967296}return Math.random()}function m(e,t){return e+C()*(t-e)}function st(e,t){return Math.floor(m(e,t+1))}function Z(e){if(e.length===0)throw new Error("Cannot pick from empty array");return e[Math.floor(C()*e.length)]}function z(e,t,n){return Math.min(Math.max(e,t),n)}function lt(e,t,n){return e+(t-e)*z(n,0,1)}function S(e){return e*x.DEG_TO_RAD}function ct(e){return e*x.RAD_TO_DEG}function J(e){if(typeof e=="object"&&"r"in e)return{r:z(Math.round(e.r),0,255),g:z(Math.round(e.g),0,255),b:z(Math.round(e.b),0,255),a:z(e.a,0,1)};if(typeof e=="object"&&"type"in e)return J(e.colors[0]);let t=e.trim().toLowerCase();return t.startsWith("#")?zt(t):t.startsWith("rgb")?Lt(t):Nt(t)}function zt(e){let t=e.slice(1),n,r,i,o=1;switch(t.length){case 3:n=parseInt(t[0]+t[0],16),r=parseInt(t[1]+t[1],16),i=parseInt(t[2]+t[2],16);break;case 4:n=parseInt(t[0]+t[0],16),r=parseInt(t[1]+t[1],16),i=parseInt(t[2]+t[2],16),o=parseInt(t[3]+t[3],16)/255;break;case 6:n=parseInt(t.slice(0,2),16),r=parseInt(t.slice(2,4),16),i=parseInt(t.slice(4,6),16);break;case 8:n=parseInt(t.slice(0,2),16),r=parseInt(t.slice(2,4),16),i=parseInt(t.slice(4,6),16),o=parseInt(t.slice(6,8),16)/255;break;default:return le}return isNaN(n)||isNaN(r)||isNaN(i)||isNaN(o)?le:{r:n,g:r,b:i,a:o}}function Lt(e){let t=e.match(/rgba?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([\d.]+))?\s*\)/);return t?{r:z(parseInt(t[1],10),0,255),g:z(parseInt(t[2],10),0,255),b:z(parseInt(t[3],10),0,255),a:t[4]!==void 0?z(parseFloat(t[4]),0,1):1}:le}function Nt(e){let t={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(t[e])return t[e];if(typeof document<"u")try{let n=document.createElement("canvas");n.width=1,n.height=1;let r=n.getContext("2d");if(r){r.fillStyle=e,r.fillRect(0,0,1,1);let i=r.getImageData(0,0,1,1).data;return{r:i[0],g:i[1],b:i[2],a:i[3]/255}}}catch{}return le}function K(e){return`rgba(${e.r}, ${e.g}, ${e.b}, ${e.a})`}function ce(e,t){if(e==="custom"&&t!==void 0)return S(t);if(e==="radial")return C()*x.TWO_PI;let n=be[e];return S(n??90)}function ut(e){let t=e.getBoundingClientRect();return{x:t.left+t.width/2,y:t.top+t.height/2}}function Ce(e){if(!e)return _;let t={...se,...e.particle},n={...oe,...e.physics},r={...ae,...e.direction};return{particleCount:e.particleCount??_.particleCount,particle:t,physics:n,direction:r,mode:e.mode??_.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??_.easing,zIndex:e.zIndex??_.zIndex,autoCleanup:e.autoCleanup??_.autoCleanup,scalar:e.scalar??_.scalar,drift:e.drift??_.drift,flat:e.flat??_.flat,onStart:e.onStart,onComplete:e.onComplete,onFrame:e.onFrame,onParticleCreate:e.onParticleCreate,onParticleDeath:e.onParticleDeath}}function $(){return typeof window<"u"&&typeof document<"u"}function dt(e=2){return $()?Math.min(window.devicePixelRatio||1,e):1}function ft(){let e,t;return{promise:new Promise((r,i)=>{e=r,t=i}),resolve:e,reject:t}}var Ht=0;function Q(e,t,n,r,i,o,a,s,c,l,u){let f=m(a[0],a[1]),h=m(s[0],s[1]),p=Z(i),D=typeof p=="string"?J(p):"type"in p?J(p.colors[0]):p,R=1+(C()-.5)*.3,E=Math.cos(n)*r*R,g=-Math.sin(n)*r*R,v;u?.images&&u.images.length>0&&(v=Z(u.images));let d=u?.tiltRange??[-30,30],I=u?.spinSpeedRange??[-15,15],A=u?.aspectRatioRange??[.5,1.5],T=m(A[0],A[1]);return{id:Ht++,x:e,y:t,vx:E,vy:g,size:f,originalSize:f,rotation:C()*x.TWO_PI,rotationSpeed:(C()-.5)*.3*l,color:D,shape:v?"custom":Z(o),opacity:h,originalOpacity:h,life:c,maxLife:c,active:!0,image:v,imageElement:null,trail:[],wobblePhase:C()*x.TWO_PI,wobbleSpeed:m(.8,2.5),tilt:S(m(d[0],d[1])),tiltSpeed:m(I[0],I[1])*.015,depth:u?.depth3D??.6,hasExploded:!1,data:{},flutterPhase:C()*x.TWO_PI,flutterSpeed:m(1.5,3.5),swayPhase:C()*x.TWO_PI,aspectRatio:T,angularVelocity:(C()-.5)*.4,scaleX:1,scaleY:1,shimmerPhase:C()*x.TWO_PI,currentDrag:m(.02,.05)}}function pt(e,t,n,r,i,o,a){if(!e.active)return;let s=t*.05988;if(o?.enabled??V.enabled){let w=e.trail;w.unshift({x:e.x,y:e.y,opacity:e.opacity,size:e.size});let B=o?.length??V.length;w.length>B&&w.pop()}let c=e.vx,l=e.vy,u=e.tilt,f=c*c+l*l,h=u-u*u*u*.166667,p=1+h*.15;if(l+=n.gravity*p*s,(n.flutter??!0)&&f>1){let w=n.flutterSpeed??2.5,B=n.flutterIntensity??.4;e.flutterPhase+=w*.05*s;let H=e.flutterPhase,me=(H-H*H*H*.166667)*B*s,At=1-u*u*.5;if(c+=me*At,(h<0?-h:h)>.7){let Dt=me<0?-me:me;l-=Dt*.3}}let R=n.swayAmplitude??15,E=n.swayFrequency??2;e.swayPhase+=E*.03*s;let g=e.swayPhase,v=(g-g*g*g*.166667)*R*.01*s;c+=v;let d=n.windVariation,I=n.wind+d*(Math.random()-.5);c+=I*s;let A=n.airResistance??.03,T=1-u*u*.5,N=T<0?-T:T,Y=n.drag+N*A,L=f>0?Math.sqrt(f):0,G=Math.max(.9,1-Y*L*.01)*n.friction*n.decay;if(c*=G,l*=G,e.x+=c*s,e.y+=l*s,e.vx=c,e.vy=l,n.tumble&&(e.angularVelocity=(e.angularVelocity+c*.001*s)*.98,e.rotation+=(e.rotationSpeed+e.angularVelocity)*s),e.tiltSpeed=(e.tiltSpeed+(Math.random()-.5)*.002*s)*.995,e.tilt=(e.tilt+e.tiltSpeed*s)%x.TWO_PI,n.wobble){let w=e.wobblePhase+n.wobbleSpeed*.1*s;e.wobblePhase=w;let B=1-w*w*.5,H=w-w*w*w*.166667;e.scaleX=.3+.7*(B<0?-B:B),e.scaleY=.3+.7*(H<0?-H:H)}if(e.shimmerPhase+=.1*s,n.floor!==null&&n.bounce>0&&a){let w=n.floor??a,B=e.size*.5;e.y+B>=w&&(e.y=w-B,e.vy=-e.vy*n.bounce,e.vx*=.85,e.rotationSpeed+=(Math.random()-.5)*.1)}e.life-=t;let tt=1-e.life/e.maxLife;if(r){let w=tt,B=w*w*(3-2*w);e.opacity=e.originalOpacity*(1-B*.9)}i&&(e.size=e.originalSize*(1-tt*.5)),(e.life<=0||e.opacity<X.MIN_OPACITY||e.size<X.MIN_SIZE)&&(e.active=!1)}function ht(e,t,n){if(!t.active)return;let{x:r,y:i,size:o,rotation:a,color:s,shape:c,opacity:l,tilt:u,aspectRatio:f,scaleX:h,scaleY:p,shimmerPhase:D}=t;if(l<.02)return;let R=n?.trailConfig,E=n?.glowConfig;(R?.enabled??V.enabled)&&t.trail.length>0&&Ut(e,t,R??V),e.save();let g=E?.enabled??Fe.enabled;g&&(e.shadowBlur=E?.blur??Fe.blur,e.shadowColor=E?.color??K(s)),e.translate(r,i),e.rotate(a+u),t.depth>0&&e.scale(h,p);let d=1+(D-Math.floor(D))*.3-.15,I=.7+.3*(h*p<0?-(h*p):h*p),A=l*s.a*I*(g?E?.intensity??1:1);if(A<.02){e.restore();return}e.globalAlpha=A>1?1:A;let T=s.r*d,N=s.g*d,Y=s.b*d;if(e.fillStyle=`rgb(${T>255?255:T},${N>255?255:N},${Y>255?255:Y})`,t.image&&t.image.isEmoji)Zt(e,t.image.src,o*(t.image.scale??1));else if(t.imageElement)Jt(e,t.imageElement,o*(t.image?.scale??1));else if(c==="custom"&&n?.customDraw){let L={ctx:e,particle:t,progress:1-t.life/t.maxLife,elapsed:n.elapsed??0};n.customDraw(L)}else{let L=f??1;switch(c){case"square":case"rectangle":let re=o*(c==="rectangle"?Math.max(1.5,L*1.5):Math.sqrt(L)),G=o/(c==="rectangle"?Math.max(1.5,L):Math.sqrt(L));e.fillRect(-re*.5,-G*.5,re,G);break;case"circle":e.beginPath(),e.arc(0,0,o*.5,0,x.TWO_PI),e.fill();break;case"triangle":qt(e,o);break;case"star":Wt(e,o);break;case"line":Gt(e,o);break;case"heart":Vt(e,o);break;case"diamond":$t(e,o);break;case"hexagon":jt(e,o);break;case"spiral":Yt(e,o,s);break;case"ribbon":Xt(e,o);break;default:e.fillRect(-o*.5,-o*.5,o,o)}}e.restore()}function Ut(e,t,n){let r=n.fade??V.fade,i=n.width??V.width;e.save(),e.lineCap="round",e.lineJoin="round";for(let o=0;o<t.trail.length-1;o++){let a=t.trail[o],s=t.trail[o+1],c=a.opacity*Math.pow(r,o),l=a.size*i*Math.pow(r,o);c>.01&&l>.1&&(e.beginPath(),e.strokeStyle=K({...t.color,a:c}),e.lineWidth=l,e.moveTo(a.x,a.y),e.lineTo(s.x,s.y),e.stroke())}e.restore()}function qt(e,t){let n=t/2;e.beginPath(),e.moveTo(0,-n),e.lineTo(n,n),e.lineTo(-n,n),e.closePath(),e.fill()}function Wt(e,t){let n=t/2,r=n*at,i=Math.PI/De;e.beginPath();for(let o=0;o<De*2;o++){let a=o%2===0?n:r,s=o*i-x.HALF_PI,c=Math.cos(s)*a,l=Math.sin(s)*a;o===0?e.moveTo(c,l):e.lineTo(c,l)}e.closePath(),e.fill()}function Gt(e,t){let n=t*2,r=t/4;e.fillRect(-n/2,-r/2,n,r)}function Vt(e,t){let n=t/30;e.save(),e.scale(n,n),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 $t(e,t){let n=t/2;e.beginPath(),e.moveTo(0,-n),e.lineTo(n*.6,0),e.lineTo(0,n),e.lineTo(-n*.6,0),e.closePath(),e.fill()}function jt(e,t){let n=t/2;e.beginPath();for(let r=0;r<6;r++){let i=Math.PI/3*r-Math.PI/6,o=Math.cos(i)*n,a=Math.sin(i)*n;r===0?e.moveTo(o,a):e.lineTo(o,a)}e.closePath(),e.fill()}function Yt(e,t,n){e.strokeStyle=K(n),e.lineWidth=t/8,e.lineCap="round",e.beginPath();for(let r=0;r<22;r++){let i=.35*r,o=(.2+1.5*i)*(t/20),a=o*Math.cos(i),s=o*Math.sin(i);r===0?e.moveTo(a,s):e.lineTo(a,s)}e.stroke()}function Xt(e,t){let n=t,r=t/3,i=t/4;e.beginPath(),e.moveTo(-n/2,0),e.quadraticCurveTo(-n/4,-i,0,0),e.quadraticCurveTo(n/4,i,n/2,0),e.lineTo(n/2,r),e.quadraticCurveTo(n/4,r+i,0,r),e.quadraticCurveTo(-n/4,r-i,-n/2,r),e.closePath(),e.fill()}function Zt(e,t,n){e.font=`${n}px serif`,e.textAlign="center",e.textBaseline="middle",e.fillText(t,0,0)}function Jt(e,t,n){let r=n/2;e.drawImage(t,-r,-r,n,n)}function mt(e){return e.filter(t=>t.active).length}var b=null,U=null,ee=0,ue=null,gt=[],Kt=500;function bt(e){gt.length<Kt&&(e.active=!1,e.trail.length=0,gt.push(e))}var Se=360,Qt=new Float32Array(Se),en=new Float32Array(Se);for(let e=0;e<Se;e++){let t=e*Math.PI/180;Qt[e]=Math.sin(t),en[e]=Math.cos(t)}function tn(e,t){if(!$())throw new Error("ConfettiEngine requires a browser environment");let n={...Ae,...t},r=n.pixelRatio??dt(X.MAX_DPR);if(!b){if(b=document.createElement("canvas"),b.style.cssText=`
|
|
1
|
+
"use strict";var xe=Object.defineProperty;var Mt=Object.getOwnPropertyDescriptor;var Ot=Object.getOwnPropertyNames;var Bt=Object.prototype.hasOwnProperty;var kt=(e,t)=>{for(var n in t)xe(e,n,{get:t[n],enumerable:!0})},_t=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Ot(t))!Bt.call(e,i)&&i!==n&&xe(e,i,{get:()=>t[i],enumerable:!(r=Mt(t,i))||r.enumerable});return e};var zt=e=>_t(xe({},"__esModule",{value:!0}),e);var un={};kt(un,{ConfettiBurst:()=>At,ConfettiButton:()=>Ke,ConfettiEngine:()=>de,DEFAULT_COLORS:()=>me,DEFAULT_CONFIG:()=>_,DEFAULT_DIRECTION:()=>ae,DEFAULT_PARTICLE:()=>se,DEFAULT_PHYSICS:()=>oe,DIRECTION_ANGLES:()=>ge,EASING_FUNCTIONS:()=>rt,clamp:()=>z,confetti:()=>v,createConfettiExplosion:()=>De,default:()=>v,degToRad:()=>S,fireFromElement:()=>Ct,forceCleanup:()=>wt,getActiveAnimationCount:()=>vt,getDirectionAngle:()=>ce,getElementCenter:()=>ct,isBrowser:()=>$,lerp:()=>st,mergeConfig:()=>be,parseColor:()=>J,radToDeg:()=>lt,randomFromArray:()=>Z,randomInRange:()=>m,randomInt:()=>at,rgbaToString:()=>K,useConfetti:()=>j});module.exports=zt(un);var me=["#FF6B6B","#4ECDC4","#FFE66D","#95E1D3","#F38181","#AA96DA","#FCBAD3","#A8D8EA","#FF9A8B","#88D8B0"],oe={gravity:1,drag:.035,friction:.99,rotationSpeed:1,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},ae={direction:"up",spread:55,velocity:[25,50],velocityDecay:.92},se={colors:me,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},V={enabled:!1,length:10,fade:.5,width:.5},Re={enabled:!1,blur:10,color:null,intensity:.5},tt={recycle:!1,numberOfPieces:200,spawnRate:50,run:!0,tweenDuration:5e3},nt={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},Ee={width:null,height:null,autoResize:!0,resizeDebounce:100,frameRate:null,pixelRatio:null,useWorker:!1,useOffscreen:!1};var _={particleCount:50,particle:se,physics:oe,direction:ae,mode:"burst",easing:"easeOut",zIndex:9999,autoCleanup:!0,scalar:1,drift:0,flat:!1},ge={up:90,down:270,left:180,right:0},E={DEG_TO_RAD:Math.PI/180,RAD_TO_DEG:180/Math.PI,TWO_PI:Math.PI*2,HALF_PI:Math.PI/2},rt={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 t=2*Math.PI/3;return e===0?0:e===1?1:Math.pow(2,-10*e)*Math.sin((e*10-.75)*t)+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 le={r:0,g:0,b:0,a:0},X={MAX_PARTICLES:500,FRAME_BUDGET:16.67,MIN_OPACITY:.01,MIN_SIZE:.5,MAX_DPR:2},it=100,Fe=5,ot=.5,k={rainbow:me,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"]},ie={celebration:["🎉","🎊","🥳","✨","🎈"],hearts:["❤️","💕","💖","💗","💓","💘"],stars:["⭐","🌟","✨","💫","⚡"],money:["💰","💵","💸","🤑","💎"],christmas:["🎄","🎅","🎁","❄️","⭐"],halloween:["🎃","👻","🦇","🕷️","💀"],birthday:["🎂","🎁","🎈","🎉","🥳"],food:["🍕","🍔","🍟","🌭","🍿"]},hn={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:[...k.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:[...k.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:[...k.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:ie.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:[...k.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:[...k.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:ie.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:[...k.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:[...k.christmas],shapes:["star","circle"],size:[8,14],images:ie.christmas.map(e=>({src:e,isEmoji:!0}))}}},halloween:{name:"halloween",description:"Spooky Halloween",options:{particleCount:60,particle:{colors:[...k.halloween],shapes:["circle","star"],images:ie.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:[...k.gold,...k.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:[...k.pastel,...k.rainbow],shapes:["star","circle","heart"],images:ie.birthday.map(e=>({src:e,isEmoji:!0})),size:[12,20],lifespan:5e3},direction:{direction:"up",spread:80,velocity:[25,45]}}}};function C(){if(typeof crypto<"u"&&crypto.getRandomValues){let e=new Uint32Array(1);return crypto.getRandomValues(e),e[0]/4294967296}return Math.random()}function m(e,t){return e+C()*(t-e)}function at(e,t){return Math.floor(m(e,t+1))}function Z(e){if(e.length===0)throw new Error("Cannot pick from empty array");return e[Math.floor(C()*e.length)]}function z(e,t,n){return Math.min(Math.max(e,t),n)}function st(e,t,n){return e+(t-e)*z(n,0,1)}function S(e){return e*E.DEG_TO_RAD}function lt(e){return e*E.RAD_TO_DEG}function J(e){if(typeof e=="object"&&"r"in e)return{r:z(Math.round(e.r),0,255),g:z(Math.round(e.g),0,255),b:z(Math.round(e.b),0,255),a:z(e.a,0,1)};if(typeof e=="object"&&"type"in e)return J(e.colors[0]);let t=e.trim().toLowerCase();return t.startsWith("#")?Lt(t):t.startsWith("rgb")?Ht(t):Nt(t)}function Lt(e){let t=e.slice(1),n,r,i,o=1;switch(t.length){case 3:n=parseInt(t[0]+t[0],16),r=parseInt(t[1]+t[1],16),i=parseInt(t[2]+t[2],16);break;case 4:n=parseInt(t[0]+t[0],16),r=parseInt(t[1]+t[1],16),i=parseInt(t[2]+t[2],16),o=parseInt(t[3]+t[3],16)/255;break;case 6:n=parseInt(t.slice(0,2),16),r=parseInt(t.slice(2,4),16),i=parseInt(t.slice(4,6),16);break;case 8:n=parseInt(t.slice(0,2),16),r=parseInt(t.slice(2,4),16),i=parseInt(t.slice(4,6),16),o=parseInt(t.slice(6,8),16)/255;break;default:return le}return isNaN(n)||isNaN(r)||isNaN(i)||isNaN(o)?le:{r:n,g:r,b:i,a:o}}function Ht(e){let t=e.match(/rgba?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([\d.]+))?\s*\)/);return t?{r:z(parseInt(t[1],10),0,255),g:z(parseInt(t[2],10),0,255),b:z(parseInt(t[3],10),0,255),a:t[4]!==void 0?z(parseFloat(t[4]),0,1):1}:le}function Nt(e){let t={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(t[e])return t[e];if(typeof document<"u")try{let n=document.createElement("canvas");n.width=1,n.height=1;let r=n.getContext("2d");if(r){r.fillStyle=e,r.fillRect(0,0,1,1);let i=r.getImageData(0,0,1,1).data;return{r:i[0],g:i[1],b:i[2],a:i[3]/255}}}catch{}return le}function K(e){return`rgba(${e.r}, ${e.g}, ${e.b}, ${e.a})`}function ce(e,t){if(e==="custom"&&t!==void 0)return S(t);if(e==="radial")return C()*E.TWO_PI;let n=ge[e];return S(n??90)}function ct(e){let t=e.getBoundingClientRect();return{x:t.left+t.width/2,y:t.top+t.height/2}}function be(e){if(!e)return _;let t={...se,...e.particle},n={...oe,...e.physics},r={...ae,...e.direction};return{particleCount:e.particleCount??_.particleCount,particle:t,physics:n,direction:r,mode:e.mode??_.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??_.easing,zIndex:e.zIndex??_.zIndex,autoCleanup:e.autoCleanup??_.autoCleanup,scalar:e.scalar??_.scalar,drift:e.drift??_.drift,flat:e.flat??_.flat,onStart:e.onStart,onComplete:e.onComplete,onFrame:e.onFrame,onParticleCreate:e.onParticleCreate,onParticleDeath:e.onParticleDeath}}function $(){return typeof window<"u"&&typeof document<"u"}function ut(e=2){return $()?Math.min(window.devicePixelRatio||1,e):1}function dt(){let e,t;return{promise:new Promise((r,i)=>{e=r,t=i}),resolve:e,reject:t}}var Ut=0;function Q(e,t,n,r,i,o,a,s,c,l,u){let p=m(a[0],a[1]),f=m(s[0],s[1]),h=Z(i),F=typeof h=="string"?J(h):"type"in h?J(h.colors[0]):h,w=1+(C()-.5)*.3,A=Math.cos(n)*r*w,g=-Math.sin(n)*r*w,y;u?.images&&u.images.length>0&&(y=Z(u.images));let d=u?.tiltRange??[-30,30],x=u?.spinSpeedRange??[-15,15],D=u?.aspectRatioRange??[.5,1.5],R=m(D[0],D[1]);return{id:Ut++,x:e,y:t,vx:A,vy:g,size:p,originalSize:p,rotation:C()*E.TWO_PI,rotationSpeed:(C()-.5)*.3*l,color:F,shape:y?"custom":Z(o),opacity:f,originalOpacity:f,life:c,maxLife:c,active:!0,image:y,imageElement:null,trail:[],wobblePhase:C()*E.TWO_PI,wobbleSpeed:m(.8,2.5),tilt:S(m(d[0],d[1])),tiltSpeed:m(x[0],x[1])*.015,depth:u?.depth3D??.6,hasExploded:!1,data:{},flutterPhase:C()*E.TWO_PI,flutterSpeed:m(1.5,3.5),swayPhase:C()*E.TWO_PI,aspectRatio:R,angularVelocity:(C()-.5)*.4,scaleX:1,scaleY:1,shimmerPhase:C()*E.TWO_PI,currentDrag:m(.02,.05)}}function ft(e,t,n,r,i,o,a){if(!e.active)return;let s=t*.05988;if(o?.enabled??V.enabled){let P=e.trail;P.unshift({x:e.x,y:e.y,opacity:e.opacity,size:e.size});let B=o?.length??V.length;P.length>B&&P.pop()}let c=e.vx,l=e.vy,u=e.tilt,p=c*c+l*l,f=u-u*u*u*.166667,h=1+f*.15;if(l+=n.gravity*h*s,(n.flutter??!0)&&p>1){let P=n.flutterSpeed??2.5,B=n.flutterIntensity??.4;e.flutterPhase+=P*.05*s;let N=e.flutterPhase,he=(N-N*N*N*.166667)*B*s,Dt=1-u*u*.5;if(c+=he*Dt,(f<0?-f:f)>.7){let St=he<0?-he:he;l-=St*.3}}let w=n.swayAmplitude??15,A=n.swayFrequency??2;e.swayPhase+=A*.03*s;let g=e.swayPhase,y=(g-g*g*g*.166667)*w*.01*s;c+=y;let d=n.windVariation,x=n.wind+d*(Math.random()-.5);c+=x*s;let D=n.airResistance??.03,R=1-u*u*.5,H=R<0?-R:R,Y=n.drag+H*D,L=p>0?Math.sqrt(p):0,G=Math.max(.9,1-Y*L*.01)*n.friction*n.decay;if(c*=G,l*=G,e.x+=c*s,e.y+=l*s,e.vx=c,e.vy=l,n.tumble&&(e.angularVelocity=(e.angularVelocity+c*.001*s)*.98,e.rotation+=(e.rotationSpeed+e.angularVelocity)*s),e.tiltSpeed=(e.tiltSpeed+(Math.random()-.5)*.002*s)*.995,e.tilt=(e.tilt+e.tiltSpeed*s)%E.TWO_PI,n.wobble){let P=e.wobblePhase+n.wobbleSpeed*.1*s;e.wobblePhase=P;let B=1-P*P*.5,N=P-P*P*P*.166667;e.scaleX=.3+.7*(B<0?-B:B),e.scaleY=.3+.7*(N<0?-N:N)}if(e.shimmerPhase+=.1*s,n.floor!==null&&n.bounce>0&&a){let P=n.floor??a,B=e.size*.5;e.y+B>=P&&(e.y=P-B,e.vy=-e.vy*n.bounce,e.vx*=.85,e.rotationSpeed+=(Math.random()-.5)*.1)}e.life-=t;let et=1-e.life/e.maxLife;if(r){let P=et,B=P*P*(3-2*P);e.opacity=e.originalOpacity*(1-B*.9)}i&&(e.size=e.originalSize*(1-et*.5)),(e.life<=0||e.opacity<X.MIN_OPACITY||e.size<X.MIN_SIZE)&&(e.active=!1)}function pt(e,t,n){if(!t.active)return;let{x:r,y:i,size:o,rotation:a,color:s,shape:c,opacity:l,tilt:u,aspectRatio:p,scaleX:f,scaleY:h,shimmerPhase:F}=t;if(l<.02)return;let w=n?.trailConfig,A=n?.glowConfig;(w?.enabled??V.enabled)&&t.trail.length>0&&Wt(e,t,w??V),e.save();let g=A?.enabled??Re.enabled;g&&(e.shadowBlur=A?.blur??Re.blur,e.shadowColor=A?.color??K(s)),e.translate(r,i),e.rotate(a+u),t.depth>0&&e.scale(f,h);let d=1+(F-Math.floor(F))*.3-.15,x=.7+.3*(f*h<0?-(f*h):f*h),D=l*s.a*x*(g?A?.intensity??1:1);if(D<.02){e.restore();return}e.globalAlpha=D>1?1:D;let R=s.r*d,H=s.g*d,Y=s.b*d;if(e.fillStyle=`rgb(${R>255?255:R},${H>255?255:H},${Y>255?255:Y})`,t.image&&t.image.isEmoji)Jt(e,t.image.src,o*(t.image.scale??1));else if(t.imageElement)Kt(e,t.imageElement,o*(t.image?.scale??1));else if(c==="custom"&&n?.customDraw){let L={ctx:e,particle:t,progress:1-t.life/t.maxLife,elapsed:n.elapsed??0};n.customDraw(L)}else{let L=p??1;switch(c){case"square":case"rectangle":let re=o*(c==="rectangle"?Math.max(1.5,L*1.5):Math.sqrt(L)),G=o/(c==="rectangle"?Math.max(1.5,L):Math.sqrt(L));e.fillRect(-re*.5,-G*.5,re,G);break;case"circle":e.beginPath(),e.arc(0,0,o*.5,0,E.TWO_PI),e.fill();break;case"triangle":qt(e,o);break;case"star":Gt(e,o);break;case"line":Vt(e,o);break;case"heart":$t(e,o);break;case"diamond":jt(e,o);break;case"hexagon":Yt(e,o);break;case"spiral":Xt(e,o,s);break;case"ribbon":Zt(e,o);break;default:e.fillRect(-o*.5,-o*.5,o,o)}}e.restore()}function Wt(e,t,n){let r=n.fade??V.fade,i=n.width??V.width;e.save(),e.lineCap="round",e.lineJoin="round";for(let o=0;o<t.trail.length-1;o++){let a=t.trail[o],s=t.trail[o+1],c=a.opacity*Math.pow(r,o),l=a.size*i*Math.pow(r,o);c>.01&&l>.1&&(e.beginPath(),e.strokeStyle=K({...t.color,a:c}),e.lineWidth=l,e.moveTo(a.x,a.y),e.lineTo(s.x,s.y),e.stroke())}e.restore()}function qt(e,t){let n=t/2;e.beginPath(),e.moveTo(0,-n),e.lineTo(n,n),e.lineTo(-n,n),e.closePath(),e.fill()}function Gt(e,t){let n=t/2,r=n*ot,i=Math.PI/Fe;e.beginPath();for(let o=0;o<Fe*2;o++){let a=o%2===0?n:r,s=o*i-E.HALF_PI,c=Math.cos(s)*a,l=Math.sin(s)*a;o===0?e.moveTo(c,l):e.lineTo(c,l)}e.closePath(),e.fill()}function Vt(e,t){let n=t*2,r=t/4;e.fillRect(-n/2,-r/2,n,r)}function $t(e,t){let n=t/30;e.save(),e.scale(n,n),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 jt(e,t){let n=t/2;e.beginPath(),e.moveTo(0,-n),e.lineTo(n*.6,0),e.lineTo(0,n),e.lineTo(-n*.6,0),e.closePath(),e.fill()}function Yt(e,t){let n=t/2;e.beginPath();for(let r=0;r<6;r++){let i=Math.PI/3*r-Math.PI/6,o=Math.cos(i)*n,a=Math.sin(i)*n;r===0?e.moveTo(o,a):e.lineTo(o,a)}e.closePath(),e.fill()}function Xt(e,t,n){e.strokeStyle=K(n),e.lineWidth=t/8,e.lineCap="round",e.beginPath();for(let r=0;r<22;r++){let i=.35*r,o=(.2+1.5*i)*(t/20),a=o*Math.cos(i),s=o*Math.sin(i);r===0?e.moveTo(a,s):e.lineTo(a,s)}e.stroke()}function Zt(e,t){let n=t,r=t/3,i=t/4;e.beginPath(),e.moveTo(-n/2,0),e.quadraticCurveTo(-n/4,-i,0,0),e.quadraticCurveTo(n/4,i,n/2,0),e.lineTo(n/2,r),e.quadraticCurveTo(n/4,r+i,0,r),e.quadraticCurveTo(-n/4,r-i,-n/2,r),e.closePath(),e.fill()}function Jt(e,t,n){e.font=`${n}px serif`,e.textAlign="center",e.textBaseline="middle",e.fillText(t,0,0)}function Kt(e,t,n){let r=n/2;e.drawImage(t,-r,-r,n,n)}function ht(e){return e.filter(t=>t.active).length}var b=null,U=null,ee=0,ue=null,mt=[],Qt=500;function gt(e){mt.length<Qt&&(e.active=!1,e.trail.length=0,mt.push(e))}var Ae=360,en=new Float32Array(Ae),tn=new Float32Array(Ae);for(let e=0;e<Ae;e++){let t=e*Math.PI/180;en[e]=Math.sin(t),tn[e]=Math.cos(t)}function nn(e,t){if(!$())throw new Error("ConfettiEngine requires a browser environment");let n={...Ee,...t},r=n.pixelRatio??ut(X.MAX_DPR);if(!b){if(b=document.createElement("canvas"),b.style.cssText=`
|
|
2
2
|
position: fixed;
|
|
3
3
|
top: 0;
|
|
4
4
|
left: 0;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
height: 100%;
|
|
7
7
|
pointer-events: none;
|
|
8
8
|
z-index: ${e};
|
|
9
|
-
`,U=b.getContext("2d",{alpha:!0,desynchronized:!0}),!U)throw new Error("Failed to get canvas 2D context");document.body.appendChild(b),n.autoResize&&(ue=()=>{if(b&&U){let a=n.width??window.innerWidth,s=n.height??window.innerHeight;b.width=a*r,b.height=s*r,b.style.width=`${a}px`,b.style.height=`${s}px`,U.scale(r,r)}},window.addEventListener("resize",ue))}b.style.zIndex=String(e);let i=n.width??window.innerWidth,o=n.height??window.innerHeight;return(b.width!==i*r||b.height!==o*r)&&(b.width=i*r,b.height=o*r,b.style.width=`${i}px`,b.style.height=`${o}px`,U.scale(r,r)),{canvas:b,ctx:U,width:i,height:o,dpr:r}}function nn(){b&&ee===0&&setTimeout(()=>{ee===0&&b&&(ue&&(window.removeEventListener("resize",ue),ue=null),b.remove(),b=null,U=null)},ot)}function Ct(e,t,n){let{type:r,x:i,y:o,w:a,h:s}=e;switch(r){case"point":return{x:i,y:o};case"rect":return{x:m(i,i+(a??0)),y:m(o,o+(s??0))};case"line":let c=C();return{x:i+c*(a??0),y:o+c*(s??0)};case"circle":let l=C()*x.TWO_PI,u=Math.sqrt(C())*(a??50);return{x:i+Math.cos(l)*u,y:o+Math.sin(l)*u};default:return{x:i,y:o}}}var de=class{constructor(t,n){this.particles=[];this.canvasContext=null;this.animationFrameId=null;this.lastFrameTime=0;this.lastSpawnTime=0;this.isRunning=!1;this.isPaused=!1;this.deferred=ft();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 t=performance.now(),n=t-this.lastFrameTime;if(this.lastFrameTime=t,this.frameInterval>0){if(t-this.lastRenderTime<this.frameInterval){this.animationFrameId=requestAnimationFrame(this.animate);return}this.lastRenderTime=t}let{ctx:r,width:i,height:o,dpr:a}=this.canvasContext,{physics:s,particle:c}=this.config;r.setTransform(1,0,0,1,0,0),r.clearRect(0,0,i*a,o*a),r.scale(a,a);let l=this.particles,u=l.length,f=0,h=!0,p=100,D=-p,R=i+p,E=-p,g=o+p;for(let v=0;v<u;v++){let d=l[v];if(d.active){if(pt(d,n,s,c.fadeOut,c.scaleDown),d.data?.isRocket&&d.y<=d.data.targetY){d.active=!1,this.explodeFirework(d.x,d.y,d.data);continue}if(d.data?.willExplode&&!d.data.hasExploded&&d.vx*d.vx+d.vy*d.vy<1&&(d.data.hasExploded=!0,this.explodeFirework(d.x,d.y,{burstCount:15,spread:360,burstColors:d.data.burstColors})),d.x<D||d.x>R||d.y<E||d.y>g){(d.y>g||d.x<D-200||d.x>R+200)&&(d.active=!1);continue}ht(r,d,{customDraw:this.drawShape}),f++,h=!1}}if(this.mode==="continuous"||this.mode==="snow"||this.mode==="rain"){let v=t-this.lastSpawnTime,d=1e3/(this.continuousConfig.spawnRate??10);if(v>=d){if(this.continuousConfig.recycle){let A=this.continuousConfig.numberOfPieces-f;if(A>0){for(let T=u-1;T>=0&&A>0;T--)l[T].active||(bt(l[T]),l.splice(T,1));this.spawnParticles(Math.min(A,5))}}else f<this.continuousConfig.numberOfPieces&&this.spawnParticles(Math.min(3,this.continuousConfig.numberOfPieces-f));this.lastSpawnTime=t}}if(this.mode==="firework"){let v=0;for(let I=0;I<u;I++)l[I].active&&l[I].data?.isRocket&&v++;let d=t-this.lastSpawnTime;v===0&&d>=(this.fireworkConfig.burstDelay??500)&&(this.launchFirework(),this.lastSpawnTime=t)}if((this.mode==="burst"||this.mode==="cannon"||this.mode==="explosion")&&h){this.complete();return}this.animationFrameId=requestAnimationFrame(this.animate)};this.origin=t,this.config=Ce(n),this.mode=n?.mode??"burst",this.spawnArea=n?.spawnArea,this.continuousConfig={...nt,...n?.continuous},this.fireworkConfig={...rt,...n?.firework},this.canvasConfig={...Ae,...n?.canvas},this.drawShape=n?.particle?.drawShape,this.canvasConfig.frameRate&&(this.frameInterval=1e3/this.canvasConfig.frameRate)}start(){if(this.isRunning)return this.createHandle();if(!$())return this.deferred.resolve(),this.createHandle();if(this.isRunning=!0,ee++,this.canvasContext=tn(this.config.zIndex,this.canvasConfig),this.mode==="continuous"||this.mode==="snow"||this.mode==="rain"){let t=Math.min(this.continuousConfig.numberOfPieces,Math.floor(this.continuousConfig.numberOfPieces*.5));this.spawnParticles(t)}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:t,particle:n,direction:r,physics:i}=this.config,{x:o,y:a}=this.origin,s=Math.min(t,X.MAX_PARTICLES);for(let c=0;c<s;c++){let l;if(r.direction==="radial")l=C()*x.TWO_PI;else{let h=ce(r.direction,r.angle),p=S(r.spread);l=h+(C()-.5)*p}let u=m(r.velocity[0],r.velocity[1]),f=Q(o,a,l,u,n.colors,n.shapes,n.size,n.opacity,n.lifespan,i.rotationSpeed,{images:n.images,tiltRange:n.tilt,spinSpeedRange:n.spinSpeed,depth3D:n.depth3D});this.particles.push(f)}}spawnParticles(t){if(!this.canvasContext)return;let{particle:n,physics:r}=this.config,{width:i,height:o}=this.canvasContext;for(let a=0;a<t;a++){let s;this.spawnArea?s=Ct(this.spawnArea,i,o):this.mode==="snow"||this.mode==="rain"?s={x:m(0,i),y:-20}:s={x:m(0,i),y:m(-20,0)};let c,l;this.mode==="snow"?(c=S(m(-20,20)-90),l=m(.5,2)):this.mode==="rain"?(c=S(-90),l=m(8,15)):(c=C()*x.TWO_PI,l=m(2,6));let u=Q(s.x,s.y,c,l,n.colors,n.shapes,n.size,n.opacity,n.lifespan,r.rotationSpeed,{images:n.images,tiltRange:n.tilt,spinSpeedRange:n.spinSpeed,depth3D:n.depth3D});this.particles.push(u)}}launchFirework(){if(!this.canvasContext)return;let{width:t,height:n}=this.canvasContext,{launchHeight:r,burstCount:i,spread:o,secondaryExplosions:a,rocketColors:s,burstColors:c,trailLength:l}=this.fireworkConfig,u=this.spawnArea?Ct(this.spawnArea,t,n).x:m(t*.2,t*.8),f=n*(1-r),h=u+m(-50,50),p=Q(u,n,S(-90+m(-10,10)),m(15,25),s,["circle"],[3,5],[1,1],2e3,0);p.data={isRocket:!0,targetY:f,targetX:h,burstCount:i,spread:o,burstColors:c,secondaryExplosions:a,trailLength:l},this.particles.push(p)}explodeFirework(t,n,r){let{burstCount:i=80,spread:o=360,burstColors:a,secondaryExplosions:s}=r,c=a??this.config.particle.colors,l=S(o);for(let u=0;u<i;u++){let f=u/i*l-l/2+S(-90),h=m(4,12),p=Q(t,n,f,h,c,this.config.particle.shapes,[2,6],[.8,1],1500,this.config.physics.rotationSpeed);s&&C()<.1&&(p.data={willExplode:!0,burstColors:c}),this.particles.push(p)}}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 t=this.particles;for(let n=t.length-1;n>=0;n--)bt(t[n]);this.particles=[],this.canvasContext=null,ee--,this.config.autoCleanup&&nn()}addParticles(t){if(!(!this.isRunning||!this.canvasContext))if(this.mode==="continuous"||this.mode==="snow"||this.mode==="rain")this.spawnParticles(t);else{let{particle:n,direction:r,physics:i}=this.config,{x:o,y:a}=this.origin;for(let s=0;s<t;s++){let c;if(r.direction==="radial")c=C()*x.TWO_PI;else{let f=ce(r.direction,r.angle),h=S(r.spread);c=f+(C()-.5)*h}let l=m(r.velocity[0],r.velocity[1]),u=Q(o,a,c,l,n.colors,n.shapes,n.size,n.opacity,n.lifespan,i.rotationSpeed);this.particles.push(u)}}}clear(){this.particles=[]}getParticleCount(){return mt(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:t=>this.addParticles(t),clear:()=>this.clear(),getParticleCount:()=>this.getParticleCount(),getState:()=>this.getState()}}};function fe(e,t){return new de(e,t).start()}function ve(e,t){if(!e||!$())return null;let n=e.getBoundingClientRect(),r={x:n.left+n.width/2,y:n.top+n.height/2};return fe(r,t)}function vt(){return ee}function wt(){b&&(b.remove(),b=null,U=null),ee=0}var O=require("react");function j(){let[e,t]=(0,O.useState)(!1),n=(0,O.useRef)(new Set);(0,O.useEffect)(()=>()=>{n.current.forEach(l=>l.stop()),n.current.clear()},[]);let r=(0,O.useCallback)((l,u)=>{let f=fe(l,u);return n.current.add(f),t(!0),f.promise.then(()=>{n.current.delete(f),n.current.size===0&&t(!1)}),f},[]),i=(0,O.useCallback)((l,u)=>{if(!l)return null;let f=ve(l,u);return f&&(n.current.add(f),t(!0),f.promise.then(()=>{n.current.delete(f),n.current.size===0&&t(!1)})),f},[]),o=(0,O.useCallback)(()=>{n.current.forEach(l=>l.stop()),n.current.clear(),t(!1)},[]),a=(0,O.useCallback)(()=>{n.current.forEach(l=>l.pause())},[]),s=(0,O.useCallback)(()=>{n.current.forEach(l=>l.resume())},[]),c=(0,O.useCallback)(()=>Array.from(n.current),[]);return{fire:r,fireFromElement:i,isActive:e,stopAll:o,pauseAll:a,resumeAll:s,getActiveHandles:c}}var P=require("react");var Oe=require("react/jsx-runtime");function yt({active:e,origin:t,triggerRef:n,options:r,onComplete:i}){let{fire:o,fireFromElement:a}=j(),s=(0,P.useRef)(!1);return(0,P.useEffect)(()=>{if(e&&!s.current){s.current=!0;let c=null;n?.current?c=a(n.current,r):t&&(c=o(t,r)),c&&c.promise.then(()=>{i?.()})}},[e,t,n,r,o,a,i]),(0,P.useEffect)(()=>{e||(s.current=!1)},[e]),null}var rn=(0,P.forwardRef)(({options:e,style:t},n)=>{let r=(0,P.useRef)(null),{fireFromElement:i}=j();return(0,P.useImperativeHandle)(n,()=>({fire:()=>i(r.current,e)})),(0,Oe.jsx)("div",{ref:r,style:{position:"absolute",width:1,height:1,pointerEvents:"none",...t},"aria-hidden":"true"})});rn.displayName="ConfettiTrigger";var Me=(0,P.forwardRef)(({children:e,confettiOptions:t,fireOnClick:n=!0,onClick:r,...i},o)=>{let a=(0,P.useRef)(null),{fireFromElement:s}=j(),c=(0,P.useCallback)(u=>{a.current=u,typeof o=="function"?o(u):o&&(o.current=u)},[o]),l=(0,P.useCallback)(u=>{n&&a.current&&s(a.current,t),r?.(u)},[n,s,t,r]);return(0,Oe.jsx)("button",{ref:c,onClick:l,...i,children:e})});Me.displayName="ConfettiButton";function on({width:e,height:t,numberOfPieces:n=200,confettiSource:r,initialVelocityX:i,initialVelocityY:o,recycle:a=!0,run:s=!0,gravity:c=.3,wind:l=0,opacity:u=1,drawShape:f,tweenDuration:h=100,colors:p,onConfettiComplete:D,frameRate:R}){let{fire:E}=j(),g=(0,P.useRef)(null),v=(0,P.useRef)(!1);return(0,P.useEffect)(()=>{if(!s){g.current&&(g.current.stop(),g.current=null),v.current=!1;return}if(v.current)return;v.current=!0;let d=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},I=typeof i=="number"?[i*.5,i*1.5]:i?[i.min,i.max]:[4,10],A=typeof o=="number"?[o*.5,o*1.5]:o?[o.min,o.max]:[10,30],T=(e??window.innerWidth)/2,N=0;return g.current=E({x:T,y:N},{particleCount:n,particle:{colors:p??["#ff0000","#00ff00","#0000ff","#ffff00","#ff00ff","#00ffff"],opacity:[u*.8,u],shapes:["square","circle","rectangle"],drawShape:f},physics:{gravity:c*10,wind:l*5,windVariation:I[1]-I[0]},direction:{velocity:A},mode:"continuous",spawnArea:d,continuous:{recycle:a,numberOfPieces:n,spawnRate:30,run:s,tweenDuration:h},canvas:{width:e,height:t,frameRate:R,autoResize:!e&&!t},onComplete:D}),()=>{g.current&&(g.current.stop(),g.current=null)}},[s,e,t,n,r,i,o,a,c,l,u,f,h,p,D,R,E]),(0,P.useEffect)(()=>{g.current},[a]),null}on.displayName="Confetti";var An=Math.PI*2,an=Math.PI/180,Pt=1e3/60;function y(){if(typeof crypto<"u"&&crypto.getRandomValues){let e=new Uint32Array(1);return crypto.getRandomValues(e),e[0]/4294967296}return Math.random()}function we(e){return e*an}function q(e,t,n){return Math.min(Math.max(e,t),n)}function Be(e,t){let n=Math.max(0,e-t),r=n/Pt;return Object.freeze({value:n,factor:r})}function It(e){if(typeof e!="string"||e.length>50)return null;let t=e.trim().toLowerCase();if(t.startsWith("#")){let r=t.slice(1);if(!/^[0-9a-f]+$/.test(r))return null;let i,o,a,s=255;if(r.length===3)i=parseInt(r[0]+r[0],16),o=parseInt(r[1]+r[1],16),a=parseInt(r[2]+r[2],16);else if(r.length===6)i=parseInt(r.slice(0,2),16),o=parseInt(r.slice(2,4),16),a=parseInt(r.slice(4,6),16);else if(r.length===8)i=parseInt(r.slice(0,2),16),o=parseInt(r.slice(2,4),16),a=parseInt(r.slice(4,6),16),s=parseInt(r.slice(6,8),16);else return null;return{r:i,g:o,b:a,a:s/255}}let n=t.match(/^rgba?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([\d.]+))?\s*\)$/);return n?{r:q(parseInt(n[1],10),0,255),g:q(parseInt(n[2],10),0,255),b:q(parseInt(n[3],10),0,255),a:n[4]!==void 0?q(parseFloat(n[4]),0,1):1}:null}function ke(e,t){let n=It(e);if(!n)return e;let{r,g:i,b:o,a}=n,s=q(r+t,0,255),c=q(i+t,0,255),l=q(o+t,0,255);return a<1?`rgba(${Math.round(s)}, ${Math.round(c)}, ${Math.round(l)}, ${a})`:`rgb(${Math.round(s)}, ${Math.round(c)}, ${Math.round(l)})`}function te(){if(typeof window>"u")return!1;try{return window.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1}catch{return!1}}var sn=0;function pe(){return++sn}function ye(e){if(e.length===0)return;let t=Math.floor(y()*e.length);return e[t]}function Pe(e){return typeof requestAnimationFrame<"u"?requestAnimationFrame(e):setTimeout(e,Pt)}function _e(e){typeof cancelAnimationFrame<"u"?cancelAnimationFrame(e):clearTimeout(e)}function ze(){return typeof window>"u"?1:Math.min(window.devicePixelRatio||1,2)}var Tt=Object.freeze(["#26ccff","#a25afd","#ff5e7e","#88ff5a","#fcff42","#ffa62d","#ff36ff"]),ln=Object.freeze(["square","circle"]),Ie=Math.PI*2,Te=class e{constructor(t,n,r,i,o,a,s,c,l,u,f,h,p,D,R,E,g){this.id=t,this.position=n,this.velocity=r,this.angle2D=i,this.gravity=o,this.drift=a,this.decay=s,this.wobble=c,this.tilt=l,this.roll=u,this.rotate=f,this.color=h,this.shape=p,this.size=D,this.scalar=R,this.flat=E,this.tick=0,this.totalTicks=g,this.destroyed=!1,this.opacity=1}static create(t,n,r={}){let{angle:i=90,spread:o=45,startVelocity:a=45,decay:s=.94,gravity:c=1,drift:l=0,flat:u=!1,ticks:f=200,origin:h={x:.5,y:.5},colors:p=Tt,shapes:D=ln,scalar:R=1,size:E=4}=r,g={x:h.x*t,y:h.y*n},v=we(i),d=we(o),I=-v+(.5*d-y()*d),A=a*.5+y()*a,T={angle:y()*Ie,angleSpeed:y()*.1+.05,moveSpeed:-15+y()*30,distance:25+y()*15},N={value:y()*Ie,sinDirection:y()>=.5?1:-1,cosDirection:y()>=.5?1:-1,speed:(y()*.4+.3)*(y()>.5?1:-1),enable:!u},Y={angle:y()*Ie,speed:(15+y()*10)/60,horizontal:y()>.3,vertical:y()>.7,enable:!u},L={angle:y()*Ie,speed:(y()*2-1)*.1,enable:!u},re=ye(p)??Tt[0],G=ye(D)??"square";return new e(pe(),g,A,I,c*3,l,s,T,N,Y,L,re,G,E,R,u,f)}get progress(){return this.tick/this.totalTicks}get computedSize(){return this.size*this.scalar}destroy(){this.destroyed=!0}clone(t){let n=Object.create(e.prototype);return Object.assign(n,this,t),n}},xe=class{constructor(t=1e3){this.pool=[];this.maxSize=t}acquire(t,n,r){let i=this.pool.pop();return i?this.resetParticle(i,t,n,r):Te.create(t,n,r)}release(t){this.pool.length<this.maxSize&&(t.destroyed=!0,this.pool.push(t))}clear(){this.pool.length=0}get size(){return this.pool.length}resetParticle(t,n,r,i){let o=Te.create(n,r,i);return Object.assign(t,o,{id:t.id}),t.destroyed=!1,t}};var M=Math.PI*2,Le=class{constructor(){this.id="base"}init(t){}isEnabled(t){return!t.destroyed}update(t,n){if(t.destroyed)return;let r=Math.cos(t.angle2D)*t.velocity,i=Math.sin(t.angle2D)*t.velocity;t.position.x+=r*n.factor+t.drift*n.factor,t.position.y+=i*n.factor+t.gravity*n.factor,t.velocity*=t.decay,t.tick++;let o=t.tick/t.totalTicks;t.opacity=1-Math.pow(o,2),t.tick>=t.totalTicks&&(t.destroyed=!0)}},Ne=class{constructor(){this.id="wobble"}init(t){t.wobble||(t.wobble={angle:Math.random()*M,angleSpeed:Math.random()*.1+.05,moveSpeed:-15+Math.random()*30,distance:25+Math.random()*15})}isEnabled(t){return!t.destroyed&&!t.flat&&!!t.wobble}update(t,n){if(!this.isEnabled(t))return;let r=t.wobble;r.angle+=r.angleSpeed*n.factor,r.angle>M&&(r.angle-=M);let i=Math.cos(r.angle)*r.distance*.1;t.position.x+=i*n.factor}},He=class{constructor(){this.id="tilt"}init(t){t.tilt||(t.tilt={value:Math.random()*M,sinDirection:Math.random()>=.5?1:-1,cosDirection:Math.random()>=.5?1:-1,speed:(Math.random()*.4+.3)*(Math.random()>.5?1:-1),enable:!t.flat})}isEnabled(t){return!t.destroyed&&t.tilt?.enable===!0}update(t,n){if(!this.isEnabled(t))return;let r=t.tilt;r.value+=r.speed*.01*n.factor,r.value>M?r.value-=M:r.value<0&&(r.value+=M)}getTransformValues(t){if(!t.tilt?.enable)return{};let n=t.tilt;return{b:Math.cos(n.value)*n.cosDirection*.5,c:Math.sin(n.value)*n.sinDirection*.5}}},Ue=class{constructor(){this.id="roll"}init(t){t.roll||(t.roll={angle:Math.random()*M,speed:(15+Math.random()*10)/60,horizontal:Math.random()>.3,vertical:Math.random()>.7,enable:!t.flat})}isEnabled(t){return!t.destroyed&&t.roll?.enable===!0}update(t,n){if(!this.isEnabled(t))return;let r=t.roll;r.angle+=r.speed*n.factor,r.angle>M&&(r.angle-=M)}getTransformValues(t){if(!t.roll?.enable)return{};let n=t.roll;return{a:n.horizontal?Math.abs(Math.cos(n.angle)):void 0,d:n.vertical?Math.abs(Math.sin(n.angle)):void 0}}getDarkenAmount(t){if(!t.roll?.enable)return 0;let n=t.roll;return!n.horizontal&&!n.vertical?0:(n.horizontal?Math.cos(n.angle):Math.sin(n.angle))<0?25:0}},qe=class{constructor(){this.id="rotate"}init(t){t.rotate||(t.rotate={angle:Math.random()*M,speed:(Math.random()*2-1)*.1,enable:!t.flat})}isEnabled(t){return!t.destroyed&&t.rotate?.enable===!0}update(t,n){if(!this.isEnabled(t))return;let r=t.rotate;r.angle+=r.speed*n.factor,r.angle>M?r.angle-=M:r.angle<0&&(r.angle+=M)}},We=class{constructor(){this.id="opacity"}init(t){t.opacity=1}isEnabled(t){return!t.destroyed}update(t,n){if(!this.isEnabled(t))return;let r=t.tick/t.totalTicks;t.opacity=1-Math.pow(r,2)}};function xt(){return[new Le,new Ne,new He,new Ue,new qe,new We]}var Rt=Math.PI*2,Ge=class{constructor(){this.type="circle"}draw(t,n,r){let i=n.flat?1:.6+Math.sin(n.wobble.angle)*.4;t.ellipse(0,0,r*i,r*(1-i*.3),n.tilt?.value??0,0,Rt)}},Ve=class{constructor(){this.type="square"}draw(t,n,r){let i=n.flat?0:Math.sin(n.wobble.angle)*r*.3;t.moveTo(-r+i,-r),t.lineTo(r+i,-r*.5),t.lineTo(r-i,r),t.lineTo(-r-i,r*.5)}},$e=class{constructor(){this.type="rectangle"}draw(t,n,r){let i=r*1.5,o=r*.6,a=n.flat?0:Math.sin(n.wobble.angle)*o*.2;t.moveTo(-i+a,-o),t.lineTo(i+a,-o*.5),t.lineTo(i-a,o),t.lineTo(-i-a,o*.5)}},je=class{constructor(){this.type="star"}draw(t,n,r){let i=r,o=r*.5,a=5,s=Math.PI/a,c=-Math.PI/2;t.moveTo(0,-i);for(let l=0;l<a;l++)t.lineTo(Math.cos(c)*i,Math.sin(c)*i),c+=s,t.lineTo(Math.cos(c)*o,Math.sin(c)*o),c+=s}},Ye=class{constructor(){this.type="triangle"}draw(t,n,r){let i=r*Math.sqrt(3)/2;t.moveTo(0,-i),t.lineTo(-r,i),t.lineTo(r,i)}},Xe=class{constructor(){this.type="diamond"}draw(t,n,r){t.moveTo(0,-r),t.lineTo(r*.6,0),t.lineTo(0,r),t.lineTo(-r*.6,0)}},Ze=class{constructor(){this.type="heart"}draw(t,n,r){let o=-r*.3,a=r*.3;t.moveTo(0,o+a),t.bezierCurveTo(0-r,o,0-r,o-a*2,0,o-a),t.bezierCurveTo(0+r,o-a*2,0+r,o,0,o+a)}},Je=class{constructor(){this.type="hexagon"}draw(t,n,r){let o=Rt/6;for(let a=0;a<6;a++){let s=o*a-Math.PI/2,c=Math.cos(s)*r,l=Math.sin(s)*r;a===0?t.moveTo(c,l):t.lineTo(c,l)}}},Ke=class{constructor(){this.drawers=new Map;this.register(new Ge),this.register(new Ve),this.register(new $e),this.register(new je),this.register(new Ye),this.register(new Xe),this.register(new Ze),this.register(new Je)}register(t){this.drawers.set(t.type,t)}get(t){return this.drawers.get(t)}has(t){return this.drawers.has(t)}getTypes(){return Array.from(this.drawers.keys())}unregister(t){return this.drawers.delete(t)}clear(){this.drawers.clear()}},ne=new Ke;var W=class{constructor(t={}){this.destroyed=!1;this.t=[];this.n=null;this.m=0;this.i=null;this.p=!1;this.o=null;this.P=t=>{if(this.destroyed)return;let n=Be(t,this.m);this.m=t,this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height);let r=!1,i=[];for(let o=0;o<this.t.length;o++){let a=this.t[o];if(a.destroyed){i.push(o);continue}for(let s of this.e)s.isEnabled(a)&&s.update(a,n);if(a.destroyed){i.push(o);continue}r=!0,this.E(a)}for(let o=i.length-1;o>=0;o--){let a=i[o],s=this.t[a];this.l.release(s),this.t.splice(a,1)}r?this.n=Pe(this.P):(this.n=null,this.i?.(),this.i=null)};this.I=()=>{this.v()};this.id=`confetti-${pe()}`,this.f={canvas:t.canvas,resize:t.resize??!0,zIndex:t.zIndex??100,disableForReducedMotion:t.disableForReducedMotion??!1},t.canvas?this.canvas=t.canvas:(this.canvas=this.T(),this.p=!0);let n=this.canvas.getContext("2d",{alpha:!0,desynchronized:!0});if(!n)throw new Error("Failed to get 2D canvas context");this.ctx=n,this.e=xt(),this.l=new xe(500),this.f.resize&&this.R(),this.v()}get particles(){return this.t}async fire(t={}){if(this.f.disableForReducedMotion&&te())return Promise.resolve();if(this.destroyed)throw new Error("Cannot fire on destroyed container");let n=t.particleCount??100,r=this.canvas.width,i=this.canvas.height;for(let o=0;o<n;o++){let a=this.l.acquire(r,i,t);for(let s of this.e)s.init(a);this.t.push(a)}return this.n?new Promise(o=>{let a=this.i;this.i=()=>{a?.(),o()}}):new Promise(o=>{this.i=o,this.m=performance.now(),this.n=Pe(this.P)})}stop(){this.n&&(_e(this.n),this.n=null);for(let t of this.t)this.l.release(t);this.t.length=0,this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.i?.(),this.i=null}reset(){this.stop(),this.l.clear()}destroy(){this.destroyed||(this.stop(),this.o&&(this.o.disconnect(),this.o=null),this.p&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.destroyed=!0)}E(t){let n=this.ctx,r=t.size*t.scalar,i={a:1,b:0,c:0,d:1};for(let l of this.e)if(l.getTransformValues){let u=l.getTransformValues(t);u.a!==void 0&&(i.a=u.a),u.b!==void 0&&(i.b=u.b),u.c!==void 0&&(i.c=u.c),u.d!==void 0&&(i.d=u.d)}let a=this.e.find(l=>l.id==="roll")?.getDarkenAmount(t)??0,s=a>0?ke(t.color,-a):t.color;n.save(),n.translate(t.position.x,t.position.y),n.rotate(t.rotate?.angle??0),n.transform(i.a??1,i.b??0,i.c??0,i.d??1,0,0),n.fillStyle=s,n.globalAlpha=t.opacity,n.beginPath();let c=ne.get(t.shape);c?c.draw(n,t,r):ne.get("square")?.draw(n,t,r),n.closePath(),n.fill(),n.restore()}T(){let t=document.createElement("canvas");return t.id=this.id,t.style.cssText=`
|
|
9
|
+
`,U=b.getContext("2d",{alpha:!0,desynchronized:!0}),!U)throw new Error("Failed to get canvas 2D context");document.body.appendChild(b),n.autoResize&&(ue=()=>{if(b&&U){let a=n.width??window.innerWidth,s=n.height??window.innerHeight;b.width=a*r,b.height=s*r,b.style.width=`${a}px`,b.style.height=`${s}px`,U.scale(r,r)}},window.addEventListener("resize",ue))}b.style.zIndex=String(e);let i=n.width??window.innerWidth,o=n.height??window.innerHeight;return(b.width!==i*r||b.height!==o*r)&&(b.width=i*r,b.height=o*r,b.style.width=`${i}px`,b.style.height=`${o}px`,U.scale(r,r)),{canvas:b,ctx:U,width:i,height:o,dpr:r}}function rn(){b&&ee===0&&setTimeout(()=>{ee===0&&b&&(ue&&(window.removeEventListener("resize",ue),ue=null),b.remove(),b=null,U=null)},it)}function bt(e,t,n){let{type:r,x:i,y:o,w:a,h:s}=e;switch(r){case"point":return{x:i,y:o};case"rect":return{x:m(i,i+(a??0)),y:m(o,o+(s??0))};case"line":let c=C();return{x:i+c*(a??0),y:o+c*(s??0)};case"circle":let l=C()*E.TWO_PI,u=Math.sqrt(C())*(a??50);return{x:i+Math.cos(l)*u,y:o+Math.sin(l)*u};default:return{x:i,y:o}}}var de=class{constructor(t,n){this.particles=[];this.canvasContext=null;this.animationFrameId=null;this.lastFrameTime=0;this.lastSpawnTime=0;this.isRunning=!1;this.isPaused=!1;this.deferred=dt();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 t=performance.now(),n=t-this.lastFrameTime;if(this.lastFrameTime=t,this.frameInterval>0){if(t-this.lastRenderTime<this.frameInterval){this.animationFrameId=requestAnimationFrame(this.animate);return}this.lastRenderTime=t}let{ctx:r,width:i,height:o,dpr:a}=this.canvasContext,{physics:s,particle:c}=this.config;r.setTransform(1,0,0,1,0,0),r.clearRect(0,0,i*a,o*a),r.scale(a,a);let l=this.particles,u=l.length,p=0,f=!0,h=100,F=-h,w=i+h,A=-h,g=o+h;for(let y=0;y<u;y++){let d=l[y];if(d.active){if(ft(d,n,s,c.fadeOut,c.scaleDown),d.data?.isRocket&&d.y<=d.data.targetY){d.active=!1,this.explodeFirework(d.x,d.y,d.data);continue}if(d.data?.willExplode&&!d.data.hasExploded&&d.vx*d.vx+d.vy*d.vy<1&&(d.data.hasExploded=!0,this.explodeFirework(d.x,d.y,{burstCount:15,spread:360,burstColors:d.data.burstColors})),d.x<F||d.x>w||d.y<A||d.y>g){(d.y>g||d.x<F-200||d.x>w+200)&&(d.active=!1);continue}pt(r,d,{customDraw:this.drawShape}),p++,f=!1}}if(this.mode==="continuous"||this.mode==="snow"||this.mode==="rain"){let y=t-this.lastSpawnTime,d=1e3/(this.continuousConfig.spawnRate??10);if(y>=d){if(this.continuousConfig.recycle){let D=this.continuousConfig.numberOfPieces-p;if(D>0){for(let R=u-1;R>=0&&D>0;R--)l[R].active||(gt(l[R]),l.splice(R,1));this.spawnParticles(Math.min(D,5))}}else p<this.continuousConfig.numberOfPieces&&this.spawnParticles(Math.min(3,this.continuousConfig.numberOfPieces-p));this.lastSpawnTime=t}}if(this.mode==="firework"){let y=0;for(let x=0;x<u;x++)l[x].active&&l[x].data?.isRocket&&y++;let d=t-this.lastSpawnTime;y===0&&d>=(this.fireworkConfig.burstDelay??500)&&(this.launchFirework(),this.lastSpawnTime=t)}if((this.mode==="burst"||this.mode==="cannon"||this.mode==="explosion")&&f){this.complete();return}this.animationFrameId=requestAnimationFrame(this.animate)};this.origin=t,this.config=be(n),this.mode=n?.mode??"burst",this.spawnArea=n?.spawnArea,this.continuousConfig={...tt,...n?.continuous},this.fireworkConfig={...nt,...n?.firework},this.canvasConfig={...Ee,...n?.canvas},this.drawShape=n?.particle?.drawShape,this.canvasConfig.frameRate&&(this.frameInterval=1e3/this.canvasConfig.frameRate)}start(){if(this.isRunning)return this.createHandle();if(!$())return this.deferred.resolve(),this.createHandle();if(this.isRunning=!0,ee++,this.canvasContext=nn(this.config.zIndex,this.canvasConfig),this.mode==="continuous"||this.mode==="snow"||this.mode==="rain"){let t=Math.min(this.continuousConfig.numberOfPieces,Math.floor(this.continuousConfig.numberOfPieces*.5));this.spawnParticles(t)}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:t,particle:n,direction:r,physics:i}=this.config,{x:o,y:a}=this.origin,s=Math.min(t,X.MAX_PARTICLES);for(let c=0;c<s;c++){let l;if(r.direction==="radial")l=C()*E.TWO_PI;else{let f=ce(r.direction,r.angle),h=S(r.spread);l=f+(C()-.5)*h}let u=m(r.velocity[0],r.velocity[1]),p=Q(o,a,l,u,n.colors,n.shapes,n.size,n.opacity,n.lifespan,i.rotationSpeed,{images:n.images,tiltRange:n.tilt,spinSpeedRange:n.spinSpeed,depth3D:n.depth3D});this.particles.push(p)}}spawnParticles(t){if(!this.canvasContext)return;let{particle:n,physics:r}=this.config,{width:i,height:o}=this.canvasContext;for(let a=0;a<t;a++){let s;this.spawnArea?s=bt(this.spawnArea,i,o):this.mode==="snow"||this.mode==="rain"?s={x:m(0,i),y:-20}:s={x:m(0,i),y:m(-20,0)};let c,l;this.mode==="snow"?(c=S(m(-20,20)-90),l=m(.5,2)):this.mode==="rain"?(c=S(-90),l=m(8,15)):(c=C()*E.TWO_PI,l=m(2,6));let u=Q(s.x,s.y,c,l,n.colors,n.shapes,n.size,n.opacity,n.lifespan,r.rotationSpeed,{images:n.images,tiltRange:n.tilt,spinSpeedRange:n.spinSpeed,depth3D:n.depth3D});this.particles.push(u)}}launchFirework(){if(!this.canvasContext)return;let{width:t,height:n}=this.canvasContext,{launchHeight:r,burstCount:i,spread:o,secondaryExplosions:a,rocketColors:s,burstColors:c,trailLength:l}=this.fireworkConfig,u=this.spawnArea?bt(this.spawnArea,t,n).x:m(t*.2,t*.8),p=n*(1-r),f=u+m(-50,50),h=Q(u,n,S(-90+m(-10,10)),m(15,25),s,["circle"],[3,5],[1,1],2e3,0);h.data={isRocket:!0,targetY:p,targetX:f,burstCount:i,spread:o,burstColors:c,secondaryExplosions:a,trailLength:l},this.particles.push(h)}explodeFirework(t,n,r){let{burstCount:i=80,spread:o=360,burstColors:a,secondaryExplosions:s}=r,c=a??this.config.particle.colors,l=S(o);for(let u=0;u<i;u++){let p=u/i*l-l/2+S(-90),f=m(4,12),h=Q(t,n,p,f,c,this.config.particle.shapes,[2,6],[.8,1],1500,this.config.physics.rotationSpeed);s&&C()<.1&&(h.data={willExplode:!0,burstColors:c}),this.particles.push(h)}}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 t=this.particles;for(let n=t.length-1;n>=0;n--)gt(t[n]);this.particles=[],this.canvasContext=null,ee--,this.config.autoCleanup&&rn()}addParticles(t){if(!(!this.isRunning||!this.canvasContext))if(this.mode==="continuous"||this.mode==="snow"||this.mode==="rain")this.spawnParticles(t);else{let{particle:n,direction:r,physics:i}=this.config,{x:o,y:a}=this.origin;for(let s=0;s<t;s++){let c;if(r.direction==="radial")c=C()*E.TWO_PI;else{let p=ce(r.direction,r.angle),f=S(r.spread);c=p+(C()-.5)*f}let l=m(r.velocity[0],r.velocity[1]),u=Q(o,a,c,l,n.colors,n.shapes,n.size,n.opacity,n.lifespan,i.rotationSpeed);this.particles.push(u)}}}clear(){this.particles=[]}getParticleCount(){return ht(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:t=>this.addParticles(t),clear:()=>this.clear(),getParticleCount:()=>this.getParticleCount(),getState:()=>this.getState()}}};function De(e,t){return new de(e,t).start()}function Ct(e,t){if(!e||!$())return null;let n=e.getBoundingClientRect(),r={x:n.left+n.width/2,y:n.top+n.height/2};return De(r,t)}function vt(){return ee}function wt(){b&&(b.remove(),b=null,U=null),ee=0}var O=require("react");var xn=Math.PI*2,on=Math.PI/180,yt=1e3/60;function I(){if(typeof crypto<"u"&&crypto.getRandomValues){let e=new Uint32Array(1);return crypto.getRandomValues(e),e[0]/4294967296}return Math.random()}function Ce(e){return e*on}function W(e,t,n){return Math.min(Math.max(e,t),n)}function Se(e,t){let n=Math.max(0,e-t),r=n/yt;return Object.freeze({value:n,factor:r})}function Pt(e){if(typeof e!="string"||e.length>50)return null;let t=e.trim().toLowerCase();if(t.startsWith("#")){let r=t.slice(1);if(!/^[0-9a-f]+$/.test(r))return null;let i,o,a,s=255;if(r.length===3)i=parseInt(r[0]+r[0],16),o=parseInt(r[1]+r[1],16),a=parseInt(r[2]+r[2],16);else if(r.length===6)i=parseInt(r.slice(0,2),16),o=parseInt(r.slice(2,4),16),a=parseInt(r.slice(4,6),16);else if(r.length===8)i=parseInt(r.slice(0,2),16),o=parseInt(r.slice(2,4),16),a=parseInt(r.slice(4,6),16),s=parseInt(r.slice(6,8),16);else return null;return{r:i,g:o,b:a,a:s/255}}let n=t.match(/^rgba?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([\d.]+))?\s*\)$/);return n?{r:W(parseInt(n[1],10),0,255),g:W(parseInt(n[2],10),0,255),b:W(parseInt(n[3],10),0,255),a:n[4]!==void 0?W(parseFloat(n[4]),0,1):1}:null}function Me(e,t){let n=Pt(e);if(!n)return e;let{r,g:i,b:o,a}=n,s=W(r+t,0,255),c=W(i+t,0,255),l=W(o+t,0,255);return a<1?`rgba(${Math.round(s)}, ${Math.round(c)}, ${Math.round(l)}, ${a})`:`rgb(${Math.round(s)}, ${Math.round(c)}, ${Math.round(l)})`}function te(){if(typeof window>"u")return!1;try{return window.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1}catch{return!1}}var an=0;function fe(){return++an}function ve(e){if(e.length===0)return;let t=Math.floor(I()*e.length);return e[t]}function we(e){return typeof requestAnimationFrame<"u"?requestAnimationFrame(e):setTimeout(e,yt)}function Oe(e){typeof cancelAnimationFrame<"u"?cancelAnimationFrame(e):clearTimeout(e)}function Be(){return typeof window>"u"?1:Math.min(window.devicePixelRatio||1,2)}var It=Object.freeze(["#26ccff","#a25afd","#ff5e7e","#88ff5a","#fcff42","#ffa62d","#ff36ff"]),sn=Object.freeze(["square","circle"]),ye=Math.PI*2,Pe=class e{constructor(t,n,r,i,o,a,s,c,l,u,p,f,h,F,w,A,g){this.id=t,this.position=n,this.velocity=r,this.angle2D=i,this.gravity=o,this.drift=a,this.decay=s,this.wobble=c,this.tilt=l,this.roll=u,this.rotate=p,this.color=f,this.shape=h,this.size=F,this.scalar=w,this.flat=A,this.tick=0,this.totalTicks=g,this.destroyed=!1,this.opacity=1}static create(t,n,r={}){let{angle:i=90,spread:o=45,startVelocity:a=45,decay:s=.94,gravity:c=1,drift:l=0,flat:u=!1,ticks:p=200,origin:f={x:.5,y:.5},colors:h=It,shapes:F=sn,scalar:w=1,size:A=4}=r,g={x:f.x*t,y:f.y*n},y=Ce(i),d=Ce(o),x=-y+(.5*d-I()*d),D=a*.5+I()*a,R={angle:I()*ye,angleSpeed:I()*.1+.05,moveSpeed:-15+I()*30,distance:25+I()*15},H={value:I()*ye,sinDirection:I()>=.5?1:-1,cosDirection:I()>=.5?1:-1,speed:(I()*.4+.3)*(I()>.5?1:-1),enable:!u},Y={angle:I()*ye,speed:(15+I()*10)/60,horizontal:I()>.3,vertical:I()>.7,enable:!u},L={angle:I()*ye,speed:(I()*2-1)*.1,enable:!u},re=ve(h)??It[0],G=ve(F)??"square";return new e(fe(),g,D,x,c*3,l,s,R,H,Y,L,re,G,A,w,u,p)}get progress(){return this.tick/this.totalTicks}get computedSize(){return this.size*this.scalar}destroy(){this.destroyed=!0}clone(t){let n=Object.create(e.prototype);return Object.assign(n,this,t),n}},Ie=class{constructor(t=1e3){this.pool=[];this.maxSize=t}acquire(t,n,r){let i=this.pool.pop();return i?this.resetParticle(i,t,n,r):Pe.create(t,n,r)}release(t){this.pool.length<this.maxSize&&(t.destroyed=!0,this.pool.push(t))}clear(){this.pool.length=0}get size(){return this.pool.length}resetParticle(t,n,r,i){let o=Pe.create(n,r,i);return Object.assign(t,o,{id:t.id}),t.destroyed=!1,t}};var M=Math.PI*2,ke=class{constructor(){this.id="base"}init(t){}isEnabled(t){return!t.destroyed}update(t,n){if(t.destroyed)return;let r=Math.cos(t.angle2D)*t.velocity,i=Math.sin(t.angle2D)*t.velocity;t.position.x+=r*n.factor+t.drift*n.factor,t.position.y+=i*n.factor+t.gravity*n.factor,t.velocity*=t.decay,t.tick++;let o=t.tick/t.totalTicks;t.opacity=1-Math.pow(o,2),t.tick>=t.totalTicks&&(t.destroyed=!0)}},_e=class{constructor(){this.id="wobble"}init(t){t.wobble||(t.wobble={angle:Math.random()*M,angleSpeed:Math.random()*.1+.05,moveSpeed:-15+Math.random()*30,distance:25+Math.random()*15})}isEnabled(t){return!t.destroyed&&!t.flat&&!!t.wobble}update(t,n){if(!this.isEnabled(t))return;let r=t.wobble;r.angle+=r.angleSpeed*n.factor,r.angle>M&&(r.angle-=M);let i=Math.cos(r.angle)*r.distance*.1;t.position.x+=i*n.factor}},ze=class{constructor(){this.id="tilt"}init(t){t.tilt||(t.tilt={value:Math.random()*M,sinDirection:Math.random()>=.5?1:-1,cosDirection:Math.random()>=.5?1:-1,speed:(Math.random()*.4+.3)*(Math.random()>.5?1:-1),enable:!t.flat})}isEnabled(t){return!t.destroyed&&t.tilt?.enable===!0}update(t,n){if(!this.isEnabled(t))return;let r=t.tilt;r.value+=r.speed*.01*n.factor,r.value>M?r.value-=M:r.value<0&&(r.value+=M)}getTransformValues(t){if(!t.tilt?.enable)return{};let n=t.tilt;return{b:Math.cos(n.value)*n.cosDirection*.5,c:Math.sin(n.value)*n.sinDirection*.5}}},Le=class{constructor(){this.id="roll"}init(t){t.roll||(t.roll={angle:Math.random()*M,speed:(15+Math.random()*10)/60,horizontal:Math.random()>.3,vertical:Math.random()>.7,enable:!t.flat})}isEnabled(t){return!t.destroyed&&t.roll?.enable===!0}update(t,n){if(!this.isEnabled(t))return;let r=t.roll;r.angle+=r.speed*n.factor,r.angle>M&&(r.angle-=M)}getTransformValues(t){if(!t.roll?.enable)return{};let n=t.roll;return{a:n.horizontal?Math.abs(Math.cos(n.angle)):void 0,d:n.vertical?Math.abs(Math.sin(n.angle)):void 0}}getDarkenAmount(t){if(!t.roll?.enable)return 0;let n=t.roll;return!n.horizontal&&!n.vertical?0:(n.horizontal?Math.cos(n.angle):Math.sin(n.angle))<0?25:0}},He=class{constructor(){this.id="rotate"}init(t){t.rotate||(t.rotate={angle:Math.random()*M,speed:(Math.random()*2-1)*.1,enable:!t.flat})}isEnabled(t){return!t.destroyed&&t.rotate?.enable===!0}update(t,n){if(!this.isEnabled(t))return;let r=t.rotate;r.angle+=r.speed*n.factor,r.angle>M?r.angle-=M:r.angle<0&&(r.angle+=M)}},Ne=class{constructor(){this.id="opacity"}init(t){t.opacity=1}isEnabled(t){return!t.destroyed}update(t,n){if(!this.isEnabled(t))return;let r=t.tick/t.totalTicks;t.opacity=1-Math.pow(r,2)}};function Tt(){return[new ke,new _e,new ze,new Le,new He,new Ne]}var xt=Math.PI*2,Ue=class{constructor(){this.type="circle"}draw(t,n,r){let i=n.flat?1:.6+Math.sin(n.wobble.angle)*.4;t.ellipse(0,0,r*i,r*(1-i*.3),n.tilt?.value??0,0,xt)}},We=class{constructor(){this.type="square"}draw(t,n,r){let i=n.flat?0:Math.sin(n.wobble.angle)*r*.3;t.moveTo(-r+i,-r),t.lineTo(r+i,-r*.5),t.lineTo(r-i,r),t.lineTo(-r-i,r*.5)}},qe=class{constructor(){this.type="rectangle"}draw(t,n,r){let i=r*1.5,o=r*.6,a=n.flat?0:Math.sin(n.wobble.angle)*o*.2;t.moveTo(-i+a,-o),t.lineTo(i+a,-o*.5),t.lineTo(i-a,o),t.lineTo(-i-a,o*.5)}},Ge=class{constructor(){this.type="star"}draw(t,n,r){let i=r,o=r*.5,a=5,s=Math.PI/a,c=-Math.PI/2;t.moveTo(0,-i);for(let l=0;l<a;l++)t.lineTo(Math.cos(c)*i,Math.sin(c)*i),c+=s,t.lineTo(Math.cos(c)*o,Math.sin(c)*o),c+=s}},Ve=class{constructor(){this.type="triangle"}draw(t,n,r){let i=r*Math.sqrt(3)/2;t.moveTo(0,-i),t.lineTo(-r,i),t.lineTo(r,i)}},$e=class{constructor(){this.type="diamond"}draw(t,n,r){t.moveTo(0,-r),t.lineTo(r*.6,0),t.lineTo(0,r),t.lineTo(-r*.6,0)}},je=class{constructor(){this.type="heart"}draw(t,n,r){let o=-r*.3,a=r*.3;t.moveTo(0,o+a),t.bezierCurveTo(0-r,o,0-r,o-a*2,0,o-a),t.bezierCurveTo(0+r,o-a*2,0+r,o,0,o+a)}},Ye=class{constructor(){this.type="hexagon"}draw(t,n,r){let o=xt/6;for(let a=0;a<6;a++){let s=o*a-Math.PI/2,c=Math.cos(s)*r,l=Math.sin(s)*r;a===0?t.moveTo(c,l):t.lineTo(c,l)}}},Xe=class{constructor(){this.drawers=new Map;this.register(new Ue),this.register(new We),this.register(new qe),this.register(new Ge),this.register(new Ve),this.register(new $e),this.register(new je),this.register(new Ye)}register(t){this.drawers.set(t.type,t)}get(t){return this.drawers.get(t)}has(t){return this.drawers.has(t)}getTypes(){return Array.from(this.drawers.keys())}unregister(t){return this.drawers.delete(t)}clear(){this.drawers.clear()}},ne=new Xe;var q=class{constructor(t={}){this.destroyed=!1;this.t=[];this.n=null;this.m=0;this.i=null;this.p=!1;this.o=null;this.P=t=>{if(this.destroyed)return;let n=Se(t,this.m);this.m=t,this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height);let r=!1,i=[];for(let o=0;o<this.t.length;o++){let a=this.t[o];if(a.destroyed){i.push(o);continue}for(let s of this.e)s.isEnabled(a)&&s.update(a,n);if(a.destroyed){i.push(o);continue}r=!0,this.E(a)}for(let o=i.length-1;o>=0;o--){let a=i[o],s=this.t[a];this.l.release(s),this.t.splice(a,1)}r?this.n=we(this.P):(this.n=null,this.i?.(),this.i=null)};this.I=()=>{this.v()};this.id=`confetti-${fe()}`,this.f={canvas:t.canvas,resize:t.resize??!0,zIndex:t.zIndex??100,disableForReducedMotion:t.disableForReducedMotion??!1},t.canvas?this.canvas=t.canvas:(this.canvas=this.T(),this.p=!0);let n=this.canvas.getContext("2d",{alpha:!0,desynchronized:!0});if(!n)throw new Error("Failed to get 2D canvas context");this.ctx=n,this.e=Tt(),this.l=new Ie(500),this.f.resize&&this.R(),this.v()}get particles(){return this.t}async fire(t={}){if(this.f.disableForReducedMotion&&te())return Promise.resolve();if(this.destroyed)throw new Error("Cannot fire on destroyed container");let n=t.particleCount??100,r=this.canvas.width,i=this.canvas.height;for(let o=0;o<n;o++){let a=this.l.acquire(r,i,t);for(let s of this.e)s.init(a);this.t.push(a)}return this.n?new Promise(o=>{let a=this.i;this.i=()=>{a?.(),o()}}):new Promise(o=>{this.i=o,this.m=performance.now(),this.n=we(this.P)})}stop(){this.n&&(Oe(this.n),this.n=null);for(let t of this.t)this.l.release(t);this.t.length=0,this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.i?.(),this.i=null}reset(){this.stop(),this.l.clear()}destroy(){this.destroyed||(this.stop(),this.o&&(this.o.disconnect(),this.o=null),this.p&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.destroyed=!0)}E(t){let n=this.ctx,r=t.size*t.scalar,i={a:1,b:0,c:0,d:1};for(let l of this.e)if(l.getTransformValues){let u=l.getTransformValues(t);u.a!==void 0&&(i.a=u.a),u.b!==void 0&&(i.b=u.b),u.c!==void 0&&(i.c=u.c),u.d!==void 0&&(i.d=u.d)}let a=this.e.find(l=>l.id==="roll")?.getDarkenAmount(t)??0,s=a>0?Me(t.color,-a):t.color;n.save(),n.translate(t.position.x,t.position.y),n.rotate(t.rotate?.angle??0),n.transform(i.a??1,i.b??0,i.c??0,i.d??1,0,0),n.fillStyle=s,n.globalAlpha=t.opacity,n.beginPath();let c=ne.get(t.shape);c?c.draw(n,t,r):ne.get("square")?.draw(n,t,r),n.closePath(),n.fill(),n.restore()}T(){let t=document.createElement("canvas");return t.id=this.id,t.style.cssText=`
|
|
10
10
|
position: fixed;
|
|
11
11
|
top: 0;
|
|
12
12
|
left: 0;
|
|
@@ -14,4 +14,4 @@
|
|
|
14
14
|
height: 100%;
|
|
15
15
|
pointer-events: none;
|
|
16
16
|
z-index: ${this.f.zIndex};
|
|
17
|
-
`,document.body.appendChild(t),t}R(){if(typeof ResizeObserver>"u"){window.addEventListener("resize",this.I);return}this.o=new ResizeObserver(this.I),this.p?this.o.observe(document.body):this.canvas.parentElement&&this.o.observe(this.canvas.parentElement)}v(){let t=
|
|
17
|
+
`,document.body.appendChild(t),t}R(){if(typeof ResizeObserver>"u"){window.addEventListener("resize",this.I);return}this.o=new ResizeObserver(this.I),this.p?this.o.observe(document.body):this.canvas.parentElement&&this.o.observe(this.canvas.parentElement)}v(){let t=Be();if(this.p){let n=document.documentElement.clientWidth,r=document.documentElement.clientHeight;this.canvas.width=n*t,this.canvas.height=r*t,this.canvas.style.width=`${n}px`,this.canvas.style.height=`${r}px`}else{let n=this.canvas.getBoundingClientRect();this.canvas.width=n.width*t,this.canvas.height=n.height*t}this.ctx.scale(t,t)}};var Te=class{constructor(){this.e=[];this.C=[];this.u=[];this.s=null}addUpdater(t){this.e.some(n=>n.id===t.id)||this.e.push(t)}addMover(t){this.C.some(n=>n.id===t.id)||this.C.push(t)}addShapeDrawer(t){ne.register(t)}getUpdaters(){return Object.freeze([...this.e])}getMovers(){return Object.freeze([...this.C])}getShapeDrawer(t){return ne.get(t)}createContainer(t){let n=new q(t);return this.u.push(n),n}getDefaultContainer(){return(!this.s||this.s.destroyed)&&(this.s=new q,this.u.push(this.s)),this.s}destroyAll(){for(let t of this.u)t.destroy();this.u.length=0,this.s=null}get containerCount(){return this.u.length}},Ze=null;function Je(){return Ze||(Ze=new Te),Ze}var pe=new Map;function Rt(e,t){let n=pe.get(e);if(!n||n.destroyed){let r=e==="default"?{resize:!0,...t}:{canvas:e,resize:t?.resize??!1,...t};n=new q(r),pe.set(e,n)}return n}function Et(e){return{particleCount:e.particleCount??100,size:e.size??4,angle:e.angle??90,spread:e.spread??45,startVelocity:e.startVelocity??45,decay:e.decay??.94,gravity:e.gravity??1,drift:e.drift??0,flat:e.flat??!1,ticks:e.ticks??200,origin:e.origin??{x:.5,y:.5},colors:e.colors??void 0,shapes:e.shapes??void 0,scalar:e.scalar??1}}function v(e={}){if(e.disableForReducedMotion&&te())return Promise.resolve();try{return Rt("default").fire(Et(e))}catch{return null}}v.create=function(e,t={}){let n=Rt(e,t),r=(i={})=>{if((i.disableForReducedMotion??t.disableForReducedMotion)&&te())return Promise.resolve();try{return n.fire(Et(i))}catch{return null}};return r.reset=()=>{n.stop()},r};v.reset=function(){let e=pe.get("default");e&&!e.destroyed&&e.stop()};v.fireworks=async function(e={}){let t={particleCount:30,spread:55,...e};await Promise.all([v({...t,angle:60,origin:{x:0,y:.65}}),v({...t,angle:120,origin:{x:1,y:.65}})])};v.schoolPride=function(e={}){let t=Date.now()+3e3,n=e.colors??["#bb0000","#ffffff"];function r(){v({particleCount:2,angle:60,spread:55,origin:{x:0,y:.6},colors:n,...e}),v({particleCount:2,angle:120,spread:55,origin:{x:1,y:.6},colors:n,...e}),Date.now()<t&&requestAnimationFrame(r)}r()};v.snow=function(e={}){let{duration:t=5e3,...n}=e,r=Date.now()+t;function i(){v({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,...n}),Date.now()<r&&requestAnimationFrame(i)}i()};v.burst=function(e,t={}){return v({particleCount:80,spread:360,startVelocity:30,decay:.92,scalar:1.2,origin:e,...t})};v.destroyAll=function(){for(let e of pe.values())e.destroy();pe.clear(),Je().destroyAll()};v.getShapes=function(){return["square","circle","star","triangle","rectangle","diamond","heart","hexagon"]};function Ft(){let e=!1,t=!1,n=Promise.resolve();return{stop:()=>{e=!0,v.reset()},pause:()=>{t=!0},resume:()=>{t=!1},promise:n,addParticles:()=>{},clear:()=>{v.reset()},getParticleCount:()=>0,getState:()=>e?"stopped":t?"paused":"running"}}function j(){let[e,t]=(0,O.useState)(!1),n=(0,O.useRef)(new Set);(0,O.useEffect)(()=>()=>{n.current.forEach(l=>l.stop()),n.current.clear()},[]);let r=(0,O.useCallback)((l,u)=>{let p={x:l.x/window.innerWidth,y:l.y/window.innerHeight},f=Ft();return n.current.add(f),t(!0),v({particleCount:u?.particleCount??100,spread:u?.direction?.spread??70,origin:p,colors:u?.particle?.colors}),setTimeout(()=>{n.current.delete(f),n.current.size===0&&t(!1)},3e3),f},[]),i=(0,O.useCallback)((l,u)=>{if(!l)return null;let p=l.getBoundingClientRect(),f=document.documentElement.clientWidth,h=document.documentElement.clientHeight,F={x:(p.left+p.width/2)/f,y:(p.top+p.height/2)/h},w=Ft();return n.current.add(w),t(!0),v({particleCount:u?.particleCount??100,spread:u?.direction?.spread??70,origin:F,colors:u?.particle?.colors}),setTimeout(()=>{n.current.delete(w),n.current.size===0&&t(!1)},3e3),w},[]),o=(0,O.useCallback)(()=>{n.current.forEach(l=>l.stop()),n.current.clear(),t(!1)},[]),a=(0,O.useCallback)(()=>{n.current.forEach(l=>l.pause())},[]),s=(0,O.useCallback)(()=>{n.current.forEach(l=>l.resume())},[]),c=(0,O.useCallback)(()=>Array.from(n.current),[]);return{fire:r,fireFromElement:i,isActive:e,stopAll:o,pauseAll:a,resumeAll:s,getActiveHandles:c}}var T=require("react");var Qe=require("react/jsx-runtime");function At({active:e,origin:t,triggerRef:n,options:r,onComplete:i}){let{fire:o,fireFromElement:a}=j(),s=(0,T.useRef)(!1);return(0,T.useEffect)(()=>{if(e&&!s.current){s.current=!0;let c=null;n?.current?c=a(n.current,r):t&&(c=o(t,r)),c&&c.promise.then(()=>{i?.()})}},[e,t,n,r,o,a,i]),(0,T.useEffect)(()=>{e||(s.current=!1)},[e]),null}var ln=(0,T.forwardRef)(({options:e,style:t},n)=>{let r=(0,T.useRef)(null),{fireFromElement:i}=j();return(0,T.useImperativeHandle)(n,()=>({fire:()=>i(r.current,e)})),(0,Qe.jsx)("div",{ref:r,style:{position:"absolute",width:1,height:1,pointerEvents:"none",...t},"aria-hidden":"true"})});ln.displayName="ConfettiTrigger";var Ke=(0,T.forwardRef)(({children:e,confettiOptions:t,fireOnClick:n=!0,onClick:r,...i},o)=>{let a=(0,T.useRef)(null),{fireFromElement:s}=j(),c=(0,T.useCallback)(u=>{a.current=u,typeof o=="function"?o(u):o&&(o.current=u)},[o]),l=(0,T.useCallback)(u=>{n&&a.current&&s(a.current,t),r?.(u)},[n,s,t,r]);return(0,Qe.jsx)("button",{ref:c,onClick:l,...i,children:e})});Ke.displayName="ConfettiButton";function cn({width:e,height:t,numberOfPieces:n=200,confettiSource:r,initialVelocityX:i,initialVelocityY:o,recycle:a=!0,run:s=!0,gravity:c=.3,wind:l=0,opacity:u=1,drawShape:p,tweenDuration:f=100,colors:h,onConfettiComplete:F,frameRate:w}){let{fire:A}=j(),g=(0,T.useRef)(null),y=(0,T.useRef)(!1);return(0,T.useEffect)(()=>{if(!s){g.current&&(g.current.stop(),g.current=null),y.current=!1;return}if(y.current)return;y.current=!0;let d=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},x=typeof i=="number"?[i*.5,i*1.5]:i?[i.min,i.max]:[4,10],D=typeof o=="number"?[o*.5,o*1.5]:o?[o.min,o.max]:[10,30],R=(e??window.innerWidth)/2,H=0;return g.current=A({x:R,y:H},{particleCount:n,particle:{colors:h??["#ff0000","#00ff00","#0000ff","#ffff00","#ff00ff","#00ffff"],opacity:[u*.8,u],shapes:["square","circle","rectangle"],drawShape:p},physics:{gravity:c*10,wind:l*5,windVariation:x[1]-x[0]},direction:{velocity:D},mode:"continuous",spawnArea:d,continuous:{recycle:a,numberOfPieces:n,spawnRate:30,run:s,tweenDuration:f},canvas:{width:e,height:t,frameRate:w,autoResize:!e&&!t},onComplete:F}),()=>{g.current&&(g.current.stop(),g.current=null)}},[s,e,t,n,r,i,o,a,c,l,u,p,f,h,F,w,A]),(0,T.useEffect)(()=>{g.current},[a]),null}cn.displayName="Confetti";
|
package/dist/esm/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var Te=["#FF6B6B","#4ECDC4","#FFE66D","#95E1D3","#F38181","#AA96DA","#FCBAD3","#A8D8EA","#FF9A8B","#88D8B0"],ue={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},de={direction:"up",spread:55,velocity:[25,50],velocityDecay:.92},fe={colors:Te,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},W={enabled:!1,length:10,fade:.5,width:.5},xe={enabled:!1,blur:10,color:null,intensity:.5},et={recycle:!1,numberOfPieces:200,spawnRate:50,run:!0,tweenDuration:5e3},tt={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},Re={width:null,height:null,autoResize:!0,resizeDebounce:100,frameRate:null,pixelRatio:null,useWorker:!1,useOffscreen:!1};var B={particleCount:50,particle:fe,physics:ue,direction:de,mode:"burst",easing:"easeOut",zIndex:9999,autoCleanup:!0,scalar:1,drift:0,flat:!1},Ee={up:90,down:270,left:180,right:0},T={DEG_TO_RAD:Math.PI/180,RAD_TO_DEG:180/Math.PI,TWO_PI:Math.PI*2,HALF_PI:Math.PI/2},xt={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 t=2*Math.PI/3;return e===0?0:e===1?1:Math.pow(2,-10*e)*Math.sin((e*10-.75)*t)+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 te={r:0,g:0,b:0,a:0},V={MAX_PARTICLES:500,FRAME_BUDGET:16.67,MIN_OPACITY:.01,MIN_SIZE:.5,MAX_DPR:2},nt=100,Fe=5,rt=.5,O={rainbow:Te,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"]},ee={celebration:["🎉","🎊","🥳","✨","🎈"],hearts:["❤️","💕","💖","💗","💓","💘"],stars:["⭐","🌟","✨","💫","⚡"],money:["💰","💵","💸","🤑","💎"],christmas:["🎄","🎅","🎁","❄️","⭐"],halloween:["🎃","👻","🦇","🕷️","💀"],birthday:["🎂","🎁","🎈","🎉","🥳"],food:["🍕","🍔","🍟","🌭","🍿"]},dn={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:ee.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:ee.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:ee.christmas.map(e=>({src:e,isEmoji:!0}))}}},halloween:{name:"halloween",description:"Spooky Halloween",options:{particleCount:60,particle:{colors:[...O.halloween],shapes:["circle","star"],images:ee.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:ee.birthday.map(e=>({src:e,isEmoji:!0})),size:[12,20],lifespan:5e3},direction:{direction:"up",spread:80,velocity:[25,45]}}}};function C(){if(typeof crypto<"u"&&crypto.getRandomValues){let e=new Uint32Array(1);return crypto.getRandomValues(e),e[0]/4294967296}return Math.random()}function m(e,t){return e+C()*(t-e)}function Rt(e,t){return Math.floor(m(e,t+1))}function ne(e){if(e.length===0)throw new Error("Cannot pick from empty array");return e[Math.floor(C()*e.length)]}function _(e,t,n){return Math.min(Math.max(e,t),n)}function Et(e,t,n){return e+(t-e)*_(n,0,1)}function S(e){return e*T.DEG_TO_RAD}function Ft(e){return e*T.RAD_TO_DEG}function re(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 re(e.colors[0]);let t=e.trim().toLowerCase();return t.startsWith("#")?At(t):t.startsWith("rgb")?Dt(t):St(t)}function At(e){let t=e.slice(1),n,r,i,o=1;switch(t.length){case 3:n=parseInt(t[0]+t[0],16),r=parseInt(t[1]+t[1],16),i=parseInt(t[2]+t[2],16);break;case 4:n=parseInt(t[0]+t[0],16),r=parseInt(t[1]+t[1],16),i=parseInt(t[2]+t[2],16),o=parseInt(t[3]+t[3],16)/255;break;case 6:n=parseInt(t.slice(0,2),16),r=parseInt(t.slice(2,4),16),i=parseInt(t.slice(4,6),16);break;case 8:n=parseInt(t.slice(0,2),16),r=parseInt(t.slice(2,4),16),i=parseInt(t.slice(4,6),16),o=parseInt(t.slice(6,8),16)/255;break;default:return te}return isNaN(n)||isNaN(r)||isNaN(i)||isNaN(o)?te:{r:n,g:r,b:i,a:o}}function Dt(e){let t=e.match(/rgba?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([\d.]+))?\s*\)/);return t?{r:_(parseInt(t[1],10),0,255),g:_(parseInt(t[2],10),0,255),b:_(parseInt(t[3],10),0,255),a:t[4]!==void 0?_(parseFloat(t[4]),0,1):1}:te}function St(e){let t={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(t[e])return t[e];if(typeof document<"u")try{let n=document.createElement("canvas");n.width=1,n.height=1;let r=n.getContext("2d");if(r){r.fillStyle=e,r.fillRect(0,0,1,1);let i=r.getImageData(0,0,1,1).data;return{r:i[0],g:i[1],b:i[2],a:i[3]/255}}}catch{}return te}function ie(e){return`rgba(${e.r}, ${e.g}, ${e.b}, ${e.a})`}function pe(e,t){if(e==="custom"&&t!==void 0)return S(t);if(e==="radial")return C()*T.TWO_PI;let n=Ee[e];return S(n??90)}function Mt(e){let t=e.getBoundingClientRect();return{x:t.left+t.width/2,y:t.top+t.height/2}}function Ae(e){if(!e)return B;let t={...fe,...e.particle},n={...ue,...e.physics},r={...de,...e.direction};return{particleCount:e.particleCount??B.particleCount,particle:t,physics:n,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 $(){return typeof window<"u"&&typeof document<"u"}function it(e=2){return $()?Math.min(window.devicePixelRatio||1,e):1}function ot(){let e,t;return{promise:new Promise((r,i)=>{e=r,t=i}),resolve:e,reject:t}}var Ot=0;function j(e,t,n,r,i,o,a,s,c,l,u){let f=m(a[0],a[1]),h=m(s[0],s[1]),p=ne(i),A=typeof p=="string"?re(p):"type"in p?re(p.colors[0]):p,x=1+(C()-.5)*.3,R=Math.cos(n)*r*x,g=-Math.sin(n)*r*x,v;u?.images&&u.images.length>0&&(v=ne(u.images));let d=u?.tiltRange??[-30,30],P=u?.spinSpeedRange??[-15,15],E=u?.aspectRatioRange??[.5,1.5],I=m(E[0],E[1]);return{id:Ot++,x:e,y:t,vx:R,vy:g,size:f,originalSize:f,rotation:C()*T.TWO_PI,rotationSpeed:(C()-.5)*.3*l,color:A,shape:v?"custom":ne(o),opacity:h,originalOpacity:h,life:c,maxLife:c,active:!0,image:v,imageElement:null,trail:[],wobblePhase:C()*T.TWO_PI,wobbleSpeed:m(.8,2.5),tilt:S(m(d[0],d[1])),tiltSpeed:m(P[0],P[1])*.015,depth:u?.depth3D??.6,hasExploded:!1,data:{},flutterPhase:C()*T.TWO_PI,flutterSpeed:m(1.5,3.5),swayPhase:C()*T.TWO_PI,aspectRatio:I,angularVelocity:(C()-.5)*.4,scaleX:1,scaleY:1,shimmerPhase:C()*T.TWO_PI,currentDrag:m(.02,.05)}}function at(e,t,n,r,i,o,a){if(!e.active)return;let s=t*.05988;if(o?.enabled??W.enabled){let w=e.trail;w.unshift({x:e.x,y:e.y,opacity:e.opacity,size:e.size});let M=o?.length??W.length;w.length>M&&w.pop()}let c=e.vx,l=e.vy,u=e.tilt,f=c*c+l*l,h=u-u*u*u*.166667,p=1+h*.15;if(l+=n.gravity*p*s,(n.flutter??!0)&&f>1){let w=n.flutterSpeed??2.5,M=n.flutterIntensity??.4;e.flutterPhase+=w*.05*s;let L=e.flutterPhase,ce=(L-L*L*L*.166667)*M*s,It=1-u*u*.5;if(c+=ce*It,(h<0?-h:h)>.7){let Tt=ce<0?-ce:ce;l-=Tt*.3}}let x=n.swayAmplitude??15,R=n.swayFrequency??2;e.swayPhase+=R*.03*s;let g=e.swayPhase,v=(g-g*g*g*.166667)*x*.01*s;c+=v;let d=n.windVariation,P=n.wind+d*(Math.random()-.5);c+=P*s;let E=n.airResistance??.03,I=1-u*u*.5,z=I<0?-I:I,G=n.drag+z*E,k=f>0?Math.sqrt(f):0,q=Math.max(.9,1-G*k*.01)*n.friction*n.decay;if(c*=q,l*=q,e.x+=c*s,e.y+=l*s,e.vx=c,e.vy=l,n.tumble&&(e.angularVelocity=(e.angularVelocity+c*.001*s)*.98,e.rotation+=(e.rotationSpeed+e.angularVelocity)*s),e.tiltSpeed=(e.tiltSpeed+(Math.random()-.5)*.002*s)*.995,e.tilt=(e.tilt+e.tiltSpeed*s)%T.TWO_PI,n.wobble){let w=e.wobblePhase+n.wobbleSpeed*.1*s;e.wobblePhase=w;let M=1-w*w*.5,L=w-w*w*w*.166667;e.scaleX=.3+.7*(M<0?-M:M),e.scaleY=.3+.7*(L<0?-L:L)}if(e.shimmerPhase+=.1*s,n.floor!==null&&n.bounce>0&&a){let w=n.floor??a,M=e.size*.5;e.y+M>=w&&(e.y=w-M,e.vy=-e.vy*n.bounce,e.vx*=.85,e.rotationSpeed+=(Math.random()-.5)*.1)}e.life-=t;let Qe=1-e.life/e.maxLife;if(r){let w=Qe,M=w*w*(3-2*w);e.opacity=e.originalOpacity*(1-M*.9)}i&&(e.size=e.originalSize*(1-Qe*.5)),(e.life<=0||e.opacity<V.MIN_OPACITY||e.size<V.MIN_SIZE)&&(e.active=!1)}function st(e,t,n){if(!t.active)return;let{x:r,y:i,size:o,rotation:a,color:s,shape:c,opacity:l,tilt:u,aspectRatio:f,scaleX:h,scaleY:p,shimmerPhase:A}=t;if(l<.02)return;let x=n?.trailConfig,R=n?.glowConfig;(x?.enabled??W.enabled)&&t.trail.length>0&&Bt(e,t,x??W),e.save();let g=R?.enabled??xe.enabled;g&&(e.shadowBlur=R?.blur??xe.blur,e.shadowColor=R?.color??ie(s)),e.translate(r,i),e.rotate(a+u),t.depth>0&&e.scale(h,p);let d=1+(A-Math.floor(A))*.3-.15,P=.7+.3*(h*p<0?-(h*p):h*p),E=l*s.a*P*(g?R?.intensity??1:1);if(E<.02){e.restore();return}e.globalAlpha=E>1?1:E;let I=s.r*d,z=s.g*d,G=s.b*d;if(e.fillStyle=`rgb(${I>255?255:I},${z>255?255:z},${G>255?255:G})`,t.image&&t.image.isEmoji)Wt(e,t.image.src,o*(t.image.scale??1));else if(t.imageElement)Gt(e,t.imageElement,o*(t.image?.scale??1));else if(c==="custom"&&n?.customDraw){let k={ctx:e,particle:t,progress:1-t.life/t.maxLife,elapsed:n.elapsed??0};n.customDraw(k)}else{let k=f??1;switch(c){case"square":case"rectangle":let Q=o*(c==="rectangle"?Math.max(1.5,k*1.5):Math.sqrt(k)),q=o/(c==="rectangle"?Math.max(1.5,k):Math.sqrt(k));e.fillRect(-Q*.5,-q*.5,Q,q);break;case"circle":e.beginPath(),e.arc(0,0,o*.5,0,T.TWO_PI),e.fill();break;case"triangle":kt(e,o);break;case"star":_t(e,o);break;case"line":zt(e,o);break;case"heart":Lt(e,o);break;case"diamond":Nt(e,o);break;case"hexagon":Ht(e,o);break;case"spiral":Ut(e,o,s);break;case"ribbon":qt(e,o);break;default:e.fillRect(-o*.5,-o*.5,o,o)}}e.restore()}function Bt(e,t,n){let r=n.fade??W.fade,i=n.width??W.width;e.save(),e.lineCap="round",e.lineJoin="round";for(let o=0;o<t.trail.length-1;o++){let a=t.trail[o],s=t.trail[o+1],c=a.opacity*Math.pow(r,o),l=a.size*i*Math.pow(r,o);c>.01&&l>.1&&(e.beginPath(),e.strokeStyle=ie({...t.color,a:c}),e.lineWidth=l,e.moveTo(a.x,a.y),e.lineTo(s.x,s.y),e.stroke())}e.restore()}function kt(e,t){let n=t/2;e.beginPath(),e.moveTo(0,-n),e.lineTo(n,n),e.lineTo(-n,n),e.closePath(),e.fill()}function _t(e,t){let n=t/2,r=n*rt,i=Math.PI/Fe;e.beginPath();for(let o=0;o<Fe*2;o++){let a=o%2===0?n:r,s=o*i-T.HALF_PI,c=Math.cos(s)*a,l=Math.sin(s)*a;o===0?e.moveTo(c,l):e.lineTo(c,l)}e.closePath(),e.fill()}function zt(e,t){let n=t*2,r=t/4;e.fillRect(-n/2,-r/2,n,r)}function Lt(e,t){let n=t/30;e.save(),e.scale(n,n),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 Nt(e,t){let n=t/2;e.beginPath(),e.moveTo(0,-n),e.lineTo(n*.6,0),e.lineTo(0,n),e.lineTo(-n*.6,0),e.closePath(),e.fill()}function Ht(e,t){let n=t/2;e.beginPath();for(let r=0;r<6;r++){let i=Math.PI/3*r-Math.PI/6,o=Math.cos(i)*n,a=Math.sin(i)*n;r===0?e.moveTo(o,a):e.lineTo(o,a)}e.closePath(),e.fill()}function Ut(e,t,n){e.strokeStyle=ie(n),e.lineWidth=t/8,e.lineCap="round",e.beginPath();for(let r=0;r<22;r++){let i=.35*r,o=(.2+1.5*i)*(t/20),a=o*Math.cos(i),s=o*Math.sin(i);r===0?e.moveTo(a,s):e.lineTo(a,s)}e.stroke()}function qt(e,t){let n=t,r=t/3,i=t/4;e.beginPath(),e.moveTo(-n/2,0),e.quadraticCurveTo(-n/4,-i,0,0),e.quadraticCurveTo(n/4,i,n/2,0),e.lineTo(n/2,r),e.quadraticCurveTo(n/4,r+i,0,r),e.quadraticCurveTo(-n/4,r-i,-n/2,r),e.closePath(),e.fill()}function Wt(e,t,n){e.font=`${n}px serif`,e.textAlign="center",e.textBaseline="middle",e.fillText(t,0,0)}function Gt(e,t,n){let r=n/2;e.drawImage(t,-r,-r,n,n)}function lt(e){return e.filter(t=>t.active).length}var b=null,N=null,Y=0,oe=null,ct=[],Vt=500;function ut(e){ct.length<Vt&&(e.active=!1,e.trail.length=0,ct.push(e))}var De=360,$t=new Float32Array(De),jt=new Float32Array(De);for(let e=0;e<De;e++){let t=e*Math.PI/180;$t[e]=Math.sin(t),jt[e]=Math.cos(t)}function Yt(e,t){if(!$())throw new Error("ConfettiEngine requires a browser environment");let n={...Re,...t},r=n.pixelRatio??it(V.MAX_DPR);if(!b){if(b=document.createElement("canvas"),b.style.cssText=`
|
|
1
|
+
var Ie=["#FF6B6B","#4ECDC4","#FFE66D","#95E1D3","#F38181","#AA96DA","#FCBAD3","#A8D8EA","#FF9A8B","#88D8B0"],ue={gravity:1,drag:.035,friction:.99,rotationSpeed:1,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},de={direction:"up",spread:55,velocity:[25,50],velocityDecay:.92},fe={colors:Ie,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},q={enabled:!1,length:10,fade:.5,width:.5},Te={enabled:!1,blur:10,color:null,intensity:.5},Ke={recycle:!1,numberOfPieces:200,spawnRate:50,run:!0,tweenDuration:5e3},Qe={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},xe={width:null,height:null,autoResize:!0,resizeDebounce:100,frameRate:null,pixelRatio:null,useWorker:!1,useOffscreen:!1};var B={particleCount:50,particle:fe,physics:ue,direction:de,mode:"burst",easing:"easeOut",zIndex:9999,autoCleanup:!0,scalar:1,drift:0,flat:!1},Re={up:90,down:270,left:180,right:0},R={DEG_TO_RAD:Math.PI/180,RAD_TO_DEG:180/Math.PI,TWO_PI:Math.PI*2,HALF_PI:Math.PI/2},xt={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 t=2*Math.PI/3;return e===0?0:e===1?1:Math.pow(2,-10*e)*Math.sin((e*10-.75)*t)+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 te={r:0,g:0,b:0,a:0},V={MAX_PARTICLES:500,FRAME_BUDGET:16.67,MIN_OPACITY:.01,MIN_SIZE:.5,MAX_DPR:2},et=100,Ee=5,tt=.5,O={rainbow:Ie,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"]},ee={celebration:["🎉","🎊","🥳","✨","🎈"],hearts:["❤️","💕","💖","💗","💓","💘"],stars:["⭐","🌟","✨","💫","⚡"],money:["💰","💵","💸","🤑","💎"],christmas:["🎄","🎅","🎁","❄️","⭐"],halloween:["🎃","👻","🦇","🕷️","💀"],birthday:["🎂","🎁","🎈","🎉","🥳"],food:["🍕","🍔","🍟","🌭","🍿"]},fn={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:ee.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:ee.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:ee.christmas.map(e=>({src:e,isEmoji:!0}))}}},halloween:{name:"halloween",description:"Spooky Halloween",options:{particleCount:60,particle:{colors:[...O.halloween],shapes:["circle","star"],images:ee.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:ee.birthday.map(e=>({src:e,isEmoji:!0})),size:[12,20],lifespan:5e3},direction:{direction:"up",spread:80,velocity:[25,45]}}}};function C(){if(typeof crypto<"u"&&crypto.getRandomValues){let e=new Uint32Array(1);return crypto.getRandomValues(e),e[0]/4294967296}return Math.random()}function m(e,t){return e+C()*(t-e)}function Rt(e,t){return Math.floor(m(e,t+1))}function ne(e){if(e.length===0)throw new Error("Cannot pick from empty array");return e[Math.floor(C()*e.length)]}function _(e,t,n){return Math.min(Math.max(e,t),n)}function Et(e,t,n){return e+(t-e)*_(n,0,1)}function S(e){return e*R.DEG_TO_RAD}function Ft(e){return e*R.RAD_TO_DEG}function re(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 re(e.colors[0]);let t=e.trim().toLowerCase();return t.startsWith("#")?At(t):t.startsWith("rgb")?Dt(t):St(t)}function At(e){let t=e.slice(1),n,r,i,o=1;switch(t.length){case 3:n=parseInt(t[0]+t[0],16),r=parseInt(t[1]+t[1],16),i=parseInt(t[2]+t[2],16);break;case 4:n=parseInt(t[0]+t[0],16),r=parseInt(t[1]+t[1],16),i=parseInt(t[2]+t[2],16),o=parseInt(t[3]+t[3],16)/255;break;case 6:n=parseInt(t.slice(0,2),16),r=parseInt(t.slice(2,4),16),i=parseInt(t.slice(4,6),16);break;case 8:n=parseInt(t.slice(0,2),16),r=parseInt(t.slice(2,4),16),i=parseInt(t.slice(4,6),16),o=parseInt(t.slice(6,8),16)/255;break;default:return te}return isNaN(n)||isNaN(r)||isNaN(i)||isNaN(o)?te:{r:n,g:r,b:i,a:o}}function Dt(e){let t=e.match(/rgba?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([\d.]+))?\s*\)/);return t?{r:_(parseInt(t[1],10),0,255),g:_(parseInt(t[2],10),0,255),b:_(parseInt(t[3],10),0,255),a:t[4]!==void 0?_(parseFloat(t[4]),0,1):1}:te}function St(e){let t={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(t[e])return t[e];if(typeof document<"u")try{let n=document.createElement("canvas");n.width=1,n.height=1;let r=n.getContext("2d");if(r){r.fillStyle=e,r.fillRect(0,0,1,1);let i=r.getImageData(0,0,1,1).data;return{r:i[0],g:i[1],b:i[2],a:i[3]/255}}}catch{}return te}function ie(e){return`rgba(${e.r}, ${e.g}, ${e.b}, ${e.a})`}function pe(e,t){if(e==="custom"&&t!==void 0)return S(t);if(e==="radial")return C()*R.TWO_PI;let n=Re[e];return S(n??90)}function Mt(e){let t=e.getBoundingClientRect();return{x:t.left+t.width/2,y:t.top+t.height/2}}function Fe(e){if(!e)return B;let t={...fe,...e.particle},n={...ue,...e.physics},r={...de,...e.direction};return{particleCount:e.particleCount??B.particleCount,particle:t,physics:n,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 $(){return typeof window<"u"&&typeof document<"u"}function nt(e=2){return $()?Math.min(window.devicePixelRatio||1,e):1}function rt(){let e,t;return{promise:new Promise((r,i)=>{e=r,t=i}),resolve:e,reject:t}}var Ot=0;function j(e,t,n,r,i,o,a,s,c,l,u){let p=m(a[0],a[1]),f=m(s[0],s[1]),h=ne(i),E=typeof h=="string"?re(h):"type"in h?re(h.colors[0]):h,v=1+(C()-.5)*.3,F=Math.cos(n)*r*v,g=-Math.sin(n)*r*v,w;u?.images&&u.images.length>0&&(w=ne(u.images));let d=u?.tiltRange??[-30,30],T=u?.spinSpeedRange??[-15,15],A=u?.aspectRatioRange??[.5,1.5],x=m(A[0],A[1]);return{id:Ot++,x:e,y:t,vx:F,vy:g,size:p,originalSize:p,rotation:C()*R.TWO_PI,rotationSpeed:(C()-.5)*.3*l,color:E,shape:w?"custom":ne(o),opacity:f,originalOpacity:f,life:c,maxLife:c,active:!0,image:w,imageElement:null,trail:[],wobblePhase:C()*R.TWO_PI,wobbleSpeed:m(.8,2.5),tilt:S(m(d[0],d[1])),tiltSpeed:m(T[0],T[1])*.015,depth:u?.depth3D??.6,hasExploded:!1,data:{},flutterPhase:C()*R.TWO_PI,flutterSpeed:m(1.5,3.5),swayPhase:C()*R.TWO_PI,aspectRatio:x,angularVelocity:(C()-.5)*.4,scaleX:1,scaleY:1,shimmerPhase:C()*R.TWO_PI,currentDrag:m(.02,.05)}}function it(e,t,n,r,i,o,a){if(!e.active)return;let s=t*.05988;if(o?.enabled??q.enabled){let P=e.trail;P.unshift({x:e.x,y:e.y,opacity:e.opacity,size:e.size});let M=o?.length??q.length;P.length>M&&P.pop()}let c=e.vx,l=e.vy,u=e.tilt,p=c*c+l*l,f=u-u*u*u*.166667,h=1+f*.15;if(l+=n.gravity*h*s,(n.flutter??!0)&&p>1){let P=n.flutterSpeed??2.5,M=n.flutterIntensity??.4;e.flutterPhase+=P*.05*s;let L=e.flutterPhase,ce=(L-L*L*L*.166667)*M*s,It=1-u*u*.5;if(c+=ce*It,(f<0?-f:f)>.7){let Tt=ce<0?-ce:ce;l-=Tt*.3}}let v=n.swayAmplitude??15,F=n.swayFrequency??2;e.swayPhase+=F*.03*s;let g=e.swayPhase,w=(g-g*g*g*.166667)*v*.01*s;c+=w;let d=n.windVariation,T=n.wind+d*(Math.random()-.5);c+=T*s;let A=n.airResistance??.03,x=1-u*u*.5,z=x<0?-x:x,G=n.drag+z*A,k=p>0?Math.sqrt(p):0,W=Math.max(.9,1-G*k*.01)*n.friction*n.decay;if(c*=W,l*=W,e.x+=c*s,e.y+=l*s,e.vx=c,e.vy=l,n.tumble&&(e.angularVelocity=(e.angularVelocity+c*.001*s)*.98,e.rotation+=(e.rotationSpeed+e.angularVelocity)*s),e.tiltSpeed=(e.tiltSpeed+(Math.random()-.5)*.002*s)*.995,e.tilt=(e.tilt+e.tiltSpeed*s)%R.TWO_PI,n.wobble){let P=e.wobblePhase+n.wobbleSpeed*.1*s;e.wobblePhase=P;let M=1-P*P*.5,L=P-P*P*P*.166667;e.scaleX=.3+.7*(M<0?-M:M),e.scaleY=.3+.7*(L<0?-L:L)}if(e.shimmerPhase+=.1*s,n.floor!==null&&n.bounce>0&&a){let P=n.floor??a,M=e.size*.5;e.y+M>=P&&(e.y=P-M,e.vy=-e.vy*n.bounce,e.vx*=.85,e.rotationSpeed+=(Math.random()-.5)*.1)}e.life-=t;let Je=1-e.life/e.maxLife;if(r){let P=Je,M=P*P*(3-2*P);e.opacity=e.originalOpacity*(1-M*.9)}i&&(e.size=e.originalSize*(1-Je*.5)),(e.life<=0||e.opacity<V.MIN_OPACITY||e.size<V.MIN_SIZE)&&(e.active=!1)}function ot(e,t,n){if(!t.active)return;let{x:r,y:i,size:o,rotation:a,color:s,shape:c,opacity:l,tilt:u,aspectRatio:p,scaleX:f,scaleY:h,shimmerPhase:E}=t;if(l<.02)return;let v=n?.trailConfig,F=n?.glowConfig;(v?.enabled??q.enabled)&&t.trail.length>0&&Bt(e,t,v??q),e.save();let g=F?.enabled??Te.enabled;g&&(e.shadowBlur=F?.blur??Te.blur,e.shadowColor=F?.color??ie(s)),e.translate(r,i),e.rotate(a+u),t.depth>0&&e.scale(f,h);let d=1+(E-Math.floor(E))*.3-.15,T=.7+.3*(f*h<0?-(f*h):f*h),A=l*s.a*T*(g?F?.intensity??1:1);if(A<.02){e.restore();return}e.globalAlpha=A>1?1:A;let x=s.r*d,z=s.g*d,G=s.b*d;if(e.fillStyle=`rgb(${x>255?255:x},${z>255?255:z},${G>255?255:G})`,t.image&&t.image.isEmoji)qt(e,t.image.src,o*(t.image.scale??1));else if(t.imageElement)Gt(e,t.imageElement,o*(t.image?.scale??1));else if(c==="custom"&&n?.customDraw){let k={ctx:e,particle:t,progress:1-t.life/t.maxLife,elapsed:n.elapsed??0};n.customDraw(k)}else{let k=p??1;switch(c){case"square":case"rectangle":let Q=o*(c==="rectangle"?Math.max(1.5,k*1.5):Math.sqrt(k)),W=o/(c==="rectangle"?Math.max(1.5,k):Math.sqrt(k));e.fillRect(-Q*.5,-W*.5,Q,W);break;case"circle":e.beginPath(),e.arc(0,0,o*.5,0,R.TWO_PI),e.fill();break;case"triangle":kt(e,o);break;case"star":_t(e,o);break;case"line":zt(e,o);break;case"heart":Lt(e,o);break;case"diamond":Ht(e,o);break;case"hexagon":Nt(e,o);break;case"spiral":Ut(e,o,s);break;case"ribbon":Wt(e,o);break;default:e.fillRect(-o*.5,-o*.5,o,o)}}e.restore()}function Bt(e,t,n){let r=n.fade??q.fade,i=n.width??q.width;e.save(),e.lineCap="round",e.lineJoin="round";for(let o=0;o<t.trail.length-1;o++){let a=t.trail[o],s=t.trail[o+1],c=a.opacity*Math.pow(r,o),l=a.size*i*Math.pow(r,o);c>.01&&l>.1&&(e.beginPath(),e.strokeStyle=ie({...t.color,a:c}),e.lineWidth=l,e.moveTo(a.x,a.y),e.lineTo(s.x,s.y),e.stroke())}e.restore()}function kt(e,t){let n=t/2;e.beginPath(),e.moveTo(0,-n),e.lineTo(n,n),e.lineTo(-n,n),e.closePath(),e.fill()}function _t(e,t){let n=t/2,r=n*tt,i=Math.PI/Ee;e.beginPath();for(let o=0;o<Ee*2;o++){let a=o%2===0?n:r,s=o*i-R.HALF_PI,c=Math.cos(s)*a,l=Math.sin(s)*a;o===0?e.moveTo(c,l):e.lineTo(c,l)}e.closePath(),e.fill()}function zt(e,t){let n=t*2,r=t/4;e.fillRect(-n/2,-r/2,n,r)}function Lt(e,t){let n=t/30;e.save(),e.scale(n,n),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 Ht(e,t){let n=t/2;e.beginPath(),e.moveTo(0,-n),e.lineTo(n*.6,0),e.lineTo(0,n),e.lineTo(-n*.6,0),e.closePath(),e.fill()}function Nt(e,t){let n=t/2;e.beginPath();for(let r=0;r<6;r++){let i=Math.PI/3*r-Math.PI/6,o=Math.cos(i)*n,a=Math.sin(i)*n;r===0?e.moveTo(o,a):e.lineTo(o,a)}e.closePath(),e.fill()}function Ut(e,t,n){e.strokeStyle=ie(n),e.lineWidth=t/8,e.lineCap="round",e.beginPath();for(let r=0;r<22;r++){let i=.35*r,o=(.2+1.5*i)*(t/20),a=o*Math.cos(i),s=o*Math.sin(i);r===0?e.moveTo(a,s):e.lineTo(a,s)}e.stroke()}function Wt(e,t){let n=t,r=t/3,i=t/4;e.beginPath(),e.moveTo(-n/2,0),e.quadraticCurveTo(-n/4,-i,0,0),e.quadraticCurveTo(n/4,i,n/2,0),e.lineTo(n/2,r),e.quadraticCurveTo(n/4,r+i,0,r),e.quadraticCurveTo(-n/4,r-i,-n/2,r),e.closePath(),e.fill()}function qt(e,t,n){e.font=`${n}px serif`,e.textAlign="center",e.textBaseline="middle",e.fillText(t,0,0)}function Gt(e,t,n){let r=n/2;e.drawImage(t,-r,-r,n,n)}function at(e){return e.filter(t=>t.active).length}var b=null,H=null,Y=0,oe=null,st=[],Vt=500;function lt(e){st.length<Vt&&(e.active=!1,e.trail.length=0,st.push(e))}var Ae=360,$t=new Float32Array(Ae),jt=new Float32Array(Ae);for(let e=0;e<Ae;e++){let t=e*Math.PI/180;$t[e]=Math.sin(t),jt[e]=Math.cos(t)}function Yt(e,t){if(!$())throw new Error("ConfettiEngine requires a browser environment");let n={...xe,...t},r=n.pixelRatio??nt(V.MAX_DPR);if(!b){if(b=document.createElement("canvas"),b.style.cssText=`
|
|
2
2
|
position: fixed;
|
|
3
3
|
top: 0;
|
|
4
4
|
left: 0;
|
|
@@ -6,7 +6,7 @@ var Te=["#FF6B6B","#4ECDC4","#FFE66D","#95E1D3","#F38181","#AA96DA","#FCBAD3","#
|
|
|
6
6
|
height: 100%;
|
|
7
7
|
pointer-events: none;
|
|
8
8
|
z-index: ${e};
|
|
9
|
-
`,N=b.getContext("2d",{alpha:!0,desynchronized:!0}),!N)throw new Error("Failed to get canvas 2D context");document.body.appendChild(b),n.autoResize&&(oe=()=>{if(b&&N){let a=n.width??window.innerWidth,s=n.height??window.innerHeight;b.width=a*r,b.height=s*r,b.style.width=`${a}px`,b.style.height=`${s}px`,N.scale(r,r)}},window.addEventListener("resize",oe))}b.style.zIndex=String(e);let i=n.width??window.innerWidth,o=n.height??window.innerHeight;return(b.width!==i*r||b.height!==o*r)&&(b.width=i*r,b.height=o*r,b.style.width=`${i}px`,b.style.height=`${o}px`,N.scale(r,r)),{canvas:b,ctx:N,width:i,height:o,dpr:r}}function Xt(){b&&Y===0&&setTimeout(()=>{Y===0&&b&&(oe&&(window.removeEventListener("resize",oe),oe=null),b.remove(),b=null,N=null)},nt)}function dt(e,t,n){let{type:r,x:i,y:o,w:a,h:s}=e;switch(r){case"point":return{x:i,y:o};case"rect":return{x:m(i,i+(a??0)),y:m(o,o+(s??0))};case"line":let c=C();return{x:i+c*(a??0),y:o+c*(s??0)};case"circle":let l=C()*T.TWO_PI,u=Math.sqrt(C())*(a??50);return{x:i+Math.cos(l)*u,y:o+Math.sin(l)*u};default:return{x:i,y:o}}}var he=class{constructor(t,n){this.particles=[];this.canvasContext=null;this.animationFrameId=null;this.lastFrameTime=0;this.lastSpawnTime=0;this.isRunning=!1;this.isPaused=!1;this.deferred=ot();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 t=performance.now(),n=t-this.lastFrameTime;if(this.lastFrameTime=t,this.frameInterval>0){if(t-this.lastRenderTime<this.frameInterval){this.animationFrameId=requestAnimationFrame(this.animate);return}this.lastRenderTime=t}let{ctx:r,width:i,height:o,dpr:a}=this.canvasContext,{physics:s,particle:c}=this.config;r.setTransform(1,0,0,1,0,0),r.clearRect(0,0,i*a,o*a),r.scale(a,a);let l=this.particles,u=l.length,f=0,h=!0,p=100,A=-p,x=i+p,R=-p,g=o+p;for(let v=0;v<u;v++){let d=l[v];if(d.active){if(at(d,n,s,c.fadeOut,c.scaleDown),d.data?.isRocket&&d.y<=d.data.targetY){d.active=!1,this.explodeFirework(d.x,d.y,d.data);continue}if(d.data?.willExplode&&!d.data.hasExploded&&d.vx*d.vx+d.vy*d.vy<1&&(d.data.hasExploded=!0,this.explodeFirework(d.x,d.y,{burstCount:15,spread:360,burstColors:d.data.burstColors})),d.x<A||d.x>x||d.y<R||d.y>g){(d.y>g||d.x<A-200||d.x>x+200)&&(d.active=!1);continue}st(r,d,{customDraw:this.drawShape}),f++,h=!1}}if(this.mode==="continuous"||this.mode==="snow"||this.mode==="rain"){let v=t-this.lastSpawnTime,d=1e3/(this.continuousConfig.spawnRate??10);if(v>=d){if(this.continuousConfig.recycle){let E=this.continuousConfig.numberOfPieces-f;if(E>0){for(let I=u-1;I>=0&&E>0;I--)l[I].active||(ut(l[I]),l.splice(I,1));this.spawnParticles(Math.min(E,5))}}else f<this.continuousConfig.numberOfPieces&&this.spawnParticles(Math.min(3,this.continuousConfig.numberOfPieces-f));this.lastSpawnTime=t}}if(this.mode==="firework"){let v=0;for(let P=0;P<u;P++)l[P].active&&l[P].data?.isRocket&&v++;let d=t-this.lastSpawnTime;v===0&&d>=(this.fireworkConfig.burstDelay??500)&&(this.launchFirework(),this.lastSpawnTime=t)}if((this.mode==="burst"||this.mode==="cannon"||this.mode==="explosion")&&h){this.complete();return}this.animationFrameId=requestAnimationFrame(this.animate)};this.origin=t,this.config=Ae(n),this.mode=n?.mode??"burst",this.spawnArea=n?.spawnArea,this.continuousConfig={...et,...n?.continuous},this.fireworkConfig={...tt,...n?.firework},this.canvasConfig={...Re,...n?.canvas},this.drawShape=n?.particle?.drawShape,this.canvasConfig.frameRate&&(this.frameInterval=1e3/this.canvasConfig.frameRate)}start(){if(this.isRunning)return this.createHandle();if(!$())return this.deferred.resolve(),this.createHandle();if(this.isRunning=!0,Y++,this.canvasContext=Yt(this.config.zIndex,this.canvasConfig),this.mode==="continuous"||this.mode==="snow"||this.mode==="rain"){let t=Math.min(this.continuousConfig.numberOfPieces,Math.floor(this.continuousConfig.numberOfPieces*.5));this.spawnParticles(t)}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:t,particle:n,direction:r,physics:i}=this.config,{x:o,y:a}=this.origin,s=Math.min(t,V.MAX_PARTICLES);for(let c=0;c<s;c++){let l;if(r.direction==="radial")l=C()*T.TWO_PI;else{let h=pe(r.direction,r.angle),p=S(r.spread);l=h+(C()-.5)*p}let u=m(r.velocity[0],r.velocity[1]),f=j(o,a,l,u,n.colors,n.shapes,n.size,n.opacity,n.lifespan,i.rotationSpeed,{images:n.images,tiltRange:n.tilt,spinSpeedRange:n.spinSpeed,depth3D:n.depth3D});this.particles.push(f)}}spawnParticles(t){if(!this.canvasContext)return;let{particle:n,physics:r}=this.config,{width:i,height:o}=this.canvasContext;for(let a=0;a<t;a++){let s;this.spawnArea?s=dt(this.spawnArea,i,o):this.mode==="snow"||this.mode==="rain"?s={x:m(0,i),y:-20}:s={x:m(0,i),y:m(-20,0)};let c,l;this.mode==="snow"?(c=S(m(-20,20)-90),l=m(.5,2)):this.mode==="rain"?(c=S(-90),l=m(8,15)):(c=C()*T.TWO_PI,l=m(2,6));let u=j(s.x,s.y,c,l,n.colors,n.shapes,n.size,n.opacity,n.lifespan,r.rotationSpeed,{images:n.images,tiltRange:n.tilt,spinSpeedRange:n.spinSpeed,depth3D:n.depth3D});this.particles.push(u)}}launchFirework(){if(!this.canvasContext)return;let{width:t,height:n}=this.canvasContext,{launchHeight:r,burstCount:i,spread:o,secondaryExplosions:a,rocketColors:s,burstColors:c,trailLength:l}=this.fireworkConfig,u=this.spawnArea?dt(this.spawnArea,t,n).x:m(t*.2,t*.8),f=n*(1-r),h=u+m(-50,50),p=j(u,n,S(-90+m(-10,10)),m(15,25),s,["circle"],[3,5],[1,1],2e3,0);p.data={isRocket:!0,targetY:f,targetX:h,burstCount:i,spread:o,burstColors:c,secondaryExplosions:a,trailLength:l},this.particles.push(p)}explodeFirework(t,n,r){let{burstCount:i=80,spread:o=360,burstColors:a,secondaryExplosions:s}=r,c=a??this.config.particle.colors,l=S(o);for(let u=0;u<i;u++){let f=u/i*l-l/2+S(-90),h=m(4,12),p=j(t,n,f,h,c,this.config.particle.shapes,[2,6],[.8,1],1500,this.config.physics.rotationSpeed);s&&C()<.1&&(p.data={willExplode:!0,burstColors:c}),this.particles.push(p)}}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 t=this.particles;for(let n=t.length-1;n>=0;n--)ut(t[n]);this.particles=[],this.canvasContext=null,Y--,this.config.autoCleanup&&Xt()}addParticles(t){if(!(!this.isRunning||!this.canvasContext))if(this.mode==="continuous"||this.mode==="snow"||this.mode==="rain")this.spawnParticles(t);else{let{particle:n,direction:r,physics:i}=this.config,{x:o,y:a}=this.origin;for(let s=0;s<t;s++){let c;if(r.direction==="radial")c=C()*T.TWO_PI;else{let f=pe(r.direction,r.angle),h=S(r.spread);c=f+(C()-.5)*h}let l=m(r.velocity[0],r.velocity[1]),u=j(o,a,c,l,n.colors,n.shapes,n.size,n.opacity,n.lifespan,i.rotationSpeed);this.particles.push(u)}}}clear(){this.particles=[]}getParticleCount(){return lt(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:t=>this.addParticles(t),clear:()=>this.clear(),getParticleCount:()=>this.getParticleCount(),getState:()=>this.getState()}}};function me(e,t){return new he(e,t).start()}function Se(e,t){if(!e||!$())return null;let n=e.getBoundingClientRect(),r={x:n.left+n.width/2,y:n.top+n.height/2};return me(r,t)}function Zt(){return Y}function Jt(){b&&(b.remove(),b=null,N=null),Y=0}import{useCallback as X,useRef as Kt,useState as Qt,useEffect as en}from"react";function Z(){let[e,t]=Qt(!1),n=Kt(new Set);en(()=>()=>{n.current.forEach(l=>l.stop()),n.current.clear()},[]);let r=X((l,u)=>{let f=me(l,u);return n.current.add(f),t(!0),f.promise.then(()=>{n.current.delete(f),n.current.size===0&&t(!1)}),f},[]),i=X((l,u)=>{if(!l)return null;let f=Se(l,u);return f&&(n.current.add(f),t(!0),f.promise.then(()=>{n.current.delete(f),n.current.size===0&&t(!1)})),f},[]),o=X(()=>{n.current.forEach(l=>l.stop()),n.current.clear(),t(!1)},[]),a=X(()=>{n.current.forEach(l=>l.pause())},[]),s=X(()=>{n.current.forEach(l=>l.resume())},[]),c=X(()=>Array.from(n.current),[]);return{fire:r,fireFromElement:i,isActive:e,stopAll:o,pauseAll:a,resumeAll:s,getActiveHandles:c}}import{useEffect as ge,useRef as ae,useCallback as ft,forwardRef as pt,useImperativeHandle as tn}from"react";import{jsx as mt}from"react/jsx-runtime";function nn({active:e,origin:t,triggerRef:n,options:r,onComplete:i}){let{fire:o,fireFromElement:a}=Z(),s=ae(!1);return ge(()=>{if(e&&!s.current){s.current=!0;let c=null;n?.current?c=a(n.current,r):t&&(c=o(t,r)),c&&c.promise.then(()=>{i?.()})}},[e,t,n,r,o,a,i]),ge(()=>{e||(s.current=!1)},[e]),null}var rn=pt(({options:e,style:t},n)=>{let r=ae(null),{fireFromElement:i}=Z();return tn(n,()=>({fire:()=>i(r.current,e)})),mt("div",{ref:r,style:{position:"absolute",width:1,height:1,pointerEvents:"none",...t},"aria-hidden":"true"})});rn.displayName="ConfettiTrigger";var ht=pt(({children:e,confettiOptions:t,fireOnClick:n=!0,onClick:r,...i},o)=>{let a=ae(null),{fireFromElement:s}=Z(),c=ft(u=>{a.current=u,typeof o=="function"?o(u):o&&(o.current=u)},[o]),l=ft(u=>{n&&a.current&&s(a.current,t),r?.(u)},[n,s,t,r]);return mt("button",{ref:c,onClick:l,...i,children:e})});ht.displayName="ConfettiButton";function on({width:e,height:t,numberOfPieces:n=200,confettiSource:r,initialVelocityX:i,initialVelocityY:o,recycle:a=!0,run:s=!0,gravity:c=.3,wind:l=0,opacity:u=1,drawShape:f,tweenDuration:h=100,colors:p,onConfettiComplete:A,frameRate:x}){let{fire:R}=Z(),g=ae(null),v=ae(!1);return ge(()=>{if(!s){g.current&&(g.current.stop(),g.current=null),v.current=!1;return}if(v.current)return;v.current=!0;let d=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},P=typeof i=="number"?[i*.5,i*1.5]:i?[i.min,i.max]:[4,10],E=typeof o=="number"?[o*.5,o*1.5]:o?[o.min,o.max]:[10,30],I=(e??window.innerWidth)/2,z=0;return g.current=R({x:I,y:z},{particleCount:n,particle:{colors:p??["#ff0000","#00ff00","#0000ff","#ffff00","#ff00ff","#00ffff"],opacity:[u*.8,u],shapes:["square","circle","rectangle"],drawShape:f},physics:{gravity:c*10,wind:l*5,windVariation:P[1]-P[0]},direction:{velocity:E},mode:"continuous",spawnArea:d,continuous:{recycle:a,numberOfPieces:n,spawnRate:30,run:s,tweenDuration:h},canvas:{width:e,height:t,frameRate:x,autoResize:!e&&!t},onComplete:A}),()=>{g.current&&(g.current.stop(),g.current=null)}},[s,e,t,n,r,i,o,a,c,l,u,f,h,p,A,x,R]),ge(()=>{g.current},[a]),null}on.displayName="Confetti";var Dn=Math.PI*2,an=Math.PI/180,gt=1e3/60;function y(){if(typeof crypto<"u"&&crypto.getRandomValues){let e=new Uint32Array(1);return crypto.getRandomValues(e),e[0]/4294967296}return Math.random()}function be(e){return e*an}function H(e,t,n){return Math.min(Math.max(e,t),n)}function Me(e,t){let n=Math.max(0,e-t),r=n/gt;return Object.freeze({value:n,factor:r})}function bt(e){if(typeof e!="string"||e.length>50)return null;let t=e.trim().toLowerCase();if(t.startsWith("#")){let r=t.slice(1);if(!/^[0-9a-f]+$/.test(r))return null;let i,o,a,s=255;if(r.length===3)i=parseInt(r[0]+r[0],16),o=parseInt(r[1]+r[1],16),a=parseInt(r[2]+r[2],16);else if(r.length===6)i=parseInt(r.slice(0,2),16),o=parseInt(r.slice(2,4),16),a=parseInt(r.slice(4,6),16);else if(r.length===8)i=parseInt(r.slice(0,2),16),o=parseInt(r.slice(2,4),16),a=parseInt(r.slice(4,6),16),s=parseInt(r.slice(6,8),16);else return null;return{r:i,g:o,b:a,a:s/255}}let n=t.match(/^rgba?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([\d.]+))?\s*\)$/);return n?{r:H(parseInt(n[1],10),0,255),g:H(parseInt(n[2],10),0,255),b:H(parseInt(n[3],10),0,255),a:n[4]!==void 0?H(parseFloat(n[4]),0,1):1}:null}function Oe(e,t){let n=bt(e);if(!n)return e;let{r,g:i,b:o,a}=n,s=H(r+t,0,255),c=H(i+t,0,255),l=H(o+t,0,255);return a<1?`rgba(${Math.round(s)}, ${Math.round(c)}, ${Math.round(l)}, ${a})`:`rgb(${Math.round(s)}, ${Math.round(c)}, ${Math.round(l)})`}function J(){if(typeof window>"u")return!1;try{return window.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1}catch{return!1}}var sn=0;function se(){return++sn}function Ce(e){if(e.length===0)return;let t=Math.floor(y()*e.length);return e[t]}function ve(e){return typeof requestAnimationFrame<"u"?requestAnimationFrame(e):setTimeout(e,gt)}function Be(e){typeof cancelAnimationFrame<"u"?cancelAnimationFrame(e):clearTimeout(e)}function ke(){return typeof window>"u"?1:Math.min(window.devicePixelRatio||1,2)}var Ct=Object.freeze(["#26ccff","#a25afd","#ff5e7e","#88ff5a","#fcff42","#ffa62d","#ff36ff"]),ln=Object.freeze(["square","circle"]),we=Math.PI*2,ye=class e{constructor(t,n,r,i,o,a,s,c,l,u,f,h,p,A,x,R,g){this.id=t,this.position=n,this.velocity=r,this.angle2D=i,this.gravity=o,this.drift=a,this.decay=s,this.wobble=c,this.tilt=l,this.roll=u,this.rotate=f,this.color=h,this.shape=p,this.size=A,this.scalar=x,this.flat=R,this.tick=0,this.totalTicks=g,this.destroyed=!1,this.opacity=1}static create(t,n,r={}){let{angle:i=90,spread:o=45,startVelocity:a=45,decay:s=.94,gravity:c=1,drift:l=0,flat:u=!1,ticks:f=200,origin:h={x:.5,y:.5},colors:p=Ct,shapes:A=ln,scalar:x=1,size:R=4}=r,g={x:h.x*t,y:h.y*n},v=be(i),d=be(o),P=-v+(.5*d-y()*d),E=a*.5+y()*a,I={angle:y()*we,angleSpeed:y()*.1+.05,moveSpeed:-15+y()*30,distance:25+y()*15},z={value:y()*we,sinDirection:y()>=.5?1:-1,cosDirection:y()>=.5?1:-1,speed:(y()*.4+.3)*(y()>.5?1:-1),enable:!u},G={angle:y()*we,speed:(15+y()*10)/60,horizontal:y()>.3,vertical:y()>.7,enable:!u},k={angle:y()*we,speed:(y()*2-1)*.1,enable:!u},Q=Ce(p)??Ct[0],q=Ce(A)??"square";return new e(se(),g,E,P,c*3,l,s,I,z,G,k,Q,q,R,x,u,f)}get progress(){return this.tick/this.totalTicks}get computedSize(){return this.size*this.scalar}destroy(){this.destroyed=!0}clone(t){let n=Object.create(e.prototype);return Object.assign(n,this,t),n}},Pe=class{constructor(t=1e3){this.pool=[];this.maxSize=t}acquire(t,n,r){let i=this.pool.pop();return i?this.resetParticle(i,t,n,r):ye.create(t,n,r)}release(t){this.pool.length<this.maxSize&&(t.destroyed=!0,this.pool.push(t))}clear(){this.pool.length=0}get size(){return this.pool.length}resetParticle(t,n,r,i){let o=ye.create(n,r,i);return Object.assign(t,o,{id:t.id}),t.destroyed=!1,t}};var D=Math.PI*2,_e=class{constructor(){this.id="base"}init(t){}isEnabled(t){return!t.destroyed}update(t,n){if(t.destroyed)return;let r=Math.cos(t.angle2D)*t.velocity,i=Math.sin(t.angle2D)*t.velocity;t.position.x+=r*n.factor+t.drift*n.factor,t.position.y+=i*n.factor+t.gravity*n.factor,t.velocity*=t.decay,t.tick++;let o=t.tick/t.totalTicks;t.opacity=1-Math.pow(o,2),t.tick>=t.totalTicks&&(t.destroyed=!0)}},ze=class{constructor(){this.id="wobble"}init(t){t.wobble||(t.wobble={angle:Math.random()*D,angleSpeed:Math.random()*.1+.05,moveSpeed:-15+Math.random()*30,distance:25+Math.random()*15})}isEnabled(t){return!t.destroyed&&!t.flat&&!!t.wobble}update(t,n){if(!this.isEnabled(t))return;let r=t.wobble;r.angle+=r.angleSpeed*n.factor,r.angle>D&&(r.angle-=D);let i=Math.cos(r.angle)*r.distance*.1;t.position.x+=i*n.factor}},Le=class{constructor(){this.id="tilt"}init(t){t.tilt||(t.tilt={value:Math.random()*D,sinDirection:Math.random()>=.5?1:-1,cosDirection:Math.random()>=.5?1:-1,speed:(Math.random()*.4+.3)*(Math.random()>.5?1:-1),enable:!t.flat})}isEnabled(t){return!t.destroyed&&t.tilt?.enable===!0}update(t,n){if(!this.isEnabled(t))return;let r=t.tilt;r.value+=r.speed*.01*n.factor,r.value>D?r.value-=D:r.value<0&&(r.value+=D)}getTransformValues(t){if(!t.tilt?.enable)return{};let n=t.tilt;return{b:Math.cos(n.value)*n.cosDirection*.5,c:Math.sin(n.value)*n.sinDirection*.5}}},Ne=class{constructor(){this.id="roll"}init(t){t.roll||(t.roll={angle:Math.random()*D,speed:(15+Math.random()*10)/60,horizontal:Math.random()>.3,vertical:Math.random()>.7,enable:!t.flat})}isEnabled(t){return!t.destroyed&&t.roll?.enable===!0}update(t,n){if(!this.isEnabled(t))return;let r=t.roll;r.angle+=r.speed*n.factor,r.angle>D&&(r.angle-=D)}getTransformValues(t){if(!t.roll?.enable)return{};let n=t.roll;return{a:n.horizontal?Math.abs(Math.cos(n.angle)):void 0,d:n.vertical?Math.abs(Math.sin(n.angle)):void 0}}getDarkenAmount(t){if(!t.roll?.enable)return 0;let n=t.roll;return!n.horizontal&&!n.vertical?0:(n.horizontal?Math.cos(n.angle):Math.sin(n.angle))<0?25:0}},He=class{constructor(){this.id="rotate"}init(t){t.rotate||(t.rotate={angle:Math.random()*D,speed:(Math.random()*2-1)*.1,enable:!t.flat})}isEnabled(t){return!t.destroyed&&t.rotate?.enable===!0}update(t,n){if(!this.isEnabled(t))return;let r=t.rotate;r.angle+=r.speed*n.factor,r.angle>D?r.angle-=D:r.angle<0&&(r.angle+=D)}},Ue=class{constructor(){this.id="opacity"}init(t){t.opacity=1}isEnabled(t){return!t.destroyed}update(t,n){if(!this.isEnabled(t))return;let r=t.tick/t.totalTicks;t.opacity=1-Math.pow(r,2)}};function vt(){return[new _e,new ze,new Le,new Ne,new He,new Ue]}var wt=Math.PI*2,qe=class{constructor(){this.type="circle"}draw(t,n,r){let i=n.flat?1:.6+Math.sin(n.wobble.angle)*.4;t.ellipse(0,0,r*i,r*(1-i*.3),n.tilt?.value??0,0,wt)}},We=class{constructor(){this.type="square"}draw(t,n,r){let i=n.flat?0:Math.sin(n.wobble.angle)*r*.3;t.moveTo(-r+i,-r),t.lineTo(r+i,-r*.5),t.lineTo(r-i,r),t.lineTo(-r-i,r*.5)}},Ge=class{constructor(){this.type="rectangle"}draw(t,n,r){let i=r*1.5,o=r*.6,a=n.flat?0:Math.sin(n.wobble.angle)*o*.2;t.moveTo(-i+a,-o),t.lineTo(i+a,-o*.5),t.lineTo(i-a,o),t.lineTo(-i-a,o*.5)}},Ve=class{constructor(){this.type="star"}draw(t,n,r){let i=r,o=r*.5,a=5,s=Math.PI/a,c=-Math.PI/2;t.moveTo(0,-i);for(let l=0;l<a;l++)t.lineTo(Math.cos(c)*i,Math.sin(c)*i),c+=s,t.lineTo(Math.cos(c)*o,Math.sin(c)*o),c+=s}},$e=class{constructor(){this.type="triangle"}draw(t,n,r){let i=r*Math.sqrt(3)/2;t.moveTo(0,-i),t.lineTo(-r,i),t.lineTo(r,i)}},je=class{constructor(){this.type="diamond"}draw(t,n,r){t.moveTo(0,-r),t.lineTo(r*.6,0),t.lineTo(0,r),t.lineTo(-r*.6,0)}},Ye=class{constructor(){this.type="heart"}draw(t,n,r){let o=-r*.3,a=r*.3;t.moveTo(0,o+a),t.bezierCurveTo(0-r,o,0-r,o-a*2,0,o-a),t.bezierCurveTo(0+r,o-a*2,0+r,o,0,o+a)}},Xe=class{constructor(){this.type="hexagon"}draw(t,n,r){let o=wt/6;for(let a=0;a<6;a++){let s=o*a-Math.PI/2,c=Math.cos(s)*r,l=Math.sin(s)*r;a===0?t.moveTo(c,l):t.lineTo(c,l)}}},Ze=class{constructor(){this.drawers=new Map;this.register(new qe),this.register(new We),this.register(new Ge),this.register(new Ve),this.register(new $e),this.register(new je),this.register(new Ye),this.register(new Xe)}register(t){this.drawers.set(t.type,t)}get(t){return this.drawers.get(t)}has(t){return this.drawers.has(t)}getTypes(){return Array.from(this.drawers.keys())}unregister(t){return this.drawers.delete(t)}clear(){this.drawers.clear()}},K=new Ze;var U=class{constructor(t={}){this.destroyed=!1;this.t=[];this.n=null;this.m=0;this.i=null;this.p=!1;this.o=null;this.P=t=>{if(this.destroyed)return;let n=Me(t,this.m);this.m=t,this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height);let r=!1,i=[];for(let o=0;o<this.t.length;o++){let a=this.t[o];if(a.destroyed){i.push(o);continue}for(let s of this.e)s.isEnabled(a)&&s.update(a,n);if(a.destroyed){i.push(o);continue}r=!0,this.E(a)}for(let o=i.length-1;o>=0;o--){let a=i[o],s=this.t[a];this.l.release(s),this.t.splice(a,1)}r?this.n=ve(this.P):(this.n=null,this.i?.(),this.i=null)};this.I=()=>{this.v()};this.id=`confetti-${se()}`,this.f={canvas:t.canvas,resize:t.resize??!0,zIndex:t.zIndex??100,disableForReducedMotion:t.disableForReducedMotion??!1},t.canvas?this.canvas=t.canvas:(this.canvas=this.T(),this.p=!0);let n=this.canvas.getContext("2d",{alpha:!0,desynchronized:!0});if(!n)throw new Error("Failed to get 2D canvas context");this.ctx=n,this.e=vt(),this.l=new Pe(500),this.f.resize&&this.R(),this.v()}get particles(){return this.t}async fire(t={}){if(this.f.disableForReducedMotion&&J())return Promise.resolve();if(this.destroyed)throw new Error("Cannot fire on destroyed container");let n=t.particleCount??100,r=this.canvas.width,i=this.canvas.height;for(let o=0;o<n;o++){let a=this.l.acquire(r,i,t);for(let s of this.e)s.init(a);this.t.push(a)}return this.n?new Promise(o=>{let a=this.i;this.i=()=>{a?.(),o()}}):new Promise(o=>{this.i=o,this.m=performance.now(),this.n=ve(this.P)})}stop(){this.n&&(Be(this.n),this.n=null);for(let t of this.t)this.l.release(t);this.t.length=0,this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.i?.(),this.i=null}reset(){this.stop(),this.l.clear()}destroy(){this.destroyed||(this.stop(),this.o&&(this.o.disconnect(),this.o=null),this.p&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.destroyed=!0)}E(t){let n=this.ctx,r=t.size*t.scalar,i={a:1,b:0,c:0,d:1};for(let l of this.e)if(l.getTransformValues){let u=l.getTransformValues(t);u.a!==void 0&&(i.a=u.a),u.b!==void 0&&(i.b=u.b),u.c!==void 0&&(i.c=u.c),u.d!==void 0&&(i.d=u.d)}let a=this.e.find(l=>l.id==="roll")?.getDarkenAmount(t)??0,s=a>0?Oe(t.color,-a):t.color;n.save(),n.translate(t.position.x,t.position.y),n.rotate(t.rotate?.angle??0),n.transform(i.a??1,i.b??0,i.c??0,i.d??1,0,0),n.fillStyle=s,n.globalAlpha=t.opacity,n.beginPath();let c=K.get(t.shape);c?c.draw(n,t,r):K.get("square")?.draw(n,t,r),n.closePath(),n.fill(),n.restore()}T(){let t=document.createElement("canvas");return t.id=this.id,t.style.cssText=`
|
|
9
|
+
`,H=b.getContext("2d",{alpha:!0,desynchronized:!0}),!H)throw new Error("Failed to get canvas 2D context");document.body.appendChild(b),n.autoResize&&(oe=()=>{if(b&&H){let a=n.width??window.innerWidth,s=n.height??window.innerHeight;b.width=a*r,b.height=s*r,b.style.width=`${a}px`,b.style.height=`${s}px`,H.scale(r,r)}},window.addEventListener("resize",oe))}b.style.zIndex=String(e);let i=n.width??window.innerWidth,o=n.height??window.innerHeight;return(b.width!==i*r||b.height!==o*r)&&(b.width=i*r,b.height=o*r,b.style.width=`${i}px`,b.style.height=`${o}px`,H.scale(r,r)),{canvas:b,ctx:H,width:i,height:o,dpr:r}}function Xt(){b&&Y===0&&setTimeout(()=>{Y===0&&b&&(oe&&(window.removeEventListener("resize",oe),oe=null),b.remove(),b=null,H=null)},et)}function ct(e,t,n){let{type:r,x:i,y:o,w:a,h:s}=e;switch(r){case"point":return{x:i,y:o};case"rect":return{x:m(i,i+(a??0)),y:m(o,o+(s??0))};case"line":let c=C();return{x:i+c*(a??0),y:o+c*(s??0)};case"circle":let l=C()*R.TWO_PI,u=Math.sqrt(C())*(a??50);return{x:i+Math.cos(l)*u,y:o+Math.sin(l)*u};default:return{x:i,y:o}}}var he=class{constructor(t,n){this.particles=[];this.canvasContext=null;this.animationFrameId=null;this.lastFrameTime=0;this.lastSpawnTime=0;this.isRunning=!1;this.isPaused=!1;this.deferred=rt();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 t=performance.now(),n=t-this.lastFrameTime;if(this.lastFrameTime=t,this.frameInterval>0){if(t-this.lastRenderTime<this.frameInterval){this.animationFrameId=requestAnimationFrame(this.animate);return}this.lastRenderTime=t}let{ctx:r,width:i,height:o,dpr:a}=this.canvasContext,{physics:s,particle:c}=this.config;r.setTransform(1,0,0,1,0,0),r.clearRect(0,0,i*a,o*a),r.scale(a,a);let l=this.particles,u=l.length,p=0,f=!0,h=100,E=-h,v=i+h,F=-h,g=o+h;for(let w=0;w<u;w++){let d=l[w];if(d.active){if(it(d,n,s,c.fadeOut,c.scaleDown),d.data?.isRocket&&d.y<=d.data.targetY){d.active=!1,this.explodeFirework(d.x,d.y,d.data);continue}if(d.data?.willExplode&&!d.data.hasExploded&&d.vx*d.vx+d.vy*d.vy<1&&(d.data.hasExploded=!0,this.explodeFirework(d.x,d.y,{burstCount:15,spread:360,burstColors:d.data.burstColors})),d.x<E||d.x>v||d.y<F||d.y>g){(d.y>g||d.x<E-200||d.x>v+200)&&(d.active=!1);continue}ot(r,d,{customDraw:this.drawShape}),p++,f=!1}}if(this.mode==="continuous"||this.mode==="snow"||this.mode==="rain"){let w=t-this.lastSpawnTime,d=1e3/(this.continuousConfig.spawnRate??10);if(w>=d){if(this.continuousConfig.recycle){let A=this.continuousConfig.numberOfPieces-p;if(A>0){for(let x=u-1;x>=0&&A>0;x--)l[x].active||(lt(l[x]),l.splice(x,1));this.spawnParticles(Math.min(A,5))}}else p<this.continuousConfig.numberOfPieces&&this.spawnParticles(Math.min(3,this.continuousConfig.numberOfPieces-p));this.lastSpawnTime=t}}if(this.mode==="firework"){let w=0;for(let T=0;T<u;T++)l[T].active&&l[T].data?.isRocket&&w++;let d=t-this.lastSpawnTime;w===0&&d>=(this.fireworkConfig.burstDelay??500)&&(this.launchFirework(),this.lastSpawnTime=t)}if((this.mode==="burst"||this.mode==="cannon"||this.mode==="explosion")&&f){this.complete();return}this.animationFrameId=requestAnimationFrame(this.animate)};this.origin=t,this.config=Fe(n),this.mode=n?.mode??"burst",this.spawnArea=n?.spawnArea,this.continuousConfig={...Ke,...n?.continuous},this.fireworkConfig={...Qe,...n?.firework},this.canvasConfig={...xe,...n?.canvas},this.drawShape=n?.particle?.drawShape,this.canvasConfig.frameRate&&(this.frameInterval=1e3/this.canvasConfig.frameRate)}start(){if(this.isRunning)return this.createHandle();if(!$())return this.deferred.resolve(),this.createHandle();if(this.isRunning=!0,Y++,this.canvasContext=Yt(this.config.zIndex,this.canvasConfig),this.mode==="continuous"||this.mode==="snow"||this.mode==="rain"){let t=Math.min(this.continuousConfig.numberOfPieces,Math.floor(this.continuousConfig.numberOfPieces*.5));this.spawnParticles(t)}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:t,particle:n,direction:r,physics:i}=this.config,{x:o,y:a}=this.origin,s=Math.min(t,V.MAX_PARTICLES);for(let c=0;c<s;c++){let l;if(r.direction==="radial")l=C()*R.TWO_PI;else{let f=pe(r.direction,r.angle),h=S(r.spread);l=f+(C()-.5)*h}let u=m(r.velocity[0],r.velocity[1]),p=j(o,a,l,u,n.colors,n.shapes,n.size,n.opacity,n.lifespan,i.rotationSpeed,{images:n.images,tiltRange:n.tilt,spinSpeedRange:n.spinSpeed,depth3D:n.depth3D});this.particles.push(p)}}spawnParticles(t){if(!this.canvasContext)return;let{particle:n,physics:r}=this.config,{width:i,height:o}=this.canvasContext;for(let a=0;a<t;a++){let s;this.spawnArea?s=ct(this.spawnArea,i,o):this.mode==="snow"||this.mode==="rain"?s={x:m(0,i),y:-20}:s={x:m(0,i),y:m(-20,0)};let c,l;this.mode==="snow"?(c=S(m(-20,20)-90),l=m(.5,2)):this.mode==="rain"?(c=S(-90),l=m(8,15)):(c=C()*R.TWO_PI,l=m(2,6));let u=j(s.x,s.y,c,l,n.colors,n.shapes,n.size,n.opacity,n.lifespan,r.rotationSpeed,{images:n.images,tiltRange:n.tilt,spinSpeedRange:n.spinSpeed,depth3D:n.depth3D});this.particles.push(u)}}launchFirework(){if(!this.canvasContext)return;let{width:t,height:n}=this.canvasContext,{launchHeight:r,burstCount:i,spread:o,secondaryExplosions:a,rocketColors:s,burstColors:c,trailLength:l}=this.fireworkConfig,u=this.spawnArea?ct(this.spawnArea,t,n).x:m(t*.2,t*.8),p=n*(1-r),f=u+m(-50,50),h=j(u,n,S(-90+m(-10,10)),m(15,25),s,["circle"],[3,5],[1,1],2e3,0);h.data={isRocket:!0,targetY:p,targetX:f,burstCount:i,spread:o,burstColors:c,secondaryExplosions:a,trailLength:l},this.particles.push(h)}explodeFirework(t,n,r){let{burstCount:i=80,spread:o=360,burstColors:a,secondaryExplosions:s}=r,c=a??this.config.particle.colors,l=S(o);for(let u=0;u<i;u++){let p=u/i*l-l/2+S(-90),f=m(4,12),h=j(t,n,p,f,c,this.config.particle.shapes,[2,6],[.8,1],1500,this.config.physics.rotationSpeed);s&&C()<.1&&(h.data={willExplode:!0,burstColors:c}),this.particles.push(h)}}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 t=this.particles;for(let n=t.length-1;n>=0;n--)lt(t[n]);this.particles=[],this.canvasContext=null,Y--,this.config.autoCleanup&&Xt()}addParticles(t){if(!(!this.isRunning||!this.canvasContext))if(this.mode==="continuous"||this.mode==="snow"||this.mode==="rain")this.spawnParticles(t);else{let{particle:n,direction:r,physics:i}=this.config,{x:o,y:a}=this.origin;for(let s=0;s<t;s++){let c;if(r.direction==="radial")c=C()*R.TWO_PI;else{let p=pe(r.direction,r.angle),f=S(r.spread);c=p+(C()-.5)*f}let l=m(r.velocity[0],r.velocity[1]),u=j(o,a,c,l,n.colors,n.shapes,n.size,n.opacity,n.lifespan,i.rotationSpeed);this.particles.push(u)}}}clear(){this.particles=[]}getParticleCount(){return at(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:t=>this.addParticles(t),clear:()=>this.clear(),getParticleCount:()=>this.getParticleCount(),getState:()=>this.getState()}}};function ut(e,t){return new he(e,t).start()}function Zt(e,t){if(!e||!$())return null;let n=e.getBoundingClientRect(),r={x:n.left+n.width/2,y:n.top+n.height/2};return ut(r,t)}function Jt(){return Y}function Kt(){b&&(b.remove(),b=null,H=null),Y=0}import{useCallback as J,useRef as nn,useState as rn,useEffect as on}from"react";var In=Math.PI*2,Qt=Math.PI/180,dt=1e3/60;function I(){if(typeof crypto<"u"&&crypto.getRandomValues){let e=new Uint32Array(1);return crypto.getRandomValues(e),e[0]/4294967296}return Math.random()}function me(e){return e*Qt}function N(e,t,n){return Math.min(Math.max(e,t),n)}function De(e,t){let n=Math.max(0,e-t),r=n/dt;return Object.freeze({value:n,factor:r})}function ft(e){if(typeof e!="string"||e.length>50)return null;let t=e.trim().toLowerCase();if(t.startsWith("#")){let r=t.slice(1);if(!/^[0-9a-f]+$/.test(r))return null;let i,o,a,s=255;if(r.length===3)i=parseInt(r[0]+r[0],16),o=parseInt(r[1]+r[1],16),a=parseInt(r[2]+r[2],16);else if(r.length===6)i=parseInt(r.slice(0,2),16),o=parseInt(r.slice(2,4),16),a=parseInt(r.slice(4,6),16);else if(r.length===8)i=parseInt(r.slice(0,2),16),o=parseInt(r.slice(2,4),16),a=parseInt(r.slice(4,6),16),s=parseInt(r.slice(6,8),16);else return null;return{r:i,g:o,b:a,a:s/255}}let n=t.match(/^rgba?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([\d.]+))?\s*\)$/);return n?{r:N(parseInt(n[1],10),0,255),g:N(parseInt(n[2],10),0,255),b:N(parseInt(n[3],10),0,255),a:n[4]!==void 0?N(parseFloat(n[4]),0,1):1}:null}function Se(e,t){let n=ft(e);if(!n)return e;let{r,g:i,b:o,a}=n,s=N(r+t,0,255),c=N(i+t,0,255),l=N(o+t,0,255);return a<1?`rgba(${Math.round(s)}, ${Math.round(c)}, ${Math.round(l)}, ${a})`:`rgb(${Math.round(s)}, ${Math.round(c)}, ${Math.round(l)})`}function X(){if(typeof window>"u")return!1;try{return window.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1}catch{return!1}}var en=0;function ae(){return++en}function ge(e){if(e.length===0)return;let t=Math.floor(I()*e.length);return e[t]}function be(e){return typeof requestAnimationFrame<"u"?requestAnimationFrame(e):setTimeout(e,dt)}function Me(e){typeof cancelAnimationFrame<"u"?cancelAnimationFrame(e):clearTimeout(e)}function Oe(){return typeof window>"u"?1:Math.min(window.devicePixelRatio||1,2)}var pt=Object.freeze(["#26ccff","#a25afd","#ff5e7e","#88ff5a","#fcff42","#ffa62d","#ff36ff"]),tn=Object.freeze(["square","circle"]),Ce=Math.PI*2,ve=class e{constructor(t,n,r,i,o,a,s,c,l,u,p,f,h,E,v,F,g){this.id=t,this.position=n,this.velocity=r,this.angle2D=i,this.gravity=o,this.drift=a,this.decay=s,this.wobble=c,this.tilt=l,this.roll=u,this.rotate=p,this.color=f,this.shape=h,this.size=E,this.scalar=v,this.flat=F,this.tick=0,this.totalTicks=g,this.destroyed=!1,this.opacity=1}static create(t,n,r={}){let{angle:i=90,spread:o=45,startVelocity:a=45,decay:s=.94,gravity:c=1,drift:l=0,flat:u=!1,ticks:p=200,origin:f={x:.5,y:.5},colors:h=pt,shapes:E=tn,scalar:v=1,size:F=4}=r,g={x:f.x*t,y:f.y*n},w=me(i),d=me(o),T=-w+(.5*d-I()*d),A=a*.5+I()*a,x={angle:I()*Ce,angleSpeed:I()*.1+.05,moveSpeed:-15+I()*30,distance:25+I()*15},z={value:I()*Ce,sinDirection:I()>=.5?1:-1,cosDirection:I()>=.5?1:-1,speed:(I()*.4+.3)*(I()>.5?1:-1),enable:!u},G={angle:I()*Ce,speed:(15+I()*10)/60,horizontal:I()>.3,vertical:I()>.7,enable:!u},k={angle:I()*Ce,speed:(I()*2-1)*.1,enable:!u},Q=ge(h)??pt[0],W=ge(E)??"square";return new e(ae(),g,A,T,c*3,l,s,x,z,G,k,Q,W,F,v,u,p)}get progress(){return this.tick/this.totalTicks}get computedSize(){return this.size*this.scalar}destroy(){this.destroyed=!0}clone(t){let n=Object.create(e.prototype);return Object.assign(n,this,t),n}},we=class{constructor(t=1e3){this.pool=[];this.maxSize=t}acquire(t,n,r){let i=this.pool.pop();return i?this.resetParticle(i,t,n,r):ve.create(t,n,r)}release(t){this.pool.length<this.maxSize&&(t.destroyed=!0,this.pool.push(t))}clear(){this.pool.length=0}get size(){return this.pool.length}resetParticle(t,n,r,i){let o=ve.create(n,r,i);return Object.assign(t,o,{id:t.id}),t.destroyed=!1,t}};var D=Math.PI*2,Be=class{constructor(){this.id="base"}init(t){}isEnabled(t){return!t.destroyed}update(t,n){if(t.destroyed)return;let r=Math.cos(t.angle2D)*t.velocity,i=Math.sin(t.angle2D)*t.velocity;t.position.x+=r*n.factor+t.drift*n.factor,t.position.y+=i*n.factor+t.gravity*n.factor,t.velocity*=t.decay,t.tick++;let o=t.tick/t.totalTicks;t.opacity=1-Math.pow(o,2),t.tick>=t.totalTicks&&(t.destroyed=!0)}},ke=class{constructor(){this.id="wobble"}init(t){t.wobble||(t.wobble={angle:Math.random()*D,angleSpeed:Math.random()*.1+.05,moveSpeed:-15+Math.random()*30,distance:25+Math.random()*15})}isEnabled(t){return!t.destroyed&&!t.flat&&!!t.wobble}update(t,n){if(!this.isEnabled(t))return;let r=t.wobble;r.angle+=r.angleSpeed*n.factor,r.angle>D&&(r.angle-=D);let i=Math.cos(r.angle)*r.distance*.1;t.position.x+=i*n.factor}},_e=class{constructor(){this.id="tilt"}init(t){t.tilt||(t.tilt={value:Math.random()*D,sinDirection:Math.random()>=.5?1:-1,cosDirection:Math.random()>=.5?1:-1,speed:(Math.random()*.4+.3)*(Math.random()>.5?1:-1),enable:!t.flat})}isEnabled(t){return!t.destroyed&&t.tilt?.enable===!0}update(t,n){if(!this.isEnabled(t))return;let r=t.tilt;r.value+=r.speed*.01*n.factor,r.value>D?r.value-=D:r.value<0&&(r.value+=D)}getTransformValues(t){if(!t.tilt?.enable)return{};let n=t.tilt;return{b:Math.cos(n.value)*n.cosDirection*.5,c:Math.sin(n.value)*n.sinDirection*.5}}},ze=class{constructor(){this.id="roll"}init(t){t.roll||(t.roll={angle:Math.random()*D,speed:(15+Math.random()*10)/60,horizontal:Math.random()>.3,vertical:Math.random()>.7,enable:!t.flat})}isEnabled(t){return!t.destroyed&&t.roll?.enable===!0}update(t,n){if(!this.isEnabled(t))return;let r=t.roll;r.angle+=r.speed*n.factor,r.angle>D&&(r.angle-=D)}getTransformValues(t){if(!t.roll?.enable)return{};let n=t.roll;return{a:n.horizontal?Math.abs(Math.cos(n.angle)):void 0,d:n.vertical?Math.abs(Math.sin(n.angle)):void 0}}getDarkenAmount(t){if(!t.roll?.enable)return 0;let n=t.roll;return!n.horizontal&&!n.vertical?0:(n.horizontal?Math.cos(n.angle):Math.sin(n.angle))<0?25:0}},Le=class{constructor(){this.id="rotate"}init(t){t.rotate||(t.rotate={angle:Math.random()*D,speed:(Math.random()*2-1)*.1,enable:!t.flat})}isEnabled(t){return!t.destroyed&&t.rotate?.enable===!0}update(t,n){if(!this.isEnabled(t))return;let r=t.rotate;r.angle+=r.speed*n.factor,r.angle>D?r.angle-=D:r.angle<0&&(r.angle+=D)}},He=class{constructor(){this.id="opacity"}init(t){t.opacity=1}isEnabled(t){return!t.destroyed}update(t,n){if(!this.isEnabled(t))return;let r=t.tick/t.totalTicks;t.opacity=1-Math.pow(r,2)}};function ht(){return[new Be,new ke,new _e,new ze,new Le,new He]}var mt=Math.PI*2,Ne=class{constructor(){this.type="circle"}draw(t,n,r){let i=n.flat?1:.6+Math.sin(n.wobble.angle)*.4;t.ellipse(0,0,r*i,r*(1-i*.3),n.tilt?.value??0,0,mt)}},Ue=class{constructor(){this.type="square"}draw(t,n,r){let i=n.flat?0:Math.sin(n.wobble.angle)*r*.3;t.moveTo(-r+i,-r),t.lineTo(r+i,-r*.5),t.lineTo(r-i,r),t.lineTo(-r-i,r*.5)}},We=class{constructor(){this.type="rectangle"}draw(t,n,r){let i=r*1.5,o=r*.6,a=n.flat?0:Math.sin(n.wobble.angle)*o*.2;t.moveTo(-i+a,-o),t.lineTo(i+a,-o*.5),t.lineTo(i-a,o),t.lineTo(-i-a,o*.5)}},qe=class{constructor(){this.type="star"}draw(t,n,r){let i=r,o=r*.5,a=5,s=Math.PI/a,c=-Math.PI/2;t.moveTo(0,-i);for(let l=0;l<a;l++)t.lineTo(Math.cos(c)*i,Math.sin(c)*i),c+=s,t.lineTo(Math.cos(c)*o,Math.sin(c)*o),c+=s}},Ge=class{constructor(){this.type="triangle"}draw(t,n,r){let i=r*Math.sqrt(3)/2;t.moveTo(0,-i),t.lineTo(-r,i),t.lineTo(r,i)}},Ve=class{constructor(){this.type="diamond"}draw(t,n,r){t.moveTo(0,-r),t.lineTo(r*.6,0),t.lineTo(0,r),t.lineTo(-r*.6,0)}},$e=class{constructor(){this.type="heart"}draw(t,n,r){let o=-r*.3,a=r*.3;t.moveTo(0,o+a),t.bezierCurveTo(0-r,o,0-r,o-a*2,0,o-a),t.bezierCurveTo(0+r,o-a*2,0+r,o,0,o+a)}},je=class{constructor(){this.type="hexagon"}draw(t,n,r){let o=mt/6;for(let a=0;a<6;a++){let s=o*a-Math.PI/2,c=Math.cos(s)*r,l=Math.sin(s)*r;a===0?t.moveTo(c,l):t.lineTo(c,l)}}},Ye=class{constructor(){this.drawers=new Map;this.register(new Ne),this.register(new Ue),this.register(new We),this.register(new qe),this.register(new Ge),this.register(new Ve),this.register(new $e),this.register(new je)}register(t){this.drawers.set(t.type,t)}get(t){return this.drawers.get(t)}has(t){return this.drawers.has(t)}getTypes(){return Array.from(this.drawers.keys())}unregister(t){return this.drawers.delete(t)}clear(){this.drawers.clear()}},Z=new Ye;var U=class{constructor(t={}){this.destroyed=!1;this.t=[];this.n=null;this.m=0;this.i=null;this.p=!1;this.o=null;this.P=t=>{if(this.destroyed)return;let n=De(t,this.m);this.m=t,this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height);let r=!1,i=[];for(let o=0;o<this.t.length;o++){let a=this.t[o];if(a.destroyed){i.push(o);continue}for(let s of this.e)s.isEnabled(a)&&s.update(a,n);if(a.destroyed){i.push(o);continue}r=!0,this.E(a)}for(let o=i.length-1;o>=0;o--){let a=i[o],s=this.t[a];this.l.release(s),this.t.splice(a,1)}r?this.n=be(this.P):(this.n=null,this.i?.(),this.i=null)};this.I=()=>{this.v()};this.id=`confetti-${ae()}`,this.f={canvas:t.canvas,resize:t.resize??!0,zIndex:t.zIndex??100,disableForReducedMotion:t.disableForReducedMotion??!1},t.canvas?this.canvas=t.canvas:(this.canvas=this.T(),this.p=!0);let n=this.canvas.getContext("2d",{alpha:!0,desynchronized:!0});if(!n)throw new Error("Failed to get 2D canvas context");this.ctx=n,this.e=ht(),this.l=new we(500),this.f.resize&&this.R(),this.v()}get particles(){return this.t}async fire(t={}){if(this.f.disableForReducedMotion&&X())return Promise.resolve();if(this.destroyed)throw new Error("Cannot fire on destroyed container");let n=t.particleCount??100,r=this.canvas.width,i=this.canvas.height;for(let o=0;o<n;o++){let a=this.l.acquire(r,i,t);for(let s of this.e)s.init(a);this.t.push(a)}return this.n?new Promise(o=>{let a=this.i;this.i=()=>{a?.(),o()}}):new Promise(o=>{this.i=o,this.m=performance.now(),this.n=be(this.P)})}stop(){this.n&&(Me(this.n),this.n=null);for(let t of this.t)this.l.release(t);this.t.length=0,this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.i?.(),this.i=null}reset(){this.stop(),this.l.clear()}destroy(){this.destroyed||(this.stop(),this.o&&(this.o.disconnect(),this.o=null),this.p&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.destroyed=!0)}E(t){let n=this.ctx,r=t.size*t.scalar,i={a:1,b:0,c:0,d:1};for(let l of this.e)if(l.getTransformValues){let u=l.getTransformValues(t);u.a!==void 0&&(i.a=u.a),u.b!==void 0&&(i.b=u.b),u.c!==void 0&&(i.c=u.c),u.d!==void 0&&(i.d=u.d)}let a=this.e.find(l=>l.id==="roll")?.getDarkenAmount(t)??0,s=a>0?Se(t.color,-a):t.color;n.save(),n.translate(t.position.x,t.position.y),n.rotate(t.rotate?.angle??0),n.transform(i.a??1,i.b??0,i.c??0,i.d??1,0,0),n.fillStyle=s,n.globalAlpha=t.opacity,n.beginPath();let c=Z.get(t.shape);c?c.draw(n,t,r):Z.get("square")?.draw(n,t,r),n.closePath(),n.fill(),n.restore()}T(){let t=document.createElement("canvas");return t.id=this.id,t.style.cssText=`
|
|
10
10
|
position: fixed;
|
|
11
11
|
top: 0;
|
|
12
12
|
left: 0;
|
|
@@ -14,4 +14,4 @@ var Te=["#FF6B6B","#4ECDC4","#FFE66D","#95E1D3","#F38181","#AA96DA","#FCBAD3","#
|
|
|
14
14
|
height: 100%;
|
|
15
15
|
pointer-events: none;
|
|
16
16
|
z-index: ${this.f.zIndex};
|
|
17
|
-
`,document.body.appendChild(t),t}R(){if(typeof ResizeObserver>"u"){window.addEventListener("resize",this.I);return}this.o=new ResizeObserver(this.I),this.p?this.o.observe(document.body):this.canvas.parentElement&&this.o.observe(this.canvas.parentElement)}v(){let t=
|
|
17
|
+
`,document.body.appendChild(t),t}R(){if(typeof ResizeObserver>"u"){window.addEventListener("resize",this.I);return}this.o=new ResizeObserver(this.I),this.p?this.o.observe(document.body):this.canvas.parentElement&&this.o.observe(this.canvas.parentElement)}v(){let t=Oe();if(this.p){let n=document.documentElement.clientWidth,r=document.documentElement.clientHeight;this.canvas.width=n*t,this.canvas.height=r*t,this.canvas.style.width=`${n}px`,this.canvas.style.height=`${r}px`}else{let n=this.canvas.getBoundingClientRect();this.canvas.width=n.width*t,this.canvas.height=n.height*t}this.ctx.scale(t,t)}};var ye=class{constructor(){this.e=[];this.C=[];this.u=[];this.s=null}addUpdater(t){this.e.some(n=>n.id===t.id)||this.e.push(t)}addMover(t){this.C.some(n=>n.id===t.id)||this.C.push(t)}addShapeDrawer(t){Z.register(t)}getUpdaters(){return Object.freeze([...this.e])}getMovers(){return Object.freeze([...this.C])}getShapeDrawer(t){return Z.get(t)}createContainer(t){let n=new U(t);return this.u.push(n),n}getDefaultContainer(){return(!this.s||this.s.destroyed)&&(this.s=new U,this.u.push(this.s)),this.s}destroyAll(){for(let t of this.u)t.destroy();this.u.length=0,this.s=null}get containerCount(){return this.u.length}},Xe=null;function Ze(){return Xe||(Xe=new ye),Xe}var se=new Map;function gt(e,t){let n=se.get(e);if(!n||n.destroyed){let r=e==="default"?{resize:!0,...t}:{canvas:e,resize:t?.resize??!1,...t};n=new U(r),se.set(e,n)}return n}function bt(e){return{particleCount:e.particleCount??100,size:e.size??4,angle:e.angle??90,spread:e.spread??45,startVelocity:e.startVelocity??45,decay:e.decay??.94,gravity:e.gravity??1,drift:e.drift??0,flat:e.flat??!1,ticks:e.ticks??200,origin:e.origin??{x:.5,y:.5},colors:e.colors??void 0,shapes:e.shapes??void 0,scalar:e.scalar??1}}function y(e={}){if(e.disableForReducedMotion&&X())return Promise.resolve();try{return gt("default").fire(bt(e))}catch{return null}}y.create=function(e,t={}){let n=gt(e,t),r=(i={})=>{if((i.disableForReducedMotion??t.disableForReducedMotion)&&X())return Promise.resolve();try{return n.fire(bt(i))}catch{return null}};return r.reset=()=>{n.stop()},r};y.reset=function(){let e=se.get("default");e&&!e.destroyed&&e.stop()};y.fireworks=async function(e={}){let t={particleCount:30,spread:55,...e};await Promise.all([y({...t,angle:60,origin:{x:0,y:.65}}),y({...t,angle:120,origin:{x:1,y:.65}})])};y.schoolPride=function(e={}){let t=Date.now()+3e3,n=e.colors??["#bb0000","#ffffff"];function r(){y({particleCount:2,angle:60,spread:55,origin:{x:0,y:.6},colors:n,...e}),y({particleCount:2,angle:120,spread:55,origin:{x:1,y:.6},colors:n,...e}),Date.now()<t&&requestAnimationFrame(r)}r()};y.snow=function(e={}){let{duration:t=5e3,...n}=e,r=Date.now()+t;function i(){y({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,...n}),Date.now()<r&&requestAnimationFrame(i)}i()};y.burst=function(e,t={}){return y({particleCount:80,spread:360,startVelocity:30,decay:.92,scalar:1.2,origin:e,...t})};y.destroyAll=function(){for(let e of se.values())e.destroy();se.clear(),Ze().destroyAll()};y.getShapes=function(){return["square","circle","star","triangle","rectangle","diamond","heart","hexagon"]};function Ct(){let e=!1,t=!1,n=Promise.resolve();return{stop:()=>{e=!0,y.reset()},pause:()=>{t=!0},resume:()=>{t=!1},promise:n,addParticles:()=>{},clear:()=>{y.reset()},getParticleCount:()=>0,getState:()=>e?"stopped":t?"paused":"running"}}function K(){let[e,t]=rn(!1),n=nn(new Set);on(()=>()=>{n.current.forEach(l=>l.stop()),n.current.clear()},[]);let r=J((l,u)=>{let p={x:l.x/window.innerWidth,y:l.y/window.innerHeight},f=Ct();return n.current.add(f),t(!0),y({particleCount:u?.particleCount??100,spread:u?.direction?.spread??70,origin:p,colors:u?.particle?.colors}),setTimeout(()=>{n.current.delete(f),n.current.size===0&&t(!1)},3e3),f},[]),i=J((l,u)=>{if(!l)return null;let p=l.getBoundingClientRect(),f=document.documentElement.clientWidth,h=document.documentElement.clientHeight,E={x:(p.left+p.width/2)/f,y:(p.top+p.height/2)/h},v=Ct();return n.current.add(v),t(!0),y({particleCount:u?.particleCount??100,spread:u?.direction?.spread??70,origin:E,colors:u?.particle?.colors}),setTimeout(()=>{n.current.delete(v),n.current.size===0&&t(!1)},3e3),v},[]),o=J(()=>{n.current.forEach(l=>l.stop()),n.current.clear(),t(!1)},[]),a=J(()=>{n.current.forEach(l=>l.pause())},[]),s=J(()=>{n.current.forEach(l=>l.resume())},[]),c=J(()=>Array.from(n.current),[]);return{fire:r,fireFromElement:i,isActive:e,stopAll:o,pauseAll:a,resumeAll:s,getActiveHandles:c}}import{useEffect as Pe,useRef as le,useCallback as vt,forwardRef as wt,useImperativeHandle as an}from"react";import{jsx as Pt}from"react/jsx-runtime";function sn({active:e,origin:t,triggerRef:n,options:r,onComplete:i}){let{fire:o,fireFromElement:a}=K(),s=le(!1);return Pe(()=>{if(e&&!s.current){s.current=!0;let c=null;n?.current?c=a(n.current,r):t&&(c=o(t,r)),c&&c.promise.then(()=>{i?.()})}},[e,t,n,r,o,a,i]),Pe(()=>{e||(s.current=!1)},[e]),null}var ln=wt(({options:e,style:t},n)=>{let r=le(null),{fireFromElement:i}=K();return an(n,()=>({fire:()=>i(r.current,e)})),Pt("div",{ref:r,style:{position:"absolute",width:1,height:1,pointerEvents:"none",...t},"aria-hidden":"true"})});ln.displayName="ConfettiTrigger";var yt=wt(({children:e,confettiOptions:t,fireOnClick:n=!0,onClick:r,...i},o)=>{let a=le(null),{fireFromElement:s}=K(),c=vt(u=>{a.current=u,typeof o=="function"?o(u):o&&(o.current=u)},[o]),l=vt(u=>{n&&a.current&&s(a.current,t),r?.(u)},[n,s,t,r]);return Pt("button",{ref:c,onClick:l,...i,children:e})});yt.displayName="ConfettiButton";function cn({width:e,height:t,numberOfPieces:n=200,confettiSource:r,initialVelocityX:i,initialVelocityY:o,recycle:a=!0,run:s=!0,gravity:c=.3,wind:l=0,opacity:u=1,drawShape:p,tweenDuration:f=100,colors:h,onConfettiComplete:E,frameRate:v}){let{fire:F}=K(),g=le(null),w=le(!1);return Pe(()=>{if(!s){g.current&&(g.current.stop(),g.current=null),w.current=!1;return}if(w.current)return;w.current=!0;let d=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 i=="number"?[i*.5,i*1.5]:i?[i.min,i.max]:[4,10],A=typeof o=="number"?[o*.5,o*1.5]:o?[o.min,o.max]:[10,30],x=(e??window.innerWidth)/2,z=0;return g.current=F({x,y:z},{particleCount:n,particle:{colors:h??["#ff0000","#00ff00","#0000ff","#ffff00","#ff00ff","#00ffff"],opacity:[u*.8,u],shapes:["square","circle","rectangle"],drawShape:p},physics:{gravity:c*10,wind:l*5,windVariation:T[1]-T[0]},direction:{velocity:A},mode:"continuous",spawnArea:d,continuous:{recycle:a,numberOfPieces:n,spawnRate:30,run:s,tweenDuration:f},canvas:{width:e,height:t,frameRate:v,autoResize:!e&&!t},onComplete:E}),()=>{g.current&&(g.current.stop(),g.current=null)}},[s,e,t,n,r,i,o,a,c,l,u,p,f,h,E,v,F]),Pe(()=>{g.current},[a]),null}cn.displayName="Confetti";export{sn as ConfettiBurst,yt as ConfettiButton,he as ConfettiEngine,Ie as DEFAULT_COLORS,B as DEFAULT_CONFIG,de as DEFAULT_DIRECTION,fe as DEFAULT_PARTICLE,ue as DEFAULT_PHYSICS,Re as DIRECTION_ANGLES,xt as EASING_FUNCTIONS,_ as clamp,y as confetti,ut as createConfettiExplosion,y as default,S as degToRad,Zt as fireFromElement,Kt as forceCleanup,Jt as getActiveAnimationCount,pe as getDirectionAngle,Mt as getElementCenter,$ as isBrowser,Et as lerp,Fe as mergeConfig,re as parseColor,Ft as radToDeg,ne as randomFromArray,m as randomInRange,Rt as randomInt,ie as rgbaToString,K as useConfetti};
|
package/package.json
CHANGED