@basmilius/sparkle 2.3.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/index.d.mts +637 -1
  2. package/dist/index.d.mts.map +1 -1
  3. package/dist/index.mjs +6964 -2577
  4. package/dist/index.mjs.map +1 -1
  5. package/package.json +1 -1
  6. package/src/balloons/layer.ts +4 -3
  7. package/src/black-hole/consts.ts +3 -0
  8. package/src/black-hole/index.ts +10 -0
  9. package/src/black-hole/layer.ts +193 -0
  10. package/src/black-hole/types.ts +8 -0
  11. package/src/boids/consts.ts +8 -0
  12. package/src/boids/index.ts +9 -0
  13. package/src/boids/layer.ts +245 -0
  14. package/src/boids/types.ts +7 -0
  15. package/src/butterflies/consts.ts +3 -0
  16. package/src/butterflies/index.ts +9 -0
  17. package/src/butterflies/layer.ts +246 -0
  18. package/src/butterflies/types.ts +23 -0
  19. package/src/caustics/consts.ts +3 -0
  20. package/src/caustics/index.ts +9 -0
  21. package/src/caustics/layer.ts +107 -0
  22. package/src/clouds/consts.ts +3 -0
  23. package/src/clouds/index.ts +9 -0
  24. package/src/clouds/layer.ts +167 -0
  25. package/src/clouds/types.ts +9 -0
  26. package/src/confetti/layer.ts +3 -2
  27. package/src/constellation/consts.ts +3 -0
  28. package/src/constellation/index.ts +10 -0
  29. package/src/constellation/layer.ts +256 -0
  30. package/src/constellation/types.ts +11 -0
  31. package/src/coral-reef/consts.ts +3 -0
  32. package/src/coral-reef/index.ts +10 -0
  33. package/src/coral-reef/layer.ts +276 -0
  34. package/src/coral-reef/types.ts +31 -0
  35. package/src/crystallization/consts.ts +3 -0
  36. package/src/crystallization/index.ts +10 -0
  37. package/src/crystallization/layer.ts +318 -0
  38. package/src/crystallization/types.ts +25 -0
  39. package/src/digital-rain/consts.ts +7 -0
  40. package/src/digital-rain/index.ts +10 -0
  41. package/src/digital-rain/layer.ts +195 -0
  42. package/src/digital-rain/types.ts +10 -0
  43. package/src/donuts/layer.ts +5 -3
  44. package/src/glitch/consts.ts +3 -0
  45. package/src/glitch/index.ts +9 -0
  46. package/src/glitch/layer.ts +231 -0
  47. package/src/glitch/types.ts +28 -0
  48. package/src/gradient-flow/consts.ts +3 -0
  49. package/src/gradient-flow/index.ts +9 -0
  50. package/src/gradient-flow/layer.ts +134 -0
  51. package/src/gradient-flow/types.ts +8 -0
  52. package/src/hologram/consts.ts +5 -0
  53. package/src/hologram/index.ts +9 -0
  54. package/src/hologram/layer.ts +205 -0
  55. package/src/hologram/types.ts +20 -0
  56. package/src/hyper-space/consts.ts +3 -0
  57. package/src/hyper-space/index.ts +10 -0
  58. package/src/hyper-space/layer.ts +167 -0
  59. package/src/hyper-space/types.ts +8 -0
  60. package/src/index.ts +29 -0
  61. package/src/interference/consts.ts +9 -0
  62. package/src/interference/index.ts +9 -0
  63. package/src/interference/layer.ts +129 -0
  64. package/src/kaleidoscope/consts.ts +12 -0
  65. package/src/kaleidoscope/index.ts +9 -0
  66. package/src/kaleidoscope/layer.ts +213 -0
  67. package/src/kaleidoscope/types.ts +19 -0
  68. package/src/lanterns/layer.ts +3 -2
  69. package/src/lava/consts.ts +3 -0
  70. package/src/lava/index.ts +9 -0
  71. package/src/lava/layer.ts +152 -0
  72. package/src/lava/types.ts +13 -0
  73. package/src/leaves/layer.ts +3 -2
  74. package/src/murmuration/consts.ts +3 -0
  75. package/src/murmuration/index.ts +10 -0
  76. package/src/murmuration/layer.ts +279 -0
  77. package/src/murmuration/types.ts +7 -0
  78. package/src/nebula/consts.ts +3 -0
  79. package/src/nebula/index.ts +10 -0
  80. package/src/nebula/layer.ts +150 -0
  81. package/src/nebula/types.ts +20 -0
  82. package/src/neon/consts.ts +5 -0
  83. package/src/neon/index.ts +9 -0
  84. package/src/neon/layer.ts +213 -0
  85. package/src/neon/types.ts +18 -0
  86. package/src/petals/layer.ts +3 -2
  87. package/src/pollen/consts.ts +3 -0
  88. package/src/pollen/index.ts +10 -0
  89. package/src/pollen/layer.ts +181 -0
  90. package/src/pollen/types.ts +10 -0
  91. package/src/popcorn/consts.ts +3 -0
  92. package/src/popcorn/index.ts +10 -0
  93. package/src/popcorn/layer.ts +218 -0
  94. package/src/popcorn/types.ts +13 -0
  95. package/src/portal/consts.ts +3 -0
  96. package/src/portal/index.ts +10 -0
  97. package/src/portal/layer.ts +251 -0
  98. package/src/portal/types.ts +10 -0
  99. package/src/pulse-grid/consts.ts +3 -0
  100. package/src/pulse-grid/index.ts +10 -0
  101. package/src/pulse-grid/layer.ts +185 -0
  102. package/src/pulse-grid/types.ts +8 -0
  103. package/src/roots/consts.ts +3 -0
  104. package/src/roots/index.ts +9 -0
  105. package/src/roots/layer.ts +218 -0
  106. package/src/roots/types.ts +23 -0
  107. package/src/smoke/consts.ts +3 -0
  108. package/src/smoke/index.ts +9 -0
  109. package/src/smoke/layer.ts +182 -0
  110. package/src/smoke/types.ts +14 -0
  111. package/src/snow/layer.ts +3 -2
  112. package/src/topography/consts.ts +3 -0
  113. package/src/topography/index.ts +9 -0
  114. package/src/topography/layer.ts +141 -0
  115. package/src/tornado/consts.ts +3 -0
  116. package/src/tornado/index.ts +10 -0
  117. package/src/tornado/layer.ts +271 -0
  118. package/src/tornado/types.ts +22 -0
  119. package/src/volcano/consts.ts +3 -0
  120. package/src/volcano/index.ts +10 -0
  121. package/src/volcano/layer.ts +261 -0
  122. package/src/volcano/types.ts +10 -0
  123. package/src/voronoi/consts.ts +3 -0
  124. package/src/voronoi/index.ts +10 -0
  125. package/src/voronoi/layer.ts +197 -0
  126. package/src/voronoi/types.ts +7 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["#globalSpeed","#globalFrameRate","#showFps","#canvas","#context","#frameRate","#target","#delta","#then","#speed","#isStopped","#ticks","#height","#width","#current","#frame","#now","#fpsFrames","#fpsTime","#fps","#drawFps","#simulation","#contextOptions","#getOffscreenCtx","#offscreen","#offscreenCtx","#canvas","MULBERRY","DEFAULT_COLORS","#speed","#intensity","#waveAmplitude","#verticalPosition","#rgbToHue","#bands","MULBERRY","MULBERRY","DEFAULT_COLORS","#scale","#sizeRange","#colorRGBs","#maxCount","#speed","#driftAmount","#stringLengthMul","#balloons","#createBalloon","#time","MULBERRY","#color","#driftAmp","#driftFreq","#driftPhase","#radiusX","#radiusY","#riseSpeed","#rotationSpeed","#scale","#stringLength","#y","#x","#rotation","#time","MULBERRY","DEFAULT_COLORS","#scale","#sizeRange","#popOnClick","#popRadius","#baseHues","#onClickBound","#maxCount","#speed","#wobbleAmount","#colorToHue","#bubbles","#createBubble","#onClick","#canvas","#time","#popParticles","#createPopBurst","MULBERRY","DEFAULT_CONFIG","MULBERRY","TWO_PI","#scale","#width","#height","DEFAULT_CONFIG","#createParticle","MULBERRY","#tickParticle","#particles","#isFiring","#colorStr","#gravity","#shape","#size","#totalTicks","#tick","#x","#y","MULBERRY","#vx","#vy","#decay","#flipAngle","#flipSpeed","#rotAngle","#rotCos","#rotSin","#rotSpeed","#swing","#swingAmp","#swingSpeed","MULBERRY","#background","#collisionPadding","#colors","#count","#radiusRange","#rotationSpeedRange","#scale","#speedRange","#thickness","#onMouseMoveBound","#onMouseLeaveBound","#mouseAvoidance","#mouseAvoidanceRadius","#mouseAvoidanceStrength","#repulsionStrength","#onMouseMove","#onMouseLeave","#width","#height","#initialized","#donuts","#createNonOverlapping","#resolveCollisions","#mouseOnCanvas","#resolveMouseAvoidance","#updateDonut","#mouseX","#mouseY","#rand","MULBERRY","#createDonut","#overlapsAny","MULBERRY","SPRITE_SIZE","SPRITE_CENTER","SPRITE_RADIUS","#scale","#size","#maxCount","#speed","#glowSpeed","#parseColor","#sprite","#createSprite","#fireflies","#createFirefly","#time","MULBERRY","#sprite","#bounds","#glowSpeed","#size","#speed","#phase","#freqX1","#freqX2","#freqY1","#freqY2","#phaseX1","#phaseX2","#phaseY1","#phaseY2","#amplitudeX","#amplitudeY","#x","#y","#time","MULBERRY","#scale","#maxEmbers","#flameWidth","#flameHeight","#intensity","#flameLayers","MULBERRY","#time","#embers","#createEmber","#drawFlames","#drawEmbers","MULBERRY","#position","#angle","#brightness","#config","#decay","#hue","#lineWidth","#shape","#trail","#type","#alpha","MULBERRY","#speed","#vz","#hasCrackled","#hasSplit","#sparkleTimer","#depthScale","#drawShape","#z","#drawStarPath","#drawDiamondPath","#position","#velocity","#hue","#size","#decay","#friction","#gravity","#alpha","MULBERRY","#position","#startPosition","#acceleration","#angle","#baseSize","#brightness","MULBERRY","#distance","#hue","#tailWidth","#trail","#pendingSparks","#speed","#distanceTraveled","#sparkTimer","MULBERRY","#baseSize","#tailWidth","#autoSpawn","#variants","#scale","#width","#height","#hue","#spawnExplosion","#spawnTimer","#fireworks","#createFirework","#sparks","#explosions","#pickVariant","#positionRandom","MULBERRY","#scale","#size","#maxSettled","#colorRGBs","#maxCount","#speed","#groundLevel","#falling","#createFallingPiece","#time","#settleGlitter","#settled","#drawDiamond","MULBERRY","MULBERRY","#scale","#size","#colorRGBs","#maxCount","#speed","#lanterns","#createLantern","#time","#sortDirty","#sortedLanterns","MULBERRY","MULBERRY","#scale","#size","#colors","#maxCount","#speed","#wind","#sprites","#createSprites","#leaves","#createLeaf","#height","#time","MULBERRY","#createLeafSprite","#drawOvalLeaf","#drawMapleLeaf","#drawPointedLeaf","MULBERRY","#frequency","#colorR","#colorG","#colorB","#enableBranches","#enableFlash","#scale","#groundLevel","#rng","#flashAlpha","#cooldown","#nextCooldown","#bolts","#createBolt","#drawSegments","#createBranch","#system","#enableFlash","MULBERRY","MULBERRY","#scale","#fontSize","#colorRGB","#maxColumns","#speed","#trailLength","#width","#height","#initialized","#columns","#respawnTimers","#createColumn","MULBERRY","MULBERRY","#centerCount","#orbitersPerCenter","#colors","#speed","#trailLength","#showCenters","#scale","#initialized","#centers","#orbiters","MULBERRY","#createOrbiter","#time","MULBERRY","#background","#colorRGB","#lineColorRGB","#sizeRange","#speedRange","#onMouseMoveBound","#onMouseLeaveBound","#scale","#maxCount","#connectionDistance","#lineWidth","#mouseMode","#mouseRadius","#mouseStrength","#particleForces","#glow","#cellSize","#onMouseMove","#onMouseLeave","#width","#height","#initialized","#particles","#createParticle","#grid","#mouseOnCanvas","#mouseX","#mouseY","MULBERRY","MULBERRY","#scale","#size","#colors","#maxCount","#speed","#wind","#sprites","#createSprites","#petals","#createPetal","#time","MULBERRY","#createPetalSprite","#resolution","#palette","#speed","#scale","#time","#offscreen","#offscreenCtx","#imageData","MULBERRY","#scale","#groundLevel","#colorR","#colorG","#colorB","#maxDrops","#speed","#wind","#enableSplashes","#drops","#createDrop","#createSplashBurst","#splashes","MULBERRY","#color","#depth","#length","#groundY","#scale","#opacity","#vx","#vy","#y","#x","#gravity","#size","#alpha","MULBERRY","#scale","#colorR","#colorG","#colorB","#hazeOpacity","#maxCount","#wind","#turbulence","#parseColor","#grains","#createGrain","#time","MULBERRY","#layers","#contextOptions","#getOffscreenCtx","#offscreen","#offscreenCtx","#frameRate","#defaultOptions","#runner","#interval","#color","#trailLength","#trailAlphaFactor","#speed","#scale","#alphaMin","#alphaRange","#decayMin","#decayRange","#rng","#cooldown","#stars","#create","MULBERRY","#scale","#size","#baseOpacity","#maxParticles","#speed","#sprites","#createSprites","#snowflakes","#createSnowflake","#height","#ratio","#time","MULBERRY","#createCrystalSprite","MULBERRY","DEFAULT_COLORS","#maxSparks","#colorRGBs","#speedRange","#decayRange","#onMouseMoveBound","#onMouseLeaveBound","#scale","#emitRate","#friction","#gravity","#trailLength","#hoverMode","#onMouseMove","#onMouseLeave","#emitX","#emitY","#mountedCanvas","#cachedRect","#mouseOnCanvas","#sparks","#createSpark","MULBERRY","#color","#decay","#friction","#gravity","#scale","#size","#trailLength","#trail","#alpha","#x","#y","#vx","#vy","MULBERRY","#mode","#colorRGB","#shootingStarSystem","#starCount","#twinkleSpeed","#scale","MULBERRY","#stars","#createStar","#time","MULBERRY","#colors","#scale","#speed","#count","#width","#height","#initialized","#streamers","#createStreamer","#updateSegments","#drawStreamer","MULBERRY","#adjustAlpha","#startPosition","#position","#angle","#totalDistance","#trail","#acceleration","#brightness","#glow","#hue","#width","#isDone","#pendingSparks","#speed","#distanceTraveled","#sparkTimer","MULBERRY","#foamRGB","#speed","#foamAmount","#scale","#maxFoamParticles","#waves","MULBERRY","#foamParticles","#colorRGB","#direction","#speed","#scale","#count","#width","#height","#initialized","#particles","#createParticle"],"sources":["../src/canvas.ts","../src/fade.ts","../src/simulation-canvas.ts","../src/effect.ts","../src/aurora/consts.ts","../src/aurora/layer.ts","../src/aurora/index.ts","../src/balloons/consts.ts","../src/balloons/layer.ts","../src/balloons/particle.ts","../src/balloons/index.ts","../src/color.ts","../src/bubbles/consts.ts","../src/bubbles/layer.ts","../src/bubbles/index.ts","../src/confetti/consts.ts","../src/confetti/shapes.ts","../src/confetti/layer.ts","../src/confetti/particle.ts","../src/confetti/index.ts","../src/donuts/consts.ts","../src/donuts/layer.ts","../src/donuts/index.ts","../src/fireflies/consts.ts","../src/fireflies/layer.ts","../src/fireflies/particle.ts","../src/fireflies/index.ts","../src/firepit/consts.ts","../src/firepit/layer.ts","../src/firepit/index.ts","../src/fireworks/consts.ts","../src/fireworks/types.ts","../src/fireworks/explosion.ts","../src/fireworks/create-explosion.ts","../src/distance.ts","../src/fireworks/spark.ts","../src/fireworks/firework.ts","../src/fireworks/layer.ts","../src/fireworks/index.ts","../src/glitter/consts.ts","../src/glitter/layer.ts","../src/glitter/index.ts","../src/lanterns/consts.ts","../src/lanterns/layer.ts","../src/lanterns/index.ts","../src/leaves/consts.ts","../src/leaves/layer.ts","../src/leaves/index.ts","../src/lightning/consts.ts","../src/lightning/system.ts","../src/lightning/layer.ts","../src/lightning/index.ts","../src/matrix/consts.ts","../src/matrix/layer.ts","../src/matrix/index.ts","../src/orbits/consts.ts","../src/orbits/layer.ts","../src/orbits/index.ts","../src/particles/consts.ts","../src/particles/layer.ts","../src/particles/index.ts","../src/petals/consts.ts","../src/petals/layer.ts","../src/petals/index.ts","../src/plasma/layer.ts","../src/plasma/index.ts","../src/rain/consts.ts","../src/rain/layer.ts","../src/rain/particle.ts","../src/rain/index.ts","../src/sandstorm/consts.ts","../src/sandstorm/layer.ts","../src/sandstorm/index.ts","../src/scene.ts","../src/shooting-stars/system.ts","../src/snow/consts.ts","../src/snow/layer.ts","../src/snow/index.ts","../src/sparklers/consts.ts","../src/sparklers/layer.ts","../src/sparklers/particle.ts","../src/sparklers/index.ts","../src/stars/consts.ts","../src/stars/layer.ts","../src/stars/index.ts","../src/streamers/consts.ts","../src/streamers/layer.ts","../src/streamers/index.ts","../src/trail.ts","../src/waves/consts.ts","../src/waves/layer.ts","../src/waves/index.ts","../src/wormhole/consts.ts","../src/wormhole/layer.ts","../src/wormhole/index.ts"],"sourcesContent":["export class LimitedFrameRateCanvas {\n static #globalSpeed: number = 1;\n static #globalFrameRate: number | null = null;\n static #showFps: boolean = false;\n\n static get globalSpeed(): number {\n return LimitedFrameRateCanvas.#globalSpeed;\n }\n\n static set globalSpeed(value: number) {\n LimitedFrameRateCanvas.#globalSpeed = value;\n }\n\n /**\n * Global frame rate override for all canvas instances.\n * null = use each instance's own frame rate.\n * 0 = unlimited (render as fast as the browser allows).\n * Any positive number = cap at that many frames per second.\n */\n static get globalFrameRate(): number | null {\n return LimitedFrameRateCanvas.#globalFrameRate;\n }\n\n static set globalFrameRate(value: number | null) {\n LimitedFrameRateCanvas.#globalFrameRate = value;\n }\n\n static get showFps(): boolean {\n return LimitedFrameRateCanvas.#showFps;\n }\n\n static set showFps(value: boolean) {\n LimitedFrameRateCanvas.#showFps = value;\n }\n\n readonly #canvas: HTMLCanvasElement;\n readonly #context: CanvasRenderingContext2D;\n readonly #frameRate: number;\n readonly #target: number;\n #current: number = 0;\n #delta: number = 0;\n #frame: number = 0;\n #now: number = 0;\n #speed: number = 1;\n #then: number = 0;\n #ticks: number = 0;\n #isStopped: boolean = true;\n #height: number = 540;\n #width: number = 960;\n #fps: string = '0.0';\n #fpsFrames: number = 0;\n #fpsTime: number = 0;\n\n get canvas(): HTMLCanvasElement {\n return this.#canvas;\n }\n\n get context(): CanvasRenderingContext2D {\n return this.#context;\n }\n\n get delta(): number {\n return this.#delta;\n }\n\n get deltaFactor(): number {\n return this.#then === 0 ? 1 : (this.#target / this.#delta) * this.#speed * LimitedFrameRateCanvas.#globalSpeed;\n }\n\n get speed(): number {\n return this.#speed;\n }\n\n set speed(value: number) {\n this.#speed = value;\n }\n\n get dpr(): number {\n return devicePixelRatio;\n }\n\n get frameRate(): number {\n return this.#frameRate;\n }\n\n get isSmall(): boolean {\n return innerWidth < 991; // dirty little fix :-)\n }\n\n get isTicking(): boolean {\n return !this.#isStopped;\n }\n\n get ticks(): number {\n return this.#ticks;\n }\n\n get height(): number {\n return this.#height;\n }\n\n get width(): number {\n return this.#width;\n }\n\n constructor(canvas: HTMLCanvasElement, frameRate: number, options: CanvasRenderingContext2DSettings = {colorSpace: 'display-p3'}) {\n this.#canvas = canvas;\n this.#context = canvas.getContext('2d', options);\n this.#frameRate = frameRate;\n this.#target = frameRate > 0 ? 1000 / frameRate : 0;\n\n this.onVisibilityChange = this.onVisibilityChange.bind(this);\n this.onResize = this.onResize.bind(this);\n\n document.addEventListener('visibilitychange', this.onVisibilityChange, {passive: true});\n window.addEventListener('resize', this.onResize, {passive: true});\n }\n\n loop(): void {\n if (this.#isStopped) {\n return;\n }\n\n this.#current = Date.now();\n this.#frame = requestAnimationFrame(this.loop.bind(this));\n\n const globalRate = LimitedFrameRateCanvas.#globalFrameRate;\n const effectiveTarget = globalRate !== null ? (globalRate > 0 ? 1000 / globalRate : 0) : this.#target;\n\n if (effectiveTarget > 0 && this.#then > 0 && this.#current - this.#then + 1 < effectiveTarget) {\n return;\n }\n\n this.#now = this.#current;\n this.#delta = this.#now - this.#then;\n\n ++this.#ticks;\n\n this.tick();\n this.draw();\n\n if (LimitedFrameRateCanvas.#showFps) {\n ++this.#fpsFrames;\n\n if (this.#fpsTime === 0) {\n this.#fpsTime = this.#current;\n } else {\n const elapsed = this.#current - this.#fpsTime;\n\n if (elapsed >= 1000) {\n this.#fps = (Math.round(this.#fpsFrames * 10000 / elapsed) / 10).toFixed(1);\n this.#fpsFrames = 0;\n this.#fpsTime = this.#current;\n }\n }\n\n this.#drawFps();\n }\n\n this.#then = this.#now;\n }\n\n start(): void {\n this.onResize();\n\n this.#isStopped = false;\n this.#frame = requestAnimationFrame(this.loop.bind(this));\n }\n\n stop(): void {\n this.#isStopped = true;\n cancelAnimationFrame(this.#frame);\n }\n\n pause(): void {\n this.#isStopped = true;\n cancelAnimationFrame(this.#frame);\n }\n\n resume(): void {\n if (this.#isStopped) {\n this.#isStopped = false;\n this.#frame = requestAnimationFrame(this.loop.bind(this));\n }\n }\n\n #drawFps(): void {\n const ctx = this.#context;\n const text = `${this.#fps} FPS`;\n const x = 9;\n const y = 9;\n const paddingX = 6;\n const paddingY = 4;\n\n ctx.save();\n ctx.font = '700 10px ui-monospace, monospace';\n\n const textWidth = ctx.measureText(text).width;\n const boxWidth = textWidth + paddingX * 2;\n const boxHeight = 11 + paddingY * 2;\n\n ctx.fillStyle = 'rgba(0, 0, 0, 0.45)';\n ctx.beginPath();\n ctx.roundRect(x, y, boxWidth, boxHeight, 3);\n ctx.fill();\n\n ctx.fillStyle = 'rgba(255, 255, 255, 0.8)';\n ctx.textBaseline = 'middle';\n ctx.fillText(text, x + paddingX, y + boxHeight / 1.9);\n ctx.restore();\n }\n\n draw(): void {\n throw new Error('LimitedFrameRateCanvas::draw() should be overwritten.');\n }\n\n tick(): void {\n throw new Error('LimitedFrameRateCanvas::tick() should be overwritten.');\n }\n\n destroy(): void {\n this.stop();\n document.removeEventListener('visibilitychange', this.onVisibilityChange);\n window.removeEventListener('resize', this.onResize);\n }\n\n onResize(): void {\n const {width, height} = this.#canvas.getBoundingClientRect();\n this.#height = height;\n this.#width = width;\n }\n\n onVisibilityChange(): void {\n cancelAnimationFrame(this.#frame);\n\n if (document.visibilityState === 'visible') {\n this.#then = 0;\n this.start();\n } else {\n this.#then = 0;\n this.stop();\n }\n }\n}\n","import type { EdgeFade, EdgeFadeSide } from './layer';\n\nfunction parseSide(side: EdgeFadeSide): [number, number] {\n return typeof side === 'number' ? [0, side] : side;\n}\n\nexport function applyEdgeFade(ctx: CanvasRenderingContext2D, width: number, height: number, fade: EdgeFade): void {\n ctx.globalCompositeOperation = 'destination-out';\n\n if (fade.top !== undefined) {\n const [near, far] = parseSide(fade.top);\n const nearPx = near * height;\n const farPx = far * height;\n\n if (nearPx > 0) {\n ctx.fillStyle = 'rgba(0,0,0,1)';\n ctx.fillRect(0, 0, width, nearPx);\n }\n\n if (farPx > nearPx) {\n const gradient = ctx.createLinearGradient(0, nearPx, 0, farPx);\n gradient.addColorStop(0, 'rgba(0,0,0,1)');\n gradient.addColorStop(1, 'rgba(0,0,0,0)');\n ctx.fillStyle = gradient;\n ctx.fillRect(0, nearPx, width, farPx - nearPx);\n }\n }\n\n if (fade.bottom !== undefined) {\n const [near, far] = parseSide(fade.bottom);\n const nearPx = near * height;\n const farPx = far * height;\n\n if (nearPx > 0) {\n ctx.fillStyle = 'rgba(0,0,0,1)';\n ctx.fillRect(0, height - nearPx, width, nearPx);\n }\n\n if (farPx > nearPx) {\n const gradient = ctx.createLinearGradient(0, height - farPx, 0, height - nearPx);\n gradient.addColorStop(0, 'rgba(0,0,0,0)');\n gradient.addColorStop(1, 'rgba(0,0,0,1)');\n ctx.fillStyle = gradient;\n ctx.fillRect(0, height - farPx, width, farPx - nearPx);\n }\n }\n\n if (fade.left !== undefined) {\n const [near, far] = parseSide(fade.left);\n const nearPx = near * width;\n const farPx = far * width;\n\n if (nearPx > 0) {\n ctx.fillStyle = 'rgba(0,0,0,1)';\n ctx.fillRect(0, 0, nearPx, height);\n }\n\n if (farPx > nearPx) {\n const gradient = ctx.createLinearGradient(nearPx, 0, farPx, 0);\n gradient.addColorStop(0, 'rgba(0,0,0,1)');\n gradient.addColorStop(1, 'rgba(0,0,0,0)');\n ctx.fillStyle = gradient;\n ctx.fillRect(nearPx, 0, farPx - nearPx, height);\n }\n }\n\n if (fade.right !== undefined) {\n const [near, far] = parseSide(fade.right);\n const nearPx = near * width;\n const farPx = far * width;\n\n if (nearPx > 0) {\n ctx.fillStyle = 'rgba(0,0,0,1)';\n ctx.fillRect(width - nearPx, 0, nearPx, height);\n }\n\n if (farPx > nearPx) {\n const gradient = ctx.createLinearGradient(width - farPx, 0, width - nearPx, 0);\n gradient.addColorStop(0, 'rgba(0,0,0,0)');\n gradient.addColorStop(1, 'rgba(0,0,0,1)');\n ctx.fillStyle = gradient;\n ctx.fillRect(width - farPx, 0, farPx - nearPx, height);\n }\n }\n\n ctx.globalCompositeOperation = 'source-over';\n}\n","import { LimitedFrameRateCanvas } from './canvas';\nimport { applyEdgeFade } from './fade';\nimport type { EdgeFade, SimulationLayer } from './layer';\n\nexport class SimulationCanvas extends LimitedFrameRateCanvas {\n readonly #simulation: SimulationLayer;\n readonly #contextOptions: CanvasRenderingContext2DSettings;\n #offscreen: HTMLCanvasElement | null = null;\n #offscreenCtx: CanvasRenderingContext2D | null = null;\n\n constructor(canvas: HTMLCanvasElement, simulation: SimulationLayer, frameRate: number = 60, options: CanvasRenderingContext2DSettings = {colorSpace: 'display-p3'}) {\n super(canvas, frameRate, options);\n this.#simulation = simulation;\n this.#contextOptions = options;\n\n canvas.style.position = 'absolute';\n canvas.style.top = '0';\n canvas.style.left = '0';\n canvas.style.height = '100%';\n canvas.style.width = '100%';\n }\n\n withFade(fade: EdgeFade): this {\n this.#simulation.fade = fade;\n return this;\n }\n\n start(): void {\n this.#simulation.onMount(this.canvas);\n super.start();\n }\n\n destroy(): void {\n this.#simulation.onUnmount(this.canvas);\n super.destroy();\n }\n\n draw(): void {\n const dpr = this.dpr;\n this.canvas.height = this.height * dpr;\n this.canvas.width = this.width * dpr;\n\n const ctx = this.context;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n\n if (this.#simulation.fade) {\n const offCtx = this.#getOffscreenCtx(this.width * dpr, this.height * dpr);\n offCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n offCtx.clearRect(0, 0, this.width, this.height);\n this.#simulation.draw(offCtx, this.width, this.height);\n applyEdgeFade(offCtx, this.width, this.height, this.#simulation.fade);\n ctx.drawImage(this.#offscreen!, 0, 0, this.width, this.height);\n } else {\n ctx.save();\n this.#simulation.draw(ctx, this.width, this.height);\n ctx.restore();\n }\n }\n\n tick(): void {\n const dt = (this.delta > 0 && this.delta < 200 ? this.delta / (1000 / 60) : 1) * this.speed * LimitedFrameRateCanvas.globalSpeed;\n this.#simulation.tick(dt, this.width, this.height);\n }\n\n onResize(): void {\n super.onResize();\n\n if (this.#offscreen) {\n this.#offscreen.width = this.width * this.dpr;\n this.#offscreen.height = this.height * this.dpr;\n }\n\n this.#simulation.onResize(this.width, this.height);\n }\n\n #getOffscreenCtx(width: number, height: number): CanvasRenderingContext2D {\n if (!this.#offscreen) {\n this.#offscreen = document.createElement('canvas');\n this.#offscreen.width = width;\n this.#offscreen.height = height;\n this.#offscreenCtx = this.#offscreen.getContext('2d', this.#contextOptions)!;\n }\n\n return this.#offscreenCtx!;\n }\n}\n","import { SimulationCanvas } from './simulation-canvas';\nimport type { EdgeFade, EdgeFadeSide, SimulationLayer } from './layer';\n\nexport type { EdgeFade, EdgeFadeSide };\n\n/**\n * Base class for all visual effects. Implements the internal SimulationLayer interface\n * so that effects can be used both standalone (via mount()) and composed in a Scene.\n *\n * @example Standalone usage\n * const snow = new Snow({ particles: 200 });\n * snow.mount(canvas).start();\n *\n * @example Scene composition\n * const scene = new Scene()\n * .mount(canvas)\n * .layer(new Aurora())\n * .layer(new Snow())\n * .start();\n */\nexport abstract class Effect<TConfig = Record<string, unknown>> implements SimulationLayer {\n #canvas: SimulationCanvas | null = null;\n fade: EdgeFade | null = null;\n\n abstract tick(dt: number, width: number, height: number): void;\n\n abstract draw(ctx: CanvasRenderingContext2D, width: number, height: number): void;\n\n configure(_config: Partial<TConfig>): void {\n }\n\n onResize(_width: number, _height: number): void {\n }\n\n onMount(_canvas: HTMLCanvasElement): void {\n }\n\n onUnmount(_canvas: HTMLCanvasElement): void {\n }\n\n /**\n * Apply an edge fade mask when rendering this effect standalone or in a Scene.\n */\n withFade(fade: EdgeFade): this {\n this.fade = fade;\n return this;\n }\n\n /**\n * Mount this effect to a canvas element or CSS selector, creating the render loop.\n * Must be called before start().\n */\n mount(canvas: HTMLCanvasElement | string, options: CanvasRenderingContext2DSettings = {colorSpace: 'display-p3'}, frameRate: number = 60): this {\n if (typeof canvas === 'string') {\n const el = document.querySelector<HTMLCanvasElement>(canvas);\n\n if (!el) {\n throw new Error(`Effect.mount(): no element found for selector \"${canvas}\".`);\n }\n\n canvas = el;\n }\n\n this.#canvas = new SimulationCanvas(canvas, this as unknown as SimulationLayer, frameRate, options);\n return this;\n }\n\n /**\n * Remove this effect from its canvas and clean up the render loop.\n */\n unmount(): this {\n this.#canvas?.destroy();\n this.#canvas = null;\n return this;\n }\n\n /**\n * Start the render loop. Call mount() first.\n */\n start(): this {\n this.#canvas?.start();\n return this;\n }\n\n /**\n * Pause rendering without destroying state. Use resume() to continue.\n */\n pause(): this {\n this.#canvas?.pause();\n return this;\n }\n\n /**\n * Resume rendering after a pause().\n */\n resume(): this {\n this.#canvas?.resume();\n return this;\n }\n\n /**\n * Stop rendering and call onUnmount(). Safe to call multiple times.\n */\n destroy(): void {\n this.unmount();\n }\n}\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { AuroraBand } from './types';\n\nconst DEFAULT_COLORS = ['#9922ff', '#4455ff', '#0077ee', '#00aabb', '#22ddff'];\nconst TOP_HUE = 265;\n\nexport interface AuroraConfig {\n readonly bands?: number;\n readonly colors?: string[];\n readonly speed?: number;\n readonly intensity?: number;\n readonly waveAmplitude?: number;\n readonly verticalPosition?: number;\n readonly scale?: number;\n}\n\nexport class Aurora extends Effect<AuroraConfig> {\n #speed: number;\n #intensity: number;\n #waveAmplitude: number;\n #verticalPosition: number;\n #bands: AuroraBand[] = [];\n\n constructor(config: AuroraConfig = {}) {\n super();\n\n const bandCount = config.bands ?? 5;\n const colors = config.colors ?? DEFAULT_COLORS;\n this.#speed = config.speed ?? 1;\n this.#intensity = config.intensity ?? 0.8;\n this.#waveAmplitude = config.waveAmplitude ?? 1;\n this.#verticalPosition = config.verticalPosition ?? 0.68;\n\n // Two loose clusters (left + right), rays within each cluster overlap into a whole\n const clusterCenters = [0.35, 0.65];\n\n for (let i = 0; i < bandCount; i++) {\n const color = colors[i % colors.length];\n const [r, g, b] = hexToRGB(color);\n const hue = this.#rgbToHue(r, g, b);\n const cluster = clusterCenters[i % clusterCenters.length];\n\n this.#bands.push({\n x: cluster + (MULBERRY.next() - 0.5) * 0.22,\n baseY: (MULBERRY.next() - 0.5) * 0.08,\n height: 0.5 + MULBERRY.next() * 0.3,\n sigma: 160 + MULBERRY.next() * 110,\n phase1: MULBERRY.next() * Math.PI * 2,\n phase2: MULBERRY.next() * Math.PI * 2,\n amplitude1: 0.015 + MULBERRY.next() * 0.025,\n frequency1: 0.003 + MULBERRY.next() * 0.004,\n speed: 0.4 + MULBERRY.next() * 0.6,\n hue,\n opacity: 0.5 + MULBERRY.next() * 0.3\n });\n }\n }\n\n configure(config: Partial<AuroraConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.intensity !== undefined) {\n this.#intensity = config.intensity;\n }\n if (config.waveAmplitude !== undefined) {\n this.#waveAmplitude = config.waveAmplitude;\n }\n if (config.verticalPosition !== undefined) {\n this.#verticalPosition = config.verticalPosition;\n }\n }\n\n tick(dt: number, _width: number, _height: number): void {\n for (const band of this.#bands) {\n band.phase1 += 0.005 * band.speed * this.#speed * dt;\n band.phase2 += 0.008 * band.speed * this.#speed * dt;\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n // Dark sky background gradient\n const bg = ctx.createLinearGradient(0, 0, 0, height);\n bg.addColorStop(0, '#000000');\n bg.addColorStop(0.5, '#050012');\n bg.addColorStop(1, '#0a0025');\n ctx.fillStyle = bg;\n ctx.fillRect(0, 0, width, height);\n\n // Aurora curtain rays — vertical bands with Gaussian horizontal falloff\n ctx.globalCompositeOperation = 'screen';\n\n const step = 4;\n const scale = width / 1920;\n\n for (const band of this.#bands) {\n const swayX = band.amplitude1 * width * Math.sin(band.phase1);\n const cx = band.x * width + swayX;\n const baseY = (this.#verticalPosition + band.baseY) * height;\n const rayHeight = band.height * height * (height / 800);\n const sigma = band.sigma * scale;\n const cutoff = sigma * 3.5;\n const sigmaSq2 = 2 * sigma * sigma;\n const midHue = (band.hue + TOP_HUE) / 2;\n const waveRange = height * 0.035 * this.#waveAmplitude;\n\n const xStart = Math.max(0, Math.floor((cx - cutoff) / step) * step);\n const xEnd = Math.min(width, Math.ceil((cx + cutoff) / step) * step);\n\n const centreWave = Math.sin(band.frequency1 * cx + band.phase2) * waveRange;\n const centreBase = baseY + centreWave;\n const centreTop = centreBase - rayHeight;\n const centreFadeBottom = centreBase + rayHeight * 0.1;\n\n const gradient = ctx.createLinearGradient(0, centreFadeBottom, 0, centreTop);\n gradient.addColorStop(0, `hsla(${band.hue}, 100%, 90%, 0)`);\n gradient.addColorStop(0.04, `hsla(${band.hue}, 100%, 90%, 0.55)`);\n gradient.addColorStop(0.1, `hsla(${band.hue}, 90%, 72%, 1)`);\n gradient.addColorStop(0.32, `hsla(${band.hue}, 85%, 62%, 0.75)`);\n gradient.addColorStop(0.62, `hsla(${midHue}, 80%, 56%, 0.35)`);\n gradient.addColorStop(0.86, `hsla(${TOP_HUE}, 75%, 50%, 0.12)`);\n gradient.addColorStop(1, `hsla(${TOP_HUE}, 70%, 45%, 0)`);\n ctx.fillStyle = gradient;\n\n for (let x = xStart; x < xEnd; x += step) {\n const dx = x - cx;\n const alpha = Math.exp(-dx * dx / sigmaSq2);\n\n if (alpha < 0.015) {\n continue;\n }\n\n const waveOffset = Math.sin(band.frequency1 * x + band.phase2) * waveRange;\n const colBase = baseY + waveOffset;\n const colTop = colBase - rayHeight;\n const fadeBottom = colBase + rayHeight * 0.1;\n\n ctx.globalAlpha = alpha * band.opacity * this.#intensity;\n ctx.fillRect(x, colTop, step, fadeBottom - colTop + 1);\n }\n\n ctx.globalAlpha = 1;\n }\n\n ctx.globalCompositeOperation = 'source-over';\n }\n\n #rgbToHue(r: number, g: number, b: number): number {\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n\n if (delta === 0) {\n return 0;\n }\n\n let hue: number;\n\n if (max === r) {\n hue = ((g - b) / delta) % 6;\n } else if (max === g) {\n hue = (b - r) / delta + 2;\n } else {\n hue = (r - g) / delta + 4;\n }\n\n hue = Math.round(hue * 60);\n\n if (hue < 0) {\n hue += 360;\n }\n\n return hue;\n }\n}\n","import { Aurora } from './layer';\nimport type { AuroraConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createAurora(config?: AuroraConfig): Effect<AuroraConfig> {\n return new Aurora(config);\n}\n\nexport type { AuroraConfig };\nexport type { AuroraBand } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { Balloon } from './types';\n\nconst DEFAULT_COLORS = ['#ff4444', '#4488ff', '#44cc44', '#ffcc00', '#ff88cc', '#8844ff'];\n\nexport interface BalloonsConfig {\n readonly count?: number;\n readonly colors?: string[];\n readonly sizeRange?: [number, number];\n readonly speed?: number;\n readonly driftAmount?: number;\n readonly stringLength?: number;\n readonly scale?: number;\n}\n\nexport class Balloons extends Effect<BalloonsConfig> {\n readonly #scale: number;\n #speed: number;\n #driftAmount: number;\n #stringLengthMul: number;\n readonly #sizeRange: [number, number];\n readonly #colorRGBs: [number, number, number][];\n #maxCount: number;\n #time: number = 0;\n #balloons: Balloon[] = [];\n\n constructor(config: BalloonsConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxCount = config.count ?? 15;\n this.#sizeRange = config.sizeRange ?? [25, 45];\n this.#speed = config.speed ?? 1;\n this.#driftAmount = config.driftAmount ?? 1;\n this.#stringLengthMul = config.stringLength ?? 1;\n\n const colors = config.colors ?? DEFAULT_COLORS;\n this.#colorRGBs = colors.map(c => hexToRGB(c));\n\n if (innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n\n for (let i = 0; i < this.#maxCount; ++i) {\n this.#balloons.push(this.#createBalloon(true));\n }\n }\n\n configure(config: Partial<BalloonsConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.driftAmount !== undefined) {\n this.#driftAmount = config.driftAmount;\n }\n if (config.stringLength !== undefined) {\n this.#stringLengthMul = config.stringLength;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#time += 0.015 * dt * this.#speed;\n\n for (let i = 0; i < this.#balloons.length; i++) {\n const balloon = this.#balloons[i];\n\n balloon.y -= (balloon.riseSpeed * this.#speed * dt) / (height * 1.2);\n\n const drift = Math.sin(this.#time * balloon.driftFreq + balloon.driftPhase) * balloon.driftAmp * this.#driftAmount;\n balloon.x += drift * dt / (width * 5);\n\n balloon.rotation = Math.sin(this.#time * balloon.rotationSpeed + balloon.driftPhase) * 0.08;\n\n if (balloon.y < -0.2) {\n this.#balloons[i] = this.#createBalloon(false);\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n for (const balloon of this.#balloons) {\n const px = balloon.x * width;\n const py = balloon.y * height;\n const rx = balloon.radiusX * this.#scale;\n const ry = balloon.radiusY * this.#scale;\n const [r, g, b] = balloon.color;\n const cos = Math.cos(balloon.rotation);\n const sin = Math.sin(balloon.rotation);\n\n ctx.setTransform(cos, sin, -sin, cos, px, py);\n\n const gradient = ctx.createRadialGradient(\n -rx * 0.3, -ry * 0.3, rx * 0.1,\n 0, 0, Math.max(rx, ry)\n );\n gradient.addColorStop(0, `rgba(${Math.min(255, r + 80)}, ${Math.min(255, g + 80)}, ${Math.min(255, b + 80)}, 0.95)`);\n gradient.addColorStop(0.6, `rgba(${r}, ${g}, ${b}, 0.9)`);\n gradient.addColorStop(1, `rgba(${Math.max(0, r - 40)}, ${Math.max(0, g - 40)}, ${Math.max(0, b - 40)}, 0.85)`);\n\n ctx.beginPath();\n ctx.ellipse(0, 0, rx, ry, 0, 0, Math.PI * 2);\n ctx.fillStyle = gradient;\n ctx.fill();\n\n ctx.beginPath();\n ctx.ellipse(-rx * 0.25, -ry * 0.3, rx * 0.2, ry * 0.15, -0.3, 0, Math.PI * 2);\n ctx.fillStyle = `rgba(255, 255, 255, 0.35)`;\n ctx.fill();\n\n const knotY = ry + 2 * this.#scale;\n ctx.beginPath();\n ctx.moveTo(-3 * this.#scale, knotY);\n ctx.lineTo(0, knotY + 5 * this.#scale);\n ctx.lineTo(3 * this.#scale, knotY);\n ctx.closePath();\n ctx.fillStyle = `rgba(${Math.max(0, r - 30)}, ${Math.max(0, g - 30)}, ${Math.max(0, b - 30)}, 0.9)`;\n ctx.fill();\n\n const stringLen = balloon.stringLength * this.#scale * this.#stringLengthMul;\n const knotBaseY = knotY + 5 * this.#scale;\n const ph = balloon.driftPhase;\n const fr = balloon.driftFreq;\n const swingAmt = 10 * this.#scale * this.#driftAmount;\n\n // Each control point lags further behind the balloon's lateral oscillation,\n // so the string trails the direction of movement like a real hanging string.\n const midSwing = Math.sin(this.#time * fr + ph - 0.3) * swingAmt * 0.55;\n const tipSwing = Math.sin(this.#time * fr + ph - 0.8) * swingAmt;\n // Subtle high-frequency flutter at the tip for lightness.\n const flutter = Math.sin(this.#time * fr * 2.5 + ph * 1.4 + 1.8) * 2.5 * this.#scale;\n\n ctx.beginPath();\n ctx.moveTo(0, knotBaseY);\n ctx.bezierCurveTo(\n midSwing * 0.35, knotBaseY + stringLen * 0.3,\n midSwing + flutter * 0.5, knotBaseY + stringLen * 0.65,\n tipSwing + flutter, knotBaseY + stringLen\n );\n ctx.strokeStyle = `rgba(${r}, ${g}, ${b}, 0.4)`;\n ctx.lineWidth = 1;\n ctx.stroke();\n }\n\n ctx.resetTransform();\n }\n\n #createBalloon(initialSpread: boolean): Balloon {\n const colorIndex = Math.floor(MULBERRY.next() * this.#colorRGBs.length);\n const baseRadius = this.#sizeRange[0] + MULBERRY.next() * (this.#sizeRange[1] - this.#sizeRange[0]);\n\n return {\n x: 0.1 + MULBERRY.next() * 0.8,\n y: initialSpread ? MULBERRY.next() * 1.2 : 1.2 + MULBERRY.next() * 0.2,\n radiusX: baseRadius * 0.85,\n radiusY: baseRadius,\n color: this.#colorRGBs[colorIndex],\n driftPhase: MULBERRY.next() * Math.PI * 2,\n driftFreq: 0.5 + MULBERRY.next() * 1,\n driftAmp: 0.3 + MULBERRY.next() * 0.7,\n riseSpeed: 0.3 + MULBERRY.next() * 0.7,\n rotation: 0,\n rotationSpeed: 0.5 + MULBERRY.next() * 1.5,\n stringLength: 30 + MULBERRY.next() * 40\n };\n }\n}\n","import type { Point } from '../point';\n\nexport interface BalloonParticleConfig {\n readonly driftAmp?: number;\n readonly driftFreq?: number;\n readonly driftPhase?: number;\n readonly radiusX?: number;\n readonly radiusY?: number;\n readonly riseSpeed?: number;\n readonly rotationSpeed?: number;\n readonly scale?: number;\n readonly stringLength?: number;\n}\n\nexport class BalloonParticle {\n readonly #color: [number, number, number];\n readonly #driftAmp: number;\n readonly #driftFreq: number;\n readonly #driftPhase: number;\n readonly #radiusX: number;\n readonly #radiusY: number;\n readonly #riseSpeed: number;\n readonly #rotationSpeed: number;\n readonly #scale: number;\n readonly #stringLength: number;\n #x: number;\n #y: number;\n #rotation: number = 0;\n #time: number = 0;\n\n get isDone(): boolean {\n return this.#y < -(this.#radiusY * 2 + this.#stringLength);\n }\n\n get position(): Point {\n return {x: this.#x, y: this.#y};\n }\n\n constructor(position: Point, color: [number, number, number], config: BalloonParticleConfig = {}) {\n this.#x = position.x;\n this.#y = position.y;\n this.#color = color;\n this.#driftAmp = config.driftAmp ?? (0.3 + Math.random() * 0.7);\n this.#driftFreq = config.driftFreq ?? (0.5 + Math.random() * 1);\n this.#driftPhase = config.driftPhase ?? (Math.random() * Math.PI * 2);\n this.#radiusX = (config.radiusX ?? (25 + Math.random() * 20)) * (config.scale ?? 1);\n this.#radiusY = (config.radiusY ?? (config.radiusX ? config.radiusX * (1 / 0.85) : 30 + Math.random() * 23)) * (config.scale ?? 1);\n this.#riseSpeed = config.riseSpeed ?? (0.5 + Math.random() * 0.8);\n this.#rotationSpeed = config.rotationSpeed ?? (0.5 + Math.random() * 1.5);\n this.#scale = config.scale ?? 1;\n this.#stringLength = (config.stringLength ?? (30 + Math.random() * 40)) * this.#scale;\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n const [r, g, b] = this.#color;\n const rx = this.#radiusX;\n const ry = this.#radiusY;\n\n ctx.save();\n ctx.translate(this.#x, this.#y);\n ctx.rotate(this.#rotation);\n\n const gradient = ctx.createRadialGradient(-rx * 0.3, -ry * 0.3, rx * 0.1, 0, 0, Math.max(rx, ry));\n gradient.addColorStop(0, `rgba(${Math.min(255, r + 80)}, ${Math.min(255, g + 80)}, ${Math.min(255, b + 80)}, 0.95)`);\n gradient.addColorStop(0.6, `rgba(${r}, ${g}, ${b}, 0.9)`);\n gradient.addColorStop(1, `rgba(${Math.max(0, r - 40)}, ${Math.max(0, g - 40)}, ${Math.max(0, b - 40)}, 0.85)`);\n\n ctx.beginPath();\n ctx.ellipse(0, 0, rx, ry, 0, 0, Math.PI * 2);\n ctx.fillStyle = gradient;\n ctx.fill();\n\n ctx.beginPath();\n ctx.ellipse(-rx * 0.25, -ry * 0.3, rx * 0.2, ry * 0.15, -0.3, 0, Math.PI * 2);\n ctx.fillStyle = 'rgba(255, 255, 255, 0.35)';\n ctx.fill();\n\n const knotY = ry + 2 * this.#scale;\n ctx.beginPath();\n ctx.moveTo(-3 * this.#scale, knotY);\n ctx.lineTo(0, knotY + 5 * this.#scale);\n ctx.lineTo(3 * this.#scale, knotY);\n ctx.closePath();\n ctx.fillStyle = `rgba(${Math.max(0, r - 30)}, ${Math.max(0, g - 30)}, ${Math.max(0, b - 30)}, 0.9)`;\n ctx.fill();\n\n const stringDrift = Math.sin(this.#time * 2 + this.#driftPhase) * 8 * this.#scale;\n ctx.beginPath();\n ctx.moveTo(0, knotY + 5 * this.#scale);\n ctx.quadraticCurveTo(\n stringDrift,\n knotY + 5 * this.#scale + this.#stringLength * 0.5,\n -stringDrift * 0.5,\n knotY + 5 * this.#scale + this.#stringLength\n );\n ctx.strokeStyle = `rgba(${r}, ${g}, ${b}, 0.4)`;\n ctx.lineWidth = 1;\n ctx.stroke();\n\n ctx.restore();\n }\n\n tick(dt: number = 1): void {\n this.#time += 0.015 * dt;\n\n this.#y -= this.#riseSpeed * dt;\n this.#x += Math.sin(this.#time * this.#driftFreq + this.#driftPhase) * this.#driftAmp * dt;\n this.#rotation = Math.sin(this.#time * this.#rotationSpeed + this.#driftPhase) * 0.08;\n }\n}\n","import { Balloons } from './layer';\nimport type { BalloonsConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createBalloons(config?: BalloonsConfig): Effect<BalloonsConfig> {\n return new Balloons(config);\n}\n\nexport { BalloonParticle } from './particle';\nexport type { BalloonsConfig };\nexport type { BalloonParticleConfig } from './particle';\nexport type { Balloon } from './types';\n","const cache = new Map<string, { r: number; g: number; b: number; a: number }>();\n\nexport function parseColor(fillStyle: string): { r: number; g: number; b: number; a: number } {\n const cached = cache.get(fillStyle);\n if (cached) {\n return cached;\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d')!;\n ctx.fillStyle = fillStyle;\n ctx.fillRect(0, 0, 1, 1);\n const data = ctx.getImageData(0, 0, 1, 1).data;\n const result = {r: data[0], g: data[1], b: data[2], a: data[3] / 255};\n cache.set(fillStyle, result);\n return result;\n}\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { parseColor } from '../color';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { Bubble, PopParticle } from './types';\n\nconst DEFAULT_COLORS = ['#88ccff', '#aaddff', '#ccbbff'];\n\nexport interface BubblesConfig {\n readonly count?: number;\n readonly sizeRange?: [number, number];\n readonly speed?: number;\n readonly popOnClick?: boolean;\n readonly popRadius?: number;\n readonly colors?: string[];\n readonly wobbleAmount?: number;\n readonly scale?: number;\n}\n\nexport class Bubbles extends Effect<BubblesConfig> {\n readonly #scale: number;\n #speed: number;\n readonly #sizeRange: [number, number];\n #wobbleAmount: number;\n readonly #popOnClick: boolean;\n readonly #popRadius: number;\n readonly #baseHues: number[];\n readonly #onClickBound: (evt: MouseEvent) => void;\n #maxCount: number;\n #time: number = 0;\n #bubbles: Bubble[] = [];\n #popParticles: PopParticle[] = [];\n #canvas: HTMLCanvasElement | null = null;\n\n constructor(config: BubblesConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxCount = config.count ?? 30;\n this.#sizeRange = config.sizeRange ?? [10, 40];\n this.#speed = config.speed ?? 1;\n this.#wobbleAmount = config.wobbleAmount ?? 1;\n this.#popOnClick = config.popOnClick ?? true;\n this.#popRadius = config.popRadius ?? 50;\n\n const colors = config.colors ?? DEFAULT_COLORS;\n this.#baseHues = colors.map(c => this.#colorToHue(c));\n\n if (innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n\n for (let i = 0; i < this.#maxCount; ++i) {\n this.#bubbles.push(this.#createBubble(true));\n }\n\n this.#onClickBound = this.#onClick.bind(this);\n }\n\n onMount(canvas: HTMLCanvasElement): void {\n this.#canvas = canvas;\n\n if (this.#popOnClick) {\n canvas.addEventListener('click', this.#onClickBound, {passive: true});\n }\n }\n\n onUnmount(canvas: HTMLCanvasElement): void {\n canvas.removeEventListener('click', this.#onClickBound);\n this.#canvas = null;\n }\n\n configure(config: Partial<BubblesConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.wobbleAmount !== undefined) {\n this.#wobbleAmount = config.wobbleAmount;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#time += 0.01 * dt;\n\n for (let i = 0; i < this.#bubbles.length; i++) {\n const bubble = this.#bubbles[i];\n\n const wobble = Math.sin(this.#time * bubble.wobbleFreq + bubble.wobblePhase) * bubble.wobbleAmp * this.#wobbleAmount;\n bubble.x += wobble * dt / (width * 3);\n bubble.y -= (bubble.speed * this.#speed * dt) / (height * 0.8);\n\n bubble.hue += 0.1 * dt;\n\n if (bubble.y < -0.1) {\n this.#bubbles[i] = this.#createBubble(false);\n }\n }\n\n let alive = 0;\n\n for (let i = 0; i < this.#popParticles.length; i++) {\n const particle = this.#popParticles[i];\n\n particle.x += (particle.vx * dt) / width;\n particle.y += (particle.vy * dt) / height;\n particle.alpha -= particle.decay * dt;\n\n if (particle.alpha > 0) {\n this.#popParticles[alive++] = particle;\n }\n }\n\n this.#popParticles.length = alive;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n for (const bubble of this.#bubbles) {\n const px = bubble.x * width;\n const py = bubble.y * height;\n const r = bubble.radius * this.#scale;\n\n const gradient = ctx.createRadialGradient(\n px - r * 0.3, py - r * 0.3, r * 0.1,\n px, py, r\n );\n\n const hue = (bubble.hue + this.#time * 10) % 360;\n gradient.addColorStop(0, `hsla(${hue}, 70%, 85%, ${bubble.opacity * 0.4})`);\n gradient.addColorStop(0.7, `hsla(${hue}, 60%, 70%, ${bubble.opacity * 0.15})`);\n gradient.addColorStop(1, `hsla(${hue}, 50%, 60%, ${bubble.opacity * 0.05})`);\n\n ctx.beginPath();\n ctx.arc(px, py, r, 0, Math.PI * 2);\n ctx.fillStyle = gradient;\n ctx.fill();\n\n ctx.beginPath();\n ctx.arc(px, py, r, 0, Math.PI * 2);\n ctx.strokeStyle = `hsla(${hue}, 60%, 80%, ${bubble.opacity * 0.3})`;\n ctx.lineWidth = 1;\n ctx.stroke();\n\n ctx.beginPath();\n ctx.ellipse(px - r * 0.25, py - r * 0.3, r * 0.2, r * 0.12, -0.5, 0, Math.PI * 2);\n ctx.fillStyle = `hsla(0, 0%, 100%, ${bubble.opacity * 0.5})`;\n ctx.fill();\n }\n\n for (const particle of this.#popParticles) {\n ctx.beginPath();\n ctx.arc(particle.x * width, particle.y * height, particle.size * this.#scale, 0, Math.PI * 2);\n ctx.fillStyle = `rgba(200, 220, 255, ${particle.alpha})`;\n ctx.fill();\n }\n }\n\n #onClick(evt: MouseEvent): void {\n if (!this.#canvas) {\n return;\n }\n\n const rect = this.#canvas.getBoundingClientRect();\n const mx = (evt.clientX - rect.left) / rect.width;\n const my = (evt.clientY - rect.top) / rect.height;\n const popRadiusNorm = this.#popRadius / this.#canvas.width;\n\n for (let i = this.#bubbles.length - 1; i >= 0; i--) {\n const bubble = this.#bubbles[i];\n const dx = bubble.x - mx;\n const dy = bubble.y - my;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n if (dist < popRadiusNorm + (bubble.radius * this.#scale) / this.#canvas.width) {\n this.#createPopBurst(bubble.x, bubble.y);\n this.#bubbles[i] = this.#createBubble(false);\n }\n }\n }\n\n #createBubble(initialSpread: boolean): Bubble {\n const hueIndex = Math.floor(MULBERRY.next() * this.#baseHues.length);\n\n return {\n x: MULBERRY.next(),\n y: initialSpread ? MULBERRY.next() : 1.1 + MULBERRY.next() * 0.1,\n radius: this.#sizeRange[0] + MULBERRY.next() * (this.#sizeRange[1] - this.#sizeRange[0]),\n speed: 0.5 + MULBERRY.next() * 1.5,\n hue: this.#baseHues[hueIndex],\n wobblePhase: MULBERRY.next() * Math.PI * 2,\n wobbleFreq: 1 + MULBERRY.next() * 2,\n wobbleAmp: 0.5 + MULBERRY.next() * 1,\n opacity: 0.6 + MULBERRY.next() * 0.4\n };\n }\n\n #createPopBurst(x: number, y: number): void {\n const count = 5 + Math.floor(MULBERRY.next() * 4);\n\n for (let i = 0; i < count; i++) {\n const angle = MULBERRY.next() * Math.PI * 2;\n const speed = 1 + MULBERRY.next() * 3;\n\n this.#popParticles.push({\n x,\n y,\n vx: Math.cos(angle) * speed,\n vy: Math.sin(angle) * speed,\n alpha: 0.6 + MULBERRY.next() * 0.4,\n size: 1 + MULBERRY.next() * 2,\n decay: 0.03 + MULBERRY.next() * 0.03\n });\n }\n }\n\n #colorToHue(color: string): number {\n const {r: r255, g: g255, b: b255} = parseColor(color);\n let r = r255 / 255;\n let g = g255 / 255;\n let b = b255 / 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n\n if (delta === 0) {\n return 0;\n }\n\n let hue: number;\n\n if (max === r) {\n hue = ((g - b) / delta) % 6;\n } else if (max === g) {\n hue = (b - r) / delta + 2;\n } else {\n hue = (r - g) / delta + 4;\n }\n\n hue = Math.round(hue * 60);\n\n if (hue < 0) {\n hue += 360;\n }\n\n return hue;\n }\n}\n","import { Bubbles } from './layer';\nimport type { BubblesConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createBubbles(config?: BubblesConfig): Effect<BubblesConfig> {\n return new Bubbles(config);\n}\n\nexport type { BubblesConfig };\nexport type { Bubble, PopParticle } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\nimport type { Config, Palette } from './types';\n\nexport const PALETTES: Record<Palette, string[]> = {\n classic: ['#26ccff', '#a25afd', '#ff5e7e', '#88ff5a', '#fcff42', '#ffa62d', '#ff36ff'],\n pastel: ['#a8d8ea', '#c3aed6', '#f9b4c4', '#ffd6a5', '#caffbf', '#fdffb6'],\n vibrant: ['#6366f1', '#8b5cf6', '#ec4899', '#f97316', '#eab308', '#22c55e', '#06b6d4'],\n warm: ['#ff6b6b', '#feca57', '#48dbfb', '#ff9ff3', '#54a0ff', '#5f27cd', '#01a3a4']\n};\n\nexport const DEFAULT_CONFIG: Config = {\n angle: 90,\n colors: PALETTES.vibrant,\n decay: 0.9,\n gravity: 1,\n palette: 'vibrant',\n particles: 50,\n shapes: ['bowtie', 'circle', 'crescent', 'diamond', 'heart', 'hexagon', 'ribbon', 'ring', 'square', 'star', 'triangle'],\n spread: 45,\n ticks: 200,\n startVelocity: 45,\n x: 0.5,\n y: 0.5\n};\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import type { Shape } from './types';\n\nconst TWO_PI = Math.PI * 2;\n\nfunction buildShapePaths(): Record<Shape, Path2D> {\n const bowtie = new Path2D();\n bowtie.moveTo(-1, -0.7);\n bowtie.lineTo(0, 0);\n bowtie.lineTo(-1, 0.7);\n bowtie.closePath();\n bowtie.moveTo(1, -0.7);\n bowtie.lineTo(0, 0);\n bowtie.lineTo(1, 0.7);\n bowtie.closePath();\n\n const circle = new Path2D();\n circle.ellipse(0, 0, 0.6, 1, 0, 0, TWO_PI);\n\n const crescent = new Path2D();\n crescent.arc(0, 0, 1, 0, TWO_PI, false);\n crescent.arc(0.45, 0, 0.9, 0, TWO_PI, true);\n\n const diamond = new Path2D();\n diamond.moveTo(0, -1);\n diamond.lineTo(0.6, 0);\n diamond.lineTo(0, 1);\n diamond.lineTo(-0.6, 0);\n diamond.closePath();\n\n const heart = new Path2D();\n heart.moveTo(0, 1);\n heart.bezierCurveTo(-0.4, 0.55, -1, 0.1, -1, -0.35);\n heart.bezierCurveTo(-1, -0.8, -0.5, -1, 0, -0.6);\n heart.bezierCurveTo(0.5, -1, 1, -0.8, 1, -0.35);\n heart.bezierCurveTo(1, 0.1, 0.4, 0.55, 0, 1);\n heart.closePath();\n\n const hexagon = new Path2D();\n for (let i = 0; i < 6; i++) {\n const angle = (i * Math.PI / 3) - Math.PI / 2;\n if (i === 0) {\n hexagon.moveTo(Math.cos(angle), Math.sin(angle));\n } else {\n hexagon.lineTo(Math.cos(angle), Math.sin(angle));\n }\n }\n hexagon.closePath();\n\n const ribbon = new Path2D();\n ribbon.rect(-0.2, -1, 0.4, 2);\n\n const ring = new Path2D();\n ring.arc(0, 0, 1, 0, TWO_PI, false);\n ring.arc(0, 0, 0.55, 0, TWO_PI, true);\n\n const square = new Path2D();\n square.rect(-0.7, -0.7, 1.4, 1.4);\n\n const star = new Path2D();\n for (let i = 0; i < 10; i++) {\n const r = i % 2 === 0 ? 1 : 0.42;\n const angle = (i * Math.PI / 5) - Math.PI / 2;\n if (i === 0) {\n star.moveTo(r * Math.cos(angle), r * Math.sin(angle));\n } else {\n star.lineTo(r * Math.cos(angle), r * Math.sin(angle));\n }\n }\n star.closePath();\n\n const triangle = new Path2D();\n for (let i = 0; i < 3; i++) {\n const angle = (i * 2 * Math.PI / 3) - Math.PI / 2;\n if (i === 0) {\n triangle.moveTo(Math.cos(angle), Math.sin(angle));\n } else {\n triangle.lineTo(Math.cos(angle), Math.sin(angle));\n }\n }\n triangle.closePath();\n\n return {bowtie, circle, crescent, diamond, heart, hexagon, ribbon, ring, square, star, triangle};\n}\n\nlet _shapePaths: Record<Shape, Path2D> | null = null;\n\nexport const SHAPE_PATHS: Record<Shape, Path2D> = new Proxy({} as Record<Shape, Path2D>, {\n get(_, key: string) {\n return (_shapePaths ??= buildShapePaths())[key as Shape];\n }\n});\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { DEFAULT_CONFIG, MULBERRY, PALETTES } from './consts';\nimport { SHAPE_PATHS } from './shapes';\nimport type { Config, Particle, ParticleConfig } from './types';\n\nconst TWO_PI = Math.PI * 2;\n\nexport interface ConfettiConfig {\n readonly scale?: number;\n}\n\nexport class Confetti extends Effect<ConfettiConfig> {\n readonly #scale: number;\n #particles: Particle[] = [];\n #width: number = 0;\n #height: number = 0;\n #isFiring: boolean = false;\n\n constructor(config: ConfettiConfig = {}) {\n super();\n this.#scale = config.scale ?? 1;\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n }\n\n burst(config: Partial<Config>): void {\n const width = this.#width;\n const height = this.#height;\n\n const resolved = {...DEFAULT_CONFIG, ...config};\n const colors = config.colors ?? PALETTES[resolved.palette];\n const {angle, decay, gravity, shapes, spread, startVelocity, ticks, x, y} = resolved;\n const numberOfParticles = Math.max(1, resolved.particles);\n\n for (let i = 0; i < numberOfParticles; i++) {\n const particle = this.#createParticle({\n angle,\n color: hexToRGB(colors[Math.floor(MULBERRY.next() * colors.length)]),\n decay,\n gravity: gravity * this.#scale,\n shape: shapes[Math.floor(MULBERRY.next() * shapes.length)],\n spread,\n startVelocity: startVelocity * this.#scale,\n ticks,\n x: width * x,\n y: height * y\n });\n\n this.#tickParticle(particle);\n this.#particles.push(particle);\n }\n\n this.#isFiring = true;\n }\n\n get hasParticles(): boolean {\n return this.#particles.length > 0;\n }\n\n tick(dt: number, _width: number, _height: number): void {\n const particles = this.#particles;\n let alive = 0;\n\n for (let i = 0; i < particles.length; i++) {\n const p = particles[i];\n\n if (p.tick < p.totalTicks) {\n this.#tickParticle(p, dt);\n\n if (p.tick < p.totalTicks) {\n particles[alive++] = p;\n }\n }\n }\n\n particles.length = alive;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n const particles = this.#particles;\n\n for (let i = 0; i < particles.length; i++) {\n const p = particles[i];\n const flipCos = Math.cos(p.flipAngle);\n const size = p.size;\n\n ctx.setTransform(\n p.rotCos * flipCos * size,\n p.rotSin * flipCos * size,\n -p.rotSin * size,\n p.rotCos * size,\n p.x,\n p.y\n );\n ctx.globalAlpha = 1 - p.tick / p.totalTicks;\n ctx.fillStyle = p.colorStr;\n ctx.fill(SHAPE_PATHS[p.shape]);\n }\n\n ctx.resetTransform();\n ctx.globalAlpha = 1;\n }\n\n #createParticle(config: ParticleConfig): Particle {\n const launchAngle = -(config.angle * Math.PI / 180)\n + (0.5 * config.spread * Math.PI / 180)\n - (MULBERRY.next() * config.spread * Math.PI / 180);\n\n const speed = config.startVelocity * (0.5 + MULBERRY.next());\n const rotAngle = MULBERRY.next() * TWO_PI;\n\n return {\n colorStr: `rgb(${config.color[0]}, ${config.color[1]}, ${config.color[2]})`,\n decay: config.decay - 0.05 + MULBERRY.next() * 0.1,\n flipAngle: MULBERRY.next() * TWO_PI,\n flipSpeed: 0.03 + MULBERRY.next() * 0.05,\n gravity: config.gravity,\n rotAngle,\n rotCos: Math.cos(rotAngle),\n rotSin: Math.sin(rotAngle),\n rotSpeed: (MULBERRY.next() - 0.5) * 0.06,\n shape: config.shape,\n size: (5 + MULBERRY.next() * 5) * this.#scale,\n swing: MULBERRY.next() * TWO_PI,\n swingAmp: 0.5 + MULBERRY.next() * 1.5,\n swingSpeed: 0.025 + MULBERRY.next() * 0.035,\n tick: 0,\n totalTicks: config.ticks,\n vx: Math.cos(launchAngle) * speed,\n vy: Math.sin(launchAngle) * speed,\n x: config.x,\n y: config.y\n };\n }\n\n #tickParticle(particle: Particle, dt: number = 1): void {\n const decayFactor = Math.pow(particle.decay, dt);\n particle.vx *= decayFactor;\n particle.vy *= decayFactor;\n particle.vy += particle.gravity * 0.35 * dt;\n particle.swing += particle.swingSpeed * dt;\n particle.x += (particle.vx + particle.swingAmp * Math.cos(particle.swing)) * dt;\n particle.y += particle.vy * dt;\n particle.rotAngle += particle.rotSpeed * dt;\n particle.rotCos = Math.cos(particle.rotAngle);\n particle.rotSin = Math.sin(particle.rotAngle);\n particle.flipAngle += particle.flipSpeed * dt;\n particle.tick += dt;\n }\n}\n","import type { Point } from '../point';\nimport { MULBERRY } from './consts';\nimport { SHAPE_PATHS } from './shapes';\nimport type { Shape } from './types';\n\nexport interface ConfettiParticleConfig {\n readonly decay?: number;\n readonly gravity?: number;\n readonly scale?: number;\n readonly spread?: number;\n readonly startVelocity?: number;\n readonly ticks?: number;\n}\n\nexport class ConfettiParticle {\n readonly #colorStr: string;\n readonly #gravity: number;\n readonly #shape: Shape;\n readonly #size: number;\n readonly #totalTicks: number;\n #decay: number;\n #flipAngle: number;\n #flipSpeed: number;\n #rotAngle: number;\n #rotCos: number;\n #rotSin: number;\n #rotSpeed: number;\n #swing: number;\n #swingAmp: number;\n #swingSpeed: number;\n #tick: number = 0;\n #vx: number;\n #vy: number;\n #x: number;\n #y: number;\n\n get isDead(): boolean {\n return this.#tick >= this.#totalTicks;\n }\n\n get position(): Point {\n return {x: this.#x, y: this.#y};\n }\n\n constructor(position: Point, direction: number, shape: Shape, color: string, config: ConfettiParticleConfig = {}) {\n const scale = config.scale ?? 1;\n const spread = config.spread ?? 45;\n const startVelocity = (config.startVelocity ?? 45) * scale;\n const launchAngle = -(direction * Math.PI / 180)\n + (0.5 * spread * Math.PI / 180)\n - (MULBERRY.next() * spread * Math.PI / 180);\n const speed = startVelocity * (0.5 + MULBERRY.next());\n const rotAngle = MULBERRY.next() * Math.PI * 2;\n\n this.#colorStr = color;\n this.#gravity = (config.gravity ?? 1) * scale;\n this.#shape = shape;\n this.#size = (5 + MULBERRY.next() * 5) * scale;\n this.#totalTicks = config.ticks ?? 200;\n this.#x = position.x;\n this.#y = position.y;\n this.#vx = Math.cos(launchAngle) * speed;\n this.#vy = Math.sin(launchAngle) * speed;\n this.#decay = (config.decay ?? 0.9) - 0.05 + MULBERRY.next() * 0.1;\n this.#flipAngle = MULBERRY.next() * Math.PI * 2;\n this.#flipSpeed = 0.03 + MULBERRY.next() * 0.05;\n this.#rotAngle = rotAngle;\n this.#rotCos = Math.cos(rotAngle);\n this.#rotSin = Math.sin(rotAngle);\n this.#rotSpeed = (MULBERRY.next() - 0.5) * 0.06;\n this.#swing = MULBERRY.next() * Math.PI * 2;\n this.#swingAmp = 0.5 + MULBERRY.next() * 1.5;\n this.#swingSpeed = 0.025 + MULBERRY.next() * 0.035;\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n ctx.save();\n ctx.setTransform(\n this.#rotCos * Math.cos(this.#flipAngle) * this.#size,\n this.#rotSin * Math.cos(this.#flipAngle) * this.#size,\n -this.#rotSin * this.#size,\n this.#rotCos * this.#size,\n this.#x,\n this.#y\n );\n ctx.globalAlpha = Math.max(0, 1 - this.#tick / this.#totalTicks);\n ctx.fillStyle = this.#colorStr;\n ctx.fill(SHAPE_PATHS[this.#shape]);\n ctx.restore();\n }\n\n tick(dt: number = 1): void {\n const decayFactor = Math.pow(this.#decay, dt);\n this.#vx *= decayFactor;\n this.#vy *= decayFactor;\n this.#vy += this.#gravity * 0.35 * dt;\n this.#swing += this.#swingSpeed * dt;\n this.#x += (this.#vx + this.#swingAmp * Math.cos(this.#swing)) * dt;\n this.#y += this.#vy * dt;\n this.#rotAngle += this.#rotSpeed * dt;\n this.#rotCos = Math.cos(this.#rotAngle);\n this.#rotSin = Math.sin(this.#rotAngle);\n this.#flipAngle += this.#flipSpeed * dt;\n this.#tick += dt;\n }\n}\n","import { Confetti } from './layer';\nimport type { ConfettiConfig } from './layer';\nimport type { Config as ConfettiBurstConfig } from './types';\nimport type { Effect } from '../effect';\n\nexport interface ConfettiInstance extends Effect<ConfettiConfig> {\n burst(config: Partial<ConfettiBurstConfig>): void;\n}\n\nexport function createConfetti(config?: ConfettiConfig): ConfettiInstance {\n return new Confetti(config) as ConfettiInstance;\n}\n\nexport { ConfettiParticle } from './particle';\nexport { PALETTES } from './consts';\nexport { SHAPE_PATHS } from './shapes';\nexport type { ConfettiConfig };\nexport type { ConfettiBurstConfig };\nexport type { ConfettiParticleConfig } from './particle';\nexport type { Palette, Shape as ConfettiShape } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\nimport type { DonutsConfig } from './layer';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n\nexport const DEFAULT_CONFIG: DonutsConfig = {\n background: '#a51955',\n collisionPadding: 20,\n colors: ['#bd1961', '#da287c'],\n count: 12,\n mouseAvoidance: false,\n mouseAvoidanceRadius: 150,\n mouseAvoidanceStrength: 0.03,\n radiusRange: [60, 90],\n repulsionStrength: 0.02,\n rotationSpeedRange: [0.0005, 0.002],\n speedRange: [0.15, 0.6],\n thickness: 0.39\n};\n","import { Effect } from '../effect';\nimport { DEFAULT_CONFIG, MULBERRY } from './consts';\nimport type { Donut } from './donut';\n\nexport interface DonutsConfig {\n readonly background?: string;\n readonly collisionPadding?: number;\n readonly colors?: string[];\n readonly count?: number;\n readonly mouseAvoidance?: boolean;\n readonly mouseAvoidanceRadius?: number;\n readonly mouseAvoidanceStrength?: number;\n readonly radiusRange?: [number, number];\n readonly repulsionStrength?: number;\n readonly rotationSpeedRange?: [number, number];\n readonly scale?: number;\n readonly speedRange?: [number, number];\n readonly thickness?: number;\n}\n\nexport class Donuts extends Effect<DonutsConfig> {\n readonly #background: string;\n readonly #collisionPadding: number;\n readonly #colors: string[];\n readonly #count: number;\n #mouseAvoidance: boolean;\n #mouseAvoidanceRadius: number;\n #mouseAvoidanceStrength: number;\n readonly #radiusRange: [number, number];\n #repulsionStrength: number;\n readonly #rotationSpeedRange: [number, number];\n readonly #scale: number;\n readonly #speedRange: [number, number];\n readonly #thickness: number;\n readonly #onMouseMoveBound: (event: MouseEvent) => void;\n readonly #onMouseLeaveBound: () => void;\n #donuts: Donut[] = [];\n #mouseX: number = -1;\n #mouseY: number = -1;\n #mouseOnCanvas: boolean = false;\n #width: number = 960;\n #height: number = 540;\n #initialized: boolean = false;\n\n constructor(config: DonutsConfig = {}) {\n super();\n\n const scale = config.scale ?? 1;\n\n this.#background = config.background ?? DEFAULT_CONFIG.background!;\n this.#collisionPadding = (config.collisionPadding ?? DEFAULT_CONFIG.collisionPadding!) * scale;\n this.#colors = config.colors ?? DEFAULT_CONFIG.colors!;\n this.#count = config.count ?? DEFAULT_CONFIG.count!;\n this.#mouseAvoidance = config.mouseAvoidance ?? DEFAULT_CONFIG.mouseAvoidance!;\n this.#mouseAvoidanceRadius = (config.mouseAvoidanceRadius ?? DEFAULT_CONFIG.mouseAvoidanceRadius!) * scale;\n this.#mouseAvoidanceStrength = config.mouseAvoidanceStrength ?? DEFAULT_CONFIG.mouseAvoidanceStrength!;\n this.#radiusRange = [\n (config.radiusRange ?? DEFAULT_CONFIG.radiusRange!)[0] * scale,\n (config.radiusRange ?? DEFAULT_CONFIG.radiusRange!)[1] * scale\n ];\n this.#repulsionStrength = config.repulsionStrength ?? DEFAULT_CONFIG.repulsionStrength!;\n this.#rotationSpeedRange = config.rotationSpeedRange ?? DEFAULT_CONFIG.rotationSpeedRange!;\n this.#scale = scale;\n this.#speedRange = [\n (config.speedRange ?? DEFAULT_CONFIG.speedRange!)[0] * scale,\n (config.speedRange ?? DEFAULT_CONFIG.speedRange!)[1] * scale\n ];\n this.#thickness = config.thickness ?? DEFAULT_CONFIG.thickness!;\n\n this.#onMouseMoveBound = (event: MouseEvent) => this.#onMouseMove(event);\n this.#onMouseLeaveBound = () => this.#onMouseLeave();\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n if (!this.#initialized) {\n this.#initialized = true;\n this.#donuts = [];\n\n for (let i = 0; i < this.#count; i++) {\n this.#donuts.push(this.#createNonOverlapping());\n }\n }\n }\n\n onMount(canvas: HTMLCanvasElement): void {\n if (this.#mouseAvoidance) {\n canvas.addEventListener('mousemove', this.#onMouseMoveBound, {passive: true});\n canvas.addEventListener('mouseleave', this.#onMouseLeaveBound, {passive: true});\n }\n }\n\n onUnmount(canvas: HTMLCanvasElement): void {\n canvas.removeEventListener('mousemove', this.#onMouseMoveBound);\n canvas.removeEventListener('mouseleave', this.#onMouseLeaveBound);\n }\n\n configure(config: Partial<DonutsConfig>): void {\n if (config.mouseAvoidance !== undefined) {\n this.#mouseAvoidance = config.mouseAvoidance;\n }\n if (config.mouseAvoidanceRadius !== undefined) {\n this.#mouseAvoidanceRadius = config.mouseAvoidanceRadius;\n }\n if (config.mouseAvoidanceStrength !== undefined) {\n this.#mouseAvoidanceStrength = config.mouseAvoidanceStrength;\n }\n if (config.repulsionStrength !== undefined) {\n this.#repulsionStrength = config.repulsionStrength;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n this.#resolveCollisions(dt);\n\n if (this.#mouseAvoidance && this.#mouseOnCanvas) {\n this.#resolveMouseAvoidance(dt);\n }\n\n for (const donut of this.#donuts) {\n this.#updateDonut(donut, dt);\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n ctx.globalAlpha = 1;\n ctx.fillStyle = this.#background;\n ctx.fillRect(0, 0, width, height);\n\n for (const donut of this.#donuts) {\n const cos = Math.cos(donut.angle);\n const sin = Math.sin(donut.angle);\n ctx.setTransform(cos, sin, -sin, cos, donut.x, donut.y);\n\n ctx.beginPath();\n ctx.arc(0, 0, donut.outerRadius, 0, Math.PI * 2);\n ctx.arc(0, 0, donut.innerRadius, 0, Math.PI * 2, true);\n ctx.closePath();\n\n ctx.fillStyle = donut.color;\n ctx.fill();\n }\n\n ctx.resetTransform();\n }\n\n #updateDonut(donut: Donut, dt: number): void {\n const currentSpeed = Math.sqrt(donut.vx * donut.vx + donut.vy * donut.vy);\n\n if (currentSpeed > donut.speed) {\n const damping = Math.pow(0.995, dt);\n donut.vx *= damping;\n donut.vy *= damping;\n }\n\n donut.x += donut.vx * dt;\n donut.y += donut.vy * dt;\n donut.angle += donut.rotationSpeed * dt;\n\n const limit = donut.outerRadius * 0.5;\n const width = this.#width;\n const height = this.#height;\n\n if (donut.x < -limit) {\n donut.x = -limit;\n donut.vx = Math.abs(donut.vx);\n }\n\n if (donut.x > width + limit) {\n donut.x = width + limit;\n donut.vx = -Math.abs(donut.vx);\n }\n\n if (donut.y < -limit) {\n donut.y = -limit;\n donut.vy = Math.abs(donut.vy);\n }\n\n if (donut.y > height + limit) {\n donut.y = height + limit;\n donut.vy = -Math.abs(donut.vy);\n }\n }\n\n #onMouseMove(event: MouseEvent): void {\n const target = event.currentTarget as HTMLCanvasElement;\n const rect = target.getBoundingClientRect();\n this.#mouseX = event.clientX - rect.left;\n this.#mouseY = event.clientY - rect.top;\n this.#mouseOnCanvas = true;\n }\n\n #onMouseLeave(): void {\n this.#mouseOnCanvas = false;\n }\n\n #resolveMouseAvoidance(dt: number): void {\n const radius = this.#mouseAvoidanceRadius;\n const strength = this.#mouseAvoidanceStrength;\n const mx = this.#mouseX;\n const my = this.#mouseY;\n\n for (const donut of this.#donuts) {\n const dx = donut.x - mx;\n const dy = donut.y - my;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const minDist = donut.outerRadius + radius;\n\n if (dist < minDist && dist > 0) {\n const overlap = minDist - dist;\n const nx = dx / dist;\n const ny = dy / dist;\n const force = overlap * strength * dt;\n\n donut.vx += nx * force;\n donut.vy += ny * force;\n }\n }\n }\n\n #resolveCollisions(dt: number): void {\n const padding = this.#collisionPadding;\n const strength = this.#repulsionStrength;\n\n for (let i = 0; i < this.#donuts.length; i++) {\n for (let j = i + 1; j < this.#donuts.length; j++) {\n const a = this.#donuts[i];\n const b = this.#donuts[j];\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const minDist = a.outerRadius + b.outerRadius + padding;\n\n if (dist < minDist && dist > 0) {\n const overlap = minDist - dist;\n const nx = dx / dist;\n const ny = dy / dist;\n const force = overlap * strength * dt;\n\n a.vx -= nx * force;\n a.vy -= ny * force;\n b.vx += nx * force;\n b.vy += ny * force;\n }\n }\n }\n }\n\n #createDonut(): Donut {\n const outerRadius = this.#rand(this.#radiusRange[0], this.#radiusRange[1]);\n const innerRadius = outerRadius * (1 - this.#thickness);\n const speed = this.#rand(this.#speedRange[0], this.#speedRange[1]);\n const direction = MULBERRY.next() * Math.PI * 2;\n\n return {\n outerRadius,\n innerRadius,\n x: this.#rand(-outerRadius, this.#width + outerRadius),\n y: this.#rand(-outerRadius, this.#height + outerRadius),\n angle: MULBERRY.next() * Math.PI * 2,\n speed,\n rotationSpeed: this.#rand(this.#rotationSpeedRange[0], this.#rotationSpeedRange[1]) * (MULBERRY.next() > 0.5 ? 1 : -1),\n color: this.#colors[Math.floor(MULBERRY.next() * this.#colors.length)],\n vx: Math.cos(direction) * speed,\n vy: Math.sin(direction) * speed\n };\n }\n\n #createNonOverlapping(maxAttempts: number = 200): Donut {\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const donut = this.#createDonut();\n\n if (!this.#overlapsAny(donut)) {\n return donut;\n }\n }\n\n return this.#createDonut();\n }\n\n #overlapsAny(donut: Donut): boolean {\n const minDist = this.#collisionPadding;\n\n return this.#donuts.some((other) => {\n const dx = donut.x - other.x;\n const dy = donut.y - other.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n return dist < donut.outerRadius + other.outerRadius + minDist;\n });\n }\n\n #rand(min: number, max: number): number {\n return MULBERRY.next() * (max - min) + min;\n }\n}\n","import { Donuts } from './layer';\nimport type { DonutsConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createDonuts(config?: DonutsConfig): Effect<DonutsConfig> {\n return new Donuts(config);\n}\n\nexport type { DonutsConfig };\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { Firefly } from './types';\n\nconst SPRITE_SIZE = 64;\nconst SPRITE_CENTER = SPRITE_SIZE / 2;\nconst SPRITE_RADIUS = SPRITE_SIZE / 2;\n\nexport interface FirefliesConfig {\n readonly count?: number;\n readonly color?: string;\n readonly size?: number;\n readonly speed?: number;\n readonly glowSpeed?: number;\n readonly scale?: number;\n}\n\nexport class Fireflies extends Effect<FirefliesConfig> {\n readonly #scale: number;\n readonly #size: number;\n #speed: number;\n #glowSpeed: number;\n #maxCount: number;\n #time: number = 0;\n #fireflies: Firefly[] = [];\n #sprite: HTMLCanvasElement;\n\n constructor(config: FirefliesConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxCount = config.count ?? 60;\n this.#size = (config.size ?? 6) * this.#scale;\n this.#speed = config.speed ?? 1;\n this.#glowSpeed = config.glowSpeed ?? 1;\n\n const {r, g, b} = this.#parseColor(config.color ?? '#b4ff6a');\n\n if (innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n\n this.#sprite = this.#createSprite(r, g, b);\n\n for (let i = 0; i < this.#maxCount; ++i) {\n this.#fireflies.push(this.#createFirefly());\n }\n }\n\n configure(config: Partial<FirefliesConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.glowSpeed !== undefined) {\n this.#glowSpeed = config.glowSpeed;\n }\n }\n\n tick(dt: number, _width: number, _height: number): void {\n this.#time += 0.02 * dt * this.#speed;\n\n for (const firefly of this.#fireflies) {\n const moveX = Math.sin(this.#time * firefly.freqX1 + firefly.phaseX1) * firefly.amplitudeX\n + Math.sin(this.#time * firefly.freqX2 + firefly.phaseX2) * firefly.amplitudeX * 0.5;\n\n const moveY = Math.sin(this.#time * firefly.freqY1 + firefly.phaseY1) * firefly.amplitudeY\n + Math.sin(this.#time * firefly.freqY2 + firefly.phaseY2) * firefly.amplitudeY * 0.5;\n\n firefly.x += moveX * dt / (3000 * (1 / this.#speed));\n firefly.y += moveY * dt / (3000 * (1 / this.#speed));\n\n if (firefly.x > 1.1) {\n firefly.x = -0.1;\n } else if (firefly.x < -0.1) {\n firefly.x = 1.1;\n }\n\n if (firefly.y > 1.1) {\n firefly.y = -0.1;\n } else if (firefly.y < -0.1) {\n firefly.y = 1.1;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n ctx.globalCompositeOperation = 'lighter';\n\n for (const firefly of this.#fireflies) {\n const alpha = 0.5 + 0.5 * Math.sin(this.#time * firefly.glowSpeed * this.#glowSpeed + firefly.phase);\n\n if (alpha < 0.05) {\n continue;\n }\n\n const px = firefly.x * width;\n const py = firefly.y * height;\n const displaySize = firefly.size * 2;\n\n ctx.globalAlpha = alpha;\n ctx.drawImage(\n this.#sprite,\n px - firefly.size,\n py - firefly.size,\n displaySize,\n displaySize\n );\n }\n\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = 1;\n }\n\n #parseColor(color: string): { r: number; g: number; b: number } {\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d')!;\n ctx.fillStyle = color;\n ctx.fillRect(0, 0, 1, 1);\n const data = ctx.getImageData(0, 0, 1, 1).data;\n return {r: data[0], g: data[1], b: data[2]};\n }\n\n #createSprite(r: number, g: number, b: number): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.width = SPRITE_SIZE;\n canvas.height = SPRITE_SIZE;\n const ctx = canvas.getContext('2d')!;\n\n const gradient = ctx.createRadialGradient(\n SPRITE_CENTER, SPRITE_CENTER, 0,\n SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS\n );\n\n gradient.addColorStop(0, `rgba(${r}, ${g}, ${b}, 1)`);\n gradient.addColorStop(0.1, `rgba(${r}, ${g}, ${b}, 0.8)`);\n gradient.addColorStop(0.4, `rgba(${r}, ${g}, ${b}, 0.3)`);\n gradient.addColorStop(0.7, `rgba(${r}, ${g}, ${b}, 0.08)`);\n gradient.addColorStop(1, `rgba(${r}, ${g}, ${b}, 0)`);\n\n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.arc(SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS, 0, Math.PI * 2);\n ctx.fill();\n\n return canvas;\n }\n\n #createFirefly(): Firefly {\n return {\n x: MULBERRY.next(),\n y: MULBERRY.next(),\n size: (MULBERRY.next() * 0.6 + 0.4) * this.#size,\n phase: MULBERRY.next() * Math.PI * 2,\n glowSpeed: 0.5 + MULBERRY.next() * 1.5,\n freqX1: 0.3 + MULBERRY.next() * 0.7,\n freqX2: 1.2 + MULBERRY.next() * 1.8,\n freqY1: 0.3 + MULBERRY.next() * 0.7,\n freqY2: 1.2 + MULBERRY.next() * 1.8,\n phaseX1: MULBERRY.next() * Math.PI * 2,\n phaseX2: MULBERRY.next() * Math.PI * 2,\n phaseY1: MULBERRY.next() * Math.PI * 2,\n phaseY2: MULBERRY.next() * Math.PI * 2,\n amplitudeX: 0.3 + MULBERRY.next() * 0.7,\n amplitudeY: 0.3 + MULBERRY.next() * 0.7\n };\n }\n}\n","export interface FireflyParticleConfig {\n readonly glowSpeed?: number;\n readonly scale?: number;\n readonly size?: number;\n readonly speed?: number;\n}\n\nexport function createFireflySprite(color: string, size: number = 64): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n\n const ctx = canvas.getContext('2d')!;\n const center = size / 2;\n const radius = size / 2;\n\n const tmp = document.createElement('canvas');\n tmp.width = 1;\n tmp.height = 1;\n const tmpCtx = tmp.getContext('2d')!;\n tmpCtx.fillStyle = color;\n tmpCtx.fillRect(0, 0, 1, 1);\n const [r, g, b] = tmpCtx.getImageData(0, 0, 1, 1).data;\n\n const gradient = ctx.createRadialGradient(center, center, 0, center, center, radius);\n gradient.addColorStop(0, `rgba(${r}, ${g}, ${b}, 1)`);\n gradient.addColorStop(0.1, `rgba(${r}, ${g}, ${b}, 0.8)`);\n gradient.addColorStop(0.4, `rgba(${r}, ${g}, ${b}, 0.3)`);\n gradient.addColorStop(0.7, `rgba(${r}, ${g}, ${b}, 0.08)`);\n gradient.addColorStop(1, `rgba(${r}, ${g}, ${b}, 0)`);\n\n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.arc(center, center, radius, 0, Math.PI * 2);\n ctx.fill();\n\n return canvas;\n}\n\nexport class FireflyParticle {\n readonly #sprite: HTMLCanvasElement;\n readonly #bounds: { width: number; height: number };\n readonly #glowSpeed: number;\n readonly #size: number;\n readonly #speed: number;\n readonly #phase: number;\n readonly #freqX1: number;\n readonly #freqX2: number;\n readonly #freqY1: number;\n readonly #freqY2: number;\n readonly #phaseX1: number;\n readonly #phaseX2: number;\n readonly #phaseY1: number;\n readonly #phaseY2: number;\n readonly #amplitudeX: number;\n readonly #amplitudeY: number;\n #x: number;\n #y: number;\n #time: number = 0;\n\n get position(): { x: number; y: number } {\n return {x: this.#x, y: this.#y};\n }\n\n constructor(x: number, y: number, bounds: { width: number; height: number }, sprite: HTMLCanvasElement, config: FireflyParticleConfig = {}) {\n this.#x = x;\n this.#y = y;\n this.#bounds = bounds;\n this.#sprite = sprite;\n this.#glowSpeed = config.glowSpeed ?? (0.5 + Math.random() * 1.5);\n this.#size = (config.size ?? 6) * (config.scale ?? 1);\n this.#speed = config.speed ?? 1;\n this.#phase = Math.random() * Math.PI * 2;\n this.#freqX1 = 0.3 + Math.random() * 0.7;\n this.#freqX2 = 1.2 + Math.random() * 1.8;\n this.#freqY1 = 0.3 + Math.random() * 0.7;\n this.#freqY2 = 1.2 + Math.random() * 1.8;\n this.#phaseX1 = Math.random() * Math.PI * 2;\n this.#phaseX2 = Math.random() * Math.PI * 2;\n this.#phaseY1 = Math.random() * Math.PI * 2;\n this.#phaseY2 = Math.random() * Math.PI * 2;\n this.#amplitudeX = 0.3 + Math.random() * 0.7;\n this.#amplitudeY = 0.3 + Math.random() * 0.7;\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n const alpha = 0.5 + 0.5 * Math.sin(this.#time * this.#glowSpeed + this.#phase);\n\n if (alpha < 0.05) {\n return;\n }\n\n const displaySize = this.#size * 2;\n\n ctx.globalAlpha = alpha;\n ctx.drawImage(this.#sprite, this.#x - this.#size, this.#y - this.#size, displaySize, displaySize);\n ctx.globalAlpha = 1;\n }\n\n tick(dt: number = 1): void {\n this.#time += 0.02 * dt * this.#speed;\n\n const moveX = Math.sin(this.#time * this.#freqX1 + this.#phaseX1) * this.#amplitudeX * this.#bounds.width\n + Math.sin(this.#time * this.#freqX2 + this.#phaseX2) * this.#amplitudeX * this.#bounds.width * 0.5;\n\n const moveY = Math.sin(this.#time * this.#freqY1 + this.#phaseY1) * this.#amplitudeY * this.#bounds.height\n + Math.sin(this.#time * this.#freqY2 + this.#phaseY2) * this.#amplitudeY * this.#bounds.height * 0.5;\n\n this.#x += (moveX / 3000) * dt;\n this.#y += (moveY / 3000) * dt;\n\n if (this.#x > this.#bounds.width + this.#size) {\n this.#x = -this.#size;\n } else if (this.#x < -this.#size) {\n this.#x = this.#bounds.width + this.#size;\n }\n\n if (this.#y > this.#bounds.height + this.#size) {\n this.#y = -this.#size;\n } else if (this.#y < -this.#size) {\n this.#y = this.#bounds.height + this.#size;\n }\n }\n}\n","import { Fireflies } from './layer';\nimport type { FirefliesConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createFireflies(config?: FirefliesConfig): Effect<FirefliesConfig> {\n return new Fireflies(config);\n}\n\nexport { FireflyParticle, createFireflySprite } from './particle';\nexport type { FirefliesConfig };\nexport type { FireflyParticleConfig } from './particle';\nexport type { Firefly } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { Ember, FlameLayer } from './types';\n\nexport interface FirepitConfig {\n readonly embers?: number;\n readonly flameWidth?: number;\n readonly flameHeight?: number;\n readonly intensity?: number;\n readonly scale?: number;\n}\n\nexport class Firepit extends Effect<FirepitConfig> {\n readonly #scale: number;\n #flameWidth: number;\n #flameHeight: number;\n #intensity: number;\n #maxEmbers: number;\n #time: number = 0;\n #embers: Ember[] = [];\n #flameLayers: FlameLayer[] = [];\n\n constructor(config: FirepitConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxEmbers = config.embers ?? 60;\n this.#flameWidth = config.flameWidth ?? 0.4;\n this.#flameHeight = config.flameHeight ?? 0.35;\n this.#intensity = config.intensity ?? 1;\n\n if (innerWidth < 991) {\n this.#maxEmbers = Math.floor(this.#maxEmbers / 2);\n }\n\n for (let i = 0; i < 5; i++) {\n this.#flameLayers.push({\n x: 0.5 + (MULBERRY.next() - 0.5) * 0.1,\n phase: MULBERRY.next() * Math.PI * 2,\n speed: 1.5 + MULBERRY.next() * 2,\n amplitude: 0.02 + MULBERRY.next() * 0.03,\n width: this.#flameWidth * (0.6 + MULBERRY.next() * 0.4),\n height: this.#flameHeight * (0.7 + MULBERRY.next() * 0.3)\n });\n }\n }\n\n configure(config: Partial<FirepitConfig>): void {\n if (config.intensity !== undefined) {\n this.#intensity = config.intensity;\n }\n if (config.flameWidth !== undefined) {\n this.#flameWidth = config.flameWidth;\n }\n if (config.flameHeight !== undefined) {\n this.#flameHeight = config.flameHeight;\n }\n }\n\n tick(dt: number, _width: number, _height: number): void {\n this.#time += 0.03 * dt * this.#intensity;\n\n if (this.#embers.length < this.#maxEmbers && MULBERRY.next() < 0.3 * this.#intensity * dt) {\n this.#embers.push(this.#createEmber());\n }\n\n let alive = 0;\n\n for (let i = 0; i < this.#embers.length; i++) {\n const ember = this.#embers[i];\n\n ember.x += ember.vx * dt;\n ember.y += ember.vy * dt;\n ember.vx += (MULBERRY.next() - 0.5) * 0.0002 * dt;\n ember.vy -= 0.00005 * dt;\n ember.life -= dt;\n ember.flicker = 0.6 + Math.sin(this.#time * 8 + ember.brightness * 20) * 0.4;\n\n if (ember.life > 0) {\n this.#embers[alive++] = ember;\n }\n }\n\n this.#embers.length = alive;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n this.#drawFlames(ctx, width, height);\n this.#drawEmbers(ctx, width, height);\n }\n\n #drawFlames(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const baseY = height * 0.85;\n const centerX = width * 0.5;\n\n ctx.globalCompositeOperation = 'lighter';\n\n for (let layerIndex = 0; layerIndex < this.#flameLayers.length; layerIndex++) {\n const layer = this.#flameLayers[layerIndex];\n const wobbleX = Math.sin(this.#time * layer.speed + layer.phase) * layer.amplitude * width;\n const flameW = layer.width * width * this.#scale * 0.5;\n const flameH = layer.height * height * this.#scale;\n\n const gradient = ctx.createRadialGradient(\n centerX + wobbleX, baseY, 0,\n centerX + wobbleX, baseY - flameH * 0.5, flameH * 0.6\n );\n\n const alphaBase = (0.15 + layerIndex * 0.03) * this.#intensity;\n const flicker = 0.85 + Math.sin(this.#time * (3 + layerIndex) + layer.phase) * 0.15;\n const alpha = alphaBase * flicker;\n\n if (layerIndex < 2) {\n gradient.addColorStop(0, `rgba(255, 255, 200, ${alpha})`);\n gradient.addColorStop(0.3, `rgba(255, 180, 50, ${alpha * 0.8})`);\n gradient.addColorStop(0.6, `rgba(255, 100, 20, ${alpha * 0.5})`);\n gradient.addColorStop(1, `rgba(200, 30, 0, 0)`);\n } else {\n gradient.addColorStop(0, `rgba(255, 200, 80, ${alpha * 0.7})`);\n gradient.addColorStop(0.4, `rgba(255, 120, 30, ${alpha * 0.5})`);\n gradient.addColorStop(1, `rgba(180, 40, 0, 0)`);\n }\n\n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.ellipse(centerX + wobbleX, baseY, flameW, flameH, 0, 0, Math.PI * 2);\n ctx.fill();\n }\n\n const glowGradient = ctx.createRadialGradient(\n centerX, height * 0.85, 0,\n centerX, height * 0.85, width * 0.35 * this.#scale\n );\n const glowAlpha = 0.06 * this.#intensity * (0.9 + Math.sin(this.#time * 2) * 0.1);\n glowGradient.addColorStop(0, `rgba(255, 150, 50, ${glowAlpha})`);\n glowGradient.addColorStop(0.5, `rgba(255, 80, 20, ${glowAlpha * 0.3})`);\n glowGradient.addColorStop(1, 'rgba(255, 50, 0, 0)');\n ctx.fillStyle = glowGradient;\n ctx.fillRect(0, 0, width, height);\n\n ctx.globalCompositeOperation = 'source-over';\n }\n\n #drawEmbers(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n ctx.globalCompositeOperation = 'lighter';\n\n for (const ember of this.#embers) {\n const px = ember.x * width;\n const py = ember.y * height;\n const lifeRatio = ember.life / ember.maxLife;\n const alpha = lifeRatio * ember.flicker * this.#intensity;\n const size = ember.size * this.#scale * (0.5 + lifeRatio * 0.5);\n\n if (alpha < 0.02) {\n continue;\n }\n\n const gradient = ctx.createRadialGradient(px, py, 0, px, py, size * 3);\n gradient.addColorStop(0, `rgba(255, ${180 + ember.brightness * 75}, ${50 + ember.brightness * 100}, ${alpha})`);\n gradient.addColorStop(0.3, `rgba(255, ${120 + ember.brightness * 50}, 20, ${alpha * 0.5})`);\n gradient.addColorStop(1, `rgba(255, 80, 0, 0)`);\n\n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.arc(px, py, size * 3, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.fillStyle = `rgba(255, ${200 + ember.brightness * 55}, ${100 + ember.brightness * 100}, ${alpha * 0.8})`;\n ctx.beginPath();\n ctx.arc(px, py, size * 0.5, 0, Math.PI * 2);\n ctx.fill();\n }\n\n ctx.globalCompositeOperation = 'source-over';\n }\n\n #createEmber(): Ember {\n const baseY = 0.85;\n const maxLife = 60 + MULBERRY.next() * 120;\n\n return {\n x: 0.5 + (MULBERRY.next() - 0.5) * this.#flameWidth * 0.6,\n y: baseY - MULBERRY.next() * this.#flameHeight * 0.3,\n vx: (MULBERRY.next() - 0.5) * 0.002,\n vy: -(0.001 + MULBERRY.next() * 0.003),\n size: (1 + MULBERRY.next() * 2.5) * this.#scale,\n life: maxLife,\n maxLife,\n brightness: MULBERRY.next(),\n flicker: 1\n };\n }\n}\n","import { Firepit } from './layer';\nimport type { FirepitConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createFirepit(config?: FirepitConfig): Effect<FirepitConfig> {\n return new Firepit(config);\n}\n\nexport type { FirepitConfig };\nexport type { Ember, FlameLayer } from './types';\n","import { mulberry32, type Mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\nexport const FIREWORK_TRAIL_MEMORY = 6;\n","export type ExplosionType = 'peony' | 'chrysanthemum' | 'willow' | 'ring' | 'palm' | 'crackle' | 'crossette' | 'dahlia' | 'brocade' | 'horsetail' | 'strobe' | 'heart' | 'spiral' | 'flower';\n\nexport type FireworkVariant = ExplosionType | 'saturn' | 'concentric';\n\nexport type ParticleShape = 'line' | 'circle' | 'star' | 'diamond';\n\nexport interface ExplosionConfig {\n readonly particleCount: [number, number];\n readonly speed: [number, number];\n readonly friction: number;\n readonly gravity: number;\n readonly decay: [number, number];\n readonly trailMemory: number;\n readonly hueVariation: number;\n readonly brightness: [number, number];\n readonly lineWidthScale: number;\n readonly shape: ParticleShape;\n readonly sparkle: boolean;\n readonly strobe: boolean;\n readonly spread3d: boolean;\n readonly glowSize: number;\n}\n\nexport interface FireworksConfig {\n readonly scale?: number;\n readonly autoSpawn?: boolean;\n readonly variants?: FireworkVariant[];\n}\n\nexport const FIREWORK_VARIANTS: FireworkVariant[] = [\n 'peony', 'chrysanthemum', 'willow', 'ring', 'palm', 'crackle', 'crossette',\n 'saturn', 'dahlia', 'brocade', 'horsetail', 'strobe', 'heart', 'spiral', 'flower', 'concentric'\n];\n\nexport const EXPLOSION_CONFIGS: Record<ExplosionType, ExplosionConfig> = {\n peony: {\n particleCount: [50, 70],\n speed: [2, 10],\n friction: 0.96,\n gravity: 0.8,\n decay: [0.012, 0.025],\n trailMemory: 3,\n hueVariation: 30,\n brightness: [50, 80],\n lineWidthScale: 0.8,\n shape: 'circle',\n sparkle: false,\n strobe: false,\n spread3d: true,\n glowSize: 12\n },\n chrysanthemum: {\n particleCount: [80, 120],\n speed: [3, 12],\n friction: 0.975,\n gravity: 0.5,\n decay: [0.006, 0.012],\n trailMemory: 6,\n hueVariation: 20,\n brightness: [55, 85],\n lineWidthScale: 0.5,\n shape: 'line',\n sparkle: true,\n strobe: false,\n spread3d: true,\n glowSize: 15\n },\n willow: {\n particleCount: [50, 70],\n speed: [3, 10],\n friction: 0.988,\n gravity: 1.5,\n decay: [0.004, 0.008],\n trailMemory: 10,\n hueVariation: 15,\n brightness: [60, 90],\n lineWidthScale: 0.4,\n shape: 'line',\n sparkle: false,\n strobe: false,\n spread3d: false,\n glowSize: 10\n },\n ring: {\n particleCount: [40, 60],\n speed: [6, 8],\n friction: 0.96,\n gravity: 0.4,\n decay: [0.012, 0.022],\n trailMemory: 4,\n hueVariation: 10,\n brightness: [55, 80],\n lineWidthScale: 0.7,\n shape: 'diamond',\n sparkle: false,\n strobe: false,\n spread3d: false,\n glowSize: 14\n },\n palm: {\n particleCount: [20, 30],\n speed: [5, 12],\n friction: 0.97,\n gravity: 1.2,\n decay: [0.006, 0.014],\n trailMemory: 6,\n hueVariation: 20,\n brightness: [55, 85],\n lineWidthScale: 0.6,\n shape: 'line',\n sparkle: false,\n strobe: false,\n spread3d: false,\n glowSize: 12\n },\n crackle: {\n particleCount: [40, 55],\n speed: [2, 8],\n friction: 0.955,\n gravity: 0.8,\n decay: [0.012, 0.025],\n trailMemory: 2,\n hueVariation: 25,\n brightness: [60, 90],\n lineWidthScale: 0.6,\n shape: 'star',\n sparkle: false,\n strobe: false,\n spread3d: true,\n glowSize: 8\n },\n crossette: {\n particleCount: [16, 20],\n speed: [5, 9],\n friction: 0.965,\n gravity: 0.6,\n decay: [0.006, 0.014],\n trailMemory: 4,\n hueVariation: 15,\n brightness: [55, 85],\n lineWidthScale: 0.7,\n shape: 'circle',\n sparkle: false,\n strobe: false,\n spread3d: true,\n glowSize: 12\n },\n dahlia: {\n particleCount: [48, 80],\n speed: [3, 9],\n friction: 0.965,\n gravity: 0.7,\n decay: [0.010, 0.020],\n trailMemory: 4,\n hueVariation: 5,\n brightness: [55, 85],\n lineWidthScale: 0.7,\n shape: 'circle',\n sparkle: false,\n strobe: false,\n spread3d: true,\n glowSize: 12\n },\n brocade: {\n particleCount: [60, 80],\n speed: [3, 9],\n friction: 0.98,\n gravity: 1.3,\n decay: [0.004, 0.010],\n trailMemory: 10,\n hueVariation: 10,\n brightness: [60, 90],\n lineWidthScale: 0.4,\n shape: 'line',\n sparkle: true,\n strobe: false,\n spread3d: false,\n glowSize: 10\n },\n horsetail: {\n particleCount: [30, 40],\n speed: [8, 14],\n friction: 0.975,\n gravity: 2.0,\n decay: [0.004, 0.010],\n trailMemory: 12,\n hueVariation: 15,\n brightness: [60, 90],\n lineWidthScale: 0.5,\n shape: 'line',\n sparkle: false,\n strobe: false,\n spread3d: false,\n glowSize: 10\n },\n strobe: {\n particleCount: [40, 55],\n speed: [2, 8],\n friction: 0.96,\n gravity: 0.7,\n decay: [0.010, 0.020],\n trailMemory: 2,\n hueVariation: 10,\n brightness: [75, 95],\n lineWidthScale: 0.6,\n shape: 'circle',\n sparkle: false,\n strobe: true,\n spread3d: true,\n glowSize: 10\n },\n heart: {\n particleCount: [60, 80],\n speed: [3, 5],\n friction: 0.965,\n gravity: 0.3,\n decay: [0.008, 0.016],\n trailMemory: 4,\n hueVariation: 15,\n brightness: [55, 85],\n lineWidthScale: 0.7,\n shape: 'circle',\n sparkle: false,\n strobe: false,\n spread3d: false,\n glowSize: 12\n },\n spiral: {\n particleCount: [45, 60],\n speed: [2, 10],\n friction: 0.97,\n gravity: 0.4,\n decay: [0.008, 0.016],\n trailMemory: 5,\n hueVariation: 10,\n brightness: [55, 85],\n lineWidthScale: 0.6,\n shape: 'circle',\n sparkle: false,\n strobe: false,\n spread3d: false,\n glowSize: 12\n },\n flower: {\n particleCount: [70, 90],\n speed: [3, 7],\n friction: 0.965,\n gravity: 0.3,\n decay: [0.008, 0.016],\n trailMemory: 4,\n hueVariation: 20,\n brightness: [55, 85],\n lineWidthScale: 0.7,\n shape: 'circle',\n sparkle: false,\n strobe: false,\n spread3d: false,\n glowSize: 12\n }\n};\n","import type { Point } from '../point';\nimport { MULBERRY } from './consts';\nimport { EXPLOSION_CONFIGS, type ExplosionConfig, type ExplosionType, type ParticleShape } from './types';\n\nconst PERSPECTIVE = 800;\n\nexport class Explosion {\n readonly #position: Point;\n readonly #angle: number;\n readonly #brightness: number;\n readonly #config: ExplosionConfig;\n readonly #decay: number;\n readonly #hue: number;\n readonly #lineWidth: number;\n readonly #shape: ParticleShape;\n readonly #trail: Point[] = [];\n readonly #type: ExplosionType;\n #alpha: number = 1;\n #depthScale: number = 1;\n #hasCrackled: boolean = false;\n #hasSplit: boolean = false;\n #speed: number;\n #sparkleTimer: number = 0;\n #vz: number;\n #z: number = 0;\n\n get angle(): number {\n return this.#angle;\n }\n\n get hue(): number {\n return this.#hue;\n }\n\n get isDead(): boolean {\n return this.#alpha <= 0;\n }\n\n get position(): Point {\n return this.#position;\n }\n\n get type(): ExplosionType {\n return this.#type;\n }\n\n constructor(position: Point, hue: number, lineWidth: number, type: ExplosionType, scale: number = 1, angle?: number, speed?: number, vz?: number) {\n const config = EXPLOSION_CONFIGS[type];\n\n this.#config = config;\n this.#type = type;\n this.#shape = config.shape;\n this.#position = {...position};\n this.#alpha = 1;\n this.#angle = angle ?? MULBERRY.nextBetween(0, Math.PI * 2);\n this.#brightness = MULBERRY.nextBetween(config.brightness[0], config.brightness[1]);\n this.#decay = MULBERRY.nextBetween(config.decay[0], config.decay[1]);\n this.#hue = hue + MULBERRY.nextBetween(-config.hueVariation, config.hueVariation);\n this.#lineWidth = lineWidth * config.lineWidthScale;\n this.#speed = (speed ?? MULBERRY.nextBetween(config.speed[0], config.speed[1])) * scale;\n\n if (vz !== undefined) {\n this.#vz = vz * scale;\n } else if (config.spread3d) {\n this.#vz = MULBERRY.nextBetween(-this.#speed * 0.5, this.#speed * 0.5);\n } else {\n this.#vz = 0;\n }\n\n for (let i = 0; i < config.trailMemory; i++) {\n this.#trail.push({...position});\n }\n }\n\n checkCrackle(): boolean {\n if (this.#type !== 'crackle' || this.#hasCrackled) {\n return false;\n }\n\n if (this.#alpha <= 0.4) {\n this.#hasCrackled = true;\n return true;\n }\n\n return false;\n }\n\n checkSplit(): boolean {\n if (this.#type !== 'crossette' || this.#hasSplit) {\n return false;\n }\n\n if (this.#alpha < 0.5) {\n this.#hasSplit = true;\n return true;\n }\n\n return false;\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n if (this.#config.strobe && this.#sparkleTimer % 6 < 3) {\n return;\n }\n\n const ds = this.#depthScale;\n const trailEnd = this.#trail[this.#trail.length - 1];\n const effectiveWidth = this.#shape === 'line' ? this.#lineWidth * ds : this.#lineWidth * 0.4 * ds;\n const effectiveAlpha = this.#alpha * Math.min(ds, 1.2);\n\n ctx.save();\n ctx.lineCap = 'round';\n\n if (this.#trail.length > 2) {\n for (let i = this.#trail.length - 1; i > 0; i--) {\n const progress = i / this.#trail.length;\n const alpha = (1 - progress) * effectiveAlpha * 0.5;\n const width = effectiveWidth * (1 - progress * 0.4);\n\n ctx.beginPath();\n ctx.moveTo(this.#trail[i].x, this.#trail[i].y);\n ctx.lineTo(this.#trail[i - 1].x, this.#trail[i - 1].y);\n ctx.lineWidth = width;\n ctx.strokeStyle = `hsla(${this.#hue}, 100%, ${this.#brightness * 0.7}%, ${alpha})`;\n ctx.stroke();\n }\n }\n\n ctx.beginPath();\n ctx.moveTo(trailEnd.x, trailEnd.y);\n ctx.lineTo(this.#position.x, this.#position.y);\n ctx.lineWidth = effectiveWidth;\n ctx.strokeStyle = `hsla(${this.#hue}, 100%, ${this.#brightness}%, ${effectiveAlpha})`;\n ctx.stroke();\n\n if (this.#shape !== 'line') {\n this.#drawShape(ctx, ds, effectiveAlpha);\n }\n\n if (this.#config.sparkle && this.#sparkleTimer % 4 < 2) {\n ctx.beginPath();\n ctx.arc(this.#position.x, this.#position.y, this.#lineWidth * 0.8 * ds, 0, Math.PI * 2);\n ctx.fillStyle = `hsla(${this.#hue}, 30%, 95%, ${effectiveAlpha * 0.9})`;\n ctx.fill();\n }\n\n ctx.restore();\n }\n\n tick(dt: number): void {\n this.#trail.pop();\n this.#trail.unshift({...this.#position});\n\n this.#speed *= Math.pow(this.#config.friction, dt);\n this.#vz *= Math.pow(this.#config.friction, dt);\n\n this.#position.x += Math.cos(this.#angle) * this.#speed * dt;\n this.#position.y += (Math.sin(this.#angle) * this.#speed + this.#config.gravity) * dt;\n this.#z += this.#vz * dt;\n\n this.#depthScale = PERSPECTIVE / (PERSPECTIVE + this.#z);\n\n this.#alpha -= this.#decay * dt;\n this.#sparkleTimer += dt;\n }\n\n #drawShape(ctx: CanvasRenderingContext2D, ds: number, alpha: number): void {\n const size = this.#lineWidth * 1.2 * ds;\n const color = `hsla(${this.#hue}, 100%, ${this.#brightness}%, ${alpha})`;\n\n switch (this.#shape) {\n case 'circle':\n ctx.beginPath();\n ctx.arc(this.#position.x, this.#position.y, size * 0.5, 0, Math.PI * 2);\n ctx.fillStyle = color;\n ctx.fill();\n break;\n\n case 'star':\n this.#drawStarPath(ctx, this.#position.x, this.#position.y, size * 0.7, 4, this.#sparkleTimer * 0.15);\n ctx.fillStyle = `hsla(${this.#hue}, 60%, ${Math.min(this.#brightness + 10, 100)}%, ${alpha})`;\n ctx.fill();\n break;\n\n case 'diamond':\n this.#drawDiamondPath(ctx, this.#position.x, this.#position.y, size * 0.6, this.#angle);\n ctx.fillStyle = color;\n ctx.fill();\n break;\n }\n }\n\n #drawStarPath(ctx: CanvasRenderingContext2D, cx: number, cy: number, radius: number, points: number, rotation: number): void {\n const innerRadius = radius * 0.4;\n const totalPoints = points * 2;\n\n ctx.beginPath();\n\n for (let i = 0; i < totalPoints; i++) {\n const r = i % 2 === 0 ? radius : innerRadius;\n const angle = (i * Math.PI / points) + rotation;\n const px = cx + Math.cos(angle) * r;\n const py = cy + Math.sin(angle) * r;\n\n if (i === 0) {\n ctx.moveTo(px, py);\n } else {\n ctx.lineTo(px, py);\n }\n }\n\n ctx.closePath();\n }\n\n #drawDiamondPath(ctx: CanvasRenderingContext2D, cx: number, cy: number, size: number, rotation: number): void {\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n const hw = size * 0.5;\n\n ctx.beginPath();\n ctx.moveTo(cx + cos * size - sin * 0, cy + sin * size + cos * 0);\n ctx.lineTo(cx + cos * 0 - sin * hw, cy + sin * 0 + cos * hw);\n ctx.lineTo(cx + cos * -size - sin * 0, cy + sin * -size + cos * 0);\n ctx.lineTo(cx + cos * 0 - sin * -hw, cy + sin * 0 + cos * -hw);\n ctx.closePath();\n }\n}\n","import type { Point } from '../point';\nimport { Explosion } from './explosion';\nimport { EXPLOSION_CONFIGS, type ExplosionType, type FireworkVariant } from './types';\n\nfunction between(rng: () => number, min: number, max: number): number {\n return min + rng() * (max - min);\n}\n\n/**\n * Creates an array of {@link Explosion} particles for the given firework variant.\n * Use this to fire a fully formed explosion burst in your own render loop without\n * needing a {@link Fireworks} instance.\n *\n * @param variant - The firework variant to create.\n * @param position - The center position of the explosion in canvas pixels.\n * @param hue - Base hue in degrees (0–360).\n * @param options - Optional overrides for `lineWidth` (default `5`) and `scale` (default `1`).\n * @param rng - RNG function returning values in [0, 1). Defaults to `Math.random`.\n */\nexport function createExplosion(\n variant: FireworkVariant,\n position: Point,\n hue: number,\n options: { lineWidth?: number; scale?: number } = {},\n rng: () => number = Math.random\n): Explosion[] {\n const lineWidth = options.lineWidth ?? 5;\n const scale = options.scale ?? 1;\n const explosions: Explosion[] = [];\n\n switch (variant) {\n case 'saturn':\n createSaturn(explosions, position, hue, lineWidth, scale, rng);\n break;\n case 'dahlia':\n createDahlia(explosions, position, hue, lineWidth, scale, rng);\n break;\n case 'heart':\n createHeart(explosions, position, hue, lineWidth, scale, rng);\n break;\n case 'spiral':\n createSpiral(explosions, position, hue, lineWidth, scale, rng);\n break;\n case 'flower':\n createFlower(explosions, position, hue, lineWidth, scale, rng);\n break;\n case 'concentric':\n createConcentric(explosions, position, hue, lineWidth, scale, rng);\n break;\n default: {\n const type: ExplosionType = variant;\n const config = EXPLOSION_CONFIGS[type];\n const count = Math.floor(between(rng, config.particleCount[0], config.particleCount[1]));\n const effectiveHue = type === 'brocade' ? between(rng, 35, 50) : hue;\n\n for (let i = 0; i < count; i++) {\n let angle: number | undefined;\n let speed: number | undefined;\n\n if (type === 'ring') {\n angle = (i / count) * Math.PI * 2;\n speed = between(rng, config.speed[0], config.speed[1]) * 0.5 + config.speed[0] * 0.5;\n } else if (type === 'palm' || type === 'horsetail') {\n const spread = type === 'horsetail' ? Math.PI / 8 : Math.PI / 5;\n angle = -Math.PI / 2 + between(rng, -spread, spread);\n }\n\n explosions.push(new Explosion(position, effectiveHue, lineWidth, type, scale, angle, speed));\n }\n }\n }\n\n return explosions;\n}\n\nfunction createSaturn(explosions: Explosion[], position: Point, hue: number, lineWidth: number, scale: number, rng: () => number): void {\n const velocity = between(rng, 4, 6);\n const shellCount = Math.floor(between(rng, 25, 35));\n\n for (let i = 0; i < shellCount; i++) {\n const rad = (i / shellCount) * Math.PI * 2;\n\n explosions.push(new Explosion(\n position, hue, lineWidth, 'peony', scale,\n rad + between(rng, -0.05, 0.05),\n velocity + between(rng, -0.25, 0.25)\n ));\n }\n\n const fillCount = Math.floor(between(rng, 40, 60));\n\n for (let i = 0; i < fillCount; i++) {\n explosions.push(new Explosion(\n position, hue, lineWidth, 'peony', scale,\n between(rng, 0, Math.PI * 2),\n velocity * between(rng, 0, 1)\n ));\n }\n\n const ringRotation = between(rng, 0, Math.PI * 2);\n const ringCount = Math.floor(between(rng, 40, 55));\n const ringVx = velocity * between(rng, 2, 3);\n const ringVy = velocity * 0.6;\n\n for (let i = 0; i < ringCount; i++) {\n const rad = (i / ringCount) * Math.PI * 2;\n const cx = Math.cos(rad) * ringVx + between(rng, -0.25, 0.25);\n const cy = Math.sin(rad) * ringVy + between(rng, -0.25, 0.25);\n const cosR = Math.cos(ringRotation);\n const sinR = Math.sin(ringRotation);\n const vx = cx * cosR - cy * sinR;\n const vy = cx * sinR + cy * cosR;\n const vz = Math.sin(rad) * velocity * 0.8;\n\n explosions.push(new Explosion(\n position, hue + 60, lineWidth, 'ring', scale,\n Math.atan2(vy, vx),\n Math.sqrt(vx * vx + vy * vy),\n vz\n ));\n }\n}\n\nfunction createDahlia(explosions: Explosion[], position: Point, hue: number, lineWidth: number, scale: number, rng: () => number): void {\n const petalCount = Math.floor(between(rng, 6, 9));\n const particlesPerPetal = Math.floor(between(rng, 8, 12));\n\n for (let petal = 0; petal < petalCount; petal++) {\n const baseAngle = (petal / petalCount) * Math.PI * 2;\n const petalHue = hue + (petal % 2 === 0 ? 25 : -25);\n\n for (let i = 0; i < particlesPerPetal; i++) {\n explosions.push(new Explosion(\n position, petalHue, lineWidth, 'dahlia', scale,\n baseAngle + between(rng, -0.3, 0.3)\n ));\n }\n }\n}\n\nfunction createHeart(explosions: Explosion[], position: Point, hue: number, lineWidth: number, scale: number, rng: () => number): void {\n const velocity = between(rng, 3, 5);\n const count = Math.floor(between(rng, 60, 80));\n const rotation = between(rng, -0.3, 0.3);\n const cosR = Math.cos(rotation);\n const sinR = Math.sin(rotation);\n\n for (let i = 0; i < count; i++) {\n const t = (i / count) * Math.PI * 2;\n const hx = 16 * Math.pow(Math.sin(t), 3);\n const hy = -(13 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 * t));\n const s = velocity / 16;\n const vx = hx * s;\n const vy = hy * s;\n const rvx = vx * cosR - vy * sinR;\n const rvy = vx * sinR + vy * cosR;\n\n explosions.push(new Explosion(\n position, hue, lineWidth, 'heart', scale,\n Math.atan2(rvy, rvx),\n Math.max(0.1, Math.sqrt(rvx * rvx + rvy * rvy) + between(rng, -0.15, 0.15))\n ));\n }\n}\n\nfunction createSpiral(explosions: Explosion[], position: Point, hue: number, lineWidth: number, scale: number, rng: () => number): void {\n const arms = Math.floor(between(rng, 3, 5));\n const particlesPerArm = Math.floor(between(rng, 15, 20));\n const twist = between(rng, 2, 3.5);\n const baseRotation = between(rng, 0, Math.PI * 2);\n\n for (let arm = 0; arm < arms; arm++) {\n const baseAngle = baseRotation + (arm / arms) * Math.PI * 2;\n const armHue = hue + arm * (360 / arms / 3);\n\n for (let i = 0; i < particlesPerArm; i++) {\n const progress = i / particlesPerArm;\n\n explosions.push(new Explosion(\n position, armHue, lineWidth, 'spiral', scale,\n baseAngle + progress * twist,\n 2 + progress * 8 + between(rng, -0.3, 0.3)\n ));\n }\n }\n}\n\nfunction createFlower(explosions: Explosion[], position: Point, hue: number, lineWidth: number, scale: number, rng: () => number): void {\n const velocity = between(rng, 4, 7);\n const count = Math.floor(between(rng, 70, 90));\n const petals = Math.floor(between(rng, 2, 4));\n const rotation = between(rng, 0, Math.PI * 2);\n\n for (let i = 0; i < count; i++) {\n const t = (i / count) * Math.PI * 2;\n const r = Math.abs(Math.cos(petals * t));\n const speed = velocity * r;\n\n if (speed < 0.3) {\n continue;\n }\n\n explosions.push(new Explosion(\n position, hue + between(rng, -15, 15), lineWidth, 'flower', scale,\n t + rotation,\n speed + between(rng, -0.2, 0.2)\n ));\n }\n}\n\nfunction createConcentric(explosions: Explosion[], position: Point, hue: number, lineWidth: number, scale: number, rng: () => number): void {\n const outerCount = Math.floor(between(rng, 35, 50));\n const outerSpeed = between(rng, 7, 10);\n\n for (let i = 0; i < outerCount; i++) {\n const angle = (i / outerCount) * Math.PI * 2;\n\n explosions.push(new Explosion(\n position, hue, lineWidth, 'ring', scale,\n angle + between(rng, -0.05, 0.05),\n outerSpeed + between(rng, -0.25, 0.25)\n ));\n }\n\n const innerCount = Math.floor(between(rng, 25, 35));\n const innerSpeed = between(rng, 3, 5);\n\n for (let i = 0; i < innerCount; i++) {\n const angle = (i / innerCount) * Math.PI * 2;\n\n explosions.push(new Explosion(\n position, hue + 120, lineWidth, 'ring', scale,\n angle + between(rng, -0.05, 0.05),\n innerSpeed + between(rng, -0.25, 0.25)\n ));\n }\n}\n","import type { Point } from './point';\n\nexport function distance(a: Point, b: Point): number {\n let x = a.x - b.x;\n let y = a.y - b.y;\n\n return Math.sqrt(x * x + y * y);\n}\n","import type { Point } from '../point';\nimport { MULBERRY } from './consts';\n\nexport class Spark {\n readonly #position: Point;\n readonly #velocity: Point;\n readonly #hue: number;\n readonly #size: number;\n readonly #decay: number;\n readonly #friction: number = 0.94;\n readonly #gravity: number = 0.3;\n #alpha: number = 1;\n\n get isDead(): boolean {\n return this.#alpha <= 0;\n }\n\n get position(): Point {\n return this.#position;\n }\n\n constructor(position: Point, hue: number, velocityX: number = 0, velocityY: number = 0) {\n this.#position = {...position};\n this.#hue = hue + MULBERRY.nextBetween(-20, 20);\n this.#size = MULBERRY.nextBetween(0.5, 1.5);\n this.#decay = MULBERRY.nextBetween(0.03, 0.08);\n this.#velocity = {\n x: velocityX + MULBERRY.nextBetween(-1.5, 1.5),\n y: velocityY + MULBERRY.nextBetween(-2, 2)\n };\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n ctx.beginPath();\n ctx.arc(this.#position.x, this.#position.y, this.#size, 0, Math.PI * 2);\n ctx.fillStyle = `hsla(${this.#hue}, 80%, 70%, ${this.#alpha})`;\n ctx.fill();\n }\n\n tick(dt: number): void {\n this.#velocity.x *= Math.pow(this.#friction, dt);\n this.#velocity.y *= Math.pow(this.#friction, dt);\n this.#velocity.y += this.#gravity * dt;\n\n this.#position.x += this.#velocity.x * dt;\n this.#position.y += this.#velocity.y * dt;\n\n this.#alpha -= this.#decay * dt;\n }\n}\n","import { distance } from '../distance';\nimport type { Point } from '../point';\nimport { FIREWORK_TRAIL_MEMORY, MULBERRY } from './consts';\nimport { Spark } from './spark';\n\nexport class Firework extends EventTarget {\n readonly #position: Point;\n readonly #startPosition: Point;\n readonly #acceleration: number = 1.05;\n readonly #angle: number;\n readonly #baseSize: number;\n readonly #brightness: number = MULBERRY.nextBetween(55, 75);\n readonly #distance: number;\n readonly #hue: number;\n readonly #tailWidth: number;\n readonly #trail: Point[] = [];\n #distanceTraveled: number = 0;\n #speed: number = 1;\n #sparkTimer: number = 0;\n #pendingSparks: Spark[] = [];\n\n get position(): Point {\n return this.#position;\n }\n\n get hue(): number {\n return this.#hue;\n }\n\n constructor(start: Point, target: Point, hue: number, tailWidth: number, baseSize: number) {\n super();\n\n this.#hue = hue;\n this.#tailWidth = tailWidth;\n this.#baseSize = baseSize;\n this.#position = {...start};\n this.#startPosition = {...start};\n this.#angle = Math.atan2(target.y - start.y, target.x - start.x);\n this.#distance = distance(start, target);\n\n for (let i = 0; i < FIREWORK_TRAIL_MEMORY; i++) {\n this.#trail.push({...start});\n }\n }\n\n collectSparks(): Spark[] {\n const sparks = this.#pendingSparks;\n this.#pendingSparks = [];\n return sparks;\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n ctx.save();\n ctx.lineCap = 'round';\n\n for (let i = this.#trail.length - 1; i > 0; i--) {\n const progress = i / this.#trail.length;\n const alpha = (1 - progress) * 0.8;\n const width = this.#tailWidth * (1 - progress * 0.5);\n const hue = this.#hue + MULBERRY.nextBetween(-15, 15);\n\n ctx.beginPath();\n ctx.moveTo(this.#trail[i].x, this.#trail[i].y);\n ctx.lineTo(this.#trail[i - 1].x, this.#trail[i - 1].y);\n ctx.lineWidth = width;\n ctx.strokeStyle = `hsla(${hue}, 100%, ${this.#brightness}%, ${alpha})`;\n ctx.stroke();\n }\n\n ctx.shadowBlur = this.#baseSize * 4;\n ctx.shadowColor = `hsl(${this.#hue}, 100%, 60%)`;\n\n ctx.beginPath();\n ctx.moveTo(this.#trail[0].x, this.#trail[0].y);\n ctx.lineTo(this.#position.x, this.#position.y);\n ctx.lineWidth = this.#tailWidth;\n ctx.strokeStyle = `hsl(${this.#hue}, 100%, ${this.#brightness}%)`;\n ctx.stroke();\n\n ctx.shadowBlur = this.#baseSize * 6;\n ctx.shadowColor = `hsl(${this.#hue}, 80%, 80%)`;\n ctx.beginPath();\n ctx.arc(this.#position.x, this.#position.y, this.#tailWidth * 0.6, 0, Math.PI * 2);\n ctx.fillStyle = `hsl(${this.#hue}, 20%, 92%)`;\n ctx.fill();\n\n ctx.restore();\n }\n\n tick(dt: number): void {\n this.#trail.pop();\n this.#trail.unshift({...this.#position});\n\n this.#speed *= Math.pow(this.#acceleration, dt);\n\n const vx = Math.cos(this.#angle) * this.#speed;\n const vy = Math.sin(this.#angle) * this.#speed;\n\n this.#distanceTraveled = distance(this.#startPosition, {\n x: this.#position.x + vx * dt,\n y: this.#position.y + vy * dt\n });\n\n if (this.#distanceTraveled >= this.#distance) {\n this.dispatchEvent(new CustomEvent('remove'));\n return;\n }\n\n this.#position.x += vx * dt;\n this.#position.y += vy * dt;\n\n this.#sparkTimer += dt;\n\n if (this.#sparkTimer >= 3) {\n this.#sparkTimer -= 3;\n this.#pendingSparks.push(new Spark(\n this.#position,\n this.#hue,\n -vx * 0.1,\n -vy * 0.1\n ));\n }\n }\n}\n","import { Effect } from '../effect';\nimport type { Point } from '../point';\nimport { MULBERRY } from './consts';\nimport { createExplosion } from './create-explosion';\nimport { Explosion } from './explosion';\nimport { Firework } from './firework';\nimport { Spark } from './spark';\nimport { FIREWORK_VARIANTS, type FireworksConfig, type FireworkVariant } from './types';\n\nexport class Fireworks extends Effect<FireworksConfig> {\n #explosions: Explosion[] = [];\n #fireworks: Firework[] = [];\n #sparks: Spark[] = [];\n #hue: number = 120;\n #spawnTimer: number = 0;\n #positionRandom = MULBERRY.fork();\n #autoSpawn: boolean;\n #variants: FireworkVariant[];\n readonly #baseSize: number;\n #scale: number;\n readonly #tailWidth: number;\n #width: number = 960;\n #height: number = 540;\n\n constructor(config: FireworksConfig = {}) {\n super();\n\n const scale = config.scale ?? 1;\n this.#autoSpawn = config.autoSpawn ?? true;\n this.#variants = config.variants?.length ? [...config.variants] : [...FIREWORK_VARIANTS];\n this.#baseSize = 5 * scale;\n this.#scale = scale;\n this.#tailWidth = 2 * scale;\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n }\n\n launch(variant: FireworkVariant, position?: Point): void {\n const pos = position ?? {x: this.#width / 2, y: this.#height * 0.4};\n this.#hue = MULBERRY.nextBetween(0, 360);\n this.#spawnExplosion(pos, this.#hue, variant);\n }\n\n configure(config: Partial<FireworksConfig>): void {\n if (config.scale !== undefined) {\n this.#scale = config.scale;\n }\n if (config.autoSpawn !== undefined) {\n this.#autoSpawn = config.autoSpawn;\n }\n if (Array.isArray(config.variants) && config.variants.length > 0) {\n this.#variants = [...config.variants];\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n this.#spawnTimer += dt;\n\n const isSmall = innerWidth < 991;\n const spawnInterval = isSmall ? 60 : 30;\n\n if (this.#autoSpawn && this.#fireworks.length < 6 && this.#spawnTimer >= spawnInterval) {\n this.#spawnTimer -= spawnInterval;\n let count = MULBERRY.nextBetween(1, 100) < 10 ? 2 : 1;\n\n while (count--) {\n this.#hue = MULBERRY.nextBetween(0, 360);\n this.#createFirework();\n }\n }\n\n for (const firework of this.#fireworks) {\n firework.tick(dt);\n const collected = firework.collectSparks();\n for (let i = 0; i < collected.length; i++) {\n this.#sparks.push(collected[i]);\n }\n }\n\n for (const explosion of this.#explosions) {\n explosion.tick(dt);\n }\n\n for (const spark of this.#sparks) {\n spark.tick(dt);\n }\n\n const newExplosions: Explosion[] = [];\n const newSparks: Spark[] = [];\n\n for (const explosion of this.#explosions) {\n if (explosion.checkSplit()) {\n for (let i = 0; i < 4; i++) {\n const angle = explosion.angle + (Math.PI / 2) * i + Math.PI / 4;\n\n newExplosions.push(new Explosion(\n explosion.position,\n explosion.hue,\n this.#baseSize * 0.6,\n 'peony',\n this.#scale,\n angle,\n MULBERRY.nextBetween(3, 6)\n ));\n }\n }\n\n if (explosion.checkCrackle()) {\n for (let j = 0; j < 14; j++) {\n const angle = MULBERRY.nextBetween(0, Math.PI * 2);\n const speed = MULBERRY.nextBetween(3, 8);\n\n newSparks.push(new Spark(\n explosion.position,\n explosion.hue + MULBERRY.nextBetween(-30, 30),\n Math.cos(angle) * speed,\n Math.sin(angle) * speed\n ));\n }\n }\n }\n\n this.#explosions.push(...newExplosions);\n this.#sparks.push(...newSparks);\n\n let aliveExplosions = 0;\n for (let i = 0; i < this.#explosions.length; i++) {\n if (!this.#explosions[i].isDead) {\n this.#explosions[aliveExplosions++] = this.#explosions[i];\n }\n }\n this.#explosions.length = aliveExplosions;\n\n let aliveSparks = 0;\n for (let i = 0; i < this.#sparks.length; i++) {\n if (!this.#sparks[i].isDead) {\n this.#sparks[aliveSparks++] = this.#sparks[i];\n }\n }\n this.#sparks.length = aliveSparks;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n if (ctx.canvas.width !== width || ctx.canvas.height !== height) {\n ctx.canvas.width = width;\n ctx.canvas.height = height;\n }\n\n ctx.globalCompositeOperation = 'lighter';\n\n for (const spark of this.#sparks) {\n spark.draw(ctx);\n }\n\n for (const explosion of this.#explosions) {\n explosion.draw(ctx);\n }\n\n for (const firework of this.#fireworks) {\n firework.draw(ctx);\n }\n\n ctx.globalCompositeOperation = 'source-over';\n }\n\n #spawnExplosion(position: Point, hue: number, variant?: FireworkVariant): void {\n const selected = variant ?? this.#pickVariant();\n const rng = () => MULBERRY.nextBetween(0, 1);\n this.#explosions.push(...createExplosion(selected, position, hue, {lineWidth: this.#baseSize, scale: this.#scale}, rng));\n }\n\n #createFirework(position?: Point): void {\n const hue = this.#hue;\n const targetX = position?.x || this.#positionRandom.nextBetween(this.#width * .1, this.#width * .9);\n const targetY = position?.y || this.#height * .1 + this.#positionRandom.nextBetween(0, this.#height * .5);\n const startX = this.#width * 0.3 + this.#positionRandom.nextBetween(0, this.#width * 0.4);\n\n const firework = new Firework(\n {x: startX, y: this.#height},\n {x: targetX, y: targetY},\n hue,\n this.#tailWidth,\n this.#baseSize\n );\n\n firework.addEventListener('remove', () => {\n this.#fireworks.splice(this.#fireworks.indexOf(firework), 1);\n this.#spawnExplosion(firework.position, hue);\n }, {once: true});\n\n this.#fireworks.push(firework);\n }\n\n #pickVariant(): FireworkVariant {\n const index = Math.floor(MULBERRY.nextBetween(0, this.#variants.length));\n return this.#variants[index];\n }\n}\n","import { Fireworks } from './layer';\nimport type { FireworksConfig, FireworkVariant } from './types';\nimport type { Point } from '../point';\nimport type { Effect } from '../effect';\n\nexport interface FireworksInstance extends Effect<FireworksConfig> {\n launch(variant: FireworkVariant, position?: Point): void;\n}\n\nexport function createFireworks(config?: FireworksConfig): FireworksInstance {\n return new Fireworks(config) as FireworksInstance;\n}\n\nexport { createExplosion } from './create-explosion';\nexport { Explosion } from './explosion';\nexport { Firework } from './firework';\nexport { Spark } from './spark';\nexport { EXPLOSION_CONFIGS, FIREWORK_VARIANTS } from './types';\nexport type { ExplosionConfig, ExplosionType, FireworksConfig, FireworkVariant, ParticleShape } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n\nexport const GLITTER_COLORS: string[] = [\n '#ffd700', // gold\n '#c0c0c0', // silver\n '#ff69b4', // pink\n '#00bfff', // sky blue\n '#ff4500', // orange-red\n '#7fff00', // chartreuse\n '#9370db' // medium purple\n];\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { GLITTER_COLORS, MULBERRY } from './consts';\nimport type { FallingGlitter, GlitterConfig, SettledGlitter } from './types';\n\nexport class Glitter extends Effect<GlitterConfig> {\n readonly #scale: number;\n readonly #size: number;\n #speed: number;\n #groundLevel: number;\n readonly #maxSettled: number;\n readonly #colorRGBs: [number, number, number][];\n #maxCount: number;\n #time: number = 0;\n #falling: FallingGlitter[] = [];\n #settled: SettledGlitter[] = [];\n\n constructor(config: GlitterConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxCount = config.count ?? 80;\n this.#size = (config.size ?? 4) * this.#scale;\n this.#speed = config.speed ?? 1;\n this.#groundLevel = config.groundLevel ?? 0.85;\n this.#maxSettled = config.maxSettled ?? 200;\n\n const colors = config.colors ?? GLITTER_COLORS;\n this.#colorRGBs = colors.map(c => hexToRGB(c));\n\n if (innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n\n for (let i = 0; i < this.#maxCount; ++i) {\n this.#falling.push(this.#createFallingPiece(true));\n }\n }\n\n configure(config: Partial<GlitterConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.groundLevel !== undefined) {\n this.#groundLevel = config.groundLevel;\n }\n }\n\n tick(dt: number, _width: number, _height: number): void {\n this.#time += 0.03 * dt;\n\n let alive = 0;\n\n for (let i = 0; i < this.#falling.length; i++) {\n const piece = this.#falling[i];\n\n piece.y += piece.vy * this.#speed * dt;\n piece.rotation += piece.rotationSpeed * dt;\n piece.flipAngle += piece.flipSpeed * dt;\n\n piece.sparkle = 0.3 + 0.7 * Math.max(0, Math.sin(this.#time * 3 + piece.flipAngle * 2));\n\n if (piece.y >= this.#groundLevel) {\n this.#settleGlitter(piece);\n this.#falling[alive++] = this.#createFallingPiece(false);\n } else if (piece.y > 1.1) {\n this.#falling[alive++] = this.#createFallingPiece(false);\n } else {\n this.#falling[alive++] = piece;\n }\n }\n\n this.#falling.length = alive;\n\n while (this.#settled.length > this.#maxSettled) {\n this.#settled.shift();\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n for (const piece of this.#settled) {\n const px = piece.x * width;\n const py = piece.y * height;\n const [r, g, b] = this.#colorRGBs[piece.colorIndex % this.#colorRGBs.length];\n\n const sparkle = 0.3 + 0.7 * Math.max(0, Math.sin(this.#time * piece.sparkleSpeed + piece.sparklePhase));\n const alpha = 0.4 + 0.6 * sparkle;\n\n this.#drawDiamond(ctx, px, py, piece.size, piece.rotation, r, g, b, alpha, sparkle);\n }\n\n for (const piece of this.#falling) {\n const px = piece.x * width;\n const py = piece.y * height;\n const [r, g, b] = this.#colorRGBs[piece.colorIndex % this.#colorRGBs.length];\n\n const flipFactor = Math.abs(Math.cos(piece.flipAngle));\n const alpha = 0.5 + 0.5 * piece.sparkle;\n\n this.#drawDiamond(ctx, px, py, piece.size, piece.rotation, r, g, b, alpha, piece.sparkle, flipFactor);\n }\n }\n\n #drawDiamond(\n ctx: CanvasRenderingContext2D,\n cx: number,\n cy: number,\n size: number,\n rotation: number,\n r: number,\n g: number,\n b: number,\n alpha: number,\n sparkle: number,\n flipFactor: number = 1\n ): void {\n const halfW = size * flipFactor;\n const halfH = size;\n\n if (halfW < 0.3) {\n return;\n }\n\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n\n const points = [\n {x: 0, y: -halfH},\n {x: halfW, y: 0},\n {x: 0, y: halfH},\n {x: -halfW, y: 0}\n ];\n\n ctx.beginPath();\n ctx.moveTo(cx + points[0].x * cos - points[0].y * sin, cy + points[0].x * sin + points[0].y * cos);\n\n for (let p = 1; p < points.length; p++) {\n ctx.lineTo(cx + points[p].x * cos - points[p].y * sin, cy + points[p].x * sin + points[p].y * cos);\n }\n\n ctx.closePath();\n\n ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${alpha * 0.8})`;\n ctx.fill();\n\n if (sparkle > 0.5) {\n const highlightAlpha = (sparkle - 0.5) * 2 * alpha;\n ctx.fillStyle = `rgba(255, 255, 255, ${highlightAlpha * 0.6})`;\n ctx.fill();\n }\n }\n\n #settleGlitter(piece: FallingGlitter): void {\n this.#settled.push({\n x: piece.x,\n y: this.#groundLevel + MULBERRY.next() * 0.05,\n size: piece.size * 0.8,\n rotation: piece.rotation,\n sparklePhase: MULBERRY.next() * Math.PI * 2,\n sparkleSpeed: 0.5 + MULBERRY.next() * 2,\n colorIndex: piece.colorIndex\n });\n }\n\n #createFallingPiece(initialSpread: boolean): FallingGlitter {\n return {\n x: MULBERRY.next(),\n y: initialSpread ? MULBERRY.next() * this.#groundLevel : -0.05 - MULBERRY.next() * 0.1,\n vy: (0.0008 + MULBERRY.next() * 0.0015) * this.#scale,\n size: (0.5 + MULBERRY.next() * 1) * this.#size,\n rotation: MULBERRY.next() * Math.PI * 2,\n rotationSpeed: (MULBERRY.next() - 0.5) * 0.08,\n flipAngle: MULBERRY.next() * Math.PI * 2,\n flipSpeed: 0.03 + MULBERRY.next() * 0.07,\n sparkle: MULBERRY.next(),\n colorIndex: Math.floor(MULBERRY.next() * this.#colorRGBs.length),\n settled: false\n };\n }\n}\n","import { Glitter } from './layer';\nimport type { GlitterConfig } from './types';\nimport type { Effect } from '../effect';\n\nexport function createGlitter(config?: GlitterConfig): Effect<GlitterConfig> {\n return new Glitter(config);\n}\n\nexport type { GlitterConfig, FallingGlitter, SettledGlitter } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n\nexport const LANTERN_COLORS: string[] = [\n '#ff6b35', // warm orange\n '#ff8c42', // light orange\n '#ffd166', // golden\n '#ffb347', // amber\n '#e85d04', // deep orange\n '#f4845f', // coral\n '#c1121f' // red\n];\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { LANTERN_COLORS, MULBERRY } from './consts';\nimport type { Lantern, LanternsConfig } from './types';\n\nexport class Lanterns extends Effect<LanternsConfig> {\n readonly #scale: number;\n #speed: number;\n readonly #size: number;\n readonly #colorRGBs: [number, number, number][];\n #maxCount: number;\n #time: number = 0;\n #lanterns: Lantern[] = [];\n #sortedLanterns: Lantern[] = [];\n #sortDirty: boolean = true;\n\n constructor(config: LanternsConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxCount = config.count ?? 25;\n this.#size = (config.size ?? 20) * this.#scale;\n this.#speed = config.speed ?? 0.5;\n\n const colors = config.colors ?? LANTERN_COLORS;\n this.#colorRGBs = colors.map(c => hexToRGB(c));\n\n if (innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n\n for (let i = 0; i < this.#maxCount; ++i) {\n this.#lanterns.push(this.#createLantern(true));\n }\n }\n\n configure(config: Partial<LanternsConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#time += 0.02 * dt * this.#speed;\n\n for (let i = 0; i < this.#lanterns.length; i++) {\n const lantern = this.#lanterns[i];\n\n lantern.y -= (lantern.vy * this.#speed * dt) / (height * 1.5);\n\n const sway = Math.sin(this.#time * lantern.swaySpeed + lantern.swayPhase) * lantern.swayAmplitude;\n lantern.x += sway * dt / (width * 8);\n\n if (lantern.y < -0.15) {\n this.#lanterns[i] = this.#createLantern(false);\n this.#sortDirty = true;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n if (this.#sortDirty) {\n this.#sortedLanterns = [...this.#lanterns].sort((a, b) => a.size - b.size);\n this.#sortDirty = false;\n }\n\n const sorted = this.#sortedLanterns;\n\n for (const lantern of sorted) {\n const px = lantern.x * width;\n const py = lantern.y * height;\n const size = lantern.size;\n const [r, g, b] = this.#colorRGBs[lantern.colorIndex];\n\n const glowPulse = 0.6 + 0.4 * Math.sin(this.#time * lantern.glowSpeed + lantern.glowPhase);\n const alpha = lantern.opacity * glowPulse;\n\n const glowRadius = size * 3;\n const glowGradient = ctx.createRadialGradient(px, py, 0, px, py, glowRadius);\n glowGradient.addColorStop(0, `rgba(${r}, ${g}, ${b}, ${alpha * 0.35})`);\n glowGradient.addColorStop(0.3, `rgba(${r}, ${g}, ${b}, ${alpha * 0.15})`);\n glowGradient.addColorStop(0.6, `rgba(${r}, ${g}, ${b}, ${alpha * 0.05})`);\n glowGradient.addColorStop(1, `rgba(${r}, ${g}, ${b}, 0)`);\n\n ctx.fillStyle = glowGradient;\n ctx.beginPath();\n ctx.arc(px, py, glowRadius, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.setTransform(1, 0, 0, 1, px, py);\n\n const bodyW = size * 0.8;\n const bodyH = size;\n const topW = bodyW * 0.6;\n\n ctx.beginPath();\n ctx.moveTo(-topW, -bodyH * 0.5);\n ctx.quadraticCurveTo(-bodyW, 0, -bodyW * 0.7, bodyH * 0.5);\n ctx.lineTo(bodyW * 0.7, bodyH * 0.5);\n ctx.quadraticCurveTo(bodyW, 0, topW, -bodyH * 0.5);\n ctx.closePath();\n\n const bodyGradient = ctx.createLinearGradient(0, -bodyH * 0.5, 0, bodyH * 0.5);\n bodyGradient.addColorStop(0, `rgba(${Math.min(255, r + 60)}, ${Math.min(255, g + 60)}, ${Math.min(255, b + 30)}, ${alpha * 0.9})`);\n bodyGradient.addColorStop(0.5, `rgba(${r}, ${g}, ${b}, ${alpha * 0.85})`);\n bodyGradient.addColorStop(1, `rgba(${Math.max(0, r - 30)}, ${Math.max(0, g - 30)}, ${Math.max(0, b - 20)}, ${alpha * 0.8})`);\n\n ctx.fillStyle = bodyGradient;\n ctx.fill();\n\n ctx.beginPath();\n ctx.moveTo(-topW * 0.7, -bodyH * 0.55);\n ctx.lineTo(topW * 0.7, -bodyH * 0.55);\n ctx.lineWidth = size * 0.06;\n ctx.strokeStyle = `rgba(${Math.max(0, r - 40)}, ${Math.max(0, g - 40)}, ${Math.max(0, b - 40)}, ${alpha * 0.7})`;\n ctx.stroke();\n\n const flameH = bodyH * 0.3;\n const flameW = bodyW * 0.15;\n const flameFlicker = Math.sin(this.#time * 8 + lantern.glowPhase) * flameW * 0.3;\n\n const flameGradient = ctx.createRadialGradient(\n flameFlicker, -flameH * 0.1, 0,\n flameFlicker, -flameH * 0.1, flameH\n );\n flameGradient.addColorStop(0, `rgba(255, 255, 200, ${alpha * 0.95})`);\n flameGradient.addColorStop(0.3, `rgba(255, 200, 80, ${alpha * 0.7})`);\n flameGradient.addColorStop(0.7, `rgba(255, 140, 40, ${alpha * 0.3})`);\n flameGradient.addColorStop(1, `rgba(255, 100, 20, 0)`);\n\n ctx.beginPath();\n ctx.moveTo(-flameW + flameFlicker, flameH * 0.2);\n ctx.quadraticCurveTo(-flameW * 0.5 + flameFlicker, -flameH * 0.3, flameFlicker, -flameH);\n ctx.quadraticCurveTo(flameW * 0.5 + flameFlicker, -flameH * 0.3, flameW + flameFlicker, flameH * 0.2);\n ctx.closePath();\n ctx.fillStyle = flameGradient;\n ctx.fill();\n\n const stringLen = size * 0.6;\n const stringDrift = Math.sin(this.#time * 1.5 + lantern.swayPhase) * size * 0.1;\n\n ctx.beginPath();\n ctx.moveTo(0, bodyH * 0.5);\n ctx.quadraticCurveTo(\n stringDrift,\n bodyH * 0.5 + stringLen * 0.5,\n -stringDrift * 0.5,\n bodyH * 0.5 + stringLen\n );\n ctx.strokeStyle = `rgba(${r}, ${g}, ${b}, ${alpha * 0.4})`;\n ctx.lineWidth = size * 0.04;\n ctx.stroke();\n\n ctx.resetTransform();\n }\n }\n\n #createLantern(initialSpread: boolean): Lantern {\n const colorIndex = Math.floor(MULBERRY.next() * this.#colorRGBs.length);\n const sizeVariation = 0.6 + MULBERRY.next() * 0.8;\n\n return {\n x: 0.05 + MULBERRY.next() * 0.9,\n y: initialSpread ? MULBERRY.next() * 1.3 : 1.15 + MULBERRY.next() * 0.2,\n vx: 0,\n vy: 0.2 + MULBERRY.next() * 0.6,\n size: this.#size * sizeVariation,\n glowPhase: MULBERRY.next() * Math.PI * 2,\n glowSpeed: 0.8 + MULBERRY.next() * 1.2,\n swayPhase: MULBERRY.next() * Math.PI * 2,\n swaySpeed: 0.4 + MULBERRY.next() * 0.8,\n swayAmplitude: 0.3 + MULBERRY.next() * 0.7,\n colorIndex,\n opacity: 0.7 + MULBERRY.next() * 0.3\n };\n }\n}\n","import { Lanterns } from './layer';\nimport type { LanternsConfig } from './types';\nimport type { Effect } from '../effect';\n\nexport function createLanterns(config?: LanternsConfig): Effect<LanternsConfig> {\n return new Lanterns(config);\n}\n\nexport type { LanternsConfig, Lantern } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n\nexport const LEAF_COLORS: string[] = [\n '#c0392b', // deep red\n '#e74c3c', // bright red\n '#d35400', // burnt orange\n '#e67e22', // orange\n '#f39c12', // amber\n '#f1c40f', // golden yellow\n '#d4a017', // dark gold\n '#8b4513', // saddle brown\n '#a0522d', // sienna\n '#6b8e23' // olive (some green still)\n];\n","import { Effect } from '../effect';\nimport { LEAF_COLORS, MULBERRY } from './consts';\nimport type { Leaf, LeavesConfig } from './types';\n\nexport class Leaves extends Effect<LeavesConfig> {\n readonly #scale: number;\n readonly #size: number;\n #speed: number;\n #wind: number;\n readonly #colors: string[];\n #maxCount: number;\n #time: number = 0;\n #leaves: Leaf[] = [];\n #sprites: HTMLCanvasElement[] = [];\n #height: number = 540;\n\n constructor(config: LeavesConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxCount = config.count ?? 80;\n this.#size = (config.size ?? 22) * this.#scale;\n this.#speed = config.speed ?? 1;\n this.#wind = config.wind ?? 0.3;\n this.#colors = config.colors ?? LEAF_COLORS;\n\n if (innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n\n this.#sprites = this.#createSprites();\n\n for (let i = 0; i < this.#maxCount; ++i) {\n this.#leaves.push(this.#createLeaf(true));\n }\n }\n\n onResize(_width: number, height: number): void {\n this.#height = height;\n }\n\n configure(config: Partial<LeavesConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.wind !== undefined) {\n this.#wind = config.wind;\n }\n }\n\n tick(dt: number, _width: number, height: number): void {\n this.#height = height;\n const speedFactor = (height / 540) / this.#speed;\n\n this.#time += 0.015 * dt;\n\n const globalWind = Math.sin(this.#time * 0.5) * 0.4\n + Math.sin(this.#time * 1.3 + 2) * 0.2\n + Math.sin(this.#time * 3.1) * 0.1;\n\n for (let index = 0; index < this.#leaves.length; index++) {\n const leaf = this.#leaves[index];\n\n const swing = Math.sin(this.#time * leaf.swingFrequency + leaf.swingOffset) * leaf.swingAmplitude;\n\n leaf.x += (swing + (this.#wind + globalWind * 0.5) * leaf.depth) * dt / (2500 * speedFactor);\n leaf.y += (leaf.fallSpeed * 2 + leaf.depth + leaf.size * 0.05) * dt / (500 * speedFactor);\n\n leaf.rotation += leaf.rotationSpeed * dt;\n leaf.flipAngle += leaf.flipSpeed * dt;\n\n if (leaf.x > 1.15 || leaf.x < -0.15 || leaf.y > 1.05) {\n const recycled = this.#createLeaf(false);\n\n if (this.#wind + globalWind > 0.15) {\n recycled.x = -0.15;\n recycled.y = MULBERRY.next() * 0.7;\n } else if (this.#wind + globalWind < -0.15) {\n recycled.x = 1.15;\n recycled.y = MULBERRY.next() * 0.7;\n } else {\n recycled.x = MULBERRY.next();\n recycled.y = -0.05 - MULBERRY.next() * 0.15;\n }\n\n this.#leaves[index] = recycled;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n for (const leaf of this.#leaves) {\n const px = leaf.x * width;\n const py = leaf.y * height;\n const displaySize = leaf.size * leaf.depth;\n const scaleX = Math.cos(leaf.flipAngle);\n const cos = Math.cos(leaf.rotation);\n const sin = Math.sin(leaf.rotation);\n\n ctx.setTransform(cos * scaleX, sin * scaleX, -sin, cos, px, py);\n ctx.globalAlpha = 0.3 + leaf.depth * 0.7;\n ctx.drawImage(\n this.#sprites[leaf.colorIndex % this.#sprites.length],\n -displaySize / 2,\n -displaySize / 2,\n displaySize,\n displaySize\n );\n }\n\n ctx.resetTransform();\n ctx.globalAlpha = 1;\n }\n\n #createSprites(): HTMLCanvasElement[] {\n const sprites: HTMLCanvasElement[] = [];\n\n for (const color of this.#colors) {\n sprites.push(this.#createLeafSprite(color, 0));\n sprites.push(this.#createLeafSprite(color, 1));\n sprites.push(this.#createLeafSprite(color, 2));\n }\n\n return sprites;\n }\n\n #createLeafSprite(color: string, shape: number): HTMLCanvasElement {\n const size = 64;\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n const ctx = canvas.getContext('2d')!;\n\n const cx = size / 2;\n const cy = size / 2;\n\n ctx.fillStyle = color;\n\n switch (shape) {\n case 0:\n this.#drawOvalLeaf(ctx, cx, cy, size);\n break;\n case 1:\n this.#drawMapleLeaf(ctx, cx, cy, size);\n break;\n case 2:\n this.#drawPointedLeaf(ctx, cx, cy, size);\n break;\n }\n\n return canvas;\n }\n\n #drawOvalLeaf(ctx: CanvasRenderingContext2D, cx: number, cy: number, size: number): void {\n const hw = size * 0.3;\n const hh = size * 0.42;\n\n ctx.beginPath();\n ctx.moveTo(cx, cy - hh);\n ctx.bezierCurveTo(cx + hw * 1.2, cy - hh * 0.5, cx + hw, cy + hh * 0.5, cx, cy + hh);\n ctx.bezierCurveTo(cx - hw, cy + hh * 0.5, cx - hw * 1.2, cy - hh * 0.5, cx, cy - hh);\n ctx.fill();\n\n ctx.strokeStyle = 'rgba(0, 0, 0, 0.15)';\n ctx.lineWidth = 0.8;\n ctx.beginPath();\n ctx.moveTo(cx, cy - hh * 0.8);\n ctx.lineTo(cx, cy + hh * 0.8);\n ctx.stroke();\n\n for (const offset of [-0.3, 0, 0.3]) {\n const py = cy + hh * offset;\n ctx.beginPath();\n ctx.moveTo(cx, py);\n ctx.quadraticCurveTo(cx + hw * 0.5, py - 3, cx + hw * 0.7, py - 1);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(cx, py);\n ctx.quadraticCurveTo(cx - hw * 0.5, py - 3, cx - hw * 0.7, py - 1);\n ctx.stroke();\n }\n }\n\n #drawMapleLeaf(ctx: CanvasRenderingContext2D, cx: number, cy: number, size: number): void {\n const r = size * 0.38;\n\n ctx.beginPath();\n ctx.moveTo(cx, cy - r);\n\n const points = 5;\n for (let i = 0; i < points; i++) {\n const angle = (i / points) * Math.PI * 2 - Math.PI / 2;\n const nextAngle = ((i + 1) / points) * Math.PI * 2 - Math.PI / 2;\n const outerR = r * (0.85 + (i % 2) * 0.15);\n const innerR = r * 0.45;\n const midAngle = (angle + nextAngle) / 2;\n\n ctx.lineTo(cx + Math.cos(angle) * outerR, cy + Math.sin(angle) * outerR);\n ctx.lineTo(cx + Math.cos(midAngle) * innerR, cy + Math.sin(midAngle) * innerR);\n }\n\n ctx.closePath();\n ctx.fill();\n\n ctx.strokeStyle = 'rgba(0, 0, 0, 0.12)';\n ctx.lineWidth = 0.7;\n for (let i = 0; i < points; i++) {\n const angle = (i / points) * Math.PI * 2 - Math.PI / 2;\n const outerR = r * 0.7;\n ctx.beginPath();\n ctx.moveTo(cx, cy);\n ctx.lineTo(cx + Math.cos(angle) * outerR, cy + Math.sin(angle) * outerR);\n ctx.stroke();\n }\n }\n\n #drawPointedLeaf(ctx: CanvasRenderingContext2D, cx: number, cy: number, size: number): void {\n const hw = size * 0.22;\n const hh = size * 0.44;\n\n ctx.beginPath();\n ctx.moveTo(cx, cy - hh);\n ctx.quadraticCurveTo(cx + hw * 1.6, cy - hh * 0.1, cx + hw * 0.3, cy + hh * 0.6);\n ctx.quadraticCurveTo(cx, cy + hh, cx, cy + hh);\n ctx.quadraticCurveTo(cx, cy + hh, cx - hw * 0.3, cy + hh * 0.6);\n ctx.quadraticCurveTo(cx - hw * 1.6, cy - hh * 0.1, cx, cy - hh);\n ctx.fill();\n\n ctx.strokeStyle = 'rgba(0, 0, 0, 0.15)';\n ctx.lineWidth = 0.8;\n ctx.beginPath();\n ctx.moveTo(cx, cy - hh * 0.7);\n ctx.lineTo(cx, cy + hh * 0.9);\n ctx.stroke();\n }\n\n #createLeaf(initialSpread: boolean): Leaf {\n const depth = 0.3 + MULBERRY.next() * 0.7;\n\n return {\n x: MULBERRY.next(),\n y: initialSpread ? MULBERRY.next() * 2 - 1 : -0.05 - MULBERRY.next() * 0.15,\n size: (MULBERRY.next() * 0.6 + 0.5) * this.#size,\n depth,\n rotation: MULBERRY.next() * Math.PI * 2,\n rotationSpeed: (MULBERRY.next() - 0.5) * 0.04,\n flipAngle: MULBERRY.next() * Math.PI * 2,\n flipSpeed: 0.02 + MULBERRY.next() * 0.04,\n swingAmplitude: 0.4 + MULBERRY.next() * 0.8,\n swingFrequency: 0.5 + MULBERRY.next() * 1.5,\n swingOffset: MULBERRY.next() * Math.PI * 2,\n fallSpeed: 0.3 + MULBERRY.next() * 0.7,\n shape: Math.floor(MULBERRY.next() * 3),\n colorIndex: Math.floor(MULBERRY.next() * this.#colors.length * 3)\n };\n }\n}\n","import { Leaves } from './layer';\nimport type { LeavesConfig } from './types';\nimport type { Effect } from '../effect';\n\nexport function createLeaves(config?: LeavesConfig): Effect<LeavesConfig> {\n return new Leaves(config);\n}\n\nexport type { LeavesConfig, Leaf } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import type { LightningBolt, LightningBranch } from './types';\n\nexport interface LightningSystemConfig {\n readonly frequency?: number;\n readonly color?: [number, number, number];\n readonly branches?: boolean;\n readonly flash?: boolean;\n readonly scale?: number;\n readonly groundLevel?: number;\n}\n\nexport class LightningSystem {\n readonly #frequency: number;\n readonly #colorR: number;\n readonly #colorG: number;\n readonly #colorB: number;\n readonly #enableBranches: boolean;\n readonly #enableFlash: boolean;\n readonly #scale: number;\n readonly #groundLevel: number;\n readonly #rng: () => number;\n #bolts: LightningBolt[] = [];\n #flashAlpha: number = 0;\n #cooldown: number = 0;\n\n get flashAlpha(): number {\n return this.#flashAlpha;\n }\n\n constructor(config: LightningSystemConfig, rng: () => number) {\n this.#frequency = config.frequency ?? 1;\n this.#enableBranches = config.branches ?? true;\n this.#enableFlash = config.flash ?? true;\n this.#scale = config.scale ?? 1;\n this.#groundLevel = config.groundLevel ?? 1;\n this.#rng = rng;\n\n const color = config.color ?? [180, 200, 255];\n this.#colorR = color[0];\n this.#colorG = color[1];\n this.#colorB = color[2];\n\n this.#cooldown = this.#nextCooldown();\n }\n\n tick(dt: number): void {\n this.#cooldown -= dt;\n\n if (this.#cooldown <= 0) {\n this.#bolts.push(this.#createBolt());\n\n if (this.#enableFlash) {\n this.#flashAlpha = 0.3;\n }\n\n this.#cooldown = this.#nextCooldown();\n }\n\n let alive = 0;\n\n for (let i = 0; i < this.#bolts.length; i++) {\n const bolt = this.#bolts[i];\n\n bolt.ticksAlive += dt;\n bolt.alpha = Math.max(0, 1 - bolt.ticksAlive / bolt.lifetime);\n\n if (bolt.alpha > 0) {\n this.#bolts[alive++] = bolt;\n }\n }\n\n this.#bolts.length = alive;\n\n if (this.#flashAlpha > 0) {\n this.#flashAlpha -= 0.012 * dt;\n\n if (this.#flashAlpha < 0) {\n this.#flashAlpha = 0;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n ctx.globalCompositeOperation = 'lighter';\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n\n for (const bolt of this.#bolts) {\n if (bolt.alpha <= 0) {\n continue;\n }\n\n this.#drawSegments(ctx, bolt.segments, bolt.alpha, 6 * this.#scale, 2 * this.#scale, width, height);\n\n for (const branch of bolt.branches) {\n const branchAlpha = bolt.alpha * branch.alpha;\n this.#drawSegments(ctx, branch.segments, branchAlpha, 3 * this.#scale, 1 * this.#scale, width, height);\n }\n }\n\n ctx.globalCompositeOperation = 'source-over';\n }\n\n #drawSegments(ctx: CanvasRenderingContext2D, segments: { x: number; y: number }[], alpha: number, outerWidth: number, innerWidth: number, width: number, height: number): void {\n if (segments.length < 2) {\n return;\n }\n\n // Outer glow\n ctx.beginPath();\n ctx.moveTo(segments[0].x * width, segments[0].y * height);\n\n for (let i = 1; i < segments.length; i++) {\n ctx.lineTo(segments[i].x * width, segments[i].y * height);\n }\n\n ctx.strokeStyle = `rgba(${this.#colorR}, ${this.#colorG}, ${this.#colorB}, ${alpha * 0.4})`;\n ctx.lineWidth = outerWidth;\n ctx.stroke();\n\n // Inner bright line\n ctx.beginPath();\n ctx.moveTo(segments[0].x * width, segments[0].y * height);\n\n for (let i = 1; i < segments.length; i++) {\n ctx.lineTo(segments[i].x * width, segments[i].y * height);\n }\n\n ctx.strokeStyle = `rgba(255, 255, 255, ${alpha})`;\n ctx.lineWidth = innerWidth;\n ctx.stroke();\n }\n\n #createBolt(): LightningBolt {\n const startX = 0.1 + this.#rng() * 0.8;\n const segments: { x: number; y: number }[] = [{x: startX, y: 0}];\n const branches: LightningBranch[] = [];\n\n let currentX = startX;\n let currentY = 0;\n const steps = 10 + Math.floor(this.#rng() * 10);\n\n for (let i = 0; i < steps; i++) {\n currentX += (this.#rng() - 0.5) * 0.1;\n currentY += (0.6 + this.#rng() * 0.4) / steps;\n currentX = Math.max(0.02, Math.min(0.98, currentX));\n segments.push({x: currentX, y: Math.min(currentY, this.#groundLevel)});\n\n if (this.#enableBranches && i > 1 && i < steps - 2 && this.#rng() < 0.35) {\n branches.push(this.#createBranch(currentX, currentY));\n }\n\n if (currentY >= this.#groundLevel) {\n break;\n }\n }\n\n return {\n segments,\n branches,\n alpha: 1,\n lifetime: 40 + this.#rng() * 40,\n ticksAlive: 0\n };\n }\n\n #createBranch(startX: number, startY: number): LightningBranch {\n const segments: { x: number; y: number }[] = [{x: startX, y: startY}];\n const direction = this.#rng() > 0.5 ? 1 : -1;\n const branchSteps = 3 + Math.floor(this.#rng() * 5);\n\n let bx = startX;\n let by = startY;\n\n for (let i = 0; i < branchSteps; i++) {\n bx += (0.02 + this.#rng() * 0.04) * direction;\n by += (0.02 + this.#rng() * 0.04);\n bx = Math.max(0.02, Math.min(0.98, bx));\n segments.push({x: bx, y: Math.min(by, this.#groundLevel)});\n\n if (by >= this.#groundLevel) {\n break;\n }\n }\n\n return {\n segments,\n alpha: 0.4 + this.#rng() * 0.4\n };\n }\n\n #nextCooldown(): number {\n const baseCooldown = 180 / this.#frequency;\n return baseCooldown + this.#rng() * baseCooldown;\n }\n}\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { LightningConfig } from './types';\nimport { LightningSystem } from './system';\n\nexport class Lightning extends Effect<LightningConfig> {\n readonly #system: LightningSystem;\n readonly #enableFlash: boolean;\n\n constructor(config: LightningConfig = {}) {\n super();\n\n this.#enableFlash = config.flash ?? true;\n\n const [r, g, b] = hexToRGB(config.color ?? '#b4c8ff');\n this.#system = new LightningSystem(\n {\n frequency: config.frequency ?? 1,\n color: [r, g, b],\n branches: config.branches ?? true,\n flash: this.#enableFlash,\n scale: config.scale ?? 1\n },\n () => MULBERRY.next()\n );\n }\n\n tick(dt: number, _width: number, _height: number): void {\n this.#system.tick(dt);\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n if (this.#system.flashAlpha > 0) {\n ctx.fillStyle = `rgba(255, 255, 255, ${this.#system.flashAlpha})`;\n ctx.fillRect(0, 0, width, height);\n }\n\n this.#system.draw(ctx, width, height);\n }\n}\n","import { Lightning } from './layer';\nimport type { LightningConfig } from './types';\nimport type { Effect } from '../effect';\n\nexport function createLightning(config?: LightningConfig): Effect<LightningConfig> {\n return new Lightning(config);\n}\n\nexport { LightningSystem } from './system';\nexport type { LightningSystemConfig } from './system';\nexport type { LightningConfig, LightningBolt, LightningBranch } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n\nexport const MATRIX_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MATRIX_CHARS, MULBERRY } from './consts';\nimport type { MatrixColumn, MatrixConfig } from './types';\n\nexport class Matrix extends Effect<MatrixConfig> {\n readonly #scale: number;\n #speed: number;\n readonly #fontSize: number;\n #trailLength: number;\n readonly #colorRGB: [number, number, number];\n #maxColumns: number;\n #columns: MatrixColumn[] = [];\n #respawnTimers: number[] = [];\n #width: number = 960;\n #height: number = 540;\n #initialized: boolean = false;\n\n constructor(config: MatrixConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxColumns = config.columns ?? 40;\n this.#speed = config.speed ?? 1;\n this.#fontSize = (config.fontSize ?? 14) * this.#scale;\n this.#trailLength = config.trailLength ?? 20;\n this.#colorRGB = hexToRGB(config.color ?? '#00ff41');\n\n if (innerWidth < 991) {\n this.#maxColumns = Math.floor(this.#maxColumns / 2);\n }\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n if (!this.#initialized) {\n this.#initialized = true;\n this.#columns = [];\n this.#respawnTimers = [];\n\n const columnWidth = this.#fontSize;\n const totalSlots = Math.floor(width / columnWidth);\n const columnCount = Math.min(this.#maxColumns, totalSlots);\n\n for (let i = 0; i < columnCount; ++i) {\n const column = this.#createColumn(totalSlots, height);\n this.#columns.push(column);\n this.#respawnTimers.push(0);\n }\n }\n }\n\n configure(config: Partial<MatrixConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.trailLength !== undefined) {\n this.#trailLength = config.trailLength;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n const columnWidth = this.#fontSize;\n const totalSlots = Math.floor(width / columnWidth);\n\n for (let i = 0; i < this.#columns.length; ++i) {\n if (this.#respawnTimers[i] > 0) {\n this.#respawnTimers[i] -= dt;\n\n if (this.#respawnTimers[i] <= 0) {\n this.#columns[i] = this.#createColumn(totalSlots, height);\n }\n\n continue;\n }\n\n const column = this.#columns[i];\n\n column.y += column.speed * this.#speed * dt;\n\n for (let ci = 0; ci < column.chars.length; ++ci) {\n if (MULBERRY.next() < 0.03) {\n column.chars[ci] = MATRIX_CHARS[Math.floor(MULBERRY.next() * MATRIX_CHARS.length)];\n }\n }\n\n const topOfTrail = column.y - (column.chars.length - 1) * this.#fontSize;\n\n if (topOfTrail > height) {\n this.#respawnTimers[i] = 10 + MULBERRY.next() * 60;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n ctx.fillStyle = 'rgb(0, 0, 0)';\n ctx.fillRect(0, 0, width, height);\n\n const [cr, cg, cb] = this.#colorRGB;\n\n ctx.font = `${this.#fontSize}px monospace`;\n ctx.textAlign = 'center';\n\n for (const column of this.#columns) {\n const charCount = column.chars.length;\n\n for (let ci = 0; ci < charCount; ++ci) {\n const charY = column.y - (charCount - 1 - ci) * this.#fontSize;\n\n if (charY < -this.#fontSize || charY > height + this.#fontSize) {\n continue;\n }\n\n const isHead = ci === charCount - 1;\n\n if (isHead) {\n const headAlpha = column.headBrightness;\n ctx.fillStyle = `rgba(255, 255, 255, ${headAlpha})`;\n } else {\n const trailProgress = ci / (charCount - 1);\n const alpha = trailProgress * 0.8 + 0.05;\n ctx.fillStyle = `rgba(${cr}, ${cg}, ${cb}, ${alpha})`;\n }\n\n ctx.fillText(column.chars[ci], column.x, charY);\n }\n }\n }\n\n #createColumn(totalSlots: number, height: number): MatrixColumn {\n const columnWidth = this.#fontSize;\n const slot = Math.floor(MULBERRY.next() * totalSlots);\n const length = Math.floor(this.#trailLength * 0.5 + MULBERRY.next() * this.#trailLength);\n const chars: string[] = [];\n\n for (let ci = 0; ci < length; ++ci) {\n chars.push(MATRIX_CHARS[Math.floor(MULBERRY.next() * MATRIX_CHARS.length)]);\n }\n\n return {\n x: slot * columnWidth + columnWidth / 2,\n y: -(MULBERRY.next() * height),\n speed: 1.5 + MULBERRY.next() * 3,\n chars,\n length,\n headBrightness: 0.8 + MULBERRY.next() * 0.2\n };\n }\n}\n","import { Matrix } from './layer';\nimport type { MatrixConfig } from './types';\nimport type { Effect } from '../effect';\n\nexport function createMatrix(config?: MatrixConfig): Effect<MatrixConfig> {\n return new Matrix(config);\n}\n\nexport type { MatrixConfig, MatrixColumn } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n\nexport const ORBIT_COLORS: string[] = [\n '#60a5fa', // blue\n '#a78bfa', // purple\n '#f472b6', // pink\n '#34d399', // emerald\n '#fbbf24', // amber\n '#fb923c', // orange\n '#38bdf8' // sky\n];\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY, ORBIT_COLORS } from './consts';\nimport type { OrbitalCenter, Orbiter, OrbitsConfig } from './types';\n\nexport class Orbits extends Effect<OrbitsConfig> {\n readonly #centerCount: number;\n readonly #orbitersPerCenter: number;\n #speed: number;\n readonly #colors: string[];\n #trailLength: number;\n #showCenters: boolean;\n #scale: number;\n #centers: OrbitalCenter[] = [];\n #orbiters: Orbiter[] = [];\n #time: number = 0;\n #initialized: boolean = false;\n\n constructor(config: OrbitsConfig = {}) {\n super();\n\n this.#centerCount = config.centers ?? 3;\n this.#orbitersPerCenter = config.orbitersPerCenter ?? 8;\n this.#speed = config.speed ?? 1;\n this.#colors = config.colors ?? ORBIT_COLORS;\n this.#trailLength = config.trailLength ?? 15;\n this.#showCenters = config.showCenters ?? true;\n this.#scale = config.scale ?? 1;\n }\n\n onResize(_width: number, _height: number): void {\n if (!this.#initialized) {\n this.#initialized = true;\n this.#centers = [];\n this.#orbiters = [];\n\n for (let i = 0; i < this.#centerCount; i++) {\n this.#centers.push({\n x: 0.15 + MULBERRY.next() * 0.7,\n y: 0.15 + MULBERRY.next() * 0.7\n });\n }\n\n const count = innerWidth < 991\n ? Math.floor(this.#orbitersPerCenter / 2)\n : this.#orbitersPerCenter;\n\n for (let ci = 0; ci < this.#centers.length; ci++) {\n for (let oi = 0; oi < count; oi++) {\n this.#orbiters.push(this.#createOrbiter(ci));\n }\n }\n }\n }\n\n configure(config: Partial<OrbitsConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.trailLength !== undefined) {\n this.#trailLength = config.trailLength;\n }\n if (config.showCenters !== undefined) {\n this.#showCenters = config.showCenters;\n }\n if (config.scale !== undefined) {\n this.#scale = config.scale;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#time += 0.01 * dt * this.#speed;\n\n for (const orbiter of this.#orbiters) {\n const center = this.#centers[orbiter.centerIndex];\n const cx = center.x * width;\n const cy = center.y * height;\n\n orbiter.angle += orbiter.angularSpeed * dt * this.#speed;\n\n const cosAngle = Math.cos(orbiter.angle);\n const sinAngle = Math.sin(orbiter.angle);\n const cosTilt = Math.cos(orbiter.tilt);\n\n const localX = cosAngle * orbiter.radiusX * this.#scale;\n const localY = sinAngle * orbiter.radiusY * this.#scale * cosTilt;\n\n const rotatedX = localX * Math.cos(orbiter.tilt * 0.3) - localY * Math.sin(orbiter.tilt * 0.3);\n const rotatedY = localX * Math.sin(orbiter.tilt * 0.3) + localY * Math.cos(orbiter.tilt * 0.3);\n\n const px = cx + rotatedX;\n const py = cy + rotatedY;\n\n const trail = orbiter.trail;\n const maxLen = this.#trailLength;\n\n if (trail.length < maxLen) {\n trail.push({x: px, y: py});\n orbiter.trailHead = trail.length - 1;\n } else {\n const next = (orbiter.trailHead + 1) % maxLen;\n trail[next].x = px;\n trail[next].y = py;\n orbiter.trailHead = next;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n if (this.#showCenters) {\n ctx.globalCompositeOperation = 'lighter';\n\n for (const center of this.#centers) {\n const cx = center.x * width;\n const cy = center.y * height;\n const glowRadius = 30 * this.#scale;\n\n const gradient = ctx.createRadialGradient(cx, cy, 0, cx, cy, glowRadius);\n gradient.addColorStop(0, 'rgba(255, 255, 255, 0.3)');\n gradient.addColorStop(0.4, 'rgba(200, 200, 255, 0.1)');\n gradient.addColorStop(1, 'rgba(200, 200, 255, 0)');\n\n ctx.globalAlpha = 1;\n ctx.beginPath();\n ctx.arc(cx, cy, glowRadius, 0, Math.PI * 2);\n ctx.fillStyle = gradient;\n ctx.fill();\n }\n\n ctx.globalCompositeOperation = 'source-over';\n }\n\n ctx.globalCompositeOperation = 'lighter';\n\n for (const orbiter of this.#orbiters) {\n const [cr, cg, cb] = hexToRGB(orbiter.color);\n const trail = orbiter.trail;\n const trailLen = trail.length;\n\n if (trailLen > 1) {\n const isFull = trailLen === this.#trailLength;\n const oldest = isFull ? (orbiter.trailHead + 1) % trailLen : 0;\n\n for (let ti = 0; ti < trailLen - 1; ti++) {\n const progress = (ti + 1) / trailLen;\n const trailAlpha = progress * 0.5;\n const trailWidth = orbiter.size * progress * this.#scale;\n\n if (trailAlpha < 0.01) {\n continue;\n }\n\n const idx0 = (oldest + ti) % trailLen;\n const idx1 = (oldest + ti + 1) % trailLen;\n\n ctx.globalAlpha = trailAlpha;\n ctx.strokeStyle = `rgb(${cr}, ${cg}, ${cb})`;\n ctx.lineWidth = trailWidth;\n ctx.beginPath();\n ctx.moveTo(trail[idx0].x, trail[idx0].y);\n ctx.lineTo(trail[idx1].x, trail[idx1].y);\n ctx.stroke();\n }\n }\n\n if (trailLen > 0) {\n const head = trail[orbiter.trailHead];\n const headSize = orbiter.size * this.#scale;\n\n const glow = ctx.createRadialGradient(\n head.x, head.y, 0,\n head.x, head.y, headSize * 3\n );\n glow.addColorStop(0, `rgba(${cr}, ${cg}, ${cb}, 0.9)`);\n glow.addColorStop(0.3, `rgba(${cr}, ${cg}, ${cb}, 0.3)`);\n glow.addColorStop(1, `rgba(${cr}, ${cg}, ${cb}, 0)`);\n\n ctx.globalAlpha = 1;\n ctx.beginPath();\n ctx.arc(head.x, head.y, headSize * 3, 0, Math.PI * 2);\n ctx.fillStyle = glow;\n ctx.fill();\n\n ctx.beginPath();\n ctx.arc(head.x, head.y, headSize, 0, Math.PI * 2);\n ctx.fillStyle = `rgb(${cr}, ${cg}, ${cb})`;\n ctx.fill();\n }\n }\n\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = 1;\n }\n\n #createOrbiter(centerIndex: number): Orbiter {\n const minRadius = 40;\n const maxRadius = 160;\n\n return {\n centerIndex,\n angle: MULBERRY.next() * Math.PI * 2,\n angularSpeed: 0.01 + MULBERRY.next() * 0.03,\n radiusX: minRadius + MULBERRY.next() * (maxRadius - minRadius),\n radiusY: (minRadius + MULBERRY.next() * (maxRadius - minRadius)) * (0.3 + MULBERRY.next() * 0.7),\n tilt: MULBERRY.next() * Math.PI,\n size: 1.5 + MULBERRY.next() * 2.5,\n color: this.#colors[Math.floor(MULBERRY.next() * this.#colors.length)],\n trail: [],\n trailHead: 0\n };\n }\n}\n","import { Orbits } from './layer';\nimport type { OrbitsConfig } from './types';\nimport type { Effect } from '../effect';\n\nexport function createOrbits(config?: OrbitsConfig): Effect<OrbitsConfig> {\n return new Orbits(config);\n}\n\nexport type { OrbitsConfig, OrbitalCenter, Orbiter } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { NetworkParticle, ParticleMouseMode } from './types';\n\nexport interface ParticlesConfig {\n readonly count?: number;\n readonly color?: string;\n readonly lineColor?: string;\n readonly size?: [number, number];\n readonly speed?: [number, number];\n readonly connectionDistance?: number;\n readonly lineWidth?: number;\n readonly mouseMode?: ParticleMouseMode;\n readonly mouseRadius?: number;\n readonly mouseStrength?: number;\n readonly particleForces?: boolean;\n readonly glow?: boolean;\n readonly background?: string | null;\n readonly scale?: number;\n}\n\nexport class Particles extends Effect<ParticlesConfig> {\n #scale: number;\n #connectionDistance: number;\n #lineWidth: number;\n #mouseMode: ParticleMouseMode;\n #mouseRadius: number;\n #mouseStrength: number;\n #particleForces: boolean;\n #glow: boolean;\n readonly #background: string | null;\n readonly #colorRGB: [number, number, number];\n readonly #lineColorRGB: [number, number, number];\n readonly #sizeRange: [number, number];\n readonly #speedRange: [number, number];\n readonly #onMouseMoveBound: (evt: MouseEvent) => void;\n readonly #onMouseLeaveBound: () => void;\n #maxCount: number;\n #mouseX: number = -1;\n #mouseY: number = -1;\n #mouseOnCanvas: boolean = false;\n #particles: NetworkParticle[] = [];\n #grid: Map<string, number[]> = new Map();\n #cellSize: number;\n #width: number = 960;\n #height: number = 540;\n #initialized: boolean = false;\n\n constructor(config: ParticlesConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxCount = config.count ?? 100;\n this.#connectionDistance = (config.connectionDistance ?? 120) * this.#scale;\n this.#lineWidth = config.lineWidth ?? 0.5;\n this.#mouseMode = config.mouseMode ?? 'connect';\n this.#mouseRadius = (config.mouseRadius ?? 150) * this.#scale;\n this.#mouseStrength = config.mouseStrength ?? 0.03;\n this.#particleForces = config.particleForces ?? false;\n this.#glow = config.glow ?? false;\n this.#background = config.background ?? null;\n this.#cellSize = this.#connectionDistance;\n\n this.#colorRGB = hexToRGB(config.color ?? '#6366f1');\n this.#lineColorRGB = hexToRGB(config.lineColor ?? '#6366f1');\n\n this.#sizeRange = config.size ?? [1, 3];\n this.#speedRange = config.speed ?? [0.2, 0.8];\n\n if (innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n\n this.#onMouseMoveBound = this.#onMouseMove.bind(this);\n this.#onMouseLeaveBound = this.#onMouseLeave.bind(this);\n }\n\n configure(config: Partial<ParticlesConfig>): void {\n if (config.scale !== undefined) {\n this.#scale = config.scale;\n }\n if (config.connectionDistance !== undefined) {\n this.#connectionDistance = config.connectionDistance * this.#scale;\n }\n if (config.lineWidth !== undefined) {\n this.#lineWidth = config.lineWidth;\n }\n if (config.mouseMode !== undefined) {\n this.#mouseMode = config.mouseMode;\n }\n if (config.mouseRadius !== undefined) {\n this.#mouseRadius = config.mouseRadius * this.#scale;\n }\n if (config.mouseStrength !== undefined) {\n this.#mouseStrength = config.mouseStrength;\n }\n if (config.particleForces !== undefined) {\n this.#particleForces = config.particleForces;\n }\n if (config.glow !== undefined) {\n this.#glow = config.glow;\n }\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n if (!this.#initialized) {\n this.#initialized = true;\n this.#particles = [];\n\n for (let i = 0; i < this.#maxCount; ++i) {\n this.#particles.push(this.#createParticle(this.#sizeRange, this.#speedRange));\n }\n }\n }\n\n onMount(canvas: HTMLCanvasElement): void {\n if (this.#mouseMode !== 'none') {\n canvas.addEventListener('mousemove', this.#onMouseMoveBound, {passive: true});\n canvas.addEventListener('mouseleave', this.#onMouseLeaveBound, {passive: true});\n }\n }\n\n onUnmount(canvas: HTMLCanvasElement): void {\n canvas.removeEventListener('mousemove', this.#onMouseMoveBound);\n canvas.removeEventListener('mouseleave', this.#onMouseLeaveBound);\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n this.#grid.clear();\n\n for (let i = 0; i < this.#particles.length; i++) {\n const particle = this.#particles[i];\n const col = Math.floor(particle.x / this.#cellSize);\n const row = Math.floor(particle.y / this.#cellSize);\n const key = `${col},${row}`;\n const cell = this.#grid.get(key);\n\n if (cell) {\n cell.push(i);\n } else {\n this.#grid.set(key, [i]);\n }\n }\n\n for (const particle of this.#particles) {\n particle.x += particle.vx * dt;\n particle.y += particle.vy * dt;\n\n if (particle.x < 0) {\n particle.x = 0;\n particle.vx = Math.abs(particle.vx);\n } else if (particle.x > width) {\n particle.x = width;\n particle.vx = -Math.abs(particle.vx);\n }\n\n if (particle.y < 0) {\n particle.y = 0;\n particle.vy = Math.abs(particle.vy);\n } else if (particle.y > height) {\n particle.y = height;\n particle.vy = -Math.abs(particle.vy);\n }\n }\n\n if (this.#mouseOnCanvas && (this.#mouseMode === 'attract' || this.#mouseMode === 'repel')) {\n const direction = this.#mouseMode === 'attract' ? -1 : 1;\n\n for (const particle of this.#particles) {\n const dx = particle.x - this.#mouseX;\n const dy = particle.y - this.#mouseY;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n if (dist < this.#mouseRadius && dist > 0) {\n const force = (1 - dist / this.#mouseRadius) * this.#mouseStrength * dt;\n particle.vx += (dx / dist) * force * direction * 100;\n particle.vy += (dy / dist) * force * direction * 100;\n }\n }\n }\n\n if (this.#particleForces) {\n const repelDist = 30 * this.#scale;\n\n for (let i = 0; i < this.#particles.length; i++) {\n const pa = this.#particles[i];\n const col = Math.floor(pa.x / this.#cellSize);\n const row = Math.floor(pa.y / this.#cellSize);\n\n for (let dc = -1; dc <= 1; dc++) {\n for (let dr = -1; dr <= 1; dr++) {\n const key = `${col + dc},${row + dr}`;\n const neighbors = this.#grid.get(key);\n\n if (!neighbors) {\n continue;\n }\n\n for (const j of neighbors) {\n if (j <= i) {\n continue;\n }\n\n const pb = this.#particles[j];\n const dx = pa.x - pb.x;\n const dy = pa.y - pb.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n if (dist < repelDist && dist > 0) {\n const force = (1 - dist / repelDist) * 0.5 * dt;\n const nx = dx / dist;\n const ny = dy / dist;\n pa.vx += nx * force;\n pa.vy += ny * force;\n pb.vx -= nx * force;\n pb.vy -= ny * force;\n }\n }\n }\n }\n }\n }\n\n for (const particle of this.#particles) {\n const currentSpeed = Math.sqrt(particle.vx * particle.vx + particle.vy * particle.vy);\n\n if (currentSpeed > particle.baseSpeed) {\n const damping = Math.pow(0.98, dt);\n particle.vx *= damping;\n particle.vy *= damping;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n if (this.#background) {\n ctx.fillStyle = this.#background;\n ctx.fillRect(0, 0, width, height);\n }\n\n const [lr, lg, lb] = this.#lineColorRGB;\n const [pr, pg, pb] = this.#colorRGB;\n const connDist = this.#connectionDistance;\n\n ctx.lineWidth = this.#lineWidth;\n\n const drawn = new Set<string>();\n\n for (let i = 0; i < this.#particles.length; i++) {\n const pa = this.#particles[i];\n const col = Math.floor(pa.x / this.#cellSize);\n const row = Math.floor(pa.y / this.#cellSize);\n\n for (let dc = -1; dc <= 1; dc++) {\n for (let dr = -1; dr <= 1; dr++) {\n const key = `${col + dc},${row + dr}`;\n const neighbors = this.#grid.get(key);\n\n if (!neighbors) {\n continue;\n }\n\n for (const j of neighbors) {\n if (j <= i) {\n continue;\n }\n\n const pairKey = `${i},${j}`;\n\n if (drawn.has(pairKey)) {\n continue;\n }\n\n drawn.add(pairKey);\n\n const pb2 = this.#particles[j];\n const dx = pa.x - pb2.x;\n const dy = pa.y - pb2.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n if (dist < connDist) {\n const alpha = 1 - dist / connDist;\n ctx.beginPath();\n ctx.moveTo(pa.x, pa.y);\n ctx.lineTo(pb2.x, pb2.y);\n ctx.strokeStyle = `rgba(${lr}, ${lg}, ${lb}, ${alpha * 0.6})`;\n ctx.stroke();\n }\n }\n }\n }\n }\n\n if (this.#mouseOnCanvas && this.#mouseMode === 'connect') {\n for (const particle of this.#particles) {\n const dx = particle.x - this.#mouseX;\n const dy = particle.y - this.#mouseY;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n if (dist < this.#mouseRadius) {\n const alpha = 1 - dist / this.#mouseRadius;\n ctx.beginPath();\n ctx.moveTo(this.#mouseX, this.#mouseY);\n ctx.lineTo(particle.x, particle.y);\n ctx.strokeStyle = `rgba(${lr}, ${lg}, ${lb}, ${alpha * 0.8})`;\n ctx.stroke();\n }\n }\n }\n\n if (this.#glow) {\n ctx.shadowColor = `rgb(${pr}, ${pg}, ${pb})`;\n ctx.shadowBlur = 8 * this.#scale;\n }\n\n for (const particle of this.#particles) {\n ctx.beginPath();\n ctx.arc(particle.x, particle.y, particle.radius * this.#scale, 0, Math.PI * 2);\n ctx.fillStyle = `rgb(${pr}, ${pg}, ${pb})`;\n ctx.fill();\n }\n\n if (this.#glow) {\n ctx.shadowBlur = 0;\n }\n }\n\n #onMouseMove(evt: MouseEvent): void {\n const target = evt.currentTarget as HTMLCanvasElement;\n const rect = target.getBoundingClientRect();\n this.#mouseX = evt.clientX - rect.left;\n this.#mouseY = evt.clientY - rect.top;\n this.#mouseOnCanvas = true;\n }\n\n #onMouseLeave(): void {\n this.#mouseOnCanvas = false;\n }\n\n #createParticle(sizeRange: [number, number], speedRange: [number, number]): NetworkParticle {\n const angle = MULBERRY.next() * Math.PI * 2;\n const speed = speedRange[0] + MULBERRY.next() * (speedRange[1] - speedRange[0]);\n\n return {\n x: MULBERRY.next() * this.#width,\n y: MULBERRY.next() * this.#height,\n vx: Math.cos(angle) * speed,\n vy: Math.sin(angle) * speed,\n radius: sizeRange[0] + MULBERRY.next() * (sizeRange[1] - sizeRange[0]),\n baseSpeed: speed\n };\n }\n}\n","import { Particles } from './layer';\nimport type { ParticlesConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createParticles(config?: ParticlesConfig): Effect<ParticlesConfig> {\n return new Particles(config);\n}\n\nexport type { ParticlesConfig };\nexport type { NetworkParticle, ParticleMouseMode } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n\nexport const PETAL_COLORS: string[] = [\n '#ffb7c5', // sakura pink\n '#ffc0cb', // pink\n '#ffd1dc', // pastel pink\n '#ffe4e9', // light pink\n '#fff0f3', // near white pink\n '#f8c3cd', // rose pink\n '#f4a7b9' // deeper pink\n];\n","import { Effect } from '../effect';\nimport { MULBERRY, PETAL_COLORS } from './consts';\nimport type { Petal } from './types';\n\nexport interface PetalsConfig {\n readonly count?: number;\n readonly colors?: string[];\n readonly size?: number;\n readonly speed?: number;\n readonly wind?: number;\n readonly scale?: number;\n}\n\nexport class Petals extends Effect<PetalsConfig> {\n readonly #scale: number;\n readonly #size: number;\n #speed: number;\n #wind: number;\n readonly #colors: string[];\n #maxCount: number;\n #time: number = 0;\n #petals: Petal[] = [];\n #sprites: HTMLCanvasElement[] = [];\n\n constructor(config: PetalsConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxCount = config.count ?? 100;\n this.#size = (config.size ?? 24) * this.#scale;\n this.#speed = config.speed ?? 0.7;\n this.#wind = config.wind ?? 0.15;\n this.#colors = config.colors ?? PETAL_COLORS;\n\n if (innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n\n this.#sprites = this.#createSprites();\n\n for (let i = 0; i < this.#maxCount; ++i) {\n this.#petals.push(this.#createPetal(true));\n }\n }\n\n configure(config: Partial<PetalsConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.wind !== undefined) {\n this.#wind = config.wind;\n }\n }\n\n tick(dt: number, _width: number, height: number): void {\n const speedFactor = (height / 540) / this.#speed;\n\n this.#time += 0.012 * dt;\n\n const globalWind = Math.sin(this.#time * 0.4) * 0.3\n + Math.sin(this.#time * 1.1 + 1.5) * 0.15\n + Math.sin(this.#time * 2.7) * 0.08;\n\n for (let index = 0; index < this.#petals.length; index++) {\n const petal = this.#petals[index];\n\n const swing = Math.sin(this.#time * petal.swingFrequency + petal.swingOffset) * petal.swingAmplitude;\n\n petal.x += (swing + (this.#wind + globalWind * 0.4) * petal.depth) * dt / (3000 * speedFactor);\n petal.y += (petal.fallSpeed * 1.5 + petal.depth * 0.5) * dt / (600 * speedFactor);\n\n petal.rotation += petal.rotationSpeed * dt;\n petal.flipAngle += petal.flipSpeed * dt;\n\n if (petal.x > 1.15 || petal.x < -0.15 || petal.y > 1.05) {\n const recycled = this.#createPetal(false);\n\n if (this.#wind + globalWind > 0.1) {\n recycled.x = -0.15;\n recycled.y = MULBERRY.next() * 0.6;\n } else {\n recycled.x = MULBERRY.next();\n recycled.y = -0.05 - MULBERRY.next() * 0.15;\n }\n\n this.#petals[index] = recycled;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n for (const petal of this.#petals) {\n const px = petal.x * width;\n const py = petal.y * height;\n const displaySize = petal.size * petal.depth;\n const scaleX = Math.cos(petal.flipAngle);\n const cos = Math.cos(petal.rotation);\n const sin = Math.sin(petal.rotation);\n\n ctx.setTransform(cos * scaleX, sin * scaleX, -sin, cos, px, py);\n ctx.globalAlpha = 0.4 + petal.depth * 0.6;\n ctx.drawImage(\n this.#sprites[petal.colorIndex % this.#sprites.length],\n -displaySize / 2,\n -displaySize / 2,\n displaySize,\n displaySize\n );\n }\n\n ctx.resetTransform();\n ctx.globalAlpha = 1;\n }\n\n #createSprites(): HTMLCanvasElement[] {\n const sprites: HTMLCanvasElement[] = [];\n\n for (const color of this.#colors) {\n sprites.push(this.#createPetalSprite(color));\n }\n\n return sprites;\n }\n\n #createPetalSprite(color: string): HTMLCanvasElement {\n const size = 64;\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n const ctx = canvas.getContext('2d')!;\n\n const cx = size / 2;\n const cy = size / 2;\n const hw = size * 0.28;\n const hh = size * 0.38;\n\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(cx, cy - hh);\n ctx.bezierCurveTo(cx + hw * 1.4, cy - hh * 0.6, cx + hw * 1.1, cy + hh * 0.3, cx, cy + hh);\n ctx.bezierCurveTo(cx - hw * 1.1, cy + hh * 0.3, cx - hw * 1.4, cy - hh * 0.6, cx, cy - hh);\n ctx.fill();\n\n ctx.strokeStyle = 'rgba(200, 100, 120, 0.15)';\n ctx.lineWidth = 0.6;\n ctx.beginPath();\n ctx.moveTo(cx, cy - hh * 0.6);\n ctx.quadraticCurveTo(cx + 1, cy, cx, cy + hh * 0.7);\n ctx.stroke();\n\n return canvas;\n }\n\n #createPetal(initialSpread: boolean): Petal {\n const depth = 0.5 + MULBERRY.next() * 0.5;\n\n return {\n x: MULBERRY.next(),\n y: initialSpread ? MULBERRY.next() * 2 - 1 : -0.05 - MULBERRY.next() * 0.15,\n size: (MULBERRY.next() * 0.4 + 0.6) * this.#size,\n depth,\n rotation: MULBERRY.next() * Math.PI * 2,\n rotationSpeed: (MULBERRY.next() - 0.5) * 0.03,\n flipAngle: MULBERRY.next() * Math.PI * 2,\n flipSpeed: 0.015 + MULBERRY.next() * 0.03,\n swingAmplitude: 0.5 + MULBERRY.next() * 1.0,\n swingFrequency: 0.4 + MULBERRY.next() * 1.2,\n swingOffset: MULBERRY.next() * Math.PI * 2,\n fallSpeed: 0.2 + MULBERRY.next() * 0.5,\n colorIndex: Math.floor(MULBERRY.next() * this.#colors.length)\n };\n }\n}\n","import { Petals } from './layer';\nimport type { PetalsConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createPetals(config?: PetalsConfig): Effect<PetalsConfig> {\n return new Petals(config);\n}\n\nexport type { PetalsConfig };\nexport type { Petal } from './types';\n","import { Effect } from '../effect';\nimport type { PlasmaColor } from './types';\n\nexport interface PlasmaConfig {\n readonly speed?: number;\n readonly scale?: number;\n readonly resolution?: number;\n readonly palette?: PlasmaColor[];\n}\n\nconst DEFAULT_PALETTE: PlasmaColor[] = [\n {r: 0, g: 255, b: 255},\n {r: 255, g: 0, b: 255},\n {r: 255, g: 255, b: 0},\n {r: 0, g: 100, b: 255},\n {r: 0, g: 255, b: 100}\n];\n\nexport class Plasma extends Effect<PlasmaConfig> {\n #speed: number;\n #scale: number;\n readonly #resolution: number;\n readonly #palette: PlasmaColor[];\n #time: number = 0;\n #offscreen: HTMLCanvasElement | null = null;\n #offscreenCtx: CanvasRenderingContext2D | null = null;\n #imageData: ImageData | null = null;\n\n constructor(config: PlasmaConfig = {}) {\n super();\n\n this.#speed = config.speed ?? 1;\n this.#scale = config.scale ?? 1;\n this.#resolution = config.resolution ?? 4;\n this.#palette = config.palette ?? DEFAULT_PALETTE;\n }\n\n configure(config: Partial<PlasmaConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.scale !== undefined) {\n this.#scale = config.scale;\n }\n }\n\n tick(dt: number, _width: number, _height: number): void {\n this.#time += 0.02 * dt * this.#speed;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const resolution = this.#resolution;\n const offWidth = Math.ceil(width / resolution);\n const offHeight = Math.ceil(height / resolution);\n\n if (!this.#offscreen || this.#offscreen.width !== offWidth || this.#offscreen.height !== offHeight) {\n this.#offscreen = document.createElement('canvas');\n this.#offscreen.width = offWidth;\n this.#offscreen.height = offHeight;\n this.#offscreenCtx = this.#offscreen.getContext('2d');\n this.#imageData = this.#offscreenCtx!.createImageData(offWidth, offHeight);\n }\n\n const data = this.#imageData!.data;\n const time = this.#time;\n const scale = this.#scale;\n const freq = 50 * scale;\n const palette = this.#palette;\n const paletteLen = palette.length;\n\n for (let py = 0; py < offHeight; py++) {\n const worldY = py * resolution;\n\n for (let px = 0; px < offWidth; px++) {\n const worldX = px * resolution;\n\n const value = Math.sin(worldX / freq + time)\n + Math.sin(worldY / freq + time * 0.7)\n + Math.sin((worldX + worldY) / (freq * 1.3) + time * 1.3)\n + Math.sin(Math.sqrt(worldX * worldX + worldY * worldY) / freq + time * 0.5);\n\n const normalized = (value + 4) / 8;\n const mapped = normalized * (paletteLen - 1);\n const index = Math.floor(mapped);\n const frac = mapped - index;\n\n const colorA = palette[index];\n const colorB = palette[Math.min(index + 1, paletteLen - 1)];\n\n const red = colorA.r + (colorB.r - colorA.r) * frac;\n const green = colorA.g + (colorB.g - colorA.g) * frac;\n const blue = colorA.b + (colorB.b - colorA.b) * frac;\n\n const offset = (py * offWidth + px) * 4;\n data[offset] = red;\n data[offset + 1] = green;\n data[offset + 2] = blue;\n data[offset + 3] = 255;\n }\n }\n\n this.#offscreenCtx!.putImageData(this.#imageData!, 0, 0);\n\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(this.#offscreen!, 0, 0, width, height);\n }\n}\n","import { Plasma } from './layer';\nimport type { PlasmaConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createPlasma(config?: PlasmaConfig): Effect<PlasmaConfig> {\n return new Plasma(config);\n}\n\nexport type { PlasmaConfig };\nexport type { PlasmaColor } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { parseColor } from '../color';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { Raindrop, RainVariant, Splash } from './types';\n\nexport interface RainConfig {\n readonly variant?: RainVariant;\n readonly drops?: number;\n readonly wind?: number;\n readonly speed?: number;\n readonly splashes?: boolean;\n readonly color?: string;\n readonly groundLevel?: number;\n readonly scale?: number;\n}\n\nconst VARIANT_PRESETS: Record<RainVariant, { drops: number; speed: number; wind: number; splashes: boolean }> = {\n drizzle: {drops: 70, speed: 0.55, wind: 0.1, splashes: false},\n downpour: {drops: 200, speed: 0.85, wind: 0.25, splashes: true},\n thunderstorm: {drops: 300, speed: 1, wind: 0.4, splashes: true}\n};\n\nexport class Rain extends Effect<RainConfig> {\n readonly #scale: number;\n #speed: number;\n #wind: number;\n readonly #groundLevel: number;\n #enableSplashes: boolean;\n readonly #colorR: number;\n readonly #colorG: number;\n readonly #colorB: number;\n #maxDrops: number;\n #drops: Raindrop[] = [];\n #splashes: Splash[] = [];\n\n constructor(config: RainConfig = {}) {\n super();\n\n const variant = config.variant ?? 'downpour';\n const preset = VARIANT_PRESETS[variant];\n\n this.#scale = config.scale ?? 1;\n this.#maxDrops = config.drops ?? preset.drops;\n this.#speed = config.speed ?? preset.speed;\n this.#wind = config.wind ?? preset.wind;\n this.#groundLevel = config.groundLevel ?? 1.0;\n this.#enableSplashes = config.splashes ?? preset.splashes;\n\n const {r, g, b} = parseColor(config.color ?? 'rgba(174, 194, 224, 0.6)');\n this.#colorR = r;\n this.#colorG = g;\n this.#colorB = b;\n\n if (innerWidth < 991) {\n this.#maxDrops = Math.floor(this.#maxDrops / 2);\n }\n\n for (let i = 0; i < this.#maxDrops; ++i) {\n this.#drops.push(this.#createDrop(true));\n }\n }\n\n configure(config: Partial<RainConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.wind !== undefined) {\n this.#wind = config.wind;\n }\n if (config.splashes !== undefined) {\n this.#enableSplashes = config.splashes;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n // Update raindrops\n let aliveDrops = 0;\n\n for (let i = 0; i < this.#drops.length; i++) {\n const drop = this.#drops[i];\n\n drop.x += (drop.vx * dt) / width;\n drop.y += (drop.vy * dt) / height;\n\n if (drop.y >= this.#groundLevel) {\n if (this.#enableSplashes) {\n this.#createSplashBurst(drop.x, this.#groundLevel);\n }\n\n this.#drops[aliveDrops++] = this.#createDrop(false);\n } else {\n this.#drops[aliveDrops++] = drop;\n }\n }\n\n this.#drops.length = aliveDrops;\n\n // Refill drops\n while (this.#drops.length < this.#maxDrops) {\n this.#drops.push(this.#createDrop(false));\n }\n\n // Update splashes\n let aliveSplashes = 0;\n\n for (let i = 0; i < this.#splashes.length; i++) {\n const splash = this.#splashes[i];\n\n splash.x += (splash.vx * dt) / width;\n splash.y += (splash.vy * dt) / height;\n splash.vy += splash.gravity * dt;\n splash.alpha -= 0.04 * dt;\n\n if (splash.alpha > 0) {\n this.#splashes[aliveSplashes++] = splash;\n }\n }\n\n this.#splashes.length = aliveSplashes;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n // Raindrops\n ctx.lineCap = 'round';\n for (const drop of this.#drops) {\n const px = drop.x * width;\n const py = drop.y * height;\n const lineWidth = (0.4 + drop.depth * 1) * this.#scale;\n\n // Draw line along velocity direction\n const speed = Math.sqrt(drop.vx * drop.vx + drop.vy * drop.vy);\n const nx = speed > 0 ? drop.vx / speed : 0;\n const ny = speed > 0 ? drop.vy / speed : -1;\n const tailLength = drop.length * drop.depth;\n\n ctx.beginPath();\n ctx.moveTo(px, py);\n ctx.lineTo(px - nx * tailLength, py - ny * tailLength);\n ctx.strokeStyle = `rgba(${this.#colorR}, ${this.#colorG}, ${this.#colorB}, ${drop.opacity * drop.depth})`;\n ctx.lineWidth = lineWidth;\n ctx.stroke();\n }\n\n // Splashes\n for (const splash of this.#splashes) {\n const px = splash.x * width;\n const py = splash.y * height;\n\n ctx.beginPath();\n ctx.arc(px, py, splash.size * this.#scale, 0, Math.PI * 2);\n ctx.fillStyle = `rgba(${this.#colorR}, ${this.#colorG}, ${this.#colorB}, ${splash.alpha})`;\n ctx.fill();\n }\n }\n\n #createDrop(initialSpread: boolean): Raindrop {\n const depth = 0.3 + MULBERRY.next() * 0.7;\n const fallSpeed = (3.5 + MULBERRY.next() * 5) * depth * this.#speed;\n\n // Extend spawn range upstream of wind direction so the windward edge stays covered.\n // Drops blowing right need to also spawn left of the canvas (negative x), and vice versa.\n const windOffset = Math.abs(this.#wind) * 0.5;\n const xMin = this.#wind > 0 ? -windOffset : 0;\n const xMax = this.#wind < 0 ? 1 + windOffset : 1;\n\n return {\n x: xMin + MULBERRY.next() * (xMax - xMin),\n y: initialSpread ? MULBERRY.next() * this.#groundLevel : -MULBERRY.next() * 0.1,\n vx: this.#wind * fallSpeed * 0.6,\n vy: fallSpeed,\n length: (8 + MULBERRY.next() * 15) * this.#scale,\n speed: fallSpeed,\n depth,\n opacity: 0.3 + MULBERRY.next() * 0.4\n };\n }\n\n #createSplashBurst(x: number, y: number): void {\n const count = 2 + Math.floor(MULBERRY.next() * 2);\n\n for (let i = 0; i < count; i++) {\n this.#splashes.push({\n x,\n y,\n vx: (MULBERRY.next() - 0.5) * 2,\n vy: -(1 + MULBERRY.next() * 2),\n alpha: 0.5 + MULBERRY.next() * 0.3,\n size: 1 + MULBERRY.next() * 2,\n gravity: 0.15\n });\n }\n }\n\n}\n","import type { Point } from '../point';\n\nexport interface RaindropParticleConfig {\n readonly depth?: number;\n readonly groundY?: number;\n readonly length?: number;\n readonly scale?: number;\n}\n\nexport interface SplashParticleConfig {\n readonly gravity?: number;\n readonly scale?: number;\n readonly size?: number;\n}\n\nexport class RaindropParticle {\n readonly #color: [number, number, number];\n readonly #depth: number;\n readonly #length: number;\n readonly #groundY: number;\n readonly #scale: number;\n readonly #opacity: number;\n readonly #vx: number;\n readonly #vy: number;\n #x: number;\n #y: number;\n\n get isDead(): boolean {\n return this.#y >= this.#groundY;\n }\n\n get position(): Point {\n return {x: this.#x, y: this.#y};\n }\n\n constructor(position: Point, velocity: Point, color: [number, number, number], config: RaindropParticleConfig = {}) {\n this.#x = position.x;\n this.#y = position.y;\n this.#vx = velocity.x;\n this.#vy = velocity.y;\n this.#color = color;\n this.#depth = config.depth ?? (0.3 + Math.random() * 0.7);\n this.#groundY = config.groundY ?? Number.POSITIVE_INFINITY;\n this.#length = (config.length ?? (8 + Math.random() * 15)) * (config.scale ?? 1);\n this.#opacity = 0.3 + Math.random() * 0.4;\n this.#scale = config.scale ?? 1;\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n const [r, g, b] = this.#color;\n const speed = Math.sqrt(this.#vx * this.#vx + this.#vy * this.#vy);\n const nx = speed > 0 ? this.#vx / speed : 0;\n const ny = speed > 0 ? this.#vy / speed : -1;\n\n ctx.beginPath();\n ctx.moveTo(this.#x, this.#y);\n ctx.lineTo(this.#x - nx * this.#length * this.#depth, this.#y - ny * this.#length * this.#depth);\n ctx.strokeStyle = `rgba(${r}, ${g}, ${b}, ${this.#opacity * this.#depth})`;\n ctx.lineWidth = (0.4 + this.#depth * 1) * this.#scale;\n ctx.lineCap = 'round';\n ctx.stroke();\n }\n\n tick(dt: number = 1): void {\n this.#x += this.#vx * dt;\n this.#y += this.#vy * dt;\n }\n}\n\nexport class SplashParticle {\n readonly #color: [number, number, number];\n readonly #gravity: number;\n readonly #size: number;\n readonly #scale: number;\n #x: number;\n #y: number;\n #vx: number;\n #vy: number;\n #alpha: number;\n\n get isDead(): boolean {\n return this.#alpha <= 0;\n }\n\n get position(): Point {\n return {x: this.#x, y: this.#y};\n }\n\n constructor(position: Point, velocity: Point, color: [number, number, number], config: SplashParticleConfig = {}) {\n this.#x = position.x;\n this.#y = position.y;\n this.#vx = velocity.x;\n this.#vy = velocity.y;\n this.#color = color;\n this.#alpha = 0.5 + Math.random() * 0.3;\n this.#gravity = config.gravity ?? 0.15;\n this.#size = config.size ?? (1 + Math.random() * 2);\n this.#scale = config.scale ?? 1;\n }\n\n static burst(position: Point, color: [number, number, number], config?: SplashParticleConfig): SplashParticle[] {\n const count = 2 + Math.floor(Math.random() * 3);\n const particles: SplashParticle[] = [];\n\n for (let i = 0; i < count; i++) {\n particles.push(new SplashParticle(\n position,\n {x: (Math.random() - 0.5) * 4, y: -(1 + Math.random() * 3)},\n color,\n config\n ));\n }\n\n return particles;\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n const [r, g, b] = this.#color;\n\n ctx.beginPath();\n ctx.arc(this.#x, this.#y, this.#size * this.#scale, 0, Math.PI * 2);\n ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${this.#alpha})`;\n ctx.fill();\n }\n\n tick(dt: number = 1): void {\n this.#x += this.#vx * dt;\n this.#y += this.#vy * dt;\n this.#vy += this.#gravity * dt;\n this.#alpha -= 0.04 * dt;\n }\n}\n","import { Rain } from './layer';\nimport type { RainConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createRain(config?: RainConfig): Effect<RainConfig> {\n return new Rain(config);\n}\n\nexport { RaindropParticle, SplashParticle } from './particle';\nexport type { RainConfig };\nexport type { RaindropParticleConfig, SplashParticleConfig } from './particle';\nexport type { Raindrop, RainVariant, Splash } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { SandGrain } from './types';\n\nexport interface SandstormConfig {\n readonly count?: number;\n readonly wind?: number;\n readonly turbulence?: number;\n readonly color?: string;\n readonly hazeOpacity?: number;\n readonly scale?: number;\n}\n\nexport class Sandstorm extends Effect<SandstormConfig> {\n readonly #scale: number;\n #wind: number;\n #turbulence: number;\n readonly #colorR: number;\n readonly #colorG: number;\n readonly #colorB: number;\n readonly #hazeOpacity: number;\n #maxCount: number;\n #time: number = 0;\n #grains: SandGrain[] = [];\n\n constructor(config: SandstormConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxCount = config.count ?? 300;\n this.#wind = config.wind ?? 1;\n this.#turbulence = config.turbulence ?? 1;\n this.#hazeOpacity = config.hazeOpacity ?? 0.15;\n\n const {r, g, b} = this.#parseColor(config.color ?? '#c2956b');\n this.#colorR = r;\n this.#colorG = g;\n this.#colorB = b;\n\n if (innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n\n for (let i = 0; i < this.#maxCount; ++i) {\n this.#grains.push(this.#createGrain(true));\n }\n }\n\n configure(config: Partial<SandstormConfig>): void {\n if (config.wind !== undefined) {\n this.#wind = config.wind;\n }\n if (config.turbulence !== undefined) {\n this.#turbulence = config.turbulence;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#time += 0.02 * dt;\n\n const gustX = Math.sin(this.#time * 0.3) * 0.5\n + Math.sin(this.#time * 0.8 + 1) * 0.3\n + Math.sin(this.#time * 2.1) * 0.2;\n\n const gustY = Math.sin(this.#time * 0.5 + 2) * 0.15;\n\n const baseWindX = (3 + gustX * 2) * this.#wind;\n const baseWindY = gustY * this.#turbulence;\n\n for (let index = 0; index < this.#grains.length; index++) {\n const grain = this.#grains[index];\n\n const turbX = Math.sin(this.#time * 3 + grain.turbulenceOffset) * this.#turbulence * 0.5;\n const turbY = Math.cos(this.#time * 2.5 + grain.turbulenceOffset * 1.3) * this.#turbulence * 0.3;\n\n grain.vx = (baseWindX + turbX) * grain.depth;\n grain.vy = (baseWindY + turbY) * grain.depth + 0.3 * grain.depth;\n\n grain.x += (grain.vx * dt) / width;\n grain.y += (grain.vy * dt) / height;\n\n if (grain.x > 1.1 || grain.x < -0.1 || grain.y > 1.1 || grain.y < -0.1) {\n const recycled = this.#createGrain(false);\n\n if (baseWindX > 0) {\n recycled.x = -0.1;\n } else {\n recycled.x = 1.1;\n }\n\n recycled.y = MULBERRY.next();\n this.#grains[index] = recycled;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n const hazeFlicker = 0.9 + Math.sin(this.#time * 0.7) * 0.1;\n ctx.fillStyle = `rgba(${this.#colorR}, ${this.#colorG}, ${this.#colorB}, ${this.#hazeOpacity * hazeFlicker})`;\n ctx.fillRect(0, 0, width, height);\n\n for (const grain of this.#grains) {\n const px = grain.x * width;\n const py = grain.y * height;\n const size = grain.size * grain.depth * this.#scale;\n\n if (size < 0.3) {\n continue;\n }\n\n const speed = Math.sqrt(grain.vx * grain.vx + grain.vy * grain.vy);\n const nx = speed > 0 ? grain.vx / speed : 1;\n const ny = speed > 0 ? grain.vy / speed : 0;\n const streakLength = size * 2 + speed * 3;\n\n ctx.beginPath();\n ctx.moveTo(px, py);\n ctx.lineTo(px - nx * streakLength, py - ny * streakLength);\n ctx.strokeStyle = `rgba(${this.#colorR}, ${this.#colorG}, ${this.#colorB}, ${grain.opacity * grain.depth})`;\n ctx.lineWidth = size;\n ctx.lineCap = 'round';\n ctx.stroke();\n }\n }\n\n #parseColor(color: string): { r: number; g: number; b: number } {\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d')!;\n ctx.fillStyle = color;\n ctx.fillRect(0, 0, 1, 1);\n const data = ctx.getImageData(0, 0, 1, 1).data;\n return {r: data[0], g: data[1], b: data[2]};\n }\n\n #createGrain(initialSpread: boolean): SandGrain {\n const depth = 0.2 + MULBERRY.next() * 0.8;\n\n return {\n x: initialSpread ? MULBERRY.next() : -0.1,\n y: MULBERRY.next(),\n vx: 0,\n vy: 0,\n size: (0.5 + MULBERRY.next() * 2) * this.#scale,\n depth,\n opacity: 0.3 + MULBERRY.next() * 0.5,\n turbulenceOffset: MULBERRY.next() * Math.PI * 2\n };\n }\n}\n","import { Sandstorm } from './layer';\nimport type { SandstormConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createSandstorm(config?: SandstormConfig): Effect<SandstormConfig> {\n return new Sandstorm(config);\n}\n\nexport type { SandstormConfig };\nexport type { SandGrain } from './types';\n","import { LimitedFrameRateCanvas } from './canvas';\nimport { applyEdgeFade } from './fade';\nimport type { SimulationLayer } from './layer';\n\n/**\n * Internal canvas runner that drives all layers in a Scene.\n */\nclass SceneCanvas extends LimitedFrameRateCanvas {\n readonly #layers: SimulationLayer[];\n readonly #contextOptions: CanvasRenderingContext2DSettings;\n #offscreen: HTMLCanvasElement | null = null;\n #offscreenCtx: CanvasRenderingContext2D | null = null;\n\n constructor(canvas: HTMLCanvasElement, layers: SimulationLayer[], frameRate: number, options: CanvasRenderingContext2DSettings) {\n super(canvas, frameRate, options);\n this.#layers = layers;\n this.#contextOptions = options;\n\n canvas.style.position = 'absolute';\n canvas.style.top = '0';\n canvas.style.left = '0';\n canvas.style.height = '100%';\n canvas.style.width = '100%';\n }\n\n start(): void {\n for (const layer of this.#layers) {\n layer.onMount(this.canvas);\n }\n super.start();\n }\n\n destroy(): void {\n for (const layer of this.#layers) {\n layer.onUnmount(this.canvas);\n }\n super.destroy();\n }\n\n draw(): void {\n const dpr = this.dpr;\n this.canvas.height = this.height * dpr;\n this.canvas.width = this.width * dpr;\n\n const ctx = this.context;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, this.width, this.height);\n\n for (const layer of this.#layers) {\n if (layer.fade) {\n const offCtx = this.#getOffscreenCtx(this.width * dpr, this.height * dpr);\n offCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n offCtx.clearRect(0, 0, this.width, this.height);\n layer.draw(offCtx, this.width, this.height);\n applyEdgeFade(offCtx, this.width, this.height, layer.fade);\n ctx.drawImage(this.#offscreen!, 0, 0, this.width, this.height);\n } else {\n ctx.save();\n layer.draw(ctx, this.width, this.height);\n ctx.restore();\n }\n }\n }\n\n tick(): void {\n const dt = (this.delta > 0 && this.delta < 200 ? this.delta / (1000 / 60) : 1) * this.speed * LimitedFrameRateCanvas.globalSpeed;\n\n for (const layer of this.#layers) {\n layer.tick(dt, this.width, this.height);\n }\n }\n\n onResize(): void {\n super.onResize();\n\n if (this.#offscreen) {\n this.#offscreen.width = this.width * this.dpr;\n this.#offscreen.height = this.height * this.dpr;\n }\n\n for (const layer of this.#layers) {\n layer.onResize(this.width, this.height);\n }\n }\n\n #getOffscreenCtx(width: number, height: number): CanvasRenderingContext2D {\n if (!this.#offscreen) {\n this.#offscreen = document.createElement('canvas');\n this.#offscreen.width = width;\n this.#offscreen.height = height;\n this.#offscreenCtx = this.#offscreen.getContext('2d', this.#contextOptions)!;\n }\n\n return this.#offscreenCtx!;\n }\n}\n\n/**\n * Composable canvas that renders multiple Effect layers in order (first = bottom, last = top).\n *\n * @example\n * const scene = new Scene()\n * .mount(canvas)\n * .layer(new Aurora({ bands: 5 }))\n * .layer(new Stars().withFade({ bottom: 0.4 }))\n * .start();\n */\nexport class Scene {\n readonly #layers: SimulationLayer[] = [];\n readonly #frameRate: number;\n readonly #defaultOptions: CanvasRenderingContext2DSettings;\n #runner: SceneCanvas | null = null;\n\n constructor(frameRate: number = 60, options: CanvasRenderingContext2DSettings = {colorSpace: 'display-p3'}) {\n this.#frameRate = frameRate;\n this.#defaultOptions = options;\n }\n\n /**\n * Mount the scene to a canvas element or CSS selector.\n */\n mount(canvas: HTMLCanvasElement | string, options?: CanvasRenderingContext2DSettings): this {\n if (typeof canvas === 'string') {\n const el = document.querySelector<HTMLCanvasElement>(canvas);\n\n if (!el) {\n throw new Error(`Scene.mount(): no element found for selector \"${canvas}\".`);\n }\n\n canvas = el;\n }\n\n this.#runner?.destroy();\n this.#runner = new SceneCanvas(canvas, this.#layers, this.#frameRate, options ?? this.#defaultOptions);\n return this;\n }\n\n /**\n * Add an effect layer. Layers are rendered in the order they are added.\n * If the scene is already running, the layer is mounted immediately.\n */\n layer(effect: SimulationLayer): this {\n this.#layers.push(effect);\n\n if (this.#runner?.isTicking) {\n effect.onMount(this.#runner.canvas);\n }\n\n return this;\n }\n\n /**\n * Start the render loop.\n */\n start(): this {\n this.#runner?.start();\n return this;\n }\n\n /**\n * Pause rendering without destroying state. Use resume() to continue.\n */\n pause(): this {\n this.#runner?.pause();\n return this;\n }\n\n /**\n * Resume rendering after pause().\n */\n resume(): this {\n this.#runner?.resume();\n return this;\n }\n\n /**\n * Stop and destroy all layers.\n */\n destroy(): void {\n this.#runner?.destroy();\n this.#runner = null;\n }\n\n get speed(): number {\n return this.#runner?.speed ?? 1;\n }\n\n set speed(value: number) {\n if (this.#runner) {\n this.#runner.speed = value;\n }\n }\n\n get isTicking(): boolean {\n return this.#runner?.isTicking ?? false;\n }\n}\n\n/**\n * Factory alternative to `new Scene()`. Call .mount() and .layer() on the returned instance.\n */\nexport function createScene(frameRate?: number, options?: CanvasRenderingContext2DSettings): Scene {\n return new Scene(frameRate, options);\n}\n","import type { ShootingStar } from './types';\n\nexport interface ShootingStarSystemConfig {\n readonly interval: [number, number];\n readonly color?: [number, number, number];\n readonly trailLength?: number;\n readonly trailAlphaFactor?: number;\n readonly speed?: number;\n readonly scale?: number;\n readonly alphaMin?: number;\n readonly alphaRange?: number;\n readonly decayMin?: number;\n readonly decayRange?: number;\n}\n\nexport class ShootingStarSystem {\n readonly #interval: [number, number];\n readonly #color: [number, number, number];\n readonly #trailLength: number;\n readonly #trailAlphaFactor: number;\n readonly #speed: number;\n readonly #scale: number;\n readonly #alphaMin: number;\n readonly #alphaRange: number;\n readonly #decayMin: number;\n readonly #decayRange: number;\n readonly #rng: () => number;\n #cooldown: number;\n #stars: ShootingStar[] = [];\n\n constructor(config: ShootingStarSystemConfig, rng: () => number) {\n this.#interval = config.interval;\n this.#color = config.color ?? [200, 230, 255];\n this.#trailLength = config.trailLength ?? 18;\n this.#trailAlphaFactor = config.trailAlphaFactor ?? 0.5;\n this.#speed = config.speed ?? 1;\n this.#scale = config.scale ?? 1;\n this.#alphaMin = config.alphaMin ?? 0.7;\n this.#alphaRange = config.alphaRange ?? 0.3;\n this.#decayMin = config.decayMin ?? 0.008;\n this.#decayRange = config.decayRange ?? 0.01;\n this.#rng = rng;\n this.#cooldown = this.#interval[0] + this.#rng() * (this.#interval[1] - this.#interval[0]);\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#cooldown -= dt;\n\n if (this.#cooldown <= 0) {\n this.#stars.push(this.#create(width, height));\n this.#cooldown = this.#interval[0] + this.#rng() * (this.#interval[1] - this.#interval[0]);\n }\n\n let alive = 0;\n\n for (let i = 0; i < this.#stars.length; i++) {\n const star = this.#stars[i];\n\n const trail = star.trail;\n const maxLen = this.#trailLength;\n\n if (trail.length < maxLen) {\n trail.push({x: star.x, y: star.y});\n star.trailHead = trail.length - 1;\n } else {\n const next = (star.trailHead + 1) % maxLen;\n trail[next].x = star.x;\n trail[next].y = star.y;\n star.trailHead = next;\n }\n\n star.x += star.vx * this.#speed * dt;\n star.y += star.vy * this.#speed * dt;\n star.alpha -= star.decay * dt;\n\n const inBounds = star.alpha > 0 && star.x > -50 && star.x < width + 50 && star.y < height + 50;\n\n if (inBounds) {\n this.#stars[alive++] = star;\n }\n }\n\n this.#stars.length = alive;\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n const [cr, cg, cb] = this.#color;\n\n ctx.globalCompositeOperation = 'lighter';\n\n for (const star of this.#stars) {\n const trail = star.trail;\n const trailLen = trail.length;\n const isFull = trailLen === this.#trailLength;\n const oldest = isFull ? (star.trailHead + 1) % trailLen : 0;\n\n for (let t = 0; t < trailLen; t++) {\n const progress = t / trailLen;\n const trailAlpha = star.alpha * progress * this.#trailAlphaFactor;\n const trailSize = star.size * progress * this.#scale;\n\n if (trailAlpha < 0.01) {\n continue;\n }\n\n const idx = (oldest + t) % trailLen;\n\n ctx.globalAlpha = trailAlpha;\n ctx.beginPath();\n ctx.arc(trail[idx].x, trail[idx].y, trailSize, 0, Math.PI * 2);\n ctx.fillStyle = `rgb(${cr}, ${cg}, ${cb})`;\n ctx.fill();\n }\n\n const alpha = star.alpha;\n const headSize = star.size * 2 * this.#scale;\n const glow = ctx.createRadialGradient(star.x, star.y, 0, star.x, star.y, headSize);\n glow.addColorStop(0, `rgba(${cr}, ${cg}, ${cb}, ${alpha})`);\n glow.addColorStop(0.5, `rgba(${cr}, ${cg}, ${cb}, ${alpha * 0.3})`);\n glow.addColorStop(1, `rgba(${cr}, ${cg}, ${cb}, 0)`);\n\n ctx.globalAlpha = 1;\n ctx.beginPath();\n ctx.arc(star.x, star.y, headSize, 0, Math.PI * 2);\n ctx.fillStyle = glow;\n ctx.fill();\n }\n\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = 1;\n }\n\n #create(width: number, height: number): ShootingStar {\n const startX = this.#rng() * width * 0.8;\n const startY = this.#rng() * height * 0.4;\n const angle = 0.3 + this.#rng() * 0.5;\n const speed = 8 + this.#rng() * 12;\n\n return {\n x: startX,\n y: startY,\n vx: Math.cos(angle) * speed * this.#scale,\n vy: Math.sin(angle) * speed * this.#scale,\n alpha: this.#alphaMin + this.#rng() * this.#alphaRange,\n size: 1.5 + this.#rng() * 2,\n decay: this.#decayMin + this.#rng() * this.#decayRange,\n trail: [],\n trailHead: 0\n };\n }\n}\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { parseColor } from '../color';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { Snowflake } from './snowflake';\n\nexport interface SnowConfig {\n readonly fillStyle?: string;\n readonly particles?: number;\n readonly scale?: number;\n readonly size?: number;\n readonly speed?: number;\n}\n\nconst SPRITE_SIZE = 64;\nconst SPRITE_CENTER = SPRITE_SIZE / 2;\nconst SPRITE_RADIUS = SPRITE_SIZE / 2;\n\nexport class Snow extends Effect<SnowConfig> {\n readonly #scale: number;\n readonly #size: number;\n #speed: number;\n readonly #baseOpacity: number;\n #maxParticles: number;\n #time: number = 0;\n #ratio: number = 1;\n #snowflakes: Snowflake[] = [];\n #sprites: HTMLCanvasElement[] = [];\n #height: number = 540;\n\n constructor(config: SnowConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxParticles = config.particles ?? 200;\n this.#size = (config.size ?? 9) * this.#scale;\n this.#speed = config.speed ?? 2;\n\n const {r, g, b, a} = parseColor(config.fillStyle ?? 'rgb(255 255 255 / .75)');\n this.#baseOpacity = a;\n\n if (innerWidth < 991) {\n this.#maxParticles = Math.floor(this.#maxParticles / 2);\n }\n\n this.#sprites = this.#createSprites(r, g, b);\n\n for (let i = 0; i < this.#maxParticles; ++i) {\n this.#snowflakes.push(this.#createSnowflake(true));\n }\n }\n\n configure(config: Partial<SnowConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n }\n\n onResize(_width: number, height: number): void {\n this.#height = height;\n }\n\n tick(dt: number, _width: number, height: number): void {\n this.#height = height;\n\n const speedFactor = height / (420 * this.#ratio) / this.#speed;\n\n this.#time += 0.015 * speedFactor * dt;\n\n const wind = Math.sin(this.#time * 0.7) * 0.5\n + Math.sin(this.#time * 1.9 + 3) * 0.25\n + Math.sin(this.#time * 4.3 + 1) * 0.1;\n\n for (let index = 0; index < this.#snowflakes.length; index++) {\n const snowflake = this.#snowflakes[index];\n\n const swing = Math.sin(this.#time * snowflake.swingFrequency + snowflake.swingOffset) * snowflake.swingAmplitude;\n\n snowflake.x += (swing + wind * snowflake.depth * 2) * dt / (4000 * speedFactor);\n snowflake.y += (snowflake.fallSpeed * 2 + snowflake.depth + snowflake.radius * 0.15) * dt / (700 * speedFactor);\n\n snowflake.rotation += snowflake.rotationSpeed * dt / speedFactor;\n\n if (snowflake.x > 1.15 || snowflake.x < -0.15 || snowflake.y > 1.05) {\n const recycled = this.#createSnowflake(false);\n\n if (index % 3 > 0) {\n recycled.x = MULBERRY.next();\n recycled.y = -0.05 - MULBERRY.next() * 0.15;\n } else if (wind > 0.2) {\n recycled.x = -0.15;\n recycled.y = MULBERRY.next() * 0.8;\n } else if (wind < -0.2) {\n recycled.x = 1.15;\n recycled.y = MULBERRY.next() * 0.8;\n } else {\n recycled.x = MULBERRY.next();\n recycled.y = -0.05 - MULBERRY.next() * 0.15;\n }\n\n this.#snowflakes[index] = recycled;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n for (const snowflake of this.#snowflakes) {\n const px = snowflake.x * width;\n const py = snowflake.y * height;\n const displayRadius = snowflake.radius * snowflake.depth * this.#ratio;\n const displaySize = displayRadius * 2;\n\n if (displaySize < 0.5) {\n continue;\n }\n\n ctx.globalAlpha = this.#baseOpacity * (0.15 + snowflake.depth * 0.85);\n\n if (snowflake.spriteIndex === 3) {\n const cos = Math.cos(snowflake.rotation);\n const sin = Math.sin(snowflake.rotation);\n ctx.setTransform(cos, sin, -sin, cos, px, py);\n ctx.drawImage(\n this.#sprites[snowflake.spriteIndex],\n -displayRadius,\n -displayRadius,\n displaySize,\n displaySize\n );\n ctx.resetTransform();\n } else {\n ctx.drawImage(\n this.#sprites[snowflake.spriteIndex],\n px - displayRadius,\n py - displayRadius,\n displaySize,\n displaySize\n );\n }\n }\n\n ctx.globalAlpha = 1;\n }\n\n #createSprites(r: number, g: number, b: number): HTMLCanvasElement[] {\n const sprites: HTMLCanvasElement[] = [];\n\n const gradientProfiles: [number, number][][] = [\n [[0, 0.8], [0.3, 0.4], [0.7, 0.1], [1, 0]],\n [[0, 1], [0.15, 0.7], [0.5, 0.2], [1, 0]],\n [[0, 0.9], [0.25, 0.5], [0.5, 0.1], [1, 0]]\n ];\n\n for (const profile of gradientProfiles) {\n const canvas = document.createElement('canvas');\n canvas.width = SPRITE_SIZE;\n canvas.height = SPRITE_SIZE;\n const ctx = canvas.getContext('2d')!;\n\n const gradient = ctx.createRadialGradient(\n SPRITE_CENTER, SPRITE_CENTER, 0,\n SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS\n );\n\n for (const [stop, alpha] of profile) {\n gradient.addColorStop(stop, `rgba(${r}, ${g}, ${b}, ${alpha})`);\n }\n\n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.arc(SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS, 0, Math.PI * 2);\n ctx.fill();\n\n sprites.push(canvas);\n }\n\n sprites.push(this.#createCrystalSprite(r, g, b));\n\n return sprites;\n }\n\n #createCrystalSprite(r: number, g: number, b: number): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.width = SPRITE_SIZE;\n canvas.height = SPRITE_SIZE;\n const ctx = canvas.getContext('2d')!;\n\n const glow = ctx.createRadialGradient(\n SPRITE_CENTER, SPRITE_CENTER, 0,\n SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS\n );\n glow.addColorStop(0, `rgba(${r}, ${g}, ${b}, 0.6)`);\n glow.addColorStop(0.25, `rgba(${r}, ${g}, ${b}, 0.25)`);\n glow.addColorStop(0.6, `rgba(${r}, ${g}, ${b}, 0.05)`);\n glow.addColorStop(1, `rgba(${r}, ${g}, ${b}, 0)`);\n ctx.fillStyle = glow;\n ctx.beginPath();\n ctx.arc(SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.strokeStyle = `rgba(${r}, ${g}, ${b}, 0.7)`;\n ctx.lineWidth = 1.5;\n ctx.lineCap = 'round';\n\n const armLength = SPRITE_RADIUS * 0.75;\n\n for (let arm = 0; arm < 6; arm++) {\n const angle = (arm / 6) * Math.PI * 2 - Math.PI / 2;\n const tipX = SPRITE_CENTER + Math.cos(angle) * armLength;\n const tipY = SPRITE_CENTER + Math.sin(angle) * armLength;\n\n ctx.beginPath();\n ctx.moveTo(SPRITE_CENTER, SPRITE_CENTER);\n ctx.lineTo(tipX, tipY);\n ctx.stroke();\n\n for (const position of [0.4, 0.65]) {\n const branchX = SPRITE_CENTER + Math.cos(angle) * armLength * position;\n const branchY = SPRITE_CENTER + Math.sin(angle) * armLength * position;\n const branchLength = armLength * (0.4 - position * 0.3);\n\n for (const side of [-1, 1]) {\n const branchAngle = angle + side * Math.PI / 3;\n ctx.beginPath();\n ctx.moveTo(branchX, branchY);\n ctx.lineTo(\n branchX + Math.cos(branchAngle) * branchLength,\n branchY + Math.sin(branchAngle) * branchLength\n );\n ctx.stroke();\n }\n }\n }\n\n const centerGlow = ctx.createRadialGradient(\n SPRITE_CENTER, SPRITE_CENTER, 0,\n SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS * 0.12\n );\n centerGlow.addColorStop(0, `rgba(${r}, ${g}, ${b}, 0.9)`);\n centerGlow.addColorStop(1, `rgba(${r}, ${g}, ${b}, 0)`);\n ctx.fillStyle = centerGlow;\n ctx.beginPath();\n ctx.arc(SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS * 0.12, 0, Math.PI * 2);\n ctx.fill();\n\n return canvas;\n }\n\n #createSnowflake(initialSpread: boolean): Snowflake {\n const depth = 0.3 + MULBERRY.next() * 0.7;\n const radius = MULBERRY.next() * this.#size + 2 * this.#scale;\n\n let spriteIndex: number;\n if (depth > 0.85 && radius > this.#size * 0.6 && MULBERRY.next() > 0.65) {\n spriteIndex = 3;\n } else if (depth < 0.45) {\n spriteIndex = 2;\n } else {\n spriteIndex = MULBERRY.next() > 0.5 ? 0 : 1;\n }\n\n return {\n x: MULBERRY.next(),\n y: initialSpread ? MULBERRY.next() * 2 - 1 : -0.05 - MULBERRY.next() * 0.15,\n depth,\n radius,\n rotation: MULBERRY.next() * Math.PI * 2,\n rotationSpeed: (MULBERRY.next() - 0.5) * 0.03,\n swingAmplitude: 0.3 + MULBERRY.next() * 0.7,\n swingFrequency: 0.5 + MULBERRY.next() * 1.5,\n swingOffset: MULBERRY.next() * Math.PI * 2,\n fallSpeed: 0.5 + MULBERRY.next() * 0.5,\n spriteIndex\n };\n }\n}\n","import { Snow } from './layer';\nimport type { SnowConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createSnow(config?: SnowConfig): Effect<SnowConfig> {\n return new Snow(config);\n}\n\nexport type { SnowConfig };\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { SparklerSpark } from './types';\n\nexport interface SparklersConfig {\n readonly emitRate?: number;\n readonly maxSparks?: number;\n readonly colors?: string[];\n readonly speed?: [number, number];\n readonly friction?: number;\n readonly gravity?: number;\n readonly decay?: [number, number];\n readonly trailLength?: number;\n readonly hoverMode?: boolean;\n readonly scale?: number;\n}\n\nconst DEFAULT_COLORS = ['#ffcc33', '#ff9900', '#ffffff', '#ffee88'];\n\nexport class Sparklers extends Effect<SparklersConfig> {\n #scale: number;\n #emitRate: number;\n readonly #maxSparks: number;\n readonly #colorRGBs: [number, number, number][];\n readonly #speedRange: [number, number];\n #friction: number;\n #gravity: number;\n readonly #decayRange: [number, number];\n #trailLength: number;\n #hoverMode: boolean;\n readonly #onMouseMoveBound: (evt: MouseEvent) => void;\n readonly #onMouseLeaveBound: () => void;\n #emitX: number = 0.5;\n #emitY: number = 0.5;\n #mouseOnCanvas: boolean = false;\n #sparks: SparklerSpark[] = [];\n #mountedCanvas: HTMLCanvasElement | null = null;\n #cachedRect: DOMRect | null = null;\n\n constructor(config: SparklersConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#emitRate = config.emitRate ?? 8;\n this.#maxSparks = config.maxSparks ?? 300;\n this.#speedRange = config.speed ?? [2, 8];\n this.#friction = config.friction ?? 0.96;\n this.#gravity = config.gravity ?? 0.8;\n this.#decayRange = config.decay ?? [0.02, 0.05];\n this.#trailLength = config.trailLength ?? 3;\n this.#hoverMode = config.hoverMode ?? false;\n\n const colors = config.colors ?? DEFAULT_COLORS;\n this.#colorRGBs = colors.map(c => hexToRGB(c));\n\n this.#onMouseMoveBound = this.#onMouseMove.bind(this);\n this.#onMouseLeaveBound = this.#onMouseLeave.bind(this);\n }\n\n moveTo(x: number, y: number): void {\n this.#emitX = x;\n this.#emitY = y;\n }\n\n onMount(canvas: HTMLCanvasElement): void {\n this.#mountedCanvas = canvas;\n this.#cachedRect = canvas.getBoundingClientRect();\n\n if (this.#hoverMode) {\n canvas.addEventListener('mousemove', this.#onMouseMoveBound, {passive: true});\n canvas.addEventListener('mouseleave', this.#onMouseLeaveBound, {passive: true});\n }\n }\n\n onUnmount(canvas: HTMLCanvasElement): void {\n canvas.removeEventListener('mousemove', this.#onMouseMoveBound);\n canvas.removeEventListener('mouseleave', this.#onMouseLeaveBound);\n this.#mountedCanvas = null;\n this.#cachedRect = null;\n }\n\n onResize(): void {\n if (this.#mountedCanvas) {\n this.#cachedRect = this.#mountedCanvas.getBoundingClientRect();\n }\n }\n\n configure(config: Partial<SparklersConfig>): void {\n if (config.scale !== undefined) {\n this.#scale = config.scale;\n }\n if (config.emitRate !== undefined) {\n this.#emitRate = config.emitRate;\n }\n if (config.friction !== undefined) {\n this.#friction = config.friction;\n }\n if (config.gravity !== undefined) {\n this.#gravity = config.gravity;\n }\n if (config.trailLength !== undefined) {\n this.#trailLength = config.trailLength;\n }\n if (config.hoverMode !== undefined) {\n this.#hoverMode = config.hoverMode;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n if (!this.#hoverMode || this.#mouseOnCanvas) {\n const emitCount = Math.min(this.#emitRate, this.#maxSparks - this.#sparks.length);\n\n for (let i = 0; i < emitCount; i++) {\n this.#sparks.push(this.#createSpark(width, height));\n }\n }\n\n const frictionFactor = Math.pow(this.#friction, dt);\n let alive = 0;\n\n for (let i = 0; i < this.#sparks.length; i++) {\n const spark = this.#sparks[i];\n\n spark.trail.push({x: spark.x, y: spark.y});\n\n if (spark.trail.length > this.#trailLength) {\n spark.trail.shift();\n }\n\n spark.vx *= frictionFactor;\n spark.vy *= frictionFactor;\n spark.vy += this.#gravity * this.#scale * dt;\n\n spark.x += spark.vx * dt;\n spark.y += spark.vy * dt;\n\n spark.alpha -= spark.decay * dt;\n\n if (spark.alpha > 0) {\n this.#sparks[alive++] = spark;\n }\n }\n\n this.#sparks.length = alive;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n ctx.globalCompositeOperation = 'lighter';\n\n if (!this.#hoverMode || this.#mouseOnCanvas) {\n const cx = this.#emitX * width;\n const cy = this.#emitY * height;\n const glowRadius = 15 * this.#scale;\n const glow = ctx.createRadialGradient(cx, cy, 0, cx, cy, glowRadius);\n glow.addColorStop(0, 'rgba(255, 220, 100, 0.8)');\n glow.addColorStop(0.3, 'rgba(255, 180, 50, 0.3)');\n glow.addColorStop(1, 'rgba(255, 150, 0, 0)');\n ctx.fillStyle = glow;\n ctx.beginPath();\n ctx.arc(cx, cy, glowRadius, 0, Math.PI * 2);\n ctx.fill();\n }\n\n for (const spark of this.#sparks) {\n const [r, g, b] = spark.color;\n\n for (let t = 0; t < spark.trail.length; t++) {\n const trailAlpha = spark.alpha * (t / spark.trail.length) * 0.5;\n\n if (trailAlpha < 0.01) {\n continue;\n }\n\n const trailSize = spark.size * (t / spark.trail.length) * this.#scale;\n\n ctx.beginPath();\n ctx.arc(spark.trail[t].x, spark.trail[t].y, trailSize, 0, Math.PI * 2);\n ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${trailAlpha})`;\n ctx.fill();\n }\n\n ctx.beginPath();\n ctx.arc(spark.x, spark.y, spark.size * this.#scale, 0, Math.PI * 2);\n ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${spark.alpha})`;\n ctx.fill();\n }\n\n ctx.globalCompositeOperation = 'source-over';\n }\n\n #onMouseMove(evt: MouseEvent): void {\n const rect = this.#cachedRect ?? (evt.currentTarget as HTMLCanvasElement).getBoundingClientRect();\n this.#emitX = (evt.clientX - rect.left) / rect.width;\n this.#emitY = (evt.clientY - rect.top) / rect.height;\n this.#mouseOnCanvas = true;\n }\n\n #onMouseLeave(): void {\n this.#mouseOnCanvas = false;\n }\n\n #createSpark(width: number, height: number): SparklerSpark {\n const angle = MULBERRY.next() * Math.PI * 2;\n const speed = this.#speedRange[0] + MULBERRY.next() * (this.#speedRange[1] - this.#speedRange[0]);\n const colorIndex = Math.floor(MULBERRY.next() * this.#colorRGBs.length);\n\n return {\n x: this.#emitX * width,\n y: this.#emitY * height,\n vx: Math.cos(angle) * speed * this.#scale,\n vy: Math.sin(angle) * speed * this.#scale,\n alpha: 0.8 + MULBERRY.next() * 0.2,\n color: this.#colorRGBs[colorIndex],\n size: 1 + MULBERRY.next() * 2,\n decay: this.#decayRange[0] + MULBERRY.next() * (this.#decayRange[1] - this.#decayRange[0]),\n trail: []\n };\n }\n}\n","import type { Point } from '../point';\n\nexport interface SparklerParticleConfig {\n readonly decay?: number;\n readonly friction?: number;\n readonly gravity?: number;\n readonly scale?: number;\n readonly size?: number;\n readonly trailLength?: number;\n}\n\nexport class SparklerParticle {\n readonly #color: [number, number, number];\n readonly #decay: number;\n readonly #friction: number;\n readonly #gravity: number;\n readonly #scale: number;\n readonly #size: number;\n readonly #trailLength: number;\n readonly #trail: Point[] = [];\n #x: number;\n #y: number;\n #vx: number;\n #vy: number;\n #alpha: number = 1;\n\n get isDead(): boolean {\n return this.#alpha <= 0;\n }\n\n get position(): Point {\n return {x: this.#x, y: this.#y};\n }\n\n constructor(position: Point, velocity: Point, color: [number, number, number], config: SparklerParticleConfig = {}) {\n this.#x = position.x;\n this.#y = position.y;\n this.#vx = velocity.x;\n this.#vy = velocity.y;\n this.#color = color;\n this.#decay = config.decay ?? (0.02 + Math.random() * 0.03);\n this.#friction = config.friction ?? 0.96;\n this.#gravity = config.gravity ?? 0.8;\n this.#scale = config.scale ?? 1;\n this.#size = config.size ?? (1 + Math.random() * 2);\n this.#trailLength = config.trailLength ?? 3;\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n const [r, g, b] = this.#color;\n\n for (let t = 0; t < this.#trail.length; t++) {\n const trailAlpha = this.#alpha * (t / this.#trail.length) * 0.5;\n\n if (trailAlpha < 0.01) {\n continue;\n }\n\n const trailSize = this.#size * (t / this.#trail.length) * this.#scale;\n\n ctx.beginPath();\n ctx.arc(this.#trail[t].x, this.#trail[t].y, trailSize, 0, Math.PI * 2);\n ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${trailAlpha})`;\n ctx.fill();\n }\n\n ctx.beginPath();\n ctx.arc(this.#x, this.#y, this.#size * this.#scale, 0, Math.PI * 2);\n ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${this.#alpha})`;\n ctx.fill();\n }\n\n tick(dt: number = 1): void {\n this.#trail.push({x: this.#x, y: this.#y});\n\n if (this.#trail.length > this.#trailLength) {\n this.#trail.shift();\n }\n\n this.#vx *= Math.pow(this.#friction, dt);\n this.#vy *= Math.pow(this.#friction, dt);\n this.#vy += this.#gravity * this.#scale * dt;\n\n this.#x += this.#vx * dt;\n this.#y += this.#vy * dt;\n\n this.#alpha -= this.#decay * dt;\n }\n}\n","import { Sparklers } from './layer';\nimport type { SparklersConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport interface SparklersInstance extends Effect<SparklersConfig> {\n moveTo(x: number, y: number): void;\n}\n\nexport function createSparklers(config?: SparklersConfig): SparklersInstance {\n return new Sparklers(config) as SparklersInstance;\n}\n\nexport { SparklerParticle } from './particle';\nexport type { SparklersConfig };\nexport type { SparklerParticleConfig } from './particle';\nexport type { SparklerSpark } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { ShootingStarSystem } from '../shooting-stars';\nimport { MULBERRY } from './consts';\nimport type { Star, StarMode } from './types';\n\nexport interface StarsConfig {\n readonly mode?: StarMode;\n readonly starCount?: number;\n readonly shootingInterval?: [number, number];\n readonly shootingSpeed?: number;\n readonly twinkleSpeed?: number;\n readonly color?: string;\n readonly shootingColor?: string;\n readonly trailLength?: number;\n readonly scale?: number;\n}\n\nexport class Stars extends Effect<StarsConfig> {\n readonly #mode: StarMode;\n #twinkleSpeed: number;\n readonly #colorRGB: [number, number, number];\n #scale: number;\n readonly #shootingStarSystem: ShootingStarSystem | null;\n #starCount: number;\n #time: number = 0;\n #stars: Star[] = [];\n\n constructor(config: StarsConfig = {}) {\n super();\n\n this.#mode = config.mode ?? 'both';\n this.#starCount = config.starCount ?? 150;\n this.#twinkleSpeed = config.twinkleSpeed ?? 1;\n this.#scale = config.scale ?? 1;\n\n this.#colorRGB = hexToRGB(config.color ?? '#ffffff');\n\n const shootingColorRGB = hexToRGB(config.shootingColor ?? '#ffffff');\n const enableShooting = this.#mode === 'shooting' || this.#mode === 'both';\n\n this.#shootingStarSystem = enableShooting\n ? new ShootingStarSystem(\n {\n interval: config.shootingInterval ?? [120, 360],\n color: shootingColorRGB,\n trailLength: config.trailLength ?? 15,\n trailAlphaFactor: 0.6,\n speed: config.shootingSpeed ?? 1,\n scale: this.#scale,\n alphaMin: 0.8,\n alphaRange: 0.2,\n decayMin: 0.01,\n decayRange: 0.015\n },\n () => MULBERRY.next()\n )\n : null;\n\n if (this.#mode === 'sky' || this.#mode === 'both') {\n for (let i = 0; i < this.#starCount; ++i) {\n this.#stars.push(this.#createStar());\n }\n }\n }\n\n configure(config: Partial<StarsConfig>): void {\n if (config.twinkleSpeed !== undefined) {\n this.#twinkleSpeed = config.twinkleSpeed;\n }\n if (config.scale !== undefined) {\n this.#scale = config.scale;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#time += 0.02 * dt;\n this.#shootingStarSystem?.tick(dt, width, height);\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const [sr, sg, sb] = this.#colorRGB;\n\n // Background stars\n if (this.#mode === 'sky' || this.#mode === 'both') {\n ctx.globalCompositeOperation = 'source-over';\n\n for (const star of this.#stars) {\n const px = star.x * width;\n const py = star.y * height;\n const alpha = star.brightness * (0.3 + 0.7 * (0.5 + 0.5 * Math.sin(this.#time * star.twinkleSpeed * this.#twinkleSpeed + star.twinklePhase)));\n const size = star.size * this.#scale;\n\n ctx.globalAlpha = alpha;\n\n // Star dot\n ctx.beginPath();\n ctx.arc(px, py, size, 0, Math.PI * 2);\n ctx.fillStyle = `rgb(${sr}, ${sg}, ${sb})`;\n ctx.fill();\n\n // Cross sparkle for larger stars\n if (star.size > 1.5) {\n const sparkleLength = size * 3;\n const sparkleAlpha = alpha * 0.4;\n ctx.globalAlpha = sparkleAlpha;\n ctx.strokeStyle = `rgb(${sr}, ${sg}, ${sb})`;\n ctx.lineWidth = 0.5;\n\n ctx.beginPath();\n ctx.moveTo(px - sparkleLength, py);\n ctx.lineTo(px + sparkleLength, py);\n ctx.stroke();\n\n ctx.beginPath();\n ctx.moveTo(px, py - sparkleLength);\n ctx.lineTo(px, py + sparkleLength);\n ctx.stroke();\n }\n }\n }\n\n // Shooting stars\n this.#shootingStarSystem?.draw(ctx);\n\n ctx.globalAlpha = 1;\n }\n\n #createStar(): Star {\n return {\n x: MULBERRY.next(),\n y: MULBERRY.next(),\n size: 0.5 + MULBERRY.next() * 2,\n twinklePhase: MULBERRY.next() * Math.PI * 2,\n twinkleSpeed: 0.5 + MULBERRY.next() * 2,\n brightness: 0.3 + MULBERRY.next() * 0.7\n };\n }\n}\n","import { Stars } from './layer';\nimport type { StarsConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createStars(config?: StarsConfig): Effect<StarsConfig> {\n return new Stars(config);\n}\n\nexport type { StarsConfig };\nexport type { Star, StarMode, ShootingStar } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n\nexport const STREAMER_COLORS: string[] = [\n '#ff6b6b', // red\n '#ffd93d', // yellow\n '#6bcb77', // green\n '#4d96ff', // blue\n '#ff6bb5', // pink\n '#845ec2', // purple\n '#ff9671', // coral\n '#00c9a7' // teal\n];\n","import { Effect } from '../effect';\nimport { MULBERRY, STREAMER_COLORS } from './consts';\nimport type { Streamer } from './types';\n\nexport interface StreamersConfig {\n readonly count?: number;\n readonly colors?: string[];\n readonly speed?: number;\n readonly scale?: number;\n}\n\nexport class Streamers extends Effect<StreamersConfig> {\n readonly #colors: string[];\n readonly #scale: number;\n #speed: number;\n #count: number;\n #streamers: Streamer[] = [];\n #width: number = 960;\n #height: number = 540;\n #initialized: boolean = false;\n\n constructor(config: StreamersConfig = {}) {\n super();\n\n this.#colors = config.colors ?? STREAMER_COLORS;\n this.#scale = config.scale ?? 1;\n this.#speed = config.speed ?? 1;\n this.#count = config.count ?? 20;\n\n if (innerWidth < 991) {\n this.#count = Math.floor(this.#count / 2);\n }\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n if (!this.#initialized) {\n this.#initialized = true;\n this.#streamers = [];\n\n for (let i = 0; i < this.#count; i++) {\n this.#streamers.push(this.#createStreamer(true));\n }\n }\n }\n\n configure(config: Partial<StreamersConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n let alive = 0;\n\n for (let i = 0; i < this.#streamers.length; i++) {\n const streamer = this.#streamers[i];\n\n streamer.y += streamer.fallSpeed * this.#speed * dt;\n streamer.swayPhase += streamer.swaySpeed * dt;\n\n const swayOffset = Math.sin(streamer.swayPhase) * streamer.swayAmplitude;\n streamer.x += swayOffset * dt * 0.3;\n\n this.#updateSegments(streamer, dt);\n\n const tail = streamer.segments[streamer.segments.length - 1];\n const tailY = tail ? tail.y : streamer.y;\n\n if (tailY > height + 50) {\n this.#streamers[alive++] = this.#createStreamer(false);\n } else {\n this.#streamers[alive++] = streamer;\n }\n }\n\n this.#streamers.length = alive;\n\n while (this.#streamers.length < this.#count) {\n this.#streamers.push(this.#createStreamer(false));\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n for (const streamer of this.#streamers) {\n this.#drawStreamer(ctx, streamer);\n }\n }\n\n #createStreamer(initialSpread: boolean): Streamer {\n const scale = this.#scale;\n const segmentCount = 12 + Math.floor(MULBERRY.next() * 8);\n const length = (80 + MULBERRY.next() * 120) * scale;\n const width = (3 + MULBERRY.next() * 5) * scale;\n const startX = MULBERRY.next() * this.#width;\n const startY = initialSpread\n ? MULBERRY.next() * this.#height\n : -(MULBERRY.next() * 100 + length);\n const depth = 0.4 + MULBERRY.next() * 0.6;\n const curl = (0.3 + MULBERRY.next() * 0.7) * scale;\n const fallSpeed = (1.5 + MULBERRY.next() * 2.5) * depth * scale;\n const swayAmplitude = (0.3 + MULBERRY.next() * 0.6) * scale;\n const swaySpeed = 0.02 + MULBERRY.next() * 0.04;\n const swayPhase = MULBERRY.next() * Math.PI * 2;\n const color = this.#colors[Math.floor(MULBERRY.next() * this.#colors.length)];\n\n const segments: { x: number; y: number }[] = [];\n const segmentLength = length / segmentCount;\n\n for (let i = 0; i < segmentCount; i++) {\n segments.push({\n x: startX + Math.sin(i * curl * 0.5) * curl * 8,\n y: startY - i * segmentLength\n });\n }\n\n return {\n x: startX,\n y: startY,\n length,\n width,\n segments,\n fallSpeed,\n swayPhase,\n swaySpeed,\n swayAmplitude,\n color,\n curl,\n depth\n };\n }\n\n #updateSegments(streamer: Streamer, dt: number): void {\n const segments = streamer.segments;\n\n if (segments.length === 0) {\n return;\n }\n\n segments[0].x = streamer.x;\n segments[0].y = streamer.y;\n\n const segmentLength = streamer.length / segments.length;\n\n for (let i = 1; i < segments.length; i++) {\n const prev = segments[i - 1];\n const curr = segments[i];\n\n const curlOffset = Math.sin(streamer.swayPhase + i * streamer.curl * 0.8) * streamer.curl * 6;\n\n const targetX = prev.x + curlOffset;\n const targetY = prev.y - segmentLength;\n\n const follow = 0.08 * dt;\n curr.x += (targetX - curr.x) * follow;\n curr.y += (targetY - curr.y) * follow;\n\n const dx = curr.x - prev.x;\n const dy = curr.y - prev.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n if (dist > segmentLength * 1.5) {\n const nx = dx / dist;\n const ny = dy / dist;\n curr.x = prev.x + nx * segmentLength * 1.5;\n curr.y = prev.y + ny * segmentLength * 1.5;\n }\n }\n }\n\n #drawStreamer(ctx: CanvasRenderingContext2D, streamer: Streamer): void {\n const segments = streamer.segments;\n\n if (segments.length < 2) {\n return;\n }\n\n const alpha = 0.6 + streamer.depth * 0.4;\n const maxWidth = streamer.width * streamer.depth;\n const last = segments[segments.length - 1];\n\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n\n ctx.beginPath();\n ctx.moveTo(segments[0].x, segments[0].y);\n\n for (let i = 1; i < segments.length - 1; i++) {\n const curr = segments[i];\n const next = segments[i + 1];\n const midX = (curr.x + next.x) / 2;\n const midY = (curr.y + next.y) / 2;\n\n ctx.quadraticCurveTo(curr.x, curr.y, midX, midY);\n }\n\n ctx.lineTo(last.x, last.y);\n\n const gradient = ctx.createLinearGradient(\n segments[0].x, segments[0].y,\n last.x, last.y\n );\n gradient.addColorStop(0, this.#adjustAlpha(streamer.color, alpha * 0.3));\n gradient.addColorStop(0.3, this.#adjustAlpha(streamer.color, alpha));\n gradient.addColorStop(0.7, this.#adjustAlpha(streamer.color, alpha));\n gradient.addColorStop(1, this.#adjustAlpha(streamer.color, alpha * 0.1));\n\n ctx.strokeStyle = gradient;\n ctx.lineWidth = maxWidth;\n ctx.stroke();\n }\n\n #adjustAlpha(color: string, alpha: number): string {\n const clampedAlpha = Math.max(0, Math.min(1, alpha));\n return color + Math.round(clampedAlpha * 255).toString(16).padStart(2, '0');\n }\n}\n","import { Streamers } from './layer';\nimport type { StreamersConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createStreamers(config?: StreamersConfig): Effect<StreamersConfig> {\n return new Streamers(config);\n}\n\nexport type { StreamersConfig };\nexport type { Streamer } from './types';\n","import { distance } from './distance';\nimport { Spark } from './fireworks/spark';\nimport type { Point } from './point';\n\nexport interface TrailConfig {\n readonly acceleration?: number;\n readonly brightness?: number;\n readonly glow?: number;\n readonly hue?: number;\n readonly length?: number;\n readonly speed?: number;\n readonly width?: number;\n}\n\nexport class Trail {\n readonly #startPosition: Point;\n readonly #position: Point;\n readonly #angle: number;\n readonly #totalDistance: number;\n readonly #trail: Point[];\n readonly #acceleration: number;\n readonly #brightness: number;\n readonly #glow: number;\n readonly #hue: number;\n readonly #width: number;\n #speed: number;\n #distanceTraveled: number = 0;\n #isDone: boolean = false;\n #sparkTimer: number = 0;\n #pendingSparks: Spark[] = [];\n\n get hue(): number {\n return this.#hue;\n }\n\n get isDone(): boolean {\n return this.#isDone;\n }\n\n get position(): Point {\n return {...this.#position};\n }\n\n collectSparks(): Spark[] {\n const sparks = this.#pendingSparks;\n this.#pendingSparks = [];\n return sparks;\n }\n\n constructor(start: Point, end: Point, config: TrailConfig = {}) {\n this.#startPosition = {...start};\n this.#position = {...start};\n this.#angle = Math.atan2(end.y - start.y, end.x - start.x);\n this.#totalDistance = distance(start, end);\n this.#acceleration = config.acceleration ?? 1.05;\n this.#brightness = config.brightness ?? 65;\n this.#glow = config.glow ?? 10;\n this.#hue = config.hue ?? Math.random() * 360;\n this.#speed = config.speed ?? 1;\n this.#width = config.width ?? 2;\n\n const length = config.length ?? 6;\n this.#trail = Array.from({length}, () => ({...start}));\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n if (this.#isDone) {\n return;\n }\n\n ctx.save();\n ctx.lineCap = 'round';\n\n for (let i = this.#trail.length - 1; i > 0; i--) {\n const progress = i / this.#trail.length;\n const alpha = (1 - progress) * 0.8;\n const width = this.#width * (1 - progress * 0.5);\n\n ctx.beginPath();\n ctx.moveTo(this.#trail[i].x, this.#trail[i].y);\n ctx.lineTo(this.#trail[i - 1].x, this.#trail[i - 1].y);\n ctx.lineWidth = width;\n ctx.strokeStyle = `hsla(${this.#hue}, 100%, ${this.#brightness}%, ${alpha})`;\n ctx.stroke();\n }\n\n ctx.shadowBlur = this.#glow;\n ctx.shadowColor = `hsl(${this.#hue}, 100%, 60%)`;\n\n ctx.beginPath();\n ctx.moveTo(this.#trail[0].x, this.#trail[0].y);\n ctx.lineTo(this.#position.x, this.#position.y);\n ctx.lineWidth = this.#width;\n ctx.strokeStyle = `hsl(${this.#hue}, 100%, ${this.#brightness}%)`;\n ctx.stroke();\n\n ctx.shadowBlur = this.#glow * 1.5;\n ctx.shadowColor = `hsl(${this.#hue}, 80%, 80%)`;\n ctx.beginPath();\n ctx.arc(this.#position.x, this.#position.y, this.#width * 0.6, 0, Math.PI * 2);\n ctx.fillStyle = `hsl(${this.#hue}, 20%, 92%)`;\n ctx.fill();\n\n ctx.restore();\n }\n\n tick(dt: number = 1): void {\n if (this.#isDone) {\n return;\n }\n\n this.#trail.pop();\n this.#trail.unshift({...this.#position});\n\n this.#speed *= Math.pow(this.#acceleration, dt);\n\n const vx = Math.cos(this.#angle) * this.#speed;\n const vy = Math.sin(this.#angle) * this.#speed;\n\n this.#distanceTraveled = distance(this.#startPosition, {\n x: this.#position.x + vx * dt,\n y: this.#position.y + vy * dt\n });\n\n if (this.#distanceTraveled >= this.#totalDistance) {\n this.#isDone = true;\n return;\n }\n\n this.#position.x += vx * dt;\n this.#position.y += vy * dt;\n\n this.#sparkTimer += dt;\n\n if (this.#sparkTimer >= 3) {\n this.#sparkTimer -= 3;\n this.#pendingSparks.push(new Spark(this.#position, this.#hue, -vx * 0.1, -vy * 0.1));\n }\n }\n}\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { Wave } from './types';\n\nconst DEFAULT_COLORS = ['#0a3d6b', '#0e5a8a', '#1a7ab5', '#3399cc', '#66c2e0'];\n\nexport interface WavesConfig {\n readonly layers?: number;\n readonly speed?: number;\n readonly colors?: string[];\n readonly foamColor?: string;\n readonly foamAmount?: number;\n readonly scale?: number;\n}\n\nexport class Waves extends Effect<WavesConfig> {\n #speed: number;\n #foamAmount: number;\n #scale: number;\n readonly #foamRGB: [number, number, number];\n #waves: Wave[] = [];\n #foamParticles: { x: number; y: number; alpha: number; size: number }[] = [];\n #maxFoamParticles: number;\n\n constructor(config: WavesConfig = {}) {\n super();\n\n const layers = config.layers ?? 5;\n const colors = config.colors ?? DEFAULT_COLORS;\n this.#speed = config.speed ?? 1;\n this.#foamAmount = config.foamAmount ?? 0.4;\n this.#scale = config.scale ?? 1;\n this.#maxFoamParticles = 120;\n this.#foamRGB = hexToRGB(config.foamColor ?? '#ffffff');\n\n if (innerWidth < 991) {\n this.#maxFoamParticles = Math.floor(this.#maxFoamParticles / 2);\n }\n\n for (let i = 0; i < layers; i++) {\n const depth = i / Math.max(layers - 1, 1);\n const color = colors[i % colors.length];\n\n this.#waves.push({\n amplitude: (20 + MULBERRY.next() * 30) * (1 - depth * 0.4),\n frequency: 0.005 + MULBERRY.next() * 0.008 + depth * 0.002,\n speed: 0.4 + MULBERRY.next() * 0.6 + depth * 0.3,\n phase: MULBERRY.next() * Math.PI * 2,\n baseY: 0.35 + depth * 0.13,\n color,\n foamThreshold: 0.6 + MULBERRY.next() * 0.3,\n rgb: hexToRGB(color)\n });\n }\n }\n\n configure(config: Partial<WavesConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.foamAmount !== undefined) {\n this.#foamAmount = config.foamAmount;\n }\n if (config.scale !== undefined) {\n this.#scale = config.scale;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n for (const wave of this.#waves) {\n wave.phase += 0.015 * wave.speed * this.#speed * dt;\n }\n\n let aliveFoam = 0;\n\n for (let i = 0; i < this.#foamParticles.length; i++) {\n const foam = this.#foamParticles[i];\n foam.alpha -= (0.008 + MULBERRY.next() * 0.006) * dt;\n foam.x += (MULBERRY.next() - 0.5) * 0.5 * dt;\n foam.y += (MULBERRY.next() - 0.5) * 0.3 * dt;\n\n if (foam.alpha > 0) {\n this.#foamParticles[aliveFoam++] = foam;\n }\n }\n\n this.#foamParticles.length = aliveFoam;\n\n if (this.#foamAmount > 0 && width > 0 && height > 0) {\n const spawnCount = Math.ceil(2 * this.#foamAmount * dt);\n\n for (let s = 0; s < spawnCount && this.#foamParticles.length < this.#maxFoamParticles; s++) {\n const waveIndex = Math.floor(MULBERRY.next() * this.#waves.length);\n const wave = this.#waves[waveIndex];\n const x = MULBERRY.next() * width;\n const centerY = wave.baseY * height;\n const primary = wave.amplitude * Math.sin(wave.frequency * x + wave.phase);\n const secondary = wave.amplitude * 0.4 * Math.sin(wave.frequency * 2.3 * x + wave.phase * 1.7 + 1.3);\n const waveY = centerY + (primary + secondary) * this.#scale;\n\n const slopeCheck = Math.cos(wave.frequency * x + wave.phase);\n\n if (slopeCheck > wave.foamThreshold - 1) {\n this.#foamParticles.push({\n x,\n y: waveY - MULBERRY.next() * 4 * this.#scale,\n alpha: 0.4 + MULBERRY.next() * 0.6,\n size: 1 + MULBERRY.next() * 3\n });\n }\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n const step = 2;\n\n for (let wi = 0; wi < this.#waves.length; wi++) {\n const wave = this.#waves[wi];\n const [wr, wg, wb] = wave.rgb;\n const centerY = wave.baseY * height;\n\n ctx.beginPath();\n ctx.moveTo(0, height);\n\n for (let x = 0; x <= width; x += step) {\n const primary = wave.amplitude * Math.sin(wave.frequency * x + wave.phase);\n const secondary = wave.amplitude * 0.4 * Math.sin(wave.frequency * 2.3 * x + wave.phase * 1.7 + 1.3);\n const tertiary = wave.amplitude * 0.15 * Math.sin(wave.frequency * 4.1 * x + wave.phase * 0.6 + 2.8);\n const waveY = centerY + (primary + secondary + tertiary) * this.#scale;\n\n ctx.lineTo(x, waveY);\n }\n\n ctx.lineTo(width, height);\n ctx.closePath();\n\n const gradient = ctx.createLinearGradient(0, centerY - wave.amplitude * this.#scale, 0, height);\n gradient.addColorStop(0, `rgba(${wr}, ${wg}, ${wb}, 0.85)`);\n gradient.addColorStop(0.4, `rgb(${wr}, ${wg}, ${wb})`);\n gradient.addColorStop(1, `rgb(${Math.floor(wr * 0.6)}, ${Math.floor(wg * 0.6)}, ${Math.floor(wb * 0.6)})`);\n\n ctx.fillStyle = gradient;\n ctx.fill();\n }\n\n if (this.#foamAmount > 0) {\n const [fr, fg, fb] = this.#foamRGB;\n\n for (const foam of this.#foamParticles) {\n if (foam.alpha <= 0) {\n continue;\n }\n\n ctx.beginPath();\n ctx.arc(foam.x, foam.y, foam.size * this.#scale, 0, Math.PI * 2);\n ctx.fillStyle = `rgba(${fr}, ${fg}, ${fb}, ${foam.alpha * this.#foamAmount})`;\n ctx.fill();\n }\n }\n }\n}\n","import { Waves } from './layer';\nimport type { WavesConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createWaves(config?: WavesConfig): Effect<WavesConfig> {\n return new Waves(config);\n}\n\nexport type { WavesConfig };\nexport type { Wave } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { WormholeDirection, WormholeParticle } from './types';\n\nexport interface WormholeConfig {\n readonly count?: number;\n readonly speed?: number;\n readonly color?: string;\n readonly direction?: WormholeDirection;\n readonly scale?: number;\n}\n\nexport class Wormhole extends Effect<WormholeConfig> {\n #speed: number;\n readonly #colorRGB: [number, number, number];\n readonly #direction: WormholeDirection;\n #scale: number;\n #count: number;\n #particles: WormholeParticle[] = [];\n #width: number = 960;\n #height: number = 540;\n #initialized: boolean = false;\n\n constructor(config: WormholeConfig = {}) {\n super();\n\n let count = config.count ?? 200;\n\n this.#speed = config.speed ?? 1;\n this.#colorRGB = hexToRGB(config.color ?? '#6699ff');\n this.#direction = config.direction ?? 'inward';\n this.#scale = config.scale ?? 1;\n\n if (innerWidth < 991) {\n count = Math.floor(count / 2);\n }\n\n this.#count = count;\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n if (!this.#initialized) {\n this.#initialized = true;\n this.#particles = [];\n\n for (let i = 0; i < this.#count; ++i) {\n this.#particles.push(this.#createParticle(true));\n }\n }\n }\n\n configure(config: Partial<WormholeConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.scale !== undefined) {\n this.#scale = config.scale;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n const maxRadius = Math.sqrt((width / 2) ** 2 + (height / 2) ** 2);\n\n let alive = 0;\n\n for (let i = 0; i < this.#particles.length; ++i) {\n const particle = this.#particles[i];\n\n if (this.#direction === 'inward') {\n const normalizedDistance = particle.distance / maxRadius;\n const acceleration = 1 + (1 - normalizedDistance) * 3;\n particle.distance -= particle.speed * this.#speed * acceleration * dt * this.#scale;\n\n particle.trail = 5 + (1 - normalizedDistance) * 25;\n\n if (particle.distance > 0) {\n this.#particles[alive++] = particle;\n } else {\n this.#particles[alive++] = this.#createParticle(false);\n }\n } else {\n const normalizedDistance = particle.distance / maxRadius;\n const acceleration = 1 + normalizedDistance * 3;\n particle.distance += particle.speed * this.#speed * acceleration * dt * this.#scale;\n\n particle.trail = 5 + normalizedDistance * 25;\n\n if (particle.distance < maxRadius + 20) {\n this.#particles[alive++] = particle;\n } else {\n this.#particles[alive++] = this.#createParticle(false);\n }\n }\n\n particle.angle += (MULBERRY.next() - 0.5) * 0.002 * dt;\n }\n\n this.#particles.length = alive;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const cx = width / 2;\n const cy = height / 2;\n const maxRadius = Math.sqrt(cx * cx + cy * cy);\n const [cr, cg, cb] = this.#colorRGB;\n\n\n const glowRadius = 40 * this.#scale;\n const glow = ctx.createRadialGradient(cx, cy, 0, cx, cy, glowRadius);\n glow.addColorStop(0, `rgba(${cr}, ${cg}, ${cb}, 0.25)`);\n glow.addColorStop(0.4, `rgba(${cr}, ${cg}, ${cb}, 0.08)`);\n glow.addColorStop(1, `rgba(${cr}, ${cg}, ${cb}, 0)`);\n\n ctx.globalCompositeOperation = 'lighter';\n ctx.globalAlpha = 1;\n ctx.beginPath();\n ctx.arc(cx, cy, glowRadius, 0, Math.PI * 2);\n ctx.fillStyle = glow;\n ctx.fill();\n\n for (const particle of this.#particles) {\n const normalizedDistance = particle.distance / maxRadius;\n const px = cx + Math.cos(particle.angle) * particle.distance;\n const py = cy + Math.sin(particle.angle) * particle.distance;\n\n const trailFactor = this.#direction === 'inward' ? 1 : -1;\n const trailLength = particle.trail * this.#scale;\n const tx = px + Math.cos(particle.angle) * trailLength * trailFactor;\n const ty = py + Math.sin(particle.angle) * trailLength * trailFactor;\n\n let intensity: number;\n\n if (this.#direction === 'inward') {\n intensity = particle.brightness * (1 - normalizedDistance);\n } else {\n intensity = particle.brightness * normalizedDistance;\n }\n\n const alpha = Math.max(0.05, Math.min(1, intensity));\n const lineWidth = Math.max(0.5, particle.size * this.#scale * (0.5 + intensity * 0.5));\n\n const gradient = ctx.createLinearGradient(px, py, tx, ty);\n gradient.addColorStop(0, `rgba(${cr}, ${cg}, ${cb}, ${alpha})`);\n gradient.addColorStop(1, `rgba(${cr}, ${cg}, ${cb}, 0)`);\n\n ctx.globalAlpha = 1;\n ctx.beginPath();\n ctx.moveTo(px, py);\n ctx.lineTo(tx, ty);\n ctx.strokeStyle = gradient;\n ctx.lineWidth = lineWidth;\n ctx.stroke();\n\n ctx.globalAlpha = alpha;\n ctx.beginPath();\n ctx.arc(px, py, lineWidth * 0.6, 0, Math.PI * 2);\n ctx.fillStyle = `rgb(${cr}, ${cg}, ${cb})`;\n ctx.fill();\n }\n\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = 1;\n }\n\n #createParticle(spread: boolean): WormholeParticle {\n const maxRadius = Math.sqrt((this.#width / 2) ** 2 + (this.#height / 2) ** 2);\n const angle = MULBERRY.next() * Math.PI * 2;\n\n let distance: number;\n\n if (this.#direction === 'inward') {\n distance = spread\n ? MULBERRY.next() * maxRadius\n : maxRadius * (0.8 + MULBERRY.next() * 0.2);\n } else {\n distance = spread\n ? MULBERRY.next() * maxRadius\n : MULBERRY.next() * maxRadius * 0.1;\n }\n\n return {\n angle,\n distance,\n speed: 0.5 + MULBERRY.next() * 1.5,\n size: 0.8 + MULBERRY.next() * 2.2,\n brightness: 0.4 + MULBERRY.next() * 0.6,\n trail: 5\n };\n }\n}\n","import { Wormhole } from './layer';\nimport type { WormholeConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createWormhole(config?: WormholeConfig): Effect<WormholeConfig> {\n return new Wormhole(config);\n}\n\nexport type { WormholeConfig };\nexport type { WormholeDirection, WormholeParticle } from './types';\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["#globalSpeed","#globalFrameRate","#showFps","#canvas","#context","#frameRate","#target","#delta","#then","#speed","#isStopped","#ticks","#height","#width","#current","#frame","#now","#fpsFrames","#fpsTime","#fps","#drawFps","#simulation","#contextOptions","#getOffscreenCtx","#offscreen","#offscreenCtx","#canvas","MULBERRY","DEFAULT_COLORS","#speed","#intensity","#waveAmplitude","#verticalPosition","#rgbToHue","#bands","MULBERRY","MULBERRY","DEFAULT_COLORS","#scale","#sizeRange","#colorRGBs","#maxCount","#speed","#driftAmount","#stringLengthMul","#balloons","#createBalloon","#time","MULBERRY","#color","#driftAmp","#driftFreq","#driftPhase","#radiusX","#radiusY","#riseSpeed","#rotationSpeed","#scale","#stringLength","#y","#x","#rotation","#time","MULBERRY","#scale","#baseSize","#speed","#maxCount","#parseHex","#colorR","#colorG","#colorB","#width","#height","#initialized","#particles","#createParticle","MULBERRY","MULBERRY","MAX_SPEED","#scale","#colorR","#colorG","#colorB","#size","#count","#speed","#separation","#alignment","#cohesion","#width","#height","#initialized","#boids","#createBoid","MAX_SPEED","MULBERRY","MULBERRY","DEFAULT_COLORS","#scale","#sizeRange","#popOnClick","#popRadius","#baseHues","#onClickBound","#maxCount","#speed","#wobbleAmount","#colorToHue","#bubbles","#createBubble","#onClick","#canvas","#time","#popParticles","#createPopBurst","MULBERRY","MULBERRY","DEFAULT_COLORS","#scale","#speed","#count","#size","#butterflies","#createButterfly","#time","#drawButterfly","MULBERRY","#scale","#resolution","#colorR","#colorG","#colorB","#speed","#intensity","#time","#offscreen","#offscreenCtx","#imageData","MULBERRY","SPRITE_SIZE","#scale","#speed","#count","#opacity","#colorR","#colorG","#colorB","#sprites","#createSprites","#clouds","#createCloud","MULBERRY","DEFAULT_CONFIG","MULBERRY","TWO_PI","TWO_PI","#scale","#width","#height","DEFAULT_CONFIG","#createParticle","MULBERRY","#tickParticle","#particles","#isFiring","#colorStr","#gravity","#shape","#size","#totalTicks","#tick","#x","#y","MULBERRY","#vx","#vy","#decay","#flipAngle","#flipSpeed","#rotAngle","#rotCos","#rotSin","#rotSpeed","#swing","#swingAmp","#swingSpeed","MULBERRY","TWO_PI","SPRITE_SIZE","SPRITE_CENTER","SPRITE_RADIUS","#scale","#r","#g","#b","#lineWidth","#maxStars","#speed","#connectionDistance","#twinkleSpeed","#sprite","#createSprite","#width","#height","#stars","#createStar","#time","#recycleStar","MULBERRY","MULBERRY","DEFAULT_COLORS","#scale","#colors","#speed","#maxAnemones","#maxJellyfish","#maxBubbles","#width","#height","#anemones","#jellyfish","#bubbles","#createAnemone","#createJellyfish","#createBubble","#time","#drawAnemones","#drawJellyfish","#drawBubbles","MULBERRY","MULBERRY","TAU","#scale","#seedCount","#branchAngle","#maxDepth","#speed","#parseColor","#colorR","#colorG","#colorB","#width","#height","#seeds","#createSeed","#time","#tickBranches","#drawBranches","#drawSparkles","#spawnChildren","MULBERRY","MULBERRY","HEX_CHARS","#fontSize","#mode","#colorRGB","#scale","#speed","#maxColumns","#trailLength","#width","#height","#initialized","#columns","#respawnTimers","#createColumn","MULBERRY","#randomChar","HEX_CHARS","MULBERRY","#background","#collisionPadding","#colors","#count","#radiusRange","#rotationSpeedRange","#scale","#speedRange","#thickness","#onMouseMoveBound","#onMouseLeaveBound","#mouseAvoidance","#mouseAvoidanceRadius","#mouseAvoidanceStrength","#repulsionStrength","#onMouseMove","#onMouseLeave","#width","#height","#initialized","#donuts","#createNonOverlapping","#resolveCollisions","#mouseOnCanvas","#resolveMouseAvoidance","#updateDonut","#mouseX","#mouseY","#rand","MULBERRY","#createDonut","#overlapsAny","MULBERRY","SPRITE_SIZE","SPRITE_CENTER","SPRITE_RADIUS","#scale","#size","#maxCount","#speed","#glowSpeed","#parseColor","#sprite","#createSprite","#fireflies","#createFirefly","#time","MULBERRY","#sprite","#bounds","#glowSpeed","#size","#speed","#phase","#freqX1","#freqX2","#freqY1","#freqY2","#phaseX1","#phaseX2","#phaseY1","#phaseY2","#amplitudeX","#amplitudeY","#x","#y","#time","MULBERRY","#scale","#maxEmbers","#flameWidth","#flameHeight","#intensity","#flameLayers","MULBERRY","#time","#embers","#createEmber","#drawFlames","#drawEmbers","MULBERRY","#position","#angle","#brightness","#config","#decay","#hue","#lineWidth","#shape","#trail","#type","#alpha","MULBERRY","#speed","#vz","#hasCrackled","#hasSplit","#sparkleTimer","#depthScale","#drawShape","#z","#drawStarPath","#drawDiamondPath","#position","#velocity","#hue","#size","#decay","#friction","#gravity","#alpha","MULBERRY","#position","#startPosition","#acceleration","#angle","#baseSize","#brightness","MULBERRY","#distance","#hue","#tailWidth","#trail","#pendingSparks","#speed","#distanceTraveled","#sparkTimer","MULBERRY","#baseSize","#tailWidth","#autoSpawn","#variants","#scale","#width","#height","#hue","#spawnExplosion","#spawnTimer","#fireworks","#createFirework","#sparks","#explosions","#pickVariant","#positionRandom","MULBERRY","#scale","#scanlines","#noiseBlocks","#sliceDisplacement","#colorRGB","#intensity","#speed","#rgbSplit","#nextBurstIn","MULBERRY","#width","#height","#time","#slices","#blocks","#isBursting","#burstTimer","#createSlice","#createBlock","#burstDuration","MULBERRY","#scale","#size","#maxSettled","#colorRGBs","#maxCount","#speed","#groundLevel","#falling","#createFallingPiece","#time","#settleGlitter","#settled","#drawDiamond","MULBERRY","MULBERRY","DEFAULT_COLORS","#scale","#resolution","#speed","#blobs","MULBERRY","#offscreen","#offscreenCtx","#imageData","MULBERRY","#scale","#scanlineSpacing","#maxFragments","#colorRGB","#speed","#flickerIntensity","#nextDropout","MULBERRY","#width","#height","#initialized","#fragments","#createFragment","#time","#scanOffset","#flickerAlpha","#dropoutTimer","#scanBarActive","#scanBarY","#scanBarSpeed","MULBERRY","#scale","#speed","#maxCount","#parseHex","#colorR","#colorG","#colorB","#width","#height","#initialized","#stars","#createStar","MULBERRY","MULBERRY","DEFAULT_COLORS","#resolution","#layerCount","#colorRGBs","#speed","#scale","DEFAULT_COLORS","#centers","#time","#offscreen","#offscreenCtx","#imageData","MULBERRY","DEFAULT_COLORS","#segments","#speed","#shapeCount","#colors","DEFAULT_COLORS","#scale","#sourceRadius","#sourceCanvas","#sourceCtx","#initialized","#shapes","#createShape","#time","MULBERRY","MULBERRY","#scale","#size","#colorRGBs","#maxCount","#speed","#lanterns","#createLantern","#time","#sortDirty","#sortedLanterns","MULBERRY","MULBERRY","DEFAULT_COLORS","SPRITE_SIZE","SPRITE_CENTER","SPRITE_RADIUS","#scale","#speed","#count","#colors","#sprites","#createSprites","#blobs","#createBlob","#time","MULBERRY","MULBERRY","#scale","#size","#colors","#maxCount","#speed","#wind","#sprites","#createSprites","#leaves","#createLeaf","#height","#time","MULBERRY","#createLeafSprite","#drawOvalLeaf","#drawMapleLeaf","#drawPointedLeaf","MULBERRY","#frequency","#colorR","#colorG","#colorB","#enableBranches","#enableFlash","#scale","#groundLevel","#rng","#flashAlpha","#cooldown","#nextCooldown","#bolts","#createBolt","#drawSegments","#createBranch","#system","#enableFlash","MULBERRY","MULBERRY","#scale","#fontSize","#colorRGB","#maxColumns","#speed","#trailLength","#width","#height","#initialized","#columns","#respawnTimers","#createColumn","MULBERRY","MULBERRY","#scale","#color","#speed","#cohesion","#alignment","#separation","#turnRadius","#maxCount","#width","#height","#gridCols","#birds","#createBird","#time","#buildGrid","#grid","MULBERRY","MULBERRY","DEFAULT_COLORS","#scale","#speed","#colors","#maxStars","#initBlobs","#initStars","#time","#blobs","#colorWithAlpha","#stars","MULBERRY","MULBERRY","DEFAULT_COLORS","#scale","#colors","#count","#speed","#flicker","DEFAULT_COLORS","#initialized","#tubes","#createTube","#time","MULBERRY","#drawTubeShape","MULBERRY","#centerCount","#orbitersPerCenter","#colors","#speed","#trailLength","#showCenters","#scale","#initialized","#centers","#orbiters","MULBERRY","#createOrbiter","#time","MULBERRY","#background","#colorRGB","#lineColorRGB","#sizeRange","#speedRange","#onMouseMoveBound","#onMouseLeaveBound","#scale","#maxCount","#connectionDistance","#lineWidth","#mouseMode","#mouseRadius","#mouseStrength","#particleForces","#glow","#cellSize","#onMouseMove","#onMouseLeave","#width","#height","#initialized","#particles","#createParticle","#grid","#mouseOnCanvas","#mouseX","#mouseY","MULBERRY","MULBERRY","#scale","#size","#colors","#maxCount","#speed","#wind","#sprites","#createSprites","#petals","#createPetal","#time","MULBERRY","#createPetalSprite","#resolution","#palette","#speed","#scale","#time","#offscreen","#offscreenCtx","#imageData","MULBERRY","SPRITE_SIZE","SPRITE_CENTER","SPRITE_RADIUS","#scale","#size","#glowSize","#maxCount","#speed","#wind","#parseColor","#sprite","#createSprite","#width","#height","#particles","#createParticle","MULBERRY","#time","MULBERRY","#scale","#maxCount","#bounciness","#colorRGB","#speed","#gravity","#popRate","#spawnAccumulator","#kernels","#createKernel","#drawUnpopped","#drawPopped","MULBERRY","MULBERRY","#size","#colorRGB","#secondaryRGB","#direction","#speed","#scale","#count","#width","#height","#initialized","#particles","#createParticle","#time","MULBERRY","MULBERRY","#scale","#dotSize","#r","#g","#b","#spacing","#speed","#waveCount","#waveSpeed","#width","#height","#buildGrid","#waves","#spawnTimer","#spawnWave","#gridCount","#gridX","#gridY","MULBERRY","MULBERRY","#scale","#groundLevel","#colorR","#colorG","#colorB","#maxDrops","#speed","#wind","#enableSplashes","#drops","#createDrop","#createSplashBurst","#splashes","MULBERRY","#color","#depth","#length","#groundY","#scale","#opacity","#vx","#vy","#y","#x","#gravity","#size","#alpha","MULBERRY","#scale","#colorR","#colorG","#colorB","#branchProbability","#maxSegments","#count","#speed","#width","#height","#initialized","#systems","#createSystem","#growSystem","#resetSystem","#drawSystem","MULBERRY","MULBERRY","#scale","#colorR","#colorG","#colorB","#hazeOpacity","#maxCount","#wind","#turbulence","#parseColor","#grains","#createGrain","#time","MULBERRY","#layers","#contextOptions","#getOffscreenCtx","#offscreen","#offscreenCtx","#frameRate","#defaultOptions","#runner","#interval","#color","#trailLength","#trailAlphaFactor","#speed","#scale","#alphaMin","#alphaRange","#decayMin","#decayRange","#rng","#cooldown","#stars","#create","MULBERRY","SPRITE_SIZE","SPRITE_CENTER","SPRITE_RADIUS","#scale","#speed","#count","#spread","#colorR","#colorG","#colorB","#sprites","#createSprites","#particles","#createParticle","#time","MULBERRY","MULBERRY","#scale","#size","#baseOpacity","#maxParticles","#speed","#sprites","#createSprites","#snowflakes","#createSnowflake","#height","#ratio","#time","MULBERRY","#createCrystalSprite","MULBERRY","DEFAULT_COLORS","#maxSparks","#colorRGBs","#speedRange","#decayRange","#onMouseMoveBound","#onMouseLeaveBound","#scale","#emitRate","#friction","#gravity","#trailLength","#hoverMode","#onMouseMove","#onMouseLeave","#emitX","#emitY","#mountedCanvas","#cachedRect","#mouseOnCanvas","#sparks","#createSpark","MULBERRY","#color","#decay","#friction","#gravity","#scale","#size","#trailLength","#trail","#alpha","#x","#y","#vx","#vy","MULBERRY","#mode","#colorRGB","#shootingStarSystem","#starCount","#twinkleSpeed","#scale","MULBERRY","#stars","#createStar","#time","MULBERRY","#colors","#scale","#speed","#count","#width","#height","#initialized","#streamers","#createStreamer","#updateSegments","#drawStreamer","MULBERRY","#adjustAlpha","#resolution","#contourSpacing","#lineWidth","#colorR","#colorG","#colorB","#speed","#scale","#time","#offscreen","#offscreenCtx","#imageData","MULBERRY","#scale","#funnelWidth","#particleCount","#debrisCount","#speed","#intensity","#parseColor","#colorR","#colorG","#colorB","#particles","#createParticle","#debris","#createDebris","#time","MULBERRY","#getSway","#drawDustCloud","#startPosition","#position","#angle","#totalDistance","#trail","#acceleration","#brightness","#glow","#hue","#width","#isDone","#pendingSparks","#speed","#distanceTraveled","#sparkTimer","MULBERRY","DEFAULT_COLORS","#cellCount","#edgeWidth","#colorStrings","#edgeColor","#speed","#scale","#cells","MULBERRY","#clipPolygon","MULBERRY","#scale","#color","#smokeColor","#speed","#maxProjectiles","#maxEmbers","#intensity","#canvasWidth","#canvasHeight","#time","#countByType","MULBERRY","#particles","#createLava","#createEmber","#createSmoke","#drawGlow","#drawSmoke","#drawLavaAndEmbers","MULBERRY","#foamRGB","#speed","#foamAmount","#scale","#maxFoamParticles","#waves","MULBERRY","#foamParticles","#colorRGB","#direction","#speed","#scale","#count","#width","#height","#initialized","#particles","#createParticle"],"sources":["../src/canvas.ts","../src/fade.ts","../src/simulation-canvas.ts","../src/effect.ts","../src/aurora/consts.ts","../src/aurora/layer.ts","../src/aurora/index.ts","../src/balloons/consts.ts","../src/balloons/layer.ts","../src/balloons/particle.ts","../src/balloons/index.ts","../src/black-hole/consts.ts","../src/black-hole/layer.ts","../src/black-hole/index.ts","../src/color.ts","../src/boids/consts.ts","../src/boids/layer.ts","../src/boids/index.ts","../src/bubbles/consts.ts","../src/bubbles/layer.ts","../src/bubbles/index.ts","../src/butterflies/consts.ts","../src/butterflies/layer.ts","../src/butterflies/index.ts","../src/caustics/layer.ts","../src/caustics/index.ts","../src/clouds/consts.ts","../src/clouds/layer.ts","../src/clouds/index.ts","../src/confetti/consts.ts","../src/confetti/shapes.ts","../src/confetti/layer.ts","../src/confetti/particle.ts","../src/confetti/index.ts","../src/constellation/consts.ts","../src/constellation/layer.ts","../src/constellation/index.ts","../src/coral-reef/consts.ts","../src/coral-reef/layer.ts","../src/coral-reef/index.ts","../src/crystallization/consts.ts","../src/crystallization/layer.ts","../src/crystallization/index.ts","../src/digital-rain/consts.ts","../src/digital-rain/layer.ts","../src/digital-rain/index.ts","../src/donuts/consts.ts","../src/donuts/layer.ts","../src/donuts/index.ts","../src/fireflies/consts.ts","../src/fireflies/layer.ts","../src/fireflies/particle.ts","../src/fireflies/index.ts","../src/firepit/consts.ts","../src/firepit/layer.ts","../src/firepit/index.ts","../src/fireworks/consts.ts","../src/fireworks/types.ts","../src/fireworks/explosion.ts","../src/fireworks/create-explosion.ts","../src/distance.ts","../src/fireworks/spark.ts","../src/fireworks/firework.ts","../src/fireworks/layer.ts","../src/fireworks/index.ts","../src/glitch/consts.ts","../src/glitch/layer.ts","../src/glitch/index.ts","../src/glitter/consts.ts","../src/glitter/layer.ts","../src/glitter/index.ts","../src/gradient-flow/consts.ts","../src/gradient-flow/layer.ts","../src/gradient-flow/index.ts","../src/hologram/consts.ts","../src/hologram/layer.ts","../src/hologram/index.ts","../src/hyper-space/consts.ts","../src/hyper-space/layer.ts","../src/hyper-space/index.ts","../src/interference/consts.ts","../src/interference/layer.ts","../src/interference/index.ts","../src/kaleidoscope/consts.ts","../src/kaleidoscope/layer.ts","../src/kaleidoscope/index.ts","../src/lanterns/consts.ts","../src/lanterns/layer.ts","../src/lanterns/index.ts","../src/lava/consts.ts","../src/lava/layer.ts","../src/lava/index.ts","../src/leaves/consts.ts","../src/leaves/layer.ts","../src/leaves/index.ts","../src/lightning/consts.ts","../src/lightning/system.ts","../src/lightning/layer.ts","../src/lightning/index.ts","../src/matrix/consts.ts","../src/matrix/layer.ts","../src/matrix/index.ts","../src/murmuration/consts.ts","../src/murmuration/layer.ts","../src/murmuration/index.ts","../src/nebula/consts.ts","../src/nebula/layer.ts","../src/nebula/index.ts","../src/neon/consts.ts","../src/neon/layer.ts","../src/neon/index.ts","../src/orbits/consts.ts","../src/orbits/layer.ts","../src/orbits/index.ts","../src/particles/consts.ts","../src/particles/layer.ts","../src/particles/index.ts","../src/petals/consts.ts","../src/petals/layer.ts","../src/petals/index.ts","../src/plasma/layer.ts","../src/plasma/index.ts","../src/pollen/consts.ts","../src/pollen/layer.ts","../src/pollen/index.ts","../src/popcorn/consts.ts","../src/popcorn/layer.ts","../src/popcorn/index.ts","../src/portal/consts.ts","../src/portal/layer.ts","../src/portal/index.ts","../src/pulse-grid/consts.ts","../src/pulse-grid/layer.ts","../src/pulse-grid/index.ts","../src/rain/consts.ts","../src/rain/layer.ts","../src/rain/particle.ts","../src/rain/index.ts","../src/roots/consts.ts","../src/roots/layer.ts","../src/roots/index.ts","../src/sandstorm/consts.ts","../src/sandstorm/layer.ts","../src/sandstorm/index.ts","../src/scene.ts","../src/shooting-stars/system.ts","../src/smoke/consts.ts","../src/smoke/layer.ts","../src/smoke/index.ts","../src/snow/consts.ts","../src/snow/layer.ts","../src/snow/index.ts","../src/sparklers/consts.ts","../src/sparklers/layer.ts","../src/sparklers/particle.ts","../src/sparklers/index.ts","../src/stars/consts.ts","../src/stars/layer.ts","../src/stars/index.ts","../src/streamers/consts.ts","../src/streamers/layer.ts","../src/streamers/index.ts","../src/topography/layer.ts","../src/topography/index.ts","../src/tornado/consts.ts","../src/tornado/layer.ts","../src/tornado/index.ts","../src/trail.ts","../src/voronoi/consts.ts","../src/voronoi/layer.ts","../src/voronoi/index.ts","../src/volcano/consts.ts","../src/volcano/layer.ts","../src/volcano/index.ts","../src/waves/consts.ts","../src/waves/layer.ts","../src/waves/index.ts","../src/wormhole/consts.ts","../src/wormhole/layer.ts","../src/wormhole/index.ts"],"sourcesContent":["export class LimitedFrameRateCanvas {\n static #globalSpeed: number = 1;\n static #globalFrameRate: number | null = null;\n static #showFps: boolean = false;\n\n static get globalSpeed(): number {\n return LimitedFrameRateCanvas.#globalSpeed;\n }\n\n static set globalSpeed(value: number) {\n LimitedFrameRateCanvas.#globalSpeed = value;\n }\n\n /**\n * Global frame rate override for all canvas instances.\n * null = use each instance's own frame rate.\n * 0 = unlimited (render as fast as the browser allows).\n * Any positive number = cap at that many frames per second.\n */\n static get globalFrameRate(): number | null {\n return LimitedFrameRateCanvas.#globalFrameRate;\n }\n\n static set globalFrameRate(value: number | null) {\n LimitedFrameRateCanvas.#globalFrameRate = value;\n }\n\n static get showFps(): boolean {\n return LimitedFrameRateCanvas.#showFps;\n }\n\n static set showFps(value: boolean) {\n LimitedFrameRateCanvas.#showFps = value;\n }\n\n readonly #canvas: HTMLCanvasElement;\n readonly #context: CanvasRenderingContext2D;\n readonly #frameRate: number;\n readonly #target: number;\n #current: number = 0;\n #delta: number = 0;\n #frame: number = 0;\n #now: number = 0;\n #speed: number = 1;\n #then: number = 0;\n #ticks: number = 0;\n #isStopped: boolean = true;\n #height: number = 540;\n #width: number = 960;\n #fps: string = '0.0';\n #fpsFrames: number = 0;\n #fpsTime: number = 0;\n\n get canvas(): HTMLCanvasElement {\n return this.#canvas;\n }\n\n get context(): CanvasRenderingContext2D {\n return this.#context;\n }\n\n get delta(): number {\n return this.#delta;\n }\n\n get deltaFactor(): number {\n return this.#then === 0 ? 1 : (this.#target / this.#delta) * this.#speed * LimitedFrameRateCanvas.#globalSpeed;\n }\n\n get speed(): number {\n return this.#speed;\n }\n\n set speed(value: number) {\n this.#speed = value;\n }\n\n get dpr(): number {\n return devicePixelRatio;\n }\n\n get frameRate(): number {\n return this.#frameRate;\n }\n\n get isSmall(): boolean {\n return innerWidth < 991; // dirty little fix :-)\n }\n\n get isTicking(): boolean {\n return !this.#isStopped;\n }\n\n get ticks(): number {\n return this.#ticks;\n }\n\n get height(): number {\n return this.#height;\n }\n\n get width(): number {\n return this.#width;\n }\n\n constructor(canvas: HTMLCanvasElement, frameRate: number, options: CanvasRenderingContext2DSettings = {colorSpace: 'display-p3'}) {\n this.#canvas = canvas;\n this.#context = canvas.getContext('2d', options);\n this.#frameRate = frameRate;\n this.#target = frameRate > 0 ? 1000 / frameRate : 0;\n\n this.onVisibilityChange = this.onVisibilityChange.bind(this);\n this.onResize = this.onResize.bind(this);\n\n document.addEventListener('visibilitychange', this.onVisibilityChange, {passive: true});\n window.addEventListener('resize', this.onResize, {passive: true});\n }\n\n loop(): void {\n if (this.#isStopped) {\n return;\n }\n\n this.#current = Date.now();\n this.#frame = requestAnimationFrame(this.loop.bind(this));\n\n const globalRate = LimitedFrameRateCanvas.#globalFrameRate;\n const effectiveTarget = globalRate !== null ? (globalRate > 0 ? 1000 / globalRate : 0) : this.#target;\n\n if (effectiveTarget > 0 && this.#then > 0 && this.#current - this.#then + 1 < effectiveTarget) {\n return;\n }\n\n this.#now = this.#current;\n this.#delta = this.#now - this.#then;\n\n ++this.#ticks;\n\n this.tick();\n this.draw();\n\n if (LimitedFrameRateCanvas.#showFps) {\n ++this.#fpsFrames;\n\n if (this.#fpsTime === 0) {\n this.#fpsTime = this.#current;\n } else {\n const elapsed = this.#current - this.#fpsTime;\n\n if (elapsed >= 1000) {\n this.#fps = (Math.round(this.#fpsFrames * 10000 / elapsed) / 10).toFixed(1);\n this.#fpsFrames = 0;\n this.#fpsTime = this.#current;\n }\n }\n\n this.#drawFps();\n }\n\n this.#then = this.#now;\n }\n\n start(): void {\n this.onResize();\n\n this.#isStopped = false;\n this.#frame = requestAnimationFrame(this.loop.bind(this));\n }\n\n stop(): void {\n this.#isStopped = true;\n cancelAnimationFrame(this.#frame);\n }\n\n pause(): void {\n this.#isStopped = true;\n cancelAnimationFrame(this.#frame);\n }\n\n resume(): void {\n if (this.#isStopped) {\n this.#isStopped = false;\n this.#frame = requestAnimationFrame(this.loop.bind(this));\n }\n }\n\n #drawFps(): void {\n const ctx = this.#context;\n const text = `${this.#fps} FPS`;\n const x = 9;\n const y = 9;\n const paddingX = 6;\n const paddingY = 4;\n\n ctx.save();\n ctx.font = '700 10px ui-monospace, monospace';\n\n const textWidth = ctx.measureText(text).width;\n const boxWidth = textWidth + paddingX * 2;\n const boxHeight = 11 + paddingY * 2;\n\n ctx.fillStyle = 'rgba(0, 0, 0, 0.45)';\n ctx.beginPath();\n ctx.roundRect(x, y, boxWidth, boxHeight, 3);\n ctx.fill();\n\n ctx.fillStyle = 'rgba(255, 255, 255, 0.8)';\n ctx.textBaseline = 'middle';\n ctx.fillText(text, x + paddingX, y + boxHeight / 1.9);\n ctx.restore();\n }\n\n draw(): void {\n throw new Error('LimitedFrameRateCanvas::draw() should be overwritten.');\n }\n\n tick(): void {\n throw new Error('LimitedFrameRateCanvas::tick() should be overwritten.');\n }\n\n destroy(): void {\n this.stop();\n document.removeEventListener('visibilitychange', this.onVisibilityChange);\n window.removeEventListener('resize', this.onResize);\n }\n\n onResize(): void {\n const {width, height} = this.#canvas.getBoundingClientRect();\n this.#height = height;\n this.#width = width;\n }\n\n onVisibilityChange(): void {\n cancelAnimationFrame(this.#frame);\n\n if (document.visibilityState === 'visible') {\n this.#then = 0;\n this.start();\n } else {\n this.#then = 0;\n this.stop();\n }\n }\n}\n","import type { EdgeFade, EdgeFadeSide } from './layer';\n\nfunction parseSide(side: EdgeFadeSide): [number, number] {\n return typeof side === 'number' ? [0, side] : side;\n}\n\nexport function applyEdgeFade(ctx: CanvasRenderingContext2D, width: number, height: number, fade: EdgeFade): void {\n ctx.globalCompositeOperation = 'destination-out';\n\n if (fade.top !== undefined) {\n const [near, far] = parseSide(fade.top);\n const nearPx = near * height;\n const farPx = far * height;\n\n if (nearPx > 0) {\n ctx.fillStyle = 'rgba(0,0,0,1)';\n ctx.fillRect(0, 0, width, nearPx);\n }\n\n if (farPx > nearPx) {\n const gradient = ctx.createLinearGradient(0, nearPx, 0, farPx);\n gradient.addColorStop(0, 'rgba(0,0,0,1)');\n gradient.addColorStop(1, 'rgba(0,0,0,0)');\n ctx.fillStyle = gradient;\n ctx.fillRect(0, nearPx, width, farPx - nearPx);\n }\n }\n\n if (fade.bottom !== undefined) {\n const [near, far] = parseSide(fade.bottom);\n const nearPx = near * height;\n const farPx = far * height;\n\n if (nearPx > 0) {\n ctx.fillStyle = 'rgba(0,0,0,1)';\n ctx.fillRect(0, height - nearPx, width, nearPx);\n }\n\n if (farPx > nearPx) {\n const gradient = ctx.createLinearGradient(0, height - farPx, 0, height - nearPx);\n gradient.addColorStop(0, 'rgba(0,0,0,0)');\n gradient.addColorStop(1, 'rgba(0,0,0,1)');\n ctx.fillStyle = gradient;\n ctx.fillRect(0, height - farPx, width, farPx - nearPx);\n }\n }\n\n if (fade.left !== undefined) {\n const [near, far] = parseSide(fade.left);\n const nearPx = near * width;\n const farPx = far * width;\n\n if (nearPx > 0) {\n ctx.fillStyle = 'rgba(0,0,0,1)';\n ctx.fillRect(0, 0, nearPx, height);\n }\n\n if (farPx > nearPx) {\n const gradient = ctx.createLinearGradient(nearPx, 0, farPx, 0);\n gradient.addColorStop(0, 'rgba(0,0,0,1)');\n gradient.addColorStop(1, 'rgba(0,0,0,0)');\n ctx.fillStyle = gradient;\n ctx.fillRect(nearPx, 0, farPx - nearPx, height);\n }\n }\n\n if (fade.right !== undefined) {\n const [near, far] = parseSide(fade.right);\n const nearPx = near * width;\n const farPx = far * width;\n\n if (nearPx > 0) {\n ctx.fillStyle = 'rgba(0,0,0,1)';\n ctx.fillRect(width - nearPx, 0, nearPx, height);\n }\n\n if (farPx > nearPx) {\n const gradient = ctx.createLinearGradient(width - farPx, 0, width - nearPx, 0);\n gradient.addColorStop(0, 'rgba(0,0,0,0)');\n gradient.addColorStop(1, 'rgba(0,0,0,1)');\n ctx.fillStyle = gradient;\n ctx.fillRect(width - farPx, 0, farPx - nearPx, height);\n }\n }\n\n ctx.globalCompositeOperation = 'source-over';\n}\n","import { LimitedFrameRateCanvas } from './canvas';\nimport { applyEdgeFade } from './fade';\nimport type { EdgeFade, SimulationLayer } from './layer';\n\nexport class SimulationCanvas extends LimitedFrameRateCanvas {\n readonly #simulation: SimulationLayer;\n readonly #contextOptions: CanvasRenderingContext2DSettings;\n #offscreen: HTMLCanvasElement | null = null;\n #offscreenCtx: CanvasRenderingContext2D | null = null;\n\n constructor(canvas: HTMLCanvasElement, simulation: SimulationLayer, frameRate: number = 60, options: CanvasRenderingContext2DSettings = {colorSpace: 'display-p3'}) {\n super(canvas, frameRate, options);\n this.#simulation = simulation;\n this.#contextOptions = options;\n\n canvas.style.position = 'absolute';\n canvas.style.top = '0';\n canvas.style.left = '0';\n canvas.style.height = '100%';\n canvas.style.width = '100%';\n }\n\n withFade(fade: EdgeFade): this {\n this.#simulation.fade = fade;\n return this;\n }\n\n start(): void {\n this.#simulation.onMount(this.canvas);\n super.start();\n }\n\n destroy(): void {\n this.#simulation.onUnmount(this.canvas);\n super.destroy();\n }\n\n draw(): void {\n const dpr = this.dpr;\n this.canvas.height = this.height * dpr;\n this.canvas.width = this.width * dpr;\n\n const ctx = this.context;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n\n if (this.#simulation.fade) {\n const offCtx = this.#getOffscreenCtx(this.width * dpr, this.height * dpr);\n offCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n offCtx.clearRect(0, 0, this.width, this.height);\n this.#simulation.draw(offCtx, this.width, this.height);\n applyEdgeFade(offCtx, this.width, this.height, this.#simulation.fade);\n ctx.drawImage(this.#offscreen!, 0, 0, this.width, this.height);\n } else {\n ctx.save();\n this.#simulation.draw(ctx, this.width, this.height);\n ctx.restore();\n }\n }\n\n tick(): void {\n const dt = (this.delta > 0 && this.delta < 200 ? this.delta / (1000 / 60) : 1) * this.speed * LimitedFrameRateCanvas.globalSpeed;\n this.#simulation.tick(dt, this.width, this.height);\n }\n\n onResize(): void {\n super.onResize();\n\n if (this.#offscreen) {\n this.#offscreen.width = this.width * this.dpr;\n this.#offscreen.height = this.height * this.dpr;\n }\n\n this.#simulation.onResize(this.width, this.height);\n }\n\n #getOffscreenCtx(width: number, height: number): CanvasRenderingContext2D {\n if (!this.#offscreen) {\n this.#offscreen = document.createElement('canvas');\n this.#offscreen.width = width;\n this.#offscreen.height = height;\n this.#offscreenCtx = this.#offscreen.getContext('2d', this.#contextOptions)!;\n }\n\n return this.#offscreenCtx!;\n }\n}\n","import { SimulationCanvas } from './simulation-canvas';\nimport type { EdgeFade, EdgeFadeSide, SimulationLayer } from './layer';\n\nexport type { EdgeFade, EdgeFadeSide };\n\n/**\n * Base class for all visual effects. Implements the internal SimulationLayer interface\n * so that effects can be used both standalone (via mount()) and composed in a Scene.\n *\n * @example Standalone usage\n * const snow = new Snow({ particles: 200 });\n * snow.mount(canvas).start();\n *\n * @example Scene composition\n * const scene = new Scene()\n * .mount(canvas)\n * .layer(new Aurora())\n * .layer(new Snow())\n * .start();\n */\nexport abstract class Effect<TConfig = Record<string, unknown>> implements SimulationLayer {\n #canvas: SimulationCanvas | null = null;\n fade: EdgeFade | null = null;\n\n abstract tick(dt: number, width: number, height: number): void;\n\n abstract draw(ctx: CanvasRenderingContext2D, width: number, height: number): void;\n\n configure(_config: Partial<TConfig>): void {\n }\n\n onResize(_width: number, _height: number): void {\n }\n\n onMount(_canvas: HTMLCanvasElement): void {\n }\n\n onUnmount(_canvas: HTMLCanvasElement): void {\n }\n\n /**\n * Apply an edge fade mask when rendering this effect standalone or in a Scene.\n */\n withFade(fade: EdgeFade): this {\n this.fade = fade;\n return this;\n }\n\n /**\n * Mount this effect to a canvas element or CSS selector, creating the render loop.\n * Must be called before start().\n */\n mount(canvas: HTMLCanvasElement | string, options: CanvasRenderingContext2DSettings = {colorSpace: 'display-p3'}, frameRate: number = 60): this {\n if (typeof canvas === 'string') {\n const el = document.querySelector<HTMLCanvasElement>(canvas);\n\n if (!el) {\n throw new Error(`Effect.mount(): no element found for selector \"${canvas}\".`);\n }\n\n canvas = el;\n }\n\n this.#canvas = new SimulationCanvas(canvas, this as unknown as SimulationLayer, frameRate, options);\n return this;\n }\n\n /**\n * Remove this effect from its canvas and clean up the render loop.\n */\n unmount(): this {\n this.#canvas?.destroy();\n this.#canvas = null;\n return this;\n }\n\n /**\n * Start the render loop. Call mount() first.\n */\n start(): this {\n this.#canvas?.start();\n return this;\n }\n\n /**\n * Pause rendering without destroying state. Use resume() to continue.\n */\n pause(): this {\n this.#canvas?.pause();\n return this;\n }\n\n /**\n * Resume rendering after a pause().\n */\n resume(): this {\n this.#canvas?.resume();\n return this;\n }\n\n /**\n * Stop rendering and call onUnmount(). Safe to call multiple times.\n */\n destroy(): void {\n this.unmount();\n }\n}\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { AuroraBand } from './types';\n\nconst DEFAULT_COLORS = ['#9922ff', '#4455ff', '#0077ee', '#00aabb', '#22ddff'];\nconst TOP_HUE = 265;\n\nexport interface AuroraConfig {\n readonly bands?: number;\n readonly colors?: string[];\n readonly speed?: number;\n readonly intensity?: number;\n readonly waveAmplitude?: number;\n readonly verticalPosition?: number;\n readonly scale?: number;\n}\n\nexport class Aurora extends Effect<AuroraConfig> {\n #speed: number;\n #intensity: number;\n #waveAmplitude: number;\n #verticalPosition: number;\n #bands: AuroraBand[] = [];\n\n constructor(config: AuroraConfig = {}) {\n super();\n\n const bandCount = config.bands ?? 5;\n const colors = config.colors ?? DEFAULT_COLORS;\n this.#speed = config.speed ?? 1;\n this.#intensity = config.intensity ?? 0.8;\n this.#waveAmplitude = config.waveAmplitude ?? 1;\n this.#verticalPosition = config.verticalPosition ?? 0.68;\n\n // Two loose clusters (left + right), rays within each cluster overlap into a whole\n const clusterCenters = [0.35, 0.65];\n\n for (let i = 0; i < bandCount; i++) {\n const color = colors[i % colors.length];\n const [r, g, b] = hexToRGB(color);\n const hue = this.#rgbToHue(r, g, b);\n const cluster = clusterCenters[i % clusterCenters.length];\n\n this.#bands.push({\n x: cluster + (MULBERRY.next() - 0.5) * 0.22,\n baseY: (MULBERRY.next() - 0.5) * 0.08,\n height: 0.5 + MULBERRY.next() * 0.3,\n sigma: 160 + MULBERRY.next() * 110,\n phase1: MULBERRY.next() * Math.PI * 2,\n phase2: MULBERRY.next() * Math.PI * 2,\n amplitude1: 0.015 + MULBERRY.next() * 0.025,\n frequency1: 0.003 + MULBERRY.next() * 0.004,\n speed: 0.4 + MULBERRY.next() * 0.6,\n hue,\n opacity: 0.5 + MULBERRY.next() * 0.3\n });\n }\n }\n\n configure(config: Partial<AuroraConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.intensity !== undefined) {\n this.#intensity = config.intensity;\n }\n if (config.waveAmplitude !== undefined) {\n this.#waveAmplitude = config.waveAmplitude;\n }\n if (config.verticalPosition !== undefined) {\n this.#verticalPosition = config.verticalPosition;\n }\n }\n\n tick(dt: number, _width: number, _height: number): void {\n for (const band of this.#bands) {\n band.phase1 += 0.005 * band.speed * this.#speed * dt;\n band.phase2 += 0.008 * band.speed * this.#speed * dt;\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n // Dark sky background gradient\n const bg = ctx.createLinearGradient(0, 0, 0, height);\n bg.addColorStop(0, '#000000');\n bg.addColorStop(0.5, '#050012');\n bg.addColorStop(1, '#0a0025');\n ctx.fillStyle = bg;\n ctx.fillRect(0, 0, width, height);\n\n // Aurora curtain rays — vertical bands with Gaussian horizontal falloff\n ctx.globalCompositeOperation = 'screen';\n\n const step = 4;\n const scale = width / 1920;\n\n for (const band of this.#bands) {\n const swayX = band.amplitude1 * width * Math.sin(band.phase1);\n const cx = band.x * width + swayX;\n const baseY = (this.#verticalPosition + band.baseY) * height;\n const rayHeight = band.height * height * (height / 800);\n const sigma = band.sigma * scale;\n const cutoff = sigma * 3.5;\n const sigmaSq2 = 2 * sigma * sigma;\n const midHue = (band.hue + TOP_HUE) / 2;\n const waveRange = height * 0.035 * this.#waveAmplitude;\n\n const xStart = Math.max(0, Math.floor((cx - cutoff) / step) * step);\n const xEnd = Math.min(width, Math.ceil((cx + cutoff) / step) * step);\n\n const centreWave = Math.sin(band.frequency1 * cx + band.phase2) * waveRange;\n const centreBase = baseY + centreWave;\n const centreTop = centreBase - rayHeight;\n const centreFadeBottom = centreBase + rayHeight * 0.1;\n\n const gradient = ctx.createLinearGradient(0, centreFadeBottom, 0, centreTop);\n gradient.addColorStop(0, `hsla(${band.hue}, 100%, 90%, 0)`);\n gradient.addColorStop(0.04, `hsla(${band.hue}, 100%, 90%, 0.55)`);\n gradient.addColorStop(0.1, `hsla(${band.hue}, 90%, 72%, 1)`);\n gradient.addColorStop(0.32, `hsla(${band.hue}, 85%, 62%, 0.75)`);\n gradient.addColorStop(0.62, `hsla(${midHue}, 80%, 56%, 0.35)`);\n gradient.addColorStop(0.86, `hsla(${TOP_HUE}, 75%, 50%, 0.12)`);\n gradient.addColorStop(1, `hsla(${TOP_HUE}, 70%, 45%, 0)`);\n ctx.fillStyle = gradient;\n\n for (let x = xStart; x < xEnd; x += step) {\n const dx = x - cx;\n const alpha = Math.exp(-dx * dx / sigmaSq2);\n\n if (alpha < 0.015) {\n continue;\n }\n\n const waveOffset = Math.sin(band.frequency1 * x + band.phase2) * waveRange;\n const colBase = baseY + waveOffset;\n const colTop = colBase - rayHeight;\n const fadeBottom = colBase + rayHeight * 0.1;\n\n ctx.globalAlpha = alpha * band.opacity * this.#intensity;\n ctx.fillRect(x, colTop, step, fadeBottom - colTop + 1);\n }\n\n ctx.globalAlpha = 1;\n }\n\n ctx.globalCompositeOperation = 'source-over';\n }\n\n #rgbToHue(r: number, g: number, b: number): number {\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n\n if (delta === 0) {\n return 0;\n }\n\n let hue: number;\n\n if (max === r) {\n hue = ((g - b) / delta) % 6;\n } else if (max === g) {\n hue = (b - r) / delta + 2;\n } else {\n hue = (r - g) / delta + 4;\n }\n\n hue = Math.round(hue * 60);\n\n if (hue < 0) {\n hue += 360;\n }\n\n return hue;\n }\n}\n","import { Aurora } from './layer';\nimport type { AuroraConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createAurora(config?: AuroraConfig): Effect<AuroraConfig> {\n return new Aurora(config);\n}\n\nexport type { AuroraConfig };\nexport type { AuroraBand } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { Balloon } from './types';\n\nconst DEFAULT_COLORS = ['#ff4444', '#4488ff', '#44cc44', '#ffcc00', '#ff88cc', '#8844ff'];\n\nexport interface BalloonsConfig {\n readonly count?: number;\n readonly colors?: string[];\n readonly sizeRange?: [number, number];\n readonly speed?: number;\n readonly driftAmount?: number;\n readonly stringLength?: number;\n readonly scale?: number;\n}\n\nexport class Balloons extends Effect<BalloonsConfig> {\n readonly #scale: number;\n #speed: number;\n #driftAmount: number;\n #stringLengthMul: number;\n readonly #sizeRange: [number, number];\n readonly #colorRGBs: [number, number, number][];\n #maxCount: number;\n #time: number = 0;\n #balloons: Balloon[] = [];\n\n constructor(config: BalloonsConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxCount = config.count ?? 15;\n this.#sizeRange = config.sizeRange ?? [25, 45];\n this.#speed = config.speed ?? 1;\n this.#driftAmount = config.driftAmount ?? 1;\n this.#stringLengthMul = config.stringLength ?? 1;\n\n const colors = config.colors ?? DEFAULT_COLORS;\n this.#colorRGBs = colors.map(c => hexToRGB(c));\n\n if (innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n\n for (let i = 0; i < this.#maxCount; ++i) {\n this.#balloons.push(this.#createBalloon(true));\n }\n }\n\n configure(config: Partial<BalloonsConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.driftAmount !== undefined) {\n this.#driftAmount = config.driftAmount;\n }\n if (config.stringLength !== undefined) {\n this.#stringLengthMul = config.stringLength;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#time += 0.015 * dt * this.#speed;\n\n for (let i = 0; i < this.#balloons.length; i++) {\n const balloon = this.#balloons[i];\n\n balloon.y -= (balloon.riseSpeed * this.#speed * dt) / (height * 1.2);\n\n const drift = Math.sin(this.#time * balloon.driftFreq + balloon.driftPhase) * balloon.driftAmp * this.#driftAmount;\n balloon.x += drift * dt / (width * 5);\n\n balloon.rotation = Math.sin(this.#time * balloon.rotationSpeed + balloon.driftPhase) * 0.08;\n\n if (balloon.y < -0.2) {\n this.#balloons[i] = this.#createBalloon(false);\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n for (const balloon of this.#balloons) {\n const px = balloon.x * width;\n const py = balloon.y * height;\n const rx = balloon.radiusX * this.#scale;\n const ry = balloon.radiusY * this.#scale;\n const [r, g, b] = balloon.color;\n const cos = Math.cos(balloon.rotation);\n const sin = Math.sin(balloon.rotation);\n\n ctx.save();\n ctx.transform(cos, sin, -sin, cos, px, py);\n\n const gradient = ctx.createRadialGradient(\n -rx * 0.3, -ry * 0.3, rx * 0.1,\n 0, 0, Math.max(rx, ry)\n );\n gradient.addColorStop(0, `rgba(${Math.min(255, r + 80)}, ${Math.min(255, g + 80)}, ${Math.min(255, b + 80)}, 0.95)`);\n gradient.addColorStop(0.6, `rgba(${r}, ${g}, ${b}, 0.9)`);\n gradient.addColorStop(1, `rgba(${Math.max(0, r - 40)}, ${Math.max(0, g - 40)}, ${Math.max(0, b - 40)}, 0.85)`);\n\n ctx.beginPath();\n ctx.ellipse(0, 0, rx, ry, 0, 0, Math.PI * 2);\n ctx.fillStyle = gradient;\n ctx.fill();\n\n ctx.beginPath();\n ctx.ellipse(-rx * 0.25, -ry * 0.3, rx * 0.2, ry * 0.15, -0.3, 0, Math.PI * 2);\n ctx.fillStyle = `rgba(255, 255, 255, 0.35)`;\n ctx.fill();\n\n const knotY = ry + 2 * this.#scale;\n ctx.beginPath();\n ctx.moveTo(-3 * this.#scale, knotY);\n ctx.lineTo(0, knotY + 5 * this.#scale);\n ctx.lineTo(3 * this.#scale, knotY);\n ctx.closePath();\n ctx.fillStyle = `rgba(${Math.max(0, r - 30)}, ${Math.max(0, g - 30)}, ${Math.max(0, b - 30)}, 0.9)`;\n ctx.fill();\n\n const stringLen = balloon.stringLength * this.#scale * this.#stringLengthMul;\n const knotBaseY = knotY + 5 * this.#scale;\n const ph = balloon.driftPhase;\n const fr = balloon.driftFreq;\n const swingAmt = 10 * this.#scale * this.#driftAmount;\n\n // Each control point lags further behind the balloon's lateral oscillation,\n // so the string trails the direction of movement like a real hanging string.\n const midSwing = Math.sin(this.#time * fr + ph - 0.3) * swingAmt * 0.55;\n const tipSwing = Math.sin(this.#time * fr + ph - 0.8) * swingAmt;\n // Subtle high-frequency flutter at the tip for lightness.\n const flutter = Math.sin(this.#time * fr * 2.5 + ph * 1.4 + 1.8) * 2.5 * this.#scale;\n\n ctx.beginPath();\n ctx.moveTo(0, knotBaseY);\n ctx.bezierCurveTo(\n midSwing * 0.35, knotBaseY + stringLen * 0.3,\n midSwing + flutter * 0.5, knotBaseY + stringLen * 0.65,\n tipSwing + flutter, knotBaseY + stringLen\n );\n ctx.strokeStyle = `rgba(${r}, ${g}, ${b}, 0.4)`;\n ctx.lineWidth = 1;\n ctx.stroke();\n\n ctx.restore();\n }\n }\n\n #createBalloon(initialSpread: boolean): Balloon {\n const colorIndex = Math.floor(MULBERRY.next() * this.#colorRGBs.length);\n const baseRadius = this.#sizeRange[0] + MULBERRY.next() * (this.#sizeRange[1] - this.#sizeRange[0]);\n\n return {\n x: 0.1 + MULBERRY.next() * 0.8,\n y: initialSpread ? MULBERRY.next() * 1.2 : 1.2 + MULBERRY.next() * 0.2,\n radiusX: baseRadius * 0.85,\n radiusY: baseRadius,\n color: this.#colorRGBs[colorIndex],\n driftPhase: MULBERRY.next() * Math.PI * 2,\n driftFreq: 0.5 + MULBERRY.next() * 1,\n driftAmp: 0.3 + MULBERRY.next() * 0.7,\n riseSpeed: 0.3 + MULBERRY.next() * 0.7,\n rotation: 0,\n rotationSpeed: 0.5 + MULBERRY.next() * 1.5,\n stringLength: 30 + MULBERRY.next() * 40\n };\n }\n}\n","import type { Point } from '../point';\n\nexport interface BalloonParticleConfig {\n readonly driftAmp?: number;\n readonly driftFreq?: number;\n readonly driftPhase?: number;\n readonly radiusX?: number;\n readonly radiusY?: number;\n readonly riseSpeed?: number;\n readonly rotationSpeed?: number;\n readonly scale?: number;\n readonly stringLength?: number;\n}\n\nexport class BalloonParticle {\n readonly #color: [number, number, number];\n readonly #driftAmp: number;\n readonly #driftFreq: number;\n readonly #driftPhase: number;\n readonly #radiusX: number;\n readonly #radiusY: number;\n readonly #riseSpeed: number;\n readonly #rotationSpeed: number;\n readonly #scale: number;\n readonly #stringLength: number;\n #x: number;\n #y: number;\n #rotation: number = 0;\n #time: number = 0;\n\n get isDone(): boolean {\n return this.#y < -(this.#radiusY * 2 + this.#stringLength);\n }\n\n get position(): Point {\n return {x: this.#x, y: this.#y};\n }\n\n constructor(position: Point, color: [number, number, number], config: BalloonParticleConfig = {}) {\n this.#x = position.x;\n this.#y = position.y;\n this.#color = color;\n this.#driftAmp = config.driftAmp ?? (0.3 + Math.random() * 0.7);\n this.#driftFreq = config.driftFreq ?? (0.5 + Math.random() * 1);\n this.#driftPhase = config.driftPhase ?? (Math.random() * Math.PI * 2);\n this.#radiusX = (config.radiusX ?? (25 + Math.random() * 20)) * (config.scale ?? 1);\n this.#radiusY = (config.radiusY ?? (config.radiusX ? config.radiusX * (1 / 0.85) : 30 + Math.random() * 23)) * (config.scale ?? 1);\n this.#riseSpeed = config.riseSpeed ?? (0.5 + Math.random() * 0.8);\n this.#rotationSpeed = config.rotationSpeed ?? (0.5 + Math.random() * 1.5);\n this.#scale = config.scale ?? 1;\n this.#stringLength = (config.stringLength ?? (30 + Math.random() * 40)) * this.#scale;\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n const [r, g, b] = this.#color;\n const rx = this.#radiusX;\n const ry = this.#radiusY;\n\n ctx.save();\n ctx.translate(this.#x, this.#y);\n ctx.rotate(this.#rotation);\n\n const gradient = ctx.createRadialGradient(-rx * 0.3, -ry * 0.3, rx * 0.1, 0, 0, Math.max(rx, ry));\n gradient.addColorStop(0, `rgba(${Math.min(255, r + 80)}, ${Math.min(255, g + 80)}, ${Math.min(255, b + 80)}, 0.95)`);\n gradient.addColorStop(0.6, `rgba(${r}, ${g}, ${b}, 0.9)`);\n gradient.addColorStop(1, `rgba(${Math.max(0, r - 40)}, ${Math.max(0, g - 40)}, ${Math.max(0, b - 40)}, 0.85)`);\n\n ctx.beginPath();\n ctx.ellipse(0, 0, rx, ry, 0, 0, Math.PI * 2);\n ctx.fillStyle = gradient;\n ctx.fill();\n\n ctx.beginPath();\n ctx.ellipse(-rx * 0.25, -ry * 0.3, rx * 0.2, ry * 0.15, -0.3, 0, Math.PI * 2);\n ctx.fillStyle = 'rgba(255, 255, 255, 0.35)';\n ctx.fill();\n\n const knotY = ry + 2 * this.#scale;\n ctx.beginPath();\n ctx.moveTo(-3 * this.#scale, knotY);\n ctx.lineTo(0, knotY + 5 * this.#scale);\n ctx.lineTo(3 * this.#scale, knotY);\n ctx.closePath();\n ctx.fillStyle = `rgba(${Math.max(0, r - 30)}, ${Math.max(0, g - 30)}, ${Math.max(0, b - 30)}, 0.9)`;\n ctx.fill();\n\n const stringDrift = Math.sin(this.#time * 2 + this.#driftPhase) * 8 * this.#scale;\n ctx.beginPath();\n ctx.moveTo(0, knotY + 5 * this.#scale);\n ctx.quadraticCurveTo(\n stringDrift,\n knotY + 5 * this.#scale + this.#stringLength * 0.5,\n -stringDrift * 0.5,\n knotY + 5 * this.#scale + this.#stringLength\n );\n ctx.strokeStyle = `rgba(${r}, ${g}, ${b}, 0.4)`;\n ctx.lineWidth = 1;\n ctx.stroke();\n\n ctx.restore();\n }\n\n tick(dt: number = 1): void {\n this.#time += 0.015 * dt;\n\n this.#y -= this.#riseSpeed * dt;\n this.#x += Math.sin(this.#time * this.#driftFreq + this.#driftPhase) * this.#driftAmp * dt;\n this.#rotation = Math.sin(this.#time * this.#rotationSpeed + this.#driftPhase) * 0.08;\n }\n}\n","import { Balloons } from './layer';\nimport type { BalloonsConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createBalloons(config?: BalloonsConfig): Effect<BalloonsConfig> {\n return new Balloons(config);\n}\n\nexport { BalloonParticle } from './particle';\nexport type { BalloonsConfig };\nexport type { BalloonParticleConfig } from './particle';\nexport type { Balloon } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(23);\n","import { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { BlackHoleParticle } from './types';\n\nexport interface BlackHoleConfig {\n readonly count?: number;\n readonly speed?: number;\n readonly color?: string;\n readonly size?: number;\n readonly scale?: number;\n}\n\nexport class BlackHole extends Effect<BlackHoleConfig> {\n readonly #scale: number;\n #speed: number;\n #colorR: number;\n #colorG: number;\n #colorB: number;\n readonly #baseSize: number;\n #particles: BlackHoleParticle[] = [];\n #maxCount: number;\n #width: number = 960;\n #height: number = 540;\n #initialized: boolean = false;\n\n constructor(config: BlackHoleConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#speed = config.speed ?? 1;\n this.#baseSize = (config.size ?? 2) * this.#scale;\n this.#maxCount = config.count ?? 300;\n\n const parsed = this.#parseHex(config.color ?? '#6644ff');\n this.#colorR = parsed[0];\n this.#colorG = parsed[1];\n this.#colorB = parsed[2];\n\n if (typeof globalThis.innerWidth !== 'undefined' && globalThis.innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n }\n\n configure(config: Partial<BlackHoleConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n\n if (config.color !== undefined) {\n const parsed = this.#parseHex(config.color);\n this.#colorR = parsed[0];\n this.#colorG = parsed[1];\n this.#colorB = parsed[2];\n }\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n if (!this.#initialized && width > 0 && height > 0) {\n this.#initialized = true;\n this.#particles = [];\n\n for (let i = 0; i < this.#maxCount; ++i) {\n this.#particles.push(this.#createParticle(true));\n }\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n const maxRadius = Math.sqrt((width / 2) ** 2 + (height / 2) ** 2) * 0.9;\n const eventHorizon = 24 * this.#scale;\n\n for (let i = 0; i < this.#particles.length; ++i) {\n const particle = this.#particles[i];\n const normalizedRadius = particle.radius / maxRadius;\n\n particle.angle += particle.angularSpeed * this.#speed * (1 + (1 - normalizedRadius) * 4) * dt * 0.005;\n particle.radius -= particle.radialSpeed * this.#speed * (1 + (1 - normalizedRadius) * 3) * dt * 0.15;\n\n if (particle.radius <= eventHorizon) {\n this.#particles[i] = this.#createParticle(false);\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const cx = width / 2;\n const cy = height / 2;\n const maxRadius = Math.sqrt(cx * cx + cy * cy) * 0.9;\n const eventHorizon = 24 * this.#scale;\n const cr = this.#colorR;\n const cg = this.#colorG;\n const cb = this.#colorB;\n\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = 1;\n ctx.fillStyle = 'rgb(2, 0, 10)';\n ctx.fillRect(0, 0, width, height);\n\n const accretionRadius = eventHorizon * 6;\n const accretionGlow = ctx.createRadialGradient(cx, cy, eventHorizon * 0.5, cx, cy, accretionRadius);\n accretionGlow.addColorStop(0, `rgba(${cr}, ${cg}, ${cb}, 0.0)`);\n accretionGlow.addColorStop(0.4, `rgba(${cr}, ${cg}, ${cb}, 0.12)`);\n accretionGlow.addColorStop(0.7, `rgba(255, 200, 100, 0.08)`);\n accretionGlow.addColorStop(1, `rgba(${cr}, ${cg}, ${cb}, 0)`);\n\n ctx.globalCompositeOperation = 'lighter';\n ctx.globalAlpha = 1;\n ctx.beginPath();\n ctx.arc(cx, cy, accretionRadius, 0, Math.PI * 2);\n ctx.fillStyle = accretionGlow;\n ctx.fill();\n\n for (const particle of this.#particles) {\n const px = cx + Math.cos(particle.angle) * particle.radius;\n const py = cy + Math.sin(particle.angle) * particle.radius;\n\n const normalizedRadius = Math.max(0, Math.min(1, particle.radius / maxRadius));\n const proximity = 1 - normalizedRadius;\n\n const r = Math.round(cr + (255 - cr) * proximity * 0.8);\n const g = Math.round(cg + (255 - cg) * proximity * 0.5);\n const b = Math.round(cb + (255 - cb) * proximity * 0.3);\n\n const alpha = Math.max(0.05, Math.min(1, particle.brightness * (0.2 + proximity * 0.8)));\n const particleSize = Math.max(0.3, this.#baseSize * (0.4 + proximity * 0.6));\n\n ctx.globalAlpha = alpha;\n ctx.fillStyle = `rgb(${r}, ${g}, ${b})`;\n ctx.beginPath();\n ctx.arc(px, py, particleSize, 0, Math.PI * 2);\n ctx.fill();\n\n if (proximity > 0.6) {\n ctx.globalAlpha = alpha * 0.3;\n ctx.beginPath();\n ctx.arc(px, py, particleSize * 3, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = 1;\n\n const holeGrad = ctx.createRadialGradient(cx, cy, 0, cx, cy, eventHorizon);\n holeGrad.addColorStop(0, 'rgb(0, 0, 0)');\n holeGrad.addColorStop(0.7, 'rgb(0, 0, 0)');\n holeGrad.addColorStop(1, `rgba(${cr}, ${cg}, ${cb}, 0)`);\n\n ctx.fillStyle = holeGrad;\n ctx.beginPath();\n ctx.arc(cx, cy, eventHorizon, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.globalAlpha = 1;\n ctx.resetTransform();\n ctx.globalCompositeOperation = 'source-over';\n }\n\n #createParticle(spread: boolean): BlackHoleParticle {\n const maxRadius = Math.sqrt((this.#width / 2) ** 2 + (this.#height / 2) ** 2) * 0.9;\n const eventHorizon = 24 * this.#scale;\n\n const angle = MULBERRY.next() * Math.PI * 2;\n const radius = spread\n ? eventHorizon + MULBERRY.next() * (maxRadius - eventHorizon)\n : maxRadius * (0.75 + MULBERRY.next() * 0.25);\n\n return {\n angle,\n radius,\n angularSpeed: 0.4 + MULBERRY.next() * 1.2,\n radialSpeed: 0.3 + MULBERRY.next() * 0.8,\n size: 0.5 + MULBERRY.next() * 1.5,\n brightness: 0.4 + MULBERRY.next() * 0.6\n };\n }\n\n #parseHex(hex: string): [number, number, number] {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n\n if (!result) {\n return [102, 68, 255];\n }\n\n return [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)];\n }\n}\n","import { BlackHole } from './layer';\nimport type { BlackHoleConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createBlackHole(config?: BlackHoleConfig): Effect<BlackHoleConfig> {\n return new BlackHole(config);\n}\n\nexport type { BlackHoleConfig };\nexport type { BlackHoleParticle } from './types';\n","const cache = new Map<string, { r: number; g: number; b: number; a: number }>();\n\nexport function parseColor(fillStyle: string): { r: number; g: number; b: number; a: number } {\n const cached = cache.get(fillStyle);\n if (cached) {\n return cached;\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d')!;\n ctx.fillStyle = fillStyle;\n ctx.fillRect(0, 0, 1, 1);\n const data = ctx.getImageData(0, 0, 1, 1).data;\n const result = {r: data[0], g: data[1], b: data[2], a: data[3] / 255};\n cache.set(fillStyle, result);\n return result;\n}\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(59);\n\nexport const PERCEPTION_RADIUS = 80;\nexport const SEPARATION_RADIUS = 25;\nexport const MAX_SPEED = 2.5;\nexport const MAX_FORCE = 0.08;\n","import { parseColor } from '../color';\nimport { Effect } from '../effect';\nimport { MAX_FORCE, MAX_SPEED, MULBERRY, PERCEPTION_RADIUS, SEPARATION_RADIUS } from './consts';\nimport type { Boid } from './types';\n\nexport interface BoidsConfig {\n readonly count?: number;\n readonly speed?: number;\n readonly separation?: number;\n readonly alignment?: number;\n readonly cohesion?: number;\n readonly color?: string;\n readonly size?: number;\n readonly scale?: number;\n}\n\nexport class Boids extends Effect<BoidsConfig> {\n readonly #scale: number;\n #speed: number;\n #separation: number;\n #alignment: number;\n #cohesion: number;\n readonly #colorR: number;\n readonly #colorG: number;\n readonly #colorB: number;\n readonly #size: number;\n readonly #count: number;\n #boids: Boid[] = [];\n #width: number = 800;\n #height: number = 600;\n #initialized: boolean = false;\n\n constructor(config: BoidsConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#speed = config.speed ?? 1;\n this.#separation = config.separation ?? 1;\n this.#alignment = config.alignment ?? 1;\n this.#cohesion = config.cohesion ?? 1;\n this.#size = (config.size ?? 6) * this.#scale;\n this.#count = config.count ?? 80;\n\n const parsed = parseColor(config.color ?? '#44aaff');\n this.#colorR = parsed.r;\n this.#colorG = parsed.g;\n this.#colorB = parsed.b;\n }\n\n configure(config: Partial<BoidsConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.separation !== undefined) {\n this.#separation = config.separation;\n }\n if (config.alignment !== undefined) {\n this.#alignment = config.alignment;\n }\n if (config.cohesion !== undefined) {\n this.#cohesion = config.cohesion;\n }\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n if (!this.#initialized && width > 0 && height > 0) {\n this.#initialized = true;\n this.#boids = [];\n const count = innerWidth < 991 ? Math.floor(this.#count / 2) : this.#count;\n for (let i = 0; i < count; i++) {\n this.#boids.push(this.#createBoid());\n }\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n const cellSize = PERCEPTION_RADIUS;\n const grid = new Map<string, Boid[]>();\n\n for (const boid of this.#boids) {\n const cellX = Math.floor(boid.x / cellSize);\n const cellY = Math.floor(boid.y / cellSize);\n const key = `${cellX},${cellY}`;\n let cell = grid.get(key);\n if (!cell) {\n cell = [];\n grid.set(key, cell);\n }\n cell.push(boid);\n }\n\n const speedFactor = this.#speed * dt / 16;\n const maxSpeed = MAX_SPEED * this.#speed;\n const maxForce = MAX_FORCE * this.#speed;\n const perceptionR2 = PERCEPTION_RADIUS * PERCEPTION_RADIUS;\n const separationR2 = SEPARATION_RADIUS * SEPARATION_RADIUS;\n\n for (const boid of this.#boids) {\n const cellX = Math.floor(boid.x / cellSize);\n const cellY = Math.floor(boid.y / cellSize);\n\n let sepX = 0, sepY = 0, sepCount = 0;\n let alignVX = 0, alignVY = 0, alignCount = 0;\n let cohX = 0, cohY = 0, cohCount = 0;\n\n for (let dx = -1; dx <= 1; dx++) {\n for (let dy = -1; dy <= 1; dy++) {\n const neighbors = grid.get(`${cellX + dx},${cellY + dy}`);\n if (!neighbors) {\n continue;\n }\n\n for (const other of neighbors) {\n if (other === boid) {\n continue;\n }\n\n const diffX = boid.x - other.x;\n const diffY = boid.y - other.y;\n const dist2 = diffX * diffX + diffY * diffY;\n\n if (dist2 < perceptionR2) {\n alignVX += other.vx;\n alignVY += other.vy;\n alignCount++;\n\n cohX += other.x;\n cohY += other.y;\n cohCount++;\n }\n\n if (dist2 < separationR2 && dist2 > 0) {\n const dist = Math.sqrt(dist2);\n sepX += diffX / dist;\n sepY += diffY / dist;\n sepCount++;\n }\n }\n }\n }\n\n let forceX = 0;\n let forceY = 0;\n\n if (sepCount > 0) {\n const fx = sepX / sepCount;\n const fy = sepY / sepCount;\n const len = Math.sqrt(fx * fx + fy * fy) || 1;\n forceX += (fx / len * maxSpeed - boid.vx) * maxForce * this.#separation;\n forceY += (fy / len * maxSpeed - boid.vy) * maxForce * this.#separation;\n }\n\n if (alignCount > 0) {\n const fx = alignVX / alignCount;\n const fy = alignVY / alignCount;\n const len = Math.sqrt(fx * fx + fy * fy) || 1;\n forceX += (fx / len * maxSpeed - boid.vx) * maxForce * this.#alignment;\n forceY += (fy / len * maxSpeed - boid.vy) * maxForce * this.#alignment;\n }\n\n if (cohCount > 0) {\n const targetX = cohX / cohCount;\n const targetY = cohY / cohCount;\n const diffX = targetX - boid.x;\n const diffY = targetY - boid.y;\n const len = Math.sqrt(diffX * diffX + diffY * diffY) || 1;\n forceX += (diffX / len * maxSpeed - boid.vx) * maxForce * this.#cohesion;\n forceY += (diffY / len * maxSpeed - boid.vy) * maxForce * this.#cohesion;\n }\n\n boid.vx += forceX * speedFactor;\n boid.vy += forceY * speedFactor;\n\n const speed = Math.sqrt(boid.vx * boid.vx + boid.vy * boid.vy);\n if (speed > maxSpeed) {\n boid.vx = (boid.vx / speed) * maxSpeed;\n boid.vy = (boid.vy / speed) * maxSpeed;\n } else if (speed < 0.5) {\n boid.vx += (MULBERRY.next() - 0.5) * 0.2;\n boid.vy += (MULBERRY.next() - 0.5) * 0.2;\n }\n\n boid.x += boid.vx * speedFactor;\n boid.y += boid.vy * speedFactor;\n\n boid.angle = Math.atan2(boid.vy, boid.vx);\n\n if (boid.x < -10) { boid.x += width + 10; }\n if (boid.x > width + 10) { boid.x -= width + 10; }\n if (boid.y < -10) { boid.y += height + 10; }\n if (boid.y > height + 10) { boid.y -= height + 10; }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, _width: number, _height: number): void {\n const size = this.#size;\n const r = this.#colorR;\n const g = this.#colorG;\n const b = this.#colorB;\n\n ctx.fillStyle = `rgb(${r}, ${g}, ${b})`;\n ctx.strokeStyle = `rgba(${r}, ${g}, ${b}, 0.4)`;\n ctx.lineWidth = 0.5;\n\n for (const boid of this.#boids) {\n const cos = Math.cos(boid.angle);\n const sin = Math.sin(boid.angle);\n\n ctx.save();\n ctx.transform(cos, sin, -sin, cos, boid.x, boid.y);\n\n ctx.beginPath();\n ctx.moveTo(size, 0);\n ctx.lineTo(-size * 0.6, -size * 0.45);\n ctx.lineTo(-size * 0.3, 0);\n ctx.lineTo(-size * 0.6, size * 0.45);\n ctx.closePath();\n ctx.fill();\n ctx.stroke();\n\n ctx.restore();\n }\n\n ctx.globalAlpha = 1;\n }\n\n #createBoid(): Boid {\n const angle = MULBERRY.next() * Math.PI * 2;\n const speed = (MAX_SPEED * 0.5) + MULBERRY.next() * MAX_SPEED * 0.5;\n\n return {\n x: MULBERRY.next() * this.#width,\n y: MULBERRY.next() * this.#height,\n vx: Math.cos(angle) * speed,\n vy: Math.sin(angle) * speed,\n angle\n };\n }\n}\n","import { Boids } from './layer';\nimport type { BoidsConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createBoids(config?: BoidsConfig): Effect<BoidsConfig> {\n return new Boids(config);\n}\n\nexport type { BoidsConfig };\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { parseColor } from '../color';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { Bubble, PopParticle } from './types';\n\nconst DEFAULT_COLORS = ['#88ccff', '#aaddff', '#ccbbff'];\n\nexport interface BubblesConfig {\n readonly count?: number;\n readonly sizeRange?: [number, number];\n readonly speed?: number;\n readonly popOnClick?: boolean;\n readonly popRadius?: number;\n readonly colors?: string[];\n readonly wobbleAmount?: number;\n readonly scale?: number;\n}\n\nexport class Bubbles extends Effect<BubblesConfig> {\n readonly #scale: number;\n #speed: number;\n readonly #sizeRange: [number, number];\n #wobbleAmount: number;\n readonly #popOnClick: boolean;\n readonly #popRadius: number;\n readonly #baseHues: number[];\n readonly #onClickBound: (evt: MouseEvent) => void;\n #maxCount: number;\n #time: number = 0;\n #bubbles: Bubble[] = [];\n #popParticles: PopParticle[] = [];\n #canvas: HTMLCanvasElement | null = null;\n\n constructor(config: BubblesConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxCount = config.count ?? 30;\n this.#sizeRange = config.sizeRange ?? [10, 40];\n this.#speed = config.speed ?? 1;\n this.#wobbleAmount = config.wobbleAmount ?? 1;\n this.#popOnClick = config.popOnClick ?? true;\n this.#popRadius = config.popRadius ?? 50;\n\n const colors = config.colors ?? DEFAULT_COLORS;\n this.#baseHues = colors.map(c => this.#colorToHue(c));\n\n if (innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n\n for (let i = 0; i < this.#maxCount; ++i) {\n this.#bubbles.push(this.#createBubble(true));\n }\n\n this.#onClickBound = this.#onClick.bind(this);\n }\n\n onMount(canvas: HTMLCanvasElement): void {\n this.#canvas = canvas;\n\n if (this.#popOnClick) {\n canvas.addEventListener('click', this.#onClickBound, {passive: true});\n }\n }\n\n onUnmount(canvas: HTMLCanvasElement): void {\n canvas.removeEventListener('click', this.#onClickBound);\n this.#canvas = null;\n }\n\n configure(config: Partial<BubblesConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.wobbleAmount !== undefined) {\n this.#wobbleAmount = config.wobbleAmount;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#time += 0.01 * dt;\n\n for (let i = 0; i < this.#bubbles.length; i++) {\n const bubble = this.#bubbles[i];\n\n const wobble = Math.sin(this.#time * bubble.wobbleFreq + bubble.wobblePhase) * bubble.wobbleAmp * this.#wobbleAmount;\n bubble.x += wobble * dt / (width * 3);\n bubble.y -= (bubble.speed * this.#speed * dt) / (height * 0.8);\n\n bubble.hue += 0.1 * dt;\n\n if (bubble.y < -0.1) {\n this.#bubbles[i] = this.#createBubble(false);\n }\n }\n\n let alive = 0;\n\n for (let i = 0; i < this.#popParticles.length; i++) {\n const particle = this.#popParticles[i];\n\n particle.x += (particle.vx * dt) / width;\n particle.y += (particle.vy * dt) / height;\n particle.alpha -= particle.decay * dt;\n\n if (particle.alpha > 0) {\n this.#popParticles[alive++] = particle;\n }\n }\n\n this.#popParticles.length = alive;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n for (const bubble of this.#bubbles) {\n const px = bubble.x * width;\n const py = bubble.y * height;\n const r = bubble.radius * this.#scale;\n\n const gradient = ctx.createRadialGradient(\n px - r * 0.3, py - r * 0.3, r * 0.1,\n px, py, r\n );\n\n const hue = (bubble.hue + this.#time * 10) % 360;\n gradient.addColorStop(0, `hsla(${hue}, 70%, 85%, ${bubble.opacity * 0.4})`);\n gradient.addColorStop(0.7, `hsla(${hue}, 60%, 70%, ${bubble.opacity * 0.15})`);\n gradient.addColorStop(1, `hsla(${hue}, 50%, 60%, ${bubble.opacity * 0.05})`);\n\n ctx.beginPath();\n ctx.arc(px, py, r, 0, Math.PI * 2);\n ctx.fillStyle = gradient;\n ctx.fill();\n\n ctx.beginPath();\n ctx.arc(px, py, r, 0, Math.PI * 2);\n ctx.strokeStyle = `hsla(${hue}, 60%, 80%, ${bubble.opacity * 0.3})`;\n ctx.lineWidth = 1;\n ctx.stroke();\n\n ctx.beginPath();\n ctx.ellipse(px - r * 0.25, py - r * 0.3, r * 0.2, r * 0.12, -0.5, 0, Math.PI * 2);\n ctx.fillStyle = `hsla(0, 0%, 100%, ${bubble.opacity * 0.5})`;\n ctx.fill();\n }\n\n for (const particle of this.#popParticles) {\n ctx.beginPath();\n ctx.arc(particle.x * width, particle.y * height, particle.size * this.#scale, 0, Math.PI * 2);\n ctx.fillStyle = `rgba(200, 220, 255, ${particle.alpha})`;\n ctx.fill();\n }\n }\n\n #onClick(evt: MouseEvent): void {\n if (!this.#canvas) {\n return;\n }\n\n const rect = this.#canvas.getBoundingClientRect();\n const mx = (evt.clientX - rect.left) / rect.width;\n const my = (evt.clientY - rect.top) / rect.height;\n const popRadiusNorm = this.#popRadius / this.#canvas.width;\n\n for (let i = this.#bubbles.length - 1; i >= 0; i--) {\n const bubble = this.#bubbles[i];\n const dx = bubble.x - mx;\n const dy = bubble.y - my;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n if (dist < popRadiusNorm + (bubble.radius * this.#scale) / this.#canvas.width) {\n this.#createPopBurst(bubble.x, bubble.y);\n this.#bubbles[i] = this.#createBubble(false);\n }\n }\n }\n\n #createBubble(initialSpread: boolean): Bubble {\n const hueIndex = Math.floor(MULBERRY.next() * this.#baseHues.length);\n\n return {\n x: MULBERRY.next(),\n y: initialSpread ? MULBERRY.next() : 1.1 + MULBERRY.next() * 0.1,\n radius: this.#sizeRange[0] + MULBERRY.next() * (this.#sizeRange[1] - this.#sizeRange[0]),\n speed: 0.5 + MULBERRY.next() * 1.5,\n hue: this.#baseHues[hueIndex],\n wobblePhase: MULBERRY.next() * Math.PI * 2,\n wobbleFreq: 1 + MULBERRY.next() * 2,\n wobbleAmp: 0.5 + MULBERRY.next() * 1,\n opacity: 0.6 + MULBERRY.next() * 0.4\n };\n }\n\n #createPopBurst(x: number, y: number): void {\n const count = 5 + Math.floor(MULBERRY.next() * 4);\n\n for (let i = 0; i < count; i++) {\n const angle = MULBERRY.next() * Math.PI * 2;\n const speed = 1 + MULBERRY.next() * 3;\n\n this.#popParticles.push({\n x,\n y,\n vx: Math.cos(angle) * speed,\n vy: Math.sin(angle) * speed,\n alpha: 0.6 + MULBERRY.next() * 0.4,\n size: 1 + MULBERRY.next() * 2,\n decay: 0.03 + MULBERRY.next() * 0.03\n });\n }\n }\n\n #colorToHue(color: string): number {\n const {r: r255, g: g255, b: b255} = parseColor(color);\n let r = r255 / 255;\n let g = g255 / 255;\n let b = b255 / 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n\n if (delta === 0) {\n return 0;\n }\n\n let hue: number;\n\n if (max === r) {\n hue = ((g - b) / delta) % 6;\n } else if (max === g) {\n hue = (b - r) / delta + 2;\n } else {\n hue = (r - g) / delta + 4;\n }\n\n hue = Math.round(hue * 60);\n\n if (hue < 0) {\n hue += 360;\n }\n\n return hue;\n }\n}\n","import { Bubbles } from './layer';\nimport type { BubblesConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createBubbles(config?: BubblesConfig): Effect<BubblesConfig> {\n return new Bubbles(config);\n}\n\nexport type { BubblesConfig };\nexport type { Bubble, PopParticle } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { parseColor } from '../color';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { Butterfly } from './types';\n\nexport interface ButterfliesConfig {\n readonly colors?: string[];\n readonly count?: number;\n readonly scale?: number;\n readonly size?: number;\n readonly speed?: number;\n}\n\nconst DEFAULT_COLORS = [\n '#f4a261',\n '#e76f51',\n '#e9c46a',\n '#2a9d8f',\n '#8ecae6',\n '#ffb7c5',\n '#c77dff',\n '#f8edeb'\n];\n\nexport class Butterflies extends Effect<ButterfliesConfig> {\n readonly #scale: number;\n #speed: number;\n #count: number;\n #size: number;\n #time: number = 0;\n #butterflies: Butterfly[] = [];\n\n constructor(config: ButterfliesConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#speed = config.speed ?? 1;\n this.#count = config.count ?? 12;\n this.#size = (config.size ?? 20) * this.#scale;\n\n const colors = config.colors ?? DEFAULT_COLORS;\n\n if (innerWidth < 991) {\n this.#count = Math.floor(this.#count / 2);\n }\n\n for (let i = 0; i < this.#count; ++i) {\n this.#butterflies.push(this.#createButterfly(colors));\n }\n }\n\n configure(config: Partial<ButterfliesConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n }\n\n tick(dt: number, _width: number, _height: number): void {\n this.#time += 0.003 * this.#speed * dt;\n\n for (const butterfly of this.#butterflies) {\n const timeX = this.#time * butterfly.orbitSpeedX + butterfly.orbitOffsetX;\n const timeY = this.#time * butterfly.orbitSpeedY + butterfly.orbitOffsetY;\n\n const orbitX = Math.sin(timeX) * butterfly.orbitRadiusX;\n const orbitY = Math.cos(timeY) * butterfly.orbitRadiusY;\n\n const targetX = butterfly.driftX + orbitX;\n const targetY = butterfly.driftY + orbitY;\n\n const dx = targetX - butterfly.x;\n const dy = targetY - butterfly.y;\n\n butterfly.x += dx * 0.05 * dt;\n butterfly.y += dy * 0.05 * dt;\n\n butterfly.driftX += butterfly.driftVX * dt;\n butterfly.driftY += butterfly.driftVY * dt;\n\n if (butterfly.driftX < 0.05 || butterfly.driftX > 0.95) {\n butterfly.driftVX *= -1;\n }\n\n if (butterfly.driftY < 0.05 || butterfly.driftY > 0.95) {\n butterfly.driftVY *= -1;\n }\n\n const moveDx = dx * 0.05 * dt;\n const moveDy = dy * 0.05 * dt;\n\n if (Math.abs(moveDx) > 0.000001 || Math.abs(moveDy) > 0.000001) {\n const targetAngle = Math.atan2(moveDy, moveDx) + Math.PI / 2;\n let angleDiff = targetAngle - butterfly.angle;\n\n if (angleDiff > Math.PI) {\n angleDiff -= Math.PI * 2;\n } else if (angleDiff < -Math.PI) {\n angleDiff += Math.PI * 2;\n }\n\n butterfly.angle += angleDiff * 0.08 * dt;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const globalTime = this.#time * 1000;\n\n for (const butterfly of this.#butterflies) {\n const px = butterfly.x * width;\n const py = butterfly.y * height;\n const flapAngle = Math.sin(globalTime * butterfly.flapSpeed * 0.012 + butterfly.flapOffset);\n const wingScale = Math.abs(flapAngle);\n const isFlipped = flapAngle < 0;\n\n const size = butterfly.size * this.#size;\n\n ctx.globalAlpha = 0.85;\n\n this.#drawButterfly(ctx, px, py, butterfly.angle, size, wingScale, isFlipped, butterfly.colorR, butterfly.colorG, butterfly.colorB);\n }\n\n ctx.globalAlpha = 1;\n ctx.resetTransform();\n }\n\n #drawButterfly(\n ctx: CanvasRenderingContext2D,\n px: number,\n py: number,\n angle: number,\n size: number,\n wingScale: number,\n isFlipped: boolean,\n r: number,\n g: number,\n b: number\n ): void {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n\n ctx.save();\n ctx.transform(cos, sin, -sin, cos, px, py);\n\n const ws = Math.max(0.05, wingScale);\n\n const wingColor = `rgba(${r}, ${g}, ${b}, 0.75)`;\n const wingEdgeColor = `rgba(${r}, ${g}, ${b}, 0.4)`;\n const bodyColor = `rgba(${Math.floor(r * 0.4)}, ${Math.floor(g * 0.4)}, ${Math.floor(b * 0.4)}, 0.9)`;\n\n for (const side of [-1, 1]) {\n const scaleX = side * ws;\n\n ctx.save();\n ctx.scale(scaleX, 1);\n\n ctx.fillStyle = wingColor;\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.bezierCurveTo(\n size * 0.8, -size * 0.2,\n size * 1.1, -size * 0.9,\n size * 0.5, -size * 1.0\n );\n ctx.bezierCurveTo(\n size * 0.1, -size * 1.1,\n -size * 0.1, -size * 0.6,\n 0, 0\n );\n ctx.fill();\n\n ctx.fillStyle = wingEdgeColor;\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.bezierCurveTo(\n size * 0.9, size * 0.1,\n size * 1.0, size * 0.7,\n size * 0.4, size * 0.8\n );\n ctx.bezierCurveTo(\n size * 0.0, size * 0.85,\n -size * 0.1, size * 0.4,\n 0, 0\n );\n ctx.fill();\n\n ctx.restore();\n }\n\n ctx.fillStyle = bodyColor;\n const bodyLength = size * 1.2;\n ctx.beginPath();\n ctx.ellipse(0, 0, size * 0.08, bodyLength * 0.5, 0, 0, Math.PI * 2);\n ctx.fill();\n\n const antennaLength = size * 0.7;\n ctx.strokeStyle = bodyColor;\n ctx.lineWidth = 1;\n\n for (const antSide of [-1, 1]) {\n ctx.beginPath();\n ctx.moveTo(antSide * size * 0.04, -bodyLength * 0.4);\n ctx.quadraticCurveTo(\n antSide * size * 0.3, -bodyLength * 0.6,\n antSide * size * 0.25, -bodyLength * 0.5 - antennaLength\n );\n ctx.stroke();\n\n ctx.fillStyle = bodyColor;\n ctx.beginPath();\n ctx.arc(antSide * size * 0.25, -bodyLength * 0.5 - antennaLength, size * 0.06, 0, Math.PI * 2);\n ctx.fill();\n }\n\n ctx.restore();\n }\n\n #createButterfly(colors: string[]): Butterfly {\n const colorStr = colors[Math.floor(MULBERRY.next() * colors.length)];\n const {r, g, b} = parseColor(colorStr);\n\n return {\n x: MULBERRY.next(),\n y: MULBERRY.next(),\n angle: MULBERRY.next() * Math.PI * 2 + Math.PI / 2,\n speed: 0.5 + MULBERRY.next() * 0.5,\n flapSpeed: 4 + MULBERRY.next() * 4,\n flapOffset: MULBERRY.next() * Math.PI * 2,\n size: 0.7 + MULBERRY.next() * 0.6,\n color: colorStr,\n colorR: r,\n colorG: g,\n colorB: b,\n orbitRadiusX: 0.06 + MULBERRY.next() * 0.15,\n orbitRadiusY: 0.05 + MULBERRY.next() * 0.12,\n orbitSpeedX: 0.6 + MULBERRY.next() * 1.2,\n orbitSpeedY: 0.5 + MULBERRY.next() * 1.0,\n orbitOffsetX: MULBERRY.next() * Math.PI * 2,\n orbitOffsetY: MULBERRY.next() * Math.PI * 2,\n driftX: 0.15 + MULBERRY.next() * 0.7,\n driftY: 0.15 + MULBERRY.next() * 0.7,\n driftVX: (MULBERRY.next() - 0.5) * 0.0005,\n driftVY: (MULBERRY.next() - 0.5) * 0.0004\n };\n }\n}\n","import { Butterflies } from './layer';\nimport type { ButterfliesConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createButterflies(config?: ButterfliesConfig): Effect<ButterfliesConfig> {\n return new Butterflies(config);\n}\n\nexport type { ButterfliesConfig };\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\n\nexport interface CausticsConfig {\n readonly speed?: number;\n readonly scale?: number;\n readonly resolution?: number;\n readonly intensity?: number;\n readonly color?: string;\n}\n\nexport class Caustics extends Effect<CausticsConfig> {\n #speed: number;\n readonly #scale: number;\n readonly #resolution: number;\n #intensity: number;\n readonly #colorR: number;\n readonly #colorG: number;\n readonly #colorB: number;\n #time: number = 0;\n #offscreen: HTMLCanvasElement | null = null;\n #offscreenCtx: CanvasRenderingContext2D | null = null;\n #imageData: ImageData | null = null;\n\n constructor(config: CausticsConfig = {}) {\n super();\n\n this.#speed = config.speed ?? 1;\n this.#scale = config.scale ?? 1;\n this.#resolution = config.resolution ?? 4;\n this.#intensity = config.intensity ?? 0.7;\n\n const [r, g, b] = hexToRGB(config.color ?? '#4488cc');\n this.#colorR = r;\n this.#colorG = g;\n this.#colorB = b;\n }\n\n configure(config: Partial<CausticsConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.intensity !== undefined) {\n this.#intensity = config.intensity;\n }\n }\n\n tick(dt: number, _width: number, _height: number): void {\n this.#time += 0.015 * dt * this.#speed;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const resolution = this.#resolution;\n const offWidth = Math.ceil(width / resolution);\n const offHeight = Math.ceil(height / resolution);\n\n if (!this.#offscreen || this.#offscreen.width !== offWidth || this.#offscreen.height !== offHeight) {\n this.#offscreen = document.createElement('canvas');\n this.#offscreen.width = offWidth;\n this.#offscreen.height = offHeight;\n this.#offscreenCtx = this.#offscreen.getContext('2d');\n this.#imageData = this.#offscreenCtx!.createImageData(offWidth, offHeight);\n }\n\n const data = this.#imageData!.data;\n const time = this.#time;\n const scale = this.#scale;\n const intensity = this.#intensity;\n const colorR = this.#colorR;\n const colorG = this.#colorG;\n const colorB = this.#colorB;\n\n const freq1 = 40 * scale;\n const freq2 = 30 * scale;\n const freq3 = 35 * scale;\n const freq4 = 25 * scale;\n const freq5 = 45 * scale;\n const amplitude = 2.5;\n\n for (let py = 0; py < offHeight; py++) {\n const worldY = py * resolution;\n\n for (let px = 0; px < offWidth; px++) {\n const worldX = px * resolution;\n\n const v1 = Math.sin(worldX / freq1 + Math.sin(worldY / freq2 + time) * amplitude);\n const v2 = Math.sin(worldY / freq3 + Math.sin(worldX / freq4 + time * 0.7) * amplitude);\n const v3 = Math.sin((worldX + worldY) / freq5 + time * 0.5);\n\n const caustic = (v1 + v2 + v3) / 3;\n const clamped = Math.max(0, caustic);\n const brightness = Math.pow(clamped, 2) * intensity;\n\n const offset = (py * offWidth + px) * 4;\n data[offset] = Math.min(255, colorR * brightness + (1 - brightness) * colorR * 0.15);\n data[offset + 1] = Math.min(255, colorG * brightness + (1 - brightness) * colorG * 0.15);\n data[offset + 2] = Math.min(255, colorB * brightness + (1 - brightness) * colorB * 0.15);\n data[offset + 3] = 255;\n }\n }\n\n this.#offscreenCtx!.putImageData(this.#imageData!, 0, 0);\n\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(this.#offscreen!, 0, 0, width, height);\n }\n}\n","import { Caustics } from './layer';\nimport type { CausticsConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createCaustics(config?: CausticsConfig): Effect<CausticsConfig> {\n return new Caustics(config);\n}\n\nexport type { CausticsConfig };\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(17);\n","import { parseColor } from '../color';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { Cloud } from './types';\n\nexport interface CloudsConfig {\n readonly color?: string;\n readonly count?: number;\n readonly opacity?: number;\n readonly scale?: number;\n readonly speed?: number;\n}\n\nconst SPRITE_COUNT = 6;\nconst SPRITE_SIZE = 256;\n\nexport class Clouds extends Effect<CloudsConfig> {\n readonly #scale: number;\n #speed: number;\n #count: number;\n #opacity: number;\n #clouds: Cloud[] = [];\n #sprites: HTMLCanvasElement[] = [];\n #colorR: number = 255;\n #colorG: number = 255;\n #colorB: number = 255;\n\n constructor(config: CloudsConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#speed = config.speed ?? 0.3;\n this.#count = config.count ?? 8;\n this.#opacity = config.opacity ?? 0.8;\n\n const {r, g, b} = parseColor(config.color ?? '#ffffff');\n this.#colorR = r;\n this.#colorG = g;\n this.#colorB = b;\n\n if (innerWidth < 991) {\n this.#count = Math.max(3, Math.floor(this.#count / 2));\n }\n\n this.#sprites = this.#createSprites(r, g, b);\n\n for (let i = 0; i < this.#count; ++i) {\n this.#clouds.push(this.#createCloud(true));\n }\n }\n\n configure(config: Partial<CloudsConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n\n if (config.opacity !== undefined) {\n this.#opacity = config.opacity;\n }\n\n if (config.color !== undefined) {\n const {r, g, b} = parseColor(config.color);\n this.#colorR = r;\n this.#colorG = g;\n this.#colorB = b;\n this.#sprites = this.#createSprites(r, g, b);\n }\n }\n\n tick(dt: number, _width: number, _height: number): void {\n for (const cloud of this.#clouds) {\n const layerSpeed = this.#speed * (0.5 + cloud.layer * 0.5);\n cloud.x += layerSpeed * 0.002 * dt;\n\n if (cloud.x > 1.4) {\n cloud.x = -0.4;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const sortedClouds = [...this.#clouds].sort((a, b) => a.layer - b.layer);\n\n for (const cloud of sortedClouds) {\n const px = cloud.x * width;\n const py = cloud.y * height;\n const cloudWidth = SPRITE_SIZE * cloud.scale * this.#scale * (width / 800);\n const cloudHeight = (SPRITE_SIZE * 0.45) * cloud.scale * this.#scale * (width / 800);\n\n const depthAlpha = 0.4 + cloud.layer * 0.3;\n ctx.globalAlpha = this.#opacity * depthAlpha * cloud.opacity;\n\n ctx.drawImage(\n this.#sprites[cloud.spriteIndex],\n px - cloudWidth * 0.5,\n py - cloudHeight * 0.5,\n cloudWidth,\n cloudHeight\n );\n }\n\n ctx.globalAlpha = 1;\n ctx.resetTransform();\n }\n\n #createSprites(r: number, g: number, b: number): HTMLCanvasElement[] {\n const sprites: HTMLCanvasElement[] = [];\n\n for (let variant = 0; variant < SPRITE_COUNT; variant++) {\n const canvas = document.createElement('canvas');\n canvas.width = SPRITE_SIZE;\n canvas.height = Math.floor(SPRITE_SIZE * 0.5);\n const spriteCtx = canvas.getContext('2d')!;\n\n const blobCount = 3 + Math.floor(MULBERRY.next() * 3);\n const cx = SPRITE_SIZE * 0.5;\n const cy = SPRITE_SIZE * 0.2;\n\n const blobs: Array<{bx: number; by: number; br: number}> = [];\n\n blobs.push({bx: cx, by: cy, br: SPRITE_SIZE * (0.18 + MULBERRY.next() * 0.08)});\n\n for (let i = 1; i < blobCount; i++) {\n const spread = SPRITE_SIZE * 0.28;\n blobs.push({\n bx: cx + (MULBERRY.next() - 0.5) * spread * 2,\n by: cy + (MULBERRY.next() - 0.3) * spread * 0.5,\n br: SPRITE_SIZE * (0.1 + MULBERRY.next() * 0.12)\n });\n }\n\n for (const blob of blobs) {\n const gradient = spriteCtx.createRadialGradient(\n blob.bx, blob.by, 0,\n blob.bx, blob.by, blob.br\n );\n gradient.addColorStop(0, `rgba(${r}, ${g}, ${b}, 0.9)`);\n gradient.addColorStop(0.35, `rgba(${r}, ${g}, ${b}, 0.7)`);\n gradient.addColorStop(0.7, `rgba(${r}, ${g}, ${b}, 0.25)`);\n gradient.addColorStop(1, `rgba(${r}, ${g}, ${b}, 0)`);\n\n spriteCtx.fillStyle = gradient;\n spriteCtx.beginPath();\n spriteCtx.arc(blob.bx, blob.by, blob.br, 0, Math.PI * 2);\n spriteCtx.fill();\n }\n\n sprites.push(canvas);\n }\n\n return sprites;\n }\n\n #createCloud(initialSpread: boolean): Cloud {\n const layer = Math.floor(MULBERRY.next() * 3);\n\n return {\n x: initialSpread ? MULBERRY.next() * 1.8 - 0.4 : -0.4,\n y: 0.05 + MULBERRY.next() * 0.55,\n speed: 0.5 + MULBERRY.next() * 0.5,\n layer,\n scale: 0.6 + MULBERRY.next() * 0.8 + layer * 0.3,\n opacity: 0.6 + MULBERRY.next() * 0.4,\n spriteIndex: Math.floor(MULBERRY.next() * SPRITE_COUNT)\n };\n }\n}\n","import { Clouds } from './layer';\nimport type { CloudsConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createClouds(config?: CloudsConfig): Effect<CloudsConfig> {\n return new Clouds(config);\n}\n\nexport type { CloudsConfig };\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\nimport type { Config, Palette } from './types';\n\nexport const PALETTES: Record<Palette, string[]> = {\n classic: ['#26ccff', '#a25afd', '#ff5e7e', '#88ff5a', '#fcff42', '#ffa62d', '#ff36ff'],\n pastel: ['#a8d8ea', '#c3aed6', '#f9b4c4', '#ffd6a5', '#caffbf', '#fdffb6'],\n vibrant: ['#6366f1', '#8b5cf6', '#ec4899', '#f97316', '#eab308', '#22c55e', '#06b6d4'],\n warm: ['#ff6b6b', '#feca57', '#48dbfb', '#ff9ff3', '#54a0ff', '#5f27cd', '#01a3a4']\n};\n\nexport const DEFAULT_CONFIG: Config = {\n angle: 90,\n colors: PALETTES.vibrant,\n decay: 0.9,\n gravity: 1,\n palette: 'vibrant',\n particles: 50,\n shapes: ['bowtie', 'circle', 'crescent', 'diamond', 'heart', 'hexagon', 'ribbon', 'ring', 'square', 'star', 'triangle'],\n spread: 45,\n ticks: 200,\n startVelocity: 45,\n x: 0.5,\n y: 0.5\n};\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import type { Shape } from './types';\n\nconst TWO_PI = Math.PI * 2;\n\nfunction buildShapePaths(): Record<Shape, Path2D> {\n const bowtie = new Path2D();\n bowtie.moveTo(-1, -0.7);\n bowtie.lineTo(0, 0);\n bowtie.lineTo(-1, 0.7);\n bowtie.closePath();\n bowtie.moveTo(1, -0.7);\n bowtie.lineTo(0, 0);\n bowtie.lineTo(1, 0.7);\n bowtie.closePath();\n\n const circle = new Path2D();\n circle.ellipse(0, 0, 0.6, 1, 0, 0, TWO_PI);\n\n const crescent = new Path2D();\n crescent.arc(0, 0, 1, 0, TWO_PI, false);\n crescent.arc(0.45, 0, 0.9, 0, TWO_PI, true);\n\n const diamond = new Path2D();\n diamond.moveTo(0, -1);\n diamond.lineTo(0.6, 0);\n diamond.lineTo(0, 1);\n diamond.lineTo(-0.6, 0);\n diamond.closePath();\n\n const heart = new Path2D();\n heart.moveTo(0, 1);\n heart.bezierCurveTo(-0.4, 0.55, -1, 0.1, -1, -0.35);\n heart.bezierCurveTo(-1, -0.8, -0.5, -1, 0, -0.6);\n heart.bezierCurveTo(0.5, -1, 1, -0.8, 1, -0.35);\n heart.bezierCurveTo(1, 0.1, 0.4, 0.55, 0, 1);\n heart.closePath();\n\n const hexagon = new Path2D();\n for (let i = 0; i < 6; i++) {\n const angle = (i * Math.PI / 3) - Math.PI / 2;\n if (i === 0) {\n hexagon.moveTo(Math.cos(angle), Math.sin(angle));\n } else {\n hexagon.lineTo(Math.cos(angle), Math.sin(angle));\n }\n }\n hexagon.closePath();\n\n const ribbon = new Path2D();\n ribbon.rect(-0.2, -1, 0.4, 2);\n\n const ring = new Path2D();\n ring.arc(0, 0, 1, 0, TWO_PI, false);\n ring.arc(0, 0, 0.55, 0, TWO_PI, true);\n\n const square = new Path2D();\n square.rect(-0.7, -0.7, 1.4, 1.4);\n\n const star = new Path2D();\n for (let i = 0; i < 10; i++) {\n const r = i % 2 === 0 ? 1 : 0.42;\n const angle = (i * Math.PI / 5) - Math.PI / 2;\n if (i === 0) {\n star.moveTo(r * Math.cos(angle), r * Math.sin(angle));\n } else {\n star.lineTo(r * Math.cos(angle), r * Math.sin(angle));\n }\n }\n star.closePath();\n\n const triangle = new Path2D();\n for (let i = 0; i < 3; i++) {\n const angle = (i * 2 * Math.PI / 3) - Math.PI / 2;\n if (i === 0) {\n triangle.moveTo(Math.cos(angle), Math.sin(angle));\n } else {\n triangle.lineTo(Math.cos(angle), Math.sin(angle));\n }\n }\n triangle.closePath();\n\n return {bowtie, circle, crescent, diamond, heart, hexagon, ribbon, ring, square, star, triangle};\n}\n\nlet _shapePaths: Record<Shape, Path2D> | null = null;\n\nexport const SHAPE_PATHS: Record<Shape, Path2D> = new Proxy({} as Record<Shape, Path2D>, {\n get(_, key: string) {\n return (_shapePaths ??= buildShapePaths())[key as Shape];\n }\n});\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { DEFAULT_CONFIG, MULBERRY, PALETTES } from './consts';\nimport { SHAPE_PATHS } from './shapes';\nimport type { Config, Particle, ParticleConfig } from './types';\n\nconst TWO_PI = Math.PI * 2;\n\nexport interface ConfettiConfig {\n readonly scale?: number;\n}\n\nexport class Confetti extends Effect<ConfettiConfig> {\n readonly #scale: number;\n #particles: Particle[] = [];\n #width: number = 0;\n #height: number = 0;\n #isFiring: boolean = false;\n\n constructor(config: ConfettiConfig = {}) {\n super();\n this.#scale = config.scale ?? 1;\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n }\n\n burst(config: Partial<Config>): void {\n const width = this.#width;\n const height = this.#height;\n\n const resolved = {...DEFAULT_CONFIG, ...config};\n const colors = config.colors ?? PALETTES[resolved.palette];\n const {angle, decay, gravity, shapes, spread, startVelocity, ticks, x, y} = resolved;\n const numberOfParticles = Math.max(1, resolved.particles);\n\n for (let i = 0; i < numberOfParticles; i++) {\n const particle = this.#createParticle({\n angle,\n color: hexToRGB(colors[Math.floor(MULBERRY.next() * colors.length)]),\n decay,\n gravity: gravity * this.#scale,\n shape: shapes[Math.floor(MULBERRY.next() * shapes.length)],\n spread,\n startVelocity: startVelocity * this.#scale,\n ticks,\n x: width * x,\n y: height * y\n });\n\n this.#tickParticle(particle);\n this.#particles.push(particle);\n }\n\n this.#isFiring = true;\n }\n\n get hasParticles(): boolean {\n return this.#particles.length > 0;\n }\n\n tick(dt: number, _width: number, _height: number): void {\n const particles = this.#particles;\n let alive = 0;\n\n for (let i = 0; i < particles.length; i++) {\n const p = particles[i];\n\n if (p.tick < p.totalTicks) {\n this.#tickParticle(p, dt);\n\n if (p.tick < p.totalTicks) {\n particles[alive++] = p;\n }\n }\n }\n\n particles.length = alive;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n const particles = this.#particles;\n\n for (let i = 0; i < particles.length; i++) {\n const p = particles[i];\n const flipCos = Math.cos(p.flipAngle);\n const size = p.size;\n\n ctx.save();\n ctx.transform(\n p.rotCos * flipCos * size,\n p.rotSin * flipCos * size,\n -p.rotSin * size,\n p.rotCos * size,\n p.x,\n p.y\n );\n ctx.globalAlpha = 1 - p.tick / p.totalTicks;\n ctx.fillStyle = p.colorStr;\n ctx.fill(SHAPE_PATHS[p.shape]);\n ctx.restore();\n }\n\n ctx.globalAlpha = 1;\n }\n\n #createParticle(config: ParticleConfig): Particle {\n const launchAngle = -(config.angle * Math.PI / 180)\n + (0.5 * config.spread * Math.PI / 180)\n - (MULBERRY.next() * config.spread * Math.PI / 180);\n\n const speed = config.startVelocity * (0.5 + MULBERRY.next());\n const rotAngle = MULBERRY.next() * TWO_PI;\n\n return {\n colorStr: `rgb(${config.color[0]}, ${config.color[1]}, ${config.color[2]})`,\n decay: config.decay - 0.05 + MULBERRY.next() * 0.1,\n flipAngle: MULBERRY.next() * TWO_PI,\n flipSpeed: 0.03 + MULBERRY.next() * 0.05,\n gravity: config.gravity,\n rotAngle,\n rotCos: Math.cos(rotAngle),\n rotSin: Math.sin(rotAngle),\n rotSpeed: (MULBERRY.next() - 0.5) * 0.06,\n shape: config.shape,\n size: (5 + MULBERRY.next() * 5) * this.#scale,\n swing: MULBERRY.next() * TWO_PI,\n swingAmp: 0.5 + MULBERRY.next() * 1.5,\n swingSpeed: 0.025 + MULBERRY.next() * 0.035,\n tick: 0,\n totalTicks: config.ticks,\n vx: Math.cos(launchAngle) * speed,\n vy: Math.sin(launchAngle) * speed,\n x: config.x,\n y: config.y\n };\n }\n\n #tickParticle(particle: Particle, dt: number = 1): void {\n const decayFactor = Math.pow(particle.decay, dt);\n particle.vx *= decayFactor;\n particle.vy *= decayFactor;\n particle.vy += particle.gravity * 0.35 * dt;\n particle.swing += particle.swingSpeed * dt;\n particle.x += (particle.vx + particle.swingAmp * Math.cos(particle.swing)) * dt;\n particle.y += particle.vy * dt;\n particle.rotAngle += particle.rotSpeed * dt;\n particle.rotCos = Math.cos(particle.rotAngle);\n particle.rotSin = Math.sin(particle.rotAngle);\n particle.flipAngle += particle.flipSpeed * dt;\n particle.tick += dt;\n }\n}\n","import type { Point } from '../point';\nimport { MULBERRY } from './consts';\nimport { SHAPE_PATHS } from './shapes';\nimport type { Shape } from './types';\n\nexport interface ConfettiParticleConfig {\n readonly decay?: number;\n readonly gravity?: number;\n readonly scale?: number;\n readonly spread?: number;\n readonly startVelocity?: number;\n readonly ticks?: number;\n}\n\nexport class ConfettiParticle {\n readonly #colorStr: string;\n readonly #gravity: number;\n readonly #shape: Shape;\n readonly #size: number;\n readonly #totalTicks: number;\n #decay: number;\n #flipAngle: number;\n #flipSpeed: number;\n #rotAngle: number;\n #rotCos: number;\n #rotSin: number;\n #rotSpeed: number;\n #swing: number;\n #swingAmp: number;\n #swingSpeed: number;\n #tick: number = 0;\n #vx: number;\n #vy: number;\n #x: number;\n #y: number;\n\n get isDead(): boolean {\n return this.#tick >= this.#totalTicks;\n }\n\n get position(): Point {\n return {x: this.#x, y: this.#y};\n }\n\n constructor(position: Point, direction: number, shape: Shape, color: string, config: ConfettiParticleConfig = {}) {\n const scale = config.scale ?? 1;\n const spread = config.spread ?? 45;\n const startVelocity = (config.startVelocity ?? 45) * scale;\n const launchAngle = -(direction * Math.PI / 180)\n + (0.5 * spread * Math.PI / 180)\n - (MULBERRY.next() * spread * Math.PI / 180);\n const speed = startVelocity * (0.5 + MULBERRY.next());\n const rotAngle = MULBERRY.next() * Math.PI * 2;\n\n this.#colorStr = color;\n this.#gravity = (config.gravity ?? 1) * scale;\n this.#shape = shape;\n this.#size = (5 + MULBERRY.next() * 5) * scale;\n this.#totalTicks = config.ticks ?? 200;\n this.#x = position.x;\n this.#y = position.y;\n this.#vx = Math.cos(launchAngle) * speed;\n this.#vy = Math.sin(launchAngle) * speed;\n this.#decay = (config.decay ?? 0.9) - 0.05 + MULBERRY.next() * 0.1;\n this.#flipAngle = MULBERRY.next() * Math.PI * 2;\n this.#flipSpeed = 0.03 + MULBERRY.next() * 0.05;\n this.#rotAngle = rotAngle;\n this.#rotCos = Math.cos(rotAngle);\n this.#rotSin = Math.sin(rotAngle);\n this.#rotSpeed = (MULBERRY.next() - 0.5) * 0.06;\n this.#swing = MULBERRY.next() * Math.PI * 2;\n this.#swingAmp = 0.5 + MULBERRY.next() * 1.5;\n this.#swingSpeed = 0.025 + MULBERRY.next() * 0.035;\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n ctx.save();\n ctx.setTransform(\n this.#rotCos * Math.cos(this.#flipAngle) * this.#size,\n this.#rotSin * Math.cos(this.#flipAngle) * this.#size,\n -this.#rotSin * this.#size,\n this.#rotCos * this.#size,\n this.#x,\n this.#y\n );\n ctx.globalAlpha = Math.max(0, 1 - this.#tick / this.#totalTicks);\n ctx.fillStyle = this.#colorStr;\n ctx.fill(SHAPE_PATHS[this.#shape]);\n ctx.restore();\n }\n\n tick(dt: number = 1): void {\n const decayFactor = Math.pow(this.#decay, dt);\n this.#vx *= decayFactor;\n this.#vy *= decayFactor;\n this.#vy += this.#gravity * 0.35 * dt;\n this.#swing += this.#swingSpeed * dt;\n this.#x += (this.#vx + this.#swingAmp * Math.cos(this.#swing)) * dt;\n this.#y += this.#vy * dt;\n this.#rotAngle += this.#rotSpeed * dt;\n this.#rotCos = Math.cos(this.#rotAngle);\n this.#rotSin = Math.sin(this.#rotAngle);\n this.#flipAngle += this.#flipSpeed * dt;\n this.#tick += dt;\n }\n}\n","import { Confetti } from './layer';\nimport type { ConfettiConfig } from './layer';\nimport type { Config as ConfettiBurstConfig } from './types';\nimport type { Effect } from '../effect';\n\nexport interface ConfettiInstance extends Effect<ConfettiConfig> {\n burst(config: Partial<ConfettiBurstConfig>): void;\n}\n\nexport function createConfetti(config?: ConfettiConfig): ConfettiInstance {\n return new Confetti(config) as ConfettiInstance;\n}\n\nexport { ConfettiParticle } from './particle';\nexport { PALETTES } from './consts';\nexport { SHAPE_PATHS } from './shapes';\nexport type { ConfettiConfig };\nexport type { ConfettiBurstConfig };\nexport type { ConfettiParticleConfig } from './particle';\nexport type { Palette, Shape as ConfettiShape } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { ConstellationStar } from './types';\n\nexport interface ConstellationConfig {\n readonly stars?: number;\n readonly speed?: number;\n readonly connectionDistance?: number;\n readonly color?: string;\n readonly lineWidth?: number;\n readonly twinkleSpeed?: number;\n readonly scale?: number;\n}\n\nconst DEFAULT_STARS = 50;\nconst DEFAULT_CONNECTION_DISTANCE = 120;\nconst DEFAULT_LINE_WIDTH = 0.5;\nconst TWO_PI = Math.PI * 2;\nconst SPRITE_SIZE = 64;\nconst SPRITE_CENTER = SPRITE_SIZE / 2;\nconst SPRITE_RADIUS = SPRITE_SIZE / 2;\n\nexport class Constellation extends Effect<ConstellationConfig> {\n readonly #scale: number;\n readonly #r: number;\n readonly #g: number;\n readonly #b: number;\n readonly #lineWidth: number;\n readonly #maxStars: number;\n #speed: number;\n #twinkleSpeed: number;\n #connectionDistance: number;\n #time: number = 0;\n #stars: ConstellationStar[] = [];\n #sprite: HTMLCanvasElement;\n #width: number = 0;\n #height: number = 0;\n\n constructor(config: ConstellationConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxStars = config.stars ?? DEFAULT_STARS;\n this.#speed = config.speed ?? 1;\n this.#connectionDistance = (config.connectionDistance ?? DEFAULT_CONNECTION_DISTANCE) * this.#scale;\n this.#lineWidth = (config.lineWidth ?? DEFAULT_LINE_WIDTH) * this.#scale;\n this.#twinkleSpeed = config.twinkleSpeed ?? 1;\n\n const [r, g, b] = hexToRGB(config.color ?? '#ffffff');\n this.#r = r;\n this.#g = g;\n this.#b = b;\n\n this.#sprite = this.#createSprite(r, g, b);\n }\n\n configure(config: Partial<ConstellationConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.twinkleSpeed !== undefined) {\n this.#twinkleSpeed = config.twinkleSpeed;\n }\n if (config.connectionDistance !== undefined) {\n this.#connectionDistance = config.connectionDistance * this.#scale;\n }\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n if (this.#stars.length === 0) {\n for (let index = 0; index < this.#maxStars; index++) {\n this.#stars.push(this.#createStar(width, height, true));\n }\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n const dtSeconds = dt / 1000 * this.#speed;\n this.#time += dtSeconds;\n\n for (const star of this.#stars) {\n // Twinkle: oscillate brightness.\n const twinkle = 0.5 + 0.5 * Math.sin(this.#time * star.twinkleSpeed * this.#twinkleSpeed + star.phase);\n star.targetBrightness = twinkle;\n\n // Smooth brightness transition (fade-in effect).\n star.brightness += (star.targetBrightness - star.brightness) * Math.min(1, dtSeconds * 3);\n\n // Drift slowly.\n star.x += star.vx * dtSeconds;\n star.y += star.vy * dtSeconds;\n\n // Recycle stars that drift off-screen.\n if (star.x < -10 || star.x > width + 10 || star.y < -10 || star.y > height + 10) {\n this.#recycleStar(star, width, height);\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, _width: number, _height: number): void {\n const connectionDist = this.#connectionDistance;\n const connectionDistSq = connectionDist * connectionDist;\n const stars = this.#stars;\n const starCount = stars.length;\n const r = this.#r;\n const g = this.#g;\n const b = this.#b;\n\n // Draw connection lines.\n ctx.lineWidth = this.#lineWidth;\n\n for (let index = 0; index < starCount; index++) {\n const starA = stars[index];\n\n if (starA.brightness < 0.05) {\n continue;\n }\n\n for (let jndex = index + 1; jndex < starCount; jndex++) {\n const starB = stars[jndex];\n\n if (starB.brightness < 0.05) {\n continue;\n }\n\n const dx = starA.x - starB.x;\n const dy = starA.y - starB.y;\n const distSq = dx * dx + dy * dy;\n\n if (distSq > connectionDistSq) {\n continue;\n }\n\n const dist = Math.sqrt(distSq);\n const opacity = Math.min(starA.brightness, starB.brightness) * (1 - dist / connectionDist);\n\n if (opacity < 0.01) {\n continue;\n }\n\n ctx.strokeStyle = `rgba(${r}, ${g}, ${b}, ${opacity * 0.6})`;\n ctx.beginPath();\n ctx.moveTo(starA.x, starA.y);\n ctx.lineTo(starB.x, starB.y);\n ctx.stroke();\n }\n }\n\n // Draw star sprites.\n for (const star of stars) {\n if (star.brightness < 0.02) {\n continue;\n }\n\n const displaySize = star.size * 2;\n\n ctx.globalAlpha = star.brightness;\n ctx.drawImage(\n this.#sprite,\n star.x - star.size,\n star.y - star.size,\n displaySize,\n displaySize\n );\n }\n\n ctx.globalAlpha = 1;\n }\n\n #createSprite(r: number, g: number, b: number): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.width = SPRITE_SIZE;\n canvas.height = SPRITE_SIZE;\n const ctx = canvas.getContext('2d')!;\n\n const gradient = ctx.createRadialGradient(\n SPRITE_CENTER, SPRITE_CENTER, 0,\n SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS\n );\n\n gradient.addColorStop(0, `rgba(${r}, ${g}, ${b}, 1)`);\n gradient.addColorStop(0.1, `rgba(${r}, ${g}, ${b}, 0.7)`);\n gradient.addColorStop(0.3, `rgba(${r}, ${g}, ${b}, 0.2)`);\n gradient.addColorStop(0.6, `rgba(${r}, ${g}, ${b}, 0.05)`);\n gradient.addColorStop(1, `rgba(${r}, ${g}, ${b}, 0)`);\n\n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.arc(SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS, 0, TWO_PI);\n ctx.fill();\n\n return canvas;\n }\n\n #createStar(width: number, height: number, initialSpread: boolean): ConstellationStar {\n const driftSpeed = 2 + MULBERRY.next() * 4;\n const driftAngle = MULBERRY.next() * TWO_PI;\n\n return {\n x: initialSpread ? MULBERRY.next() * width : -10,\n y: initialSpread ? MULBERRY.next() * height : -10,\n size: (1.5 + MULBERRY.next() * 3) * this.#scale,\n brightness: initialSpread ? MULBERRY.next() : 0,\n targetBrightness: 0,\n phase: MULBERRY.next() * TWO_PI,\n twinkleSpeed: 0.5 + MULBERRY.next() * 2,\n vx: Math.cos(driftAngle) * driftSpeed,\n vy: Math.sin(driftAngle) * driftSpeed\n };\n }\n\n #recycleStar(star: ConstellationStar, width: number, height: number): void {\n const edge = Math.floor(MULBERRY.next() * 4);\n const driftSpeed = 2 + MULBERRY.next() * 4;\n\n switch (edge) {\n case 0: // Top edge.\n star.x = MULBERRY.next() * width;\n star.y = -5;\n star.vx = (MULBERRY.next() - 0.5) * driftSpeed;\n star.vy = Math.abs(MULBERRY.next() * driftSpeed) + 0.5;\n break;\n case 1: // Right edge.\n star.x = width + 5;\n star.y = MULBERRY.next() * height;\n star.vx = -(Math.abs(MULBERRY.next() * driftSpeed) + 0.5);\n star.vy = (MULBERRY.next() - 0.5) * driftSpeed;\n break;\n case 2: // Bottom edge.\n star.x = MULBERRY.next() * width;\n star.y = height + 5;\n star.vx = (MULBERRY.next() - 0.5) * driftSpeed;\n star.vy = -(Math.abs(MULBERRY.next() * driftSpeed) + 0.5);\n break;\n default: // Left edge.\n star.x = -5;\n star.y = MULBERRY.next() * height;\n star.vx = Math.abs(MULBERRY.next() * driftSpeed) + 0.5;\n star.vy = (MULBERRY.next() - 0.5) * driftSpeed;\n break;\n }\n\n star.size = (1.5 + MULBERRY.next() * 3) * this.#scale;\n star.brightness = 0;\n star.targetBrightness = 0;\n star.phase = MULBERRY.next() * TWO_PI;\n star.twinkleSpeed = 0.5 + MULBERRY.next() * 2;\n }\n}\n","import { Constellation } from './layer';\nimport type { ConstellationConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createConstellation(config?: ConstellationConfig): Effect<ConstellationConfig> {\n return new Constellation(config);\n}\n\nexport type { ConstellationConfig };\nexport type { ConstellationStar } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { CoralAnemone, CoralBubble, CoralJellyfish } from './types';\n\nconst DEFAULT_COLORS = ['#ff6b9d', '#c44dff', '#00d4aa', '#ff8c42', '#4dc9f6'];\n\nexport interface CoralReefConfig {\n readonly anemones?: number;\n readonly jellyfish?: number;\n readonly bubbles?: number;\n readonly speed?: number;\n readonly colors?: string[];\n readonly scale?: number;\n}\n\nexport class CoralReef extends Effect<CoralReefConfig> {\n readonly #scale: number;\n readonly #colors: string[];\n #speed: number;\n #maxAnemones: number;\n #maxJellyfish: number;\n #maxBubbles: number;\n #time: number = 0;\n #anemones: CoralAnemone[] = [];\n #jellyfish: CoralJellyfish[] = [];\n #bubbles: CoralBubble[] = [];\n #width: number = 960;\n #height: number = 540;\n\n constructor(config: CoralReefConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#speed = config.speed ?? 1;\n this.#colors = config.colors ?? DEFAULT_COLORS;\n this.#maxAnemones = config.anemones ?? 8;\n this.#maxJellyfish = config.jellyfish ?? 5;\n this.#maxBubbles = config.bubbles ?? 20;\n\n if (innerWidth < 991) {\n this.#maxAnemones = Math.floor(this.#maxAnemones / 2);\n this.#maxJellyfish = Math.floor(this.#maxJellyfish / 2);\n this.#maxBubbles = Math.floor(this.#maxBubbles / 2);\n }\n }\n\n configure(config: Partial<CoralReefConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n this.#anemones = [];\n this.#jellyfish = [];\n this.#bubbles = [];\n\n for (let i = 0; i < this.#maxAnemones; ++i) {\n this.#anemones.push(this.#createAnemone());\n }\n\n for (let i = 0; i < this.#maxJellyfish; ++i) {\n this.#jellyfish.push(this.#createJellyfish(true));\n }\n\n for (let i = 0; i < this.#maxBubbles; ++i) {\n this.#bubbles.push(this.#createBubble(true));\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n this.#time += 0.001 * this.#speed * dt;\n\n for (const anemone of this.#anemones) {\n anemone.phase += 0.0008 * anemone.speed * this.#speed * dt;\n }\n\n for (let i = 0; i < this.#jellyfish.length; i++) {\n const jelly = this.#jellyfish[i];\n\n jelly.pulsePhase += 0.002 * jelly.speed * this.#speed * dt;\n jelly.y -= (jelly.speed * this.#speed * 0.015 * dt) / height;\n jelly.x += (Math.sin(this.#time * 2 + jelly.phase) * jelly.drift * dt) / width;\n\n if (jelly.y < -0.15) {\n this.#jellyfish[i] = this.#createJellyfish(false);\n }\n }\n\n for (let i = 0; i < this.#bubbles.length; i++) {\n const bubble = this.#bubbles[i];\n\n bubble.wobblePhase += 0.003 * this.#speed * dt;\n bubble.y -= (bubble.speed * this.#speed * 0.02 * dt) / height;\n bubble.x += (Math.sin(bubble.wobblePhase) * 0.15 * dt) / width;\n\n if (bubble.y < -0.05) {\n this.#bubbles[i] = this.#createBubble(false);\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n this.#drawAnemones(ctx, width, height);\n this.#drawJellyfish(ctx, width, height);\n this.#drawBubbles(ctx, width, height);\n }\n\n #drawAnemones(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n ctx.lineCap = 'round';\n\n for (const anemone of this.#anemones) {\n const baseX = anemone.x * width;\n const baseY = anemone.baseY * height;\n\n for (let seg = 0; seg < anemone.segments; seg++) {\n const ratio = seg / anemone.segments;\n const segWidth = anemone.width * this.#scale * (1 - ratio * 0.7);\n const sway = Math.sin(anemone.phase + seg * 0.6) * (12 + seg * 4) * this.#scale;\n\n let startX = baseX;\n let startY = baseY;\n\n for (let prev = 0; prev < seg; prev++) {\n const prevSway = Math.sin(anemone.phase + prev * 0.6) * (12 + prev * 4) * this.#scale;\n startX += prevSway * 0.15;\n startY -= anemone.segmentLength * this.#scale;\n }\n\n const endX = startX + sway * 0.15;\n const endY = startY - anemone.segmentLength * this.#scale;\n\n ctx.beginPath();\n ctx.moveTo(startX, startY);\n ctx.quadraticCurveTo(\n startX + sway * 0.5,\n (startY + endY) / 2,\n endX,\n endY\n );\n ctx.lineWidth = segWidth;\n ctx.strokeStyle = anemone.color;\n ctx.globalAlpha = 0.7 + ratio * 0.3;\n ctx.stroke();\n }\n }\n\n ctx.globalAlpha = 1;\n }\n\n #drawJellyfish(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n for (const jelly of this.#jellyfish) {\n const px = jelly.x * width;\n const py = jelly.y * height;\n const size = jelly.size * this.#scale;\n const pulse = 1 + Math.sin(jelly.pulsePhase) * 0.15;\n const bellWidth = size * pulse;\n const bellHeight = size * 0.6 * (1 / pulse);\n\n ctx.globalAlpha = 0.6;\n ctx.fillStyle = jelly.color;\n ctx.beginPath();\n ctx.ellipse(px, py, bellWidth, bellHeight, 0, Math.PI, 0);\n ctx.fill();\n\n ctx.globalAlpha = 0.3;\n ctx.fillStyle = jelly.color;\n ctx.beginPath();\n ctx.ellipse(px, py + bellHeight * 0.2, bellWidth * 0.7, bellHeight * 0.5, 0, Math.PI, 0);\n ctx.fill();\n\n ctx.globalAlpha = 0.4;\n ctx.strokeStyle = jelly.color;\n ctx.lineWidth = 1.5 * this.#scale;\n ctx.lineCap = 'round';\n\n const tentacleSpacing = (bellWidth * 2) / (jelly.tentacles + 1);\n\n for (let t = 0; t < jelly.tentacles; t++) {\n const tx = px - bellWidth + tentacleSpacing * (t + 1);\n const tentacleLength = size * (0.8 + MULBERRY.next() * 0.01);\n\n ctx.beginPath();\n ctx.moveTo(tx, py);\n\n const cp1x = tx + Math.sin(jelly.pulsePhase + t * 1.2) * size * 0.3;\n const cp1y = py + tentacleLength * 0.4;\n const cp2x = tx - Math.sin(jelly.pulsePhase * 0.7 + t * 0.9) * size * 0.2;\n const cp2y = py + tentacleLength * 0.7;\n const endX = tx + Math.sin(jelly.pulsePhase * 1.3 + t * 0.6) * size * 0.15;\n const endY = py + tentacleLength;\n\n ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, endX, endY);\n ctx.stroke();\n }\n\n ctx.globalAlpha = 0.3;\n ctx.fillStyle = '#ffffff';\n ctx.beginPath();\n ctx.ellipse(px - bellWidth * 0.25, py - bellHeight * 0.3, bellWidth * 0.15, bellHeight * 0.1, -0.3, 0, Math.PI * 2);\n ctx.fill();\n }\n\n ctx.globalAlpha = 1;\n }\n\n #drawBubbles(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n for (const bubble of this.#bubbles) {\n const px = bubble.x * width;\n const py = bubble.y * height;\n const radius = bubble.size * this.#scale;\n\n ctx.globalAlpha = bubble.opacity;\n ctx.beginPath();\n ctx.arc(px, py, radius, 0, Math.PI * 2);\n ctx.strokeStyle = 'rgba(255, 255, 255, 0.5)';\n ctx.lineWidth = 1;\n ctx.stroke();\n\n ctx.globalAlpha = bubble.opacity * 0.15;\n ctx.fillStyle = '#ffffff';\n ctx.fill();\n\n ctx.globalAlpha = bubble.opacity * 0.6;\n ctx.beginPath();\n ctx.ellipse(px - radius * 0.25, py - radius * 0.25, radius * 0.15, radius * 0.08, -0.5, 0, Math.PI * 2);\n ctx.fillStyle = '#ffffff';\n ctx.fill();\n }\n\n ctx.globalAlpha = 1;\n }\n\n #createAnemone(): CoralAnemone {\n return {\n x: 0.05 + MULBERRY.next() * 0.9,\n baseY: 0.92 + MULBERRY.next() * 0.08,\n segments: 4 + Math.floor(MULBERRY.next() * 4),\n segmentLength: 12 + MULBERRY.next() * 10,\n phase: MULBERRY.next() * Math.PI * 2,\n speed: 0.6 + MULBERRY.next() * 0.8,\n color: this.#colors[Math.floor(MULBERRY.next() * this.#colors.length)],\n width: 6 + MULBERRY.next() * 6\n };\n }\n\n #createJellyfish(initialSpread: boolean): CoralJellyfish {\n return {\n x: 0.1 + MULBERRY.next() * 0.8,\n y: initialSpread ? 0.1 + MULBERRY.next() * 0.7 : 1.15 + MULBERRY.next() * 0.1,\n size: 20 + MULBERRY.next() * 30,\n phase: MULBERRY.next() * Math.PI * 2,\n speed: 0.3 + MULBERRY.next() * 0.7,\n tentacles: 4 + Math.floor(MULBERRY.next() * 4),\n color: this.#colors[Math.floor(MULBERRY.next() * this.#colors.length)],\n pulsePhase: MULBERRY.next() * Math.PI * 2,\n drift: 0.3 + MULBERRY.next() * 0.5\n };\n }\n\n #createBubble(initialSpread: boolean): CoralBubble {\n return {\n x: MULBERRY.next(),\n y: initialSpread ? MULBERRY.next() : 1.05 + MULBERRY.next() * 0.1,\n size: 2 + MULBERRY.next() * 5,\n speed: 0.3 + MULBERRY.next() * 0.7,\n wobblePhase: MULBERRY.next() * Math.PI * 2,\n opacity: 0.2 + MULBERRY.next() * 0.4\n };\n }\n}\n","import { CoralReef } from './layer';\nimport type { CoralReefConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createCoralReef(config?: CoralReefConfig): Effect<CoralReefConfig> {\n return new CoralReef(config);\n}\n\nexport type { CoralReefConfig };\nexport type { CoralAnemone, CoralBubble, CoralJellyfish } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { CrystalBranch, CrystalSeed } from './types';\n\nconst DEG_TO_RAD = Math.PI / 180;\nconst TAU = Math.PI * 2;\nconst MAX_BRANCHES_PER_SEED = 80;\n\nexport interface CrystallizationConfig {\n readonly seeds?: number;\n readonly speed?: number;\n readonly branchAngle?: number;\n readonly maxDepth?: number;\n readonly color?: string;\n readonly scale?: number;\n}\n\nconst enum SeedPhase {\n Growing,\n Holding,\n Fading\n}\n\nexport class Crystallization extends Effect<CrystallizationConfig> {\n readonly #scale: number;\n readonly #seedCount: number;\n readonly #branchAngle: number;\n readonly #maxDepth: number;\n #speed: number;\n #seeds: CrystalSeed[] = [];\n #time: number = 0;\n #width: number = 0;\n #height: number = 0;\n #colorR: number;\n #colorG: number;\n #colorB: number;\n\n constructor(config: CrystallizationConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#seedCount = config.seeds ?? 5;\n this.#speed = config.speed ?? 1;\n this.#branchAngle = (config.branchAngle ?? 60) * DEG_TO_RAD;\n this.#maxDepth = config.maxDepth ?? 5;\n\n const {r, g, b} = this.#parseColor(config.color ?? '#88ccff');\n this.#colorR = r;\n this.#colorG = g;\n this.#colorB = b;\n }\n\n configure(config: Partial<CrystallizationConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n this.#seeds = [];\n\n for (let idx = 0; idx < this.#seedCount; ++idx) {\n this.#seeds.push(this.#createSeed(idx * 1.5));\n }\n }\n\n tick(dt: number, _width: number, _height: number): void {\n this.#time += 0.02 * dt * this.#speed;\n const growSpeed = 0.8 * dt * this.#speed;\n\n for (let idx = 0; idx < this.#seeds.length; ++idx) {\n const seed = this.#seeds[idx];\n\n if (seed.delay > 0) {\n seed.delay -= 0.02 * dt * this.#speed;\n continue;\n }\n\n if (seed.phase === SeedPhase.Growing) {\n const allGrown = this.#tickBranches(seed, seed.branches, growSpeed);\n\n if (allGrown) {\n seed.phase = SeedPhase.Holding;\n seed.holdTimer = 120;\n }\n } else if (seed.phase === SeedPhase.Holding) {\n seed.holdTimer -= dt * this.#speed;\n\n if (seed.holdTimer <= 0) {\n seed.phase = SeedPhase.Fading;\n }\n } else {\n seed.alpha -= 0.008 * dt * this.#speed;\n\n if (seed.alpha <= 0) {\n this.#seeds[idx] = this.#createSeed(0);\n }\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, _width: number, _height: number): void {\n const cr = this.#colorR;\n const cg = this.#colorG;\n const cb = this.#colorB;\n\n ctx.lineCap = 'round';\n\n for (const seed of this.#seeds) {\n if (seed.delay > 0 || seed.alpha <= 0) {\n continue;\n }\n\n const baseAlpha = seed.alpha;\n\n this.#drawBranches(ctx, seed.branches, baseAlpha, cr, cg, cb);\n this.#drawSparkles(ctx, seed.branches, baseAlpha, seed.sparklePhase);\n }\n\n ctx.globalAlpha = 1;\n }\n\n #tickBranches(seed: CrystalSeed, branches: CrystalBranch[], growSpeed: number): boolean {\n let allGrown = true;\n\n for (const branch of branches) {\n if (branch.growing) {\n branch.currentLength += growSpeed * (1 + branch.depth * 0.3);\n\n if (branch.currentLength >= branch.targetLength) {\n branch.currentLength = branch.targetLength;\n branch.growing = false;\n branch.grown = true;\n\n if (branch.depth < this.#maxDepth && seed.branchCount < MAX_BRANCHES_PER_SEED) {\n this.#spawnChildren(seed, branch);\n }\n }\n\n allGrown = false;\n }\n\n if (branch.children.length > 0) {\n if (!this.#tickBranches(seed, branch.children, growSpeed)) {\n allGrown = false;\n }\n }\n\n if (!branch.grown) {\n allGrown = false;\n }\n }\n\n return allGrown;\n }\n\n #drawBranches(ctx: CanvasRenderingContext2D, branches: CrystalBranch[], baseAlpha: number, cr: number, cg: number, cb: number): void {\n for (const branch of branches) {\n if (branch.currentLength <= 0) {\n continue;\n }\n\n const endX = branch.x + Math.cos(branch.angle) * branch.currentLength;\n const endY = branch.y + Math.sin(branch.angle) * branch.currentLength;\n const depthFade = 1 - branch.depth * 0.12;\n\n ctx.globalAlpha = baseAlpha * 0.12 * depthFade;\n ctx.strokeStyle = `rgb(${cr}, ${cg}, ${cb})`;\n ctx.lineWidth = branch.width + 4 * this.#scale;\n ctx.beginPath();\n ctx.moveTo(branch.x, branch.y);\n ctx.lineTo(endX, endY);\n ctx.stroke();\n\n ctx.globalAlpha = baseAlpha * 0.8 * depthFade;\n ctx.lineWidth = branch.width;\n ctx.beginPath();\n ctx.moveTo(branch.x, branch.y);\n ctx.lineTo(endX, endY);\n ctx.stroke();\n\n if (branch.children.length > 0) {\n this.#drawBranches(ctx, branch.children, baseAlpha, cr, cg, cb);\n }\n }\n }\n\n #drawSparkles(ctx: CanvasRenderingContext2D, branches: CrystalBranch[], baseAlpha: number, phase: number): void {\n for (const branch of branches) {\n if (branch.currentLength <= 0) {\n continue;\n }\n\n if (branch.growing || (branch.grown && branch.children.length === 0)) {\n const tipX = branch.x + Math.cos(branch.angle) * branch.currentLength;\n const tipY = branch.y + Math.sin(branch.angle) * branch.currentLength;\n const sparkle = 0.5 + 0.5 * Math.sin(this.#time * 10 + phase + branch.angle * 3);\n const radius = (1 + sparkle * 1.5) * this.#scale;\n\n ctx.globalAlpha = baseAlpha * sparkle * 0.8;\n ctx.fillStyle = '#ffffff';\n ctx.beginPath();\n ctx.arc(tipX, tipY, radius, 0, TAU);\n ctx.fill();\n }\n\n if (branch.children.length > 0) {\n this.#drawSparkles(ctx, branch.children, baseAlpha, phase);\n }\n }\n }\n\n #createSeed(delay: number): CrystalSeed {\n const seed: CrystalSeed = {\n x: MULBERRY.next() * this.#width,\n y: MULBERRY.next() * this.#height,\n branches: [],\n sparklePhase: MULBERRY.next() * TAU,\n alpha: 1,\n phase: SeedPhase.Growing,\n holdTimer: 0,\n delay,\n branchCount: 0\n };\n\n const baseLength = (30 + MULBERRY.next() * 40) * this.#scale;\n\n for (let branchIdx = 0; branchIdx < 6; ++branchIdx) {\n const angle = (TAU / 6) * branchIdx + MULBERRY.next() * 0.1;\n\n seed.branches.push({\n x: seed.x,\n y: seed.y,\n angle,\n length: 0,\n targetLength: baseLength + MULBERRY.next() * 20 * this.#scale,\n currentLength: 0,\n depth: 0,\n children: [],\n width: (2.5 + MULBERRY.next()) * this.#scale,\n growing: true,\n grown: false\n });\n\n seed.branchCount += 1;\n }\n\n return seed;\n }\n\n #spawnChildren(seed: CrystalSeed, parent: CrystalBranch): void {\n const tipX = parent.x + Math.cos(parent.angle) * parent.targetLength;\n const tipY = parent.y + Math.sin(parent.angle) * parent.targetLength;\n const childLength = parent.targetLength * (0.5 + MULBERRY.next() * 0.2);\n const childWidth = Math.max(0.5 * this.#scale, parent.width * 0.65);\n const nextDepth = parent.depth + 1;\n\n const spawnChance = 1 - nextDepth * 0.15;\n\n const angles = [\n parent.angle + this.#branchAngle,\n parent.angle - this.#branchAngle\n ];\n\n for (const angle of angles) {\n if (MULBERRY.next() > spawnChance || seed.branchCount >= MAX_BRANCHES_PER_SEED) {\n continue;\n }\n\n parent.children.push({\n x: tipX,\n y: tipY,\n angle,\n length: 0,\n targetLength: childLength + MULBERRY.next() * 10 * this.#scale,\n currentLength: 0,\n depth: nextDepth,\n children: [],\n width: childWidth,\n growing: true,\n grown: false\n });\n\n seed.branchCount += 1;\n }\n\n if (MULBERRY.next() > 0.5 && seed.branchCount < MAX_BRANCHES_PER_SEED) {\n parent.children.push({\n x: tipX,\n y: tipY,\n angle: parent.angle + (MULBERRY.next() - 0.5) * 0.15,\n length: 0,\n targetLength: childLength * 0.7 + MULBERRY.next() * 8 * this.#scale,\n currentLength: 0,\n depth: nextDepth,\n children: [],\n width: childWidth,\n growing: true,\n grown: false\n });\n\n seed.branchCount += 1;\n }\n }\n\n #parseColor(color: string): { r: number; g: number; b: number } {\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d')!;\n ctx.fillStyle = color;\n ctx.fillRect(0, 0, 1, 1);\n const data = ctx.getImageData(0, 0, 1, 1).data;\n return {r: data[0], g: data[1], b: data[2]};\n }\n}\n","import { Crystallization } from './layer';\nimport type { CrystallizationConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createCrystallization(config?: CrystallizationConfig): Effect<CrystallizationConfig> {\n return new Crystallization(config);\n}\n\nexport type { CrystallizationConfig };\nexport type { CrystalBranch, CrystalSeed } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n\nexport const BINARY_CHARS = '01';\nexport const HEX_CHARS = '0123456789ABCDEF';\nexport const MIXED_CHARS = '01023456789ABCDEF';\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { BINARY_CHARS, HEX_CHARS, MIXED_CHARS, MULBERRY } from './consts';\nimport type { DigitalRainColumn, DigitalRainMode } from './types';\n\nexport interface DigitalRainConfig {\n readonly speed?: number;\n readonly fontSize?: number;\n readonly columns?: number;\n readonly mode?: DigitalRainMode;\n readonly color?: string;\n readonly trailLength?: number;\n readonly scale?: number;\n}\n\nexport class DigitalRain extends Effect<DigitalRainConfig> {\n #speed: number;\n #trailLength: number;\n readonly #fontSize: number;\n readonly #mode: DigitalRainMode;\n readonly #colorRGB: [number, number, number];\n readonly #scale: number;\n #maxColumns: number;\n #columns: DigitalRainColumn[] = [];\n #respawnTimers: number[] = [];\n #width: number = 960;\n #height: number = 540;\n #initialized: boolean = false;\n\n constructor(config: DigitalRainConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#speed = config.speed ?? 1;\n this.#fontSize = (config.fontSize ?? 14) * this.#scale;\n this.#maxColumns = config.columns ?? 0;\n this.#mode = config.mode ?? 'hex';\n this.#colorRGB = hexToRGB(config.color ?? '#00ffaa');\n this.#trailLength = config.trailLength ?? 20;\n\n if (innerWidth < 991 && this.#maxColumns > 0) {\n this.#maxColumns = Math.floor(this.#maxColumns / 2);\n }\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n if (!this.#initialized) {\n this.#initialized = true;\n this.#columns = [];\n this.#respawnTimers = [];\n\n const columnWidth = this.#fontSize;\n const totalSlots = Math.floor(width / columnWidth);\n let columnCount: number;\n\n if (this.#maxColumns === 0) {\n columnCount = totalSlots;\n } else {\n columnCount = Math.min(this.#maxColumns, totalSlots);\n }\n\n if (innerWidth < 991 && this.#maxColumns === 0) {\n columnCount = Math.floor(columnCount / 2);\n }\n\n for (let i = 0; i < columnCount; ++i) {\n const column = this.#createColumn(totalSlots, height);\n this.#columns.push(column);\n this.#respawnTimers.push(0);\n }\n }\n }\n\n configure(config: Partial<DigitalRainConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.trailLength !== undefined) {\n this.#trailLength = config.trailLength;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n const columnWidth = this.#fontSize;\n const totalSlots = Math.floor(width / columnWidth);\n\n for (let i = 0; i < this.#columns.length; ++i) {\n if (this.#respawnTimers[i] > 0) {\n this.#respawnTimers[i] -= dt;\n\n if (this.#respawnTimers[i] <= 0) {\n this.#columns[i] = this.#createColumn(totalSlots, height);\n }\n\n continue;\n }\n\n const column = this.#columns[i];\n\n column.y += column.speed * this.#speed * dt;\n column.life += dt;\n\n // Randomly change characters as they fall\n for (let ci = 0; ci < column.chars.length; ++ci) {\n if (MULBERRY.next() < 0.04) {\n column.chars[ci] = this.#randomChar();\n }\n }\n\n const topOfTrail = column.y - (column.chars.length - 1) * this.#fontSize;\n\n if (topOfTrail > height) {\n this.#respawnTimers[i] = 10 + MULBERRY.next() * 60;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n ctx.fillStyle = 'rgb(0, 0, 0)';\n ctx.fillRect(0, 0, width, height);\n\n const [cr, cg, cb] = this.#colorRGB;\n\n ctx.font = `${this.#fontSize}px monospace`;\n ctx.textAlign = 'center';\n\n for (const column of this.#columns) {\n const charCount = column.chars.length;\n\n for (let ci = 0; ci < charCount; ++ci) {\n const charY = column.y - (charCount - 1 - ci) * this.#fontSize;\n\n if (charY < -this.#fontSize || charY > height + this.#fontSize) {\n continue;\n }\n\n const isHead = ci === charCount - 1;\n\n if (isHead) {\n ctx.fillStyle = 'rgba(255, 255, 255, 0.95)';\n } else {\n const trailProgress = ci / (charCount - 1);\n const alpha = trailProgress * 0.8 + 0.05;\n ctx.fillStyle = `rgba(${cr}, ${cg}, ${cb}, ${alpha})`;\n }\n\n ctx.fillText(column.chars[ci], column.x, charY);\n }\n }\n }\n\n #randomChar(): string {\n let charset: string;\n\n switch (this.#mode) {\n case 'binary':\n charset = BINARY_CHARS;\n break;\n case 'hex':\n charset = HEX_CHARS;\n break;\n case 'mixed':\n charset = MIXED_CHARS;\n break;\n }\n\n return charset[Math.floor(MULBERRY.next() * charset.length)];\n }\n\n #createColumn(totalSlots: number, height: number): DigitalRainColumn {\n const columnWidth = this.#fontSize;\n const slot = Math.floor(MULBERRY.next() * totalSlots);\n const length = Math.floor(this.#trailLength * 0.5 + MULBERRY.next() * this.#trailLength);\n const chars: string[] = [];\n\n for (let ci = 0; ci < length; ++ci) {\n chars.push(this.#randomChar());\n }\n\n return {\n x: slot * columnWidth + columnWidth / 2,\n y: -(MULBERRY.next() * height),\n speed: 1.5 + MULBERRY.next() * 3,\n chars,\n length,\n life: 0\n };\n }\n}\n","import { DigitalRain } from './layer';\nimport type { DigitalRainConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createDigitalRain(config?: DigitalRainConfig): Effect<DigitalRainConfig> {\n return new DigitalRain(config);\n}\n\nexport type { DigitalRainConfig };\nexport type { DigitalRainColumn, DigitalRainMode } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\nimport type { DonutsConfig } from './layer';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n\nexport const DEFAULT_CONFIG: DonutsConfig = {\n background: '#a51955',\n collisionPadding: 20,\n colors: ['#bd1961', '#da287c'],\n count: 12,\n mouseAvoidance: false,\n mouseAvoidanceRadius: 150,\n mouseAvoidanceStrength: 0.03,\n radiusRange: [60, 90],\n repulsionStrength: 0.02,\n rotationSpeedRange: [0.0005, 0.002],\n speedRange: [0.15, 0.6],\n thickness: 0.39\n};\n","import { Effect } from '../effect';\nimport { DEFAULT_CONFIG, MULBERRY } from './consts';\nimport type { Donut } from './donut';\n\nexport interface DonutsConfig {\n readonly background?: string;\n readonly collisionPadding?: number;\n readonly colors?: string[];\n readonly count?: number;\n readonly mouseAvoidance?: boolean;\n readonly mouseAvoidanceRadius?: number;\n readonly mouseAvoidanceStrength?: number;\n readonly radiusRange?: [number, number];\n readonly repulsionStrength?: number;\n readonly rotationSpeedRange?: [number, number];\n readonly scale?: number;\n readonly speedRange?: [number, number];\n readonly thickness?: number;\n}\n\nexport class Donuts extends Effect<DonutsConfig> {\n readonly #background: string;\n readonly #collisionPadding: number;\n readonly #colors: string[];\n readonly #count: number;\n #mouseAvoidance: boolean;\n #mouseAvoidanceRadius: number;\n #mouseAvoidanceStrength: number;\n readonly #radiusRange: [number, number];\n #repulsionStrength: number;\n readonly #rotationSpeedRange: [number, number];\n readonly #scale: number;\n readonly #speedRange: [number, number];\n readonly #thickness: number;\n readonly #onMouseMoveBound: (event: MouseEvent) => void;\n readonly #onMouseLeaveBound: () => void;\n #donuts: Donut[] = [];\n #mouseX: number = -1;\n #mouseY: number = -1;\n #mouseOnCanvas: boolean = false;\n #width: number = 960;\n #height: number = 540;\n #initialized: boolean = false;\n\n constructor(config: DonutsConfig = {}) {\n super();\n\n const scale = config.scale ?? 1;\n\n this.#background = config.background ?? DEFAULT_CONFIG.background!;\n this.#collisionPadding = (config.collisionPadding ?? DEFAULT_CONFIG.collisionPadding!) * scale;\n this.#colors = config.colors ?? DEFAULT_CONFIG.colors!;\n this.#count = config.count ?? DEFAULT_CONFIG.count!;\n this.#mouseAvoidance = config.mouseAvoidance ?? DEFAULT_CONFIG.mouseAvoidance!;\n this.#mouseAvoidanceRadius = (config.mouseAvoidanceRadius ?? DEFAULT_CONFIG.mouseAvoidanceRadius!) * scale;\n this.#mouseAvoidanceStrength = config.mouseAvoidanceStrength ?? DEFAULT_CONFIG.mouseAvoidanceStrength!;\n this.#radiusRange = [\n (config.radiusRange ?? DEFAULT_CONFIG.radiusRange!)[0] * scale,\n (config.radiusRange ?? DEFAULT_CONFIG.radiusRange!)[1] * scale\n ];\n this.#repulsionStrength = config.repulsionStrength ?? DEFAULT_CONFIG.repulsionStrength!;\n this.#rotationSpeedRange = config.rotationSpeedRange ?? DEFAULT_CONFIG.rotationSpeedRange!;\n this.#scale = scale;\n this.#speedRange = [\n (config.speedRange ?? DEFAULT_CONFIG.speedRange!)[0] * scale,\n (config.speedRange ?? DEFAULT_CONFIG.speedRange!)[1] * scale\n ];\n this.#thickness = config.thickness ?? DEFAULT_CONFIG.thickness!;\n\n this.#onMouseMoveBound = (event: MouseEvent) => this.#onMouseMove(event);\n this.#onMouseLeaveBound = () => this.#onMouseLeave();\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n if (!this.#initialized) {\n this.#initialized = true;\n this.#donuts = [];\n\n for (let i = 0; i < this.#count; i++) {\n this.#donuts.push(this.#createNonOverlapping());\n }\n }\n }\n\n onMount(canvas: HTMLCanvasElement): void {\n if (this.#mouseAvoidance) {\n canvas.addEventListener('mousemove', this.#onMouseMoveBound, {passive: true});\n canvas.addEventListener('mouseleave', this.#onMouseLeaveBound, {passive: true});\n }\n }\n\n onUnmount(canvas: HTMLCanvasElement): void {\n canvas.removeEventListener('mousemove', this.#onMouseMoveBound);\n canvas.removeEventListener('mouseleave', this.#onMouseLeaveBound);\n }\n\n configure(config: Partial<DonutsConfig>): void {\n if (config.mouseAvoidance !== undefined) {\n this.#mouseAvoidance = config.mouseAvoidance;\n }\n if (config.mouseAvoidanceRadius !== undefined) {\n this.#mouseAvoidanceRadius = config.mouseAvoidanceRadius;\n }\n if (config.mouseAvoidanceStrength !== undefined) {\n this.#mouseAvoidanceStrength = config.mouseAvoidanceStrength;\n }\n if (config.repulsionStrength !== undefined) {\n this.#repulsionStrength = config.repulsionStrength;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n this.#resolveCollisions(dt);\n\n if (this.#mouseAvoidance && this.#mouseOnCanvas) {\n this.#resolveMouseAvoidance(dt);\n }\n\n for (const donut of this.#donuts) {\n this.#updateDonut(donut, dt);\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n ctx.globalAlpha = 1;\n ctx.fillStyle = this.#background;\n ctx.fillRect(0, 0, width, height);\n\n for (const donut of this.#donuts) {\n const cos = Math.cos(donut.angle);\n const sin = Math.sin(donut.angle);\n\n ctx.save();\n ctx.transform(cos, sin, -sin, cos, donut.x, donut.y);\n\n ctx.beginPath();\n ctx.arc(0, 0, donut.outerRadius, 0, Math.PI * 2);\n ctx.arc(0, 0, donut.innerRadius, 0, Math.PI * 2, true);\n ctx.closePath();\n\n ctx.fillStyle = donut.color;\n ctx.fill();\n\n ctx.restore();\n }\n }\n\n #updateDonut(donut: Donut, dt: number): void {\n const currentSpeed = Math.sqrt(donut.vx * donut.vx + donut.vy * donut.vy);\n\n if (currentSpeed > donut.speed) {\n const damping = Math.pow(0.995, dt);\n donut.vx *= damping;\n donut.vy *= damping;\n }\n\n donut.x += donut.vx * dt;\n donut.y += donut.vy * dt;\n donut.angle += donut.rotationSpeed * dt;\n\n const limit = donut.outerRadius * 0.5;\n const width = this.#width;\n const height = this.#height;\n\n if (donut.x < -limit) {\n donut.x = -limit;\n donut.vx = Math.abs(donut.vx);\n }\n\n if (donut.x > width + limit) {\n donut.x = width + limit;\n donut.vx = -Math.abs(donut.vx);\n }\n\n if (donut.y < -limit) {\n donut.y = -limit;\n donut.vy = Math.abs(donut.vy);\n }\n\n if (donut.y > height + limit) {\n donut.y = height + limit;\n donut.vy = -Math.abs(donut.vy);\n }\n }\n\n #onMouseMove(event: MouseEvent): void {\n const target = event.currentTarget as HTMLCanvasElement;\n const rect = target.getBoundingClientRect();\n this.#mouseX = event.clientX - rect.left;\n this.#mouseY = event.clientY - rect.top;\n this.#mouseOnCanvas = true;\n }\n\n #onMouseLeave(): void {\n this.#mouseOnCanvas = false;\n }\n\n #resolveMouseAvoidance(dt: number): void {\n const radius = this.#mouseAvoidanceRadius;\n const strength = this.#mouseAvoidanceStrength;\n const mx = this.#mouseX;\n const my = this.#mouseY;\n\n for (const donut of this.#donuts) {\n const dx = donut.x - mx;\n const dy = donut.y - my;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const minDist = donut.outerRadius + radius;\n\n if (dist < minDist && dist > 0) {\n const overlap = minDist - dist;\n const nx = dx / dist;\n const ny = dy / dist;\n const force = overlap * strength * dt;\n\n donut.vx += nx * force;\n donut.vy += ny * force;\n }\n }\n }\n\n #resolveCollisions(dt: number): void {\n const padding = this.#collisionPadding;\n const strength = this.#repulsionStrength;\n\n for (let i = 0; i < this.#donuts.length; i++) {\n for (let j = i + 1; j < this.#donuts.length; j++) {\n const a = this.#donuts[i];\n const b = this.#donuts[j];\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const minDist = a.outerRadius + b.outerRadius + padding;\n\n if (dist < minDist && dist > 0) {\n const overlap = minDist - dist;\n const nx = dx / dist;\n const ny = dy / dist;\n const force = overlap * strength * dt;\n\n a.vx -= nx * force;\n a.vy -= ny * force;\n b.vx += nx * force;\n b.vy += ny * force;\n }\n }\n }\n }\n\n #createDonut(): Donut {\n const outerRadius = this.#rand(this.#radiusRange[0], this.#radiusRange[1]);\n const innerRadius = outerRadius * (1 - this.#thickness);\n const speed = this.#rand(this.#speedRange[0], this.#speedRange[1]);\n const direction = MULBERRY.next() * Math.PI * 2;\n\n return {\n outerRadius,\n innerRadius,\n x: this.#rand(-outerRadius, this.#width + outerRadius),\n y: this.#rand(-outerRadius, this.#height + outerRadius),\n angle: MULBERRY.next() * Math.PI * 2,\n speed,\n rotationSpeed: this.#rand(this.#rotationSpeedRange[0], this.#rotationSpeedRange[1]) * (MULBERRY.next() > 0.5 ? 1 : -1),\n color: this.#colors[Math.floor(MULBERRY.next() * this.#colors.length)],\n vx: Math.cos(direction) * speed,\n vy: Math.sin(direction) * speed\n };\n }\n\n #createNonOverlapping(maxAttempts: number = 200): Donut {\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const donut = this.#createDonut();\n\n if (!this.#overlapsAny(donut)) {\n return donut;\n }\n }\n\n return this.#createDonut();\n }\n\n #overlapsAny(donut: Donut): boolean {\n const minDist = this.#collisionPadding;\n\n return this.#donuts.some((other) => {\n const dx = donut.x - other.x;\n const dy = donut.y - other.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n return dist < donut.outerRadius + other.outerRadius + minDist;\n });\n }\n\n #rand(min: number, max: number): number {\n return MULBERRY.next() * (max - min) + min;\n }\n}\n","import { Donuts } from './layer';\nimport type { DonutsConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createDonuts(config?: DonutsConfig): Effect<DonutsConfig> {\n return new Donuts(config);\n}\n\nexport type { DonutsConfig };\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { Firefly } from './types';\n\nconst SPRITE_SIZE = 64;\nconst SPRITE_CENTER = SPRITE_SIZE / 2;\nconst SPRITE_RADIUS = SPRITE_SIZE / 2;\n\nexport interface FirefliesConfig {\n readonly count?: number;\n readonly color?: string;\n readonly size?: number;\n readonly speed?: number;\n readonly glowSpeed?: number;\n readonly scale?: number;\n}\n\nexport class Fireflies extends Effect<FirefliesConfig> {\n readonly #scale: number;\n readonly #size: number;\n #speed: number;\n #glowSpeed: number;\n #maxCount: number;\n #time: number = 0;\n #fireflies: Firefly[] = [];\n #sprite: HTMLCanvasElement;\n\n constructor(config: FirefliesConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxCount = config.count ?? 60;\n this.#size = (config.size ?? 6) * this.#scale;\n this.#speed = config.speed ?? 1;\n this.#glowSpeed = config.glowSpeed ?? 1;\n\n const {r, g, b} = this.#parseColor(config.color ?? '#b4ff6a');\n\n if (innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n\n this.#sprite = this.#createSprite(r, g, b);\n\n for (let i = 0; i < this.#maxCount; ++i) {\n this.#fireflies.push(this.#createFirefly());\n }\n }\n\n configure(config: Partial<FirefliesConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.glowSpeed !== undefined) {\n this.#glowSpeed = config.glowSpeed;\n }\n }\n\n tick(dt: number, _width: number, _height: number): void {\n this.#time += 0.02 * dt * this.#speed;\n\n for (const firefly of this.#fireflies) {\n const moveX = Math.sin(this.#time * firefly.freqX1 + firefly.phaseX1) * firefly.amplitudeX\n + Math.sin(this.#time * firefly.freqX2 + firefly.phaseX2) * firefly.amplitudeX * 0.5;\n\n const moveY = Math.sin(this.#time * firefly.freqY1 + firefly.phaseY1) * firefly.amplitudeY\n + Math.sin(this.#time * firefly.freqY2 + firefly.phaseY2) * firefly.amplitudeY * 0.5;\n\n firefly.x += moveX * dt / (3000 * (1 / this.#speed));\n firefly.y += moveY * dt / (3000 * (1 / this.#speed));\n\n if (firefly.x > 1.1) {\n firefly.x = -0.1;\n } else if (firefly.x < -0.1) {\n firefly.x = 1.1;\n }\n\n if (firefly.y > 1.1) {\n firefly.y = -0.1;\n } else if (firefly.y < -0.1) {\n firefly.y = 1.1;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n ctx.globalCompositeOperation = 'lighter';\n\n for (const firefly of this.#fireflies) {\n const alpha = 0.5 + 0.5 * Math.sin(this.#time * firefly.glowSpeed * this.#glowSpeed + firefly.phase);\n\n if (alpha < 0.05) {\n continue;\n }\n\n const px = firefly.x * width;\n const py = firefly.y * height;\n const displaySize = firefly.size * 2;\n\n ctx.globalAlpha = alpha;\n ctx.drawImage(\n this.#sprite,\n px - firefly.size,\n py - firefly.size,\n displaySize,\n displaySize\n );\n }\n\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = 1;\n }\n\n #parseColor(color: string): { r: number; g: number; b: number } {\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d')!;\n ctx.fillStyle = color;\n ctx.fillRect(0, 0, 1, 1);\n const data = ctx.getImageData(0, 0, 1, 1).data;\n return {r: data[0], g: data[1], b: data[2]};\n }\n\n #createSprite(r: number, g: number, b: number): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.width = SPRITE_SIZE;\n canvas.height = SPRITE_SIZE;\n const ctx = canvas.getContext('2d')!;\n\n const gradient = ctx.createRadialGradient(\n SPRITE_CENTER, SPRITE_CENTER, 0,\n SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS\n );\n\n gradient.addColorStop(0, `rgba(${r}, ${g}, ${b}, 1)`);\n gradient.addColorStop(0.1, `rgba(${r}, ${g}, ${b}, 0.8)`);\n gradient.addColorStop(0.4, `rgba(${r}, ${g}, ${b}, 0.3)`);\n gradient.addColorStop(0.7, `rgba(${r}, ${g}, ${b}, 0.08)`);\n gradient.addColorStop(1, `rgba(${r}, ${g}, ${b}, 0)`);\n\n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.arc(SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS, 0, Math.PI * 2);\n ctx.fill();\n\n return canvas;\n }\n\n #createFirefly(): Firefly {\n return {\n x: MULBERRY.next(),\n y: MULBERRY.next(),\n size: (MULBERRY.next() * 0.6 + 0.4) * this.#size,\n phase: MULBERRY.next() * Math.PI * 2,\n glowSpeed: 0.5 + MULBERRY.next() * 1.5,\n freqX1: 0.3 + MULBERRY.next() * 0.7,\n freqX2: 1.2 + MULBERRY.next() * 1.8,\n freqY1: 0.3 + MULBERRY.next() * 0.7,\n freqY2: 1.2 + MULBERRY.next() * 1.8,\n phaseX1: MULBERRY.next() * Math.PI * 2,\n phaseX2: MULBERRY.next() * Math.PI * 2,\n phaseY1: MULBERRY.next() * Math.PI * 2,\n phaseY2: MULBERRY.next() * Math.PI * 2,\n amplitudeX: 0.3 + MULBERRY.next() * 0.7,\n amplitudeY: 0.3 + MULBERRY.next() * 0.7\n };\n }\n}\n","export interface FireflyParticleConfig {\n readonly glowSpeed?: number;\n readonly scale?: number;\n readonly size?: number;\n readonly speed?: number;\n}\n\nexport function createFireflySprite(color: string, size: number = 64): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n\n const ctx = canvas.getContext('2d')!;\n const center = size / 2;\n const radius = size / 2;\n\n const tmp = document.createElement('canvas');\n tmp.width = 1;\n tmp.height = 1;\n const tmpCtx = tmp.getContext('2d')!;\n tmpCtx.fillStyle = color;\n tmpCtx.fillRect(0, 0, 1, 1);\n const [r, g, b] = tmpCtx.getImageData(0, 0, 1, 1).data;\n\n const gradient = ctx.createRadialGradient(center, center, 0, center, center, radius);\n gradient.addColorStop(0, `rgba(${r}, ${g}, ${b}, 1)`);\n gradient.addColorStop(0.1, `rgba(${r}, ${g}, ${b}, 0.8)`);\n gradient.addColorStop(0.4, `rgba(${r}, ${g}, ${b}, 0.3)`);\n gradient.addColorStop(0.7, `rgba(${r}, ${g}, ${b}, 0.08)`);\n gradient.addColorStop(1, `rgba(${r}, ${g}, ${b}, 0)`);\n\n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.arc(center, center, radius, 0, Math.PI * 2);\n ctx.fill();\n\n return canvas;\n}\n\nexport class FireflyParticle {\n readonly #sprite: HTMLCanvasElement;\n readonly #bounds: { width: number; height: number };\n readonly #glowSpeed: number;\n readonly #size: number;\n readonly #speed: number;\n readonly #phase: number;\n readonly #freqX1: number;\n readonly #freqX2: number;\n readonly #freqY1: number;\n readonly #freqY2: number;\n readonly #phaseX1: number;\n readonly #phaseX2: number;\n readonly #phaseY1: number;\n readonly #phaseY2: number;\n readonly #amplitudeX: number;\n readonly #amplitudeY: number;\n #x: number;\n #y: number;\n #time: number = 0;\n\n get position(): { x: number; y: number } {\n return {x: this.#x, y: this.#y};\n }\n\n constructor(x: number, y: number, bounds: { width: number; height: number }, sprite: HTMLCanvasElement, config: FireflyParticleConfig = {}) {\n this.#x = x;\n this.#y = y;\n this.#bounds = bounds;\n this.#sprite = sprite;\n this.#glowSpeed = config.glowSpeed ?? (0.5 + Math.random() * 1.5);\n this.#size = (config.size ?? 6) * (config.scale ?? 1);\n this.#speed = config.speed ?? 1;\n this.#phase = Math.random() * Math.PI * 2;\n this.#freqX1 = 0.3 + Math.random() * 0.7;\n this.#freqX2 = 1.2 + Math.random() * 1.8;\n this.#freqY1 = 0.3 + Math.random() * 0.7;\n this.#freqY2 = 1.2 + Math.random() * 1.8;\n this.#phaseX1 = Math.random() * Math.PI * 2;\n this.#phaseX2 = Math.random() * Math.PI * 2;\n this.#phaseY1 = Math.random() * Math.PI * 2;\n this.#phaseY2 = Math.random() * Math.PI * 2;\n this.#amplitudeX = 0.3 + Math.random() * 0.7;\n this.#amplitudeY = 0.3 + Math.random() * 0.7;\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n const alpha = 0.5 + 0.5 * Math.sin(this.#time * this.#glowSpeed + this.#phase);\n\n if (alpha < 0.05) {\n return;\n }\n\n const displaySize = this.#size * 2;\n\n ctx.globalAlpha = alpha;\n ctx.drawImage(this.#sprite, this.#x - this.#size, this.#y - this.#size, displaySize, displaySize);\n ctx.globalAlpha = 1;\n }\n\n tick(dt: number = 1): void {\n this.#time += 0.02 * dt * this.#speed;\n\n const moveX = Math.sin(this.#time * this.#freqX1 + this.#phaseX1) * this.#amplitudeX * this.#bounds.width\n + Math.sin(this.#time * this.#freqX2 + this.#phaseX2) * this.#amplitudeX * this.#bounds.width * 0.5;\n\n const moveY = Math.sin(this.#time * this.#freqY1 + this.#phaseY1) * this.#amplitudeY * this.#bounds.height\n + Math.sin(this.#time * this.#freqY2 + this.#phaseY2) * this.#amplitudeY * this.#bounds.height * 0.5;\n\n this.#x += (moveX / 3000) * dt;\n this.#y += (moveY / 3000) * dt;\n\n if (this.#x > this.#bounds.width + this.#size) {\n this.#x = -this.#size;\n } else if (this.#x < -this.#size) {\n this.#x = this.#bounds.width + this.#size;\n }\n\n if (this.#y > this.#bounds.height + this.#size) {\n this.#y = -this.#size;\n } else if (this.#y < -this.#size) {\n this.#y = this.#bounds.height + this.#size;\n }\n }\n}\n","import { Fireflies } from './layer';\nimport type { FirefliesConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createFireflies(config?: FirefliesConfig): Effect<FirefliesConfig> {\n return new Fireflies(config);\n}\n\nexport { FireflyParticle, createFireflySprite } from './particle';\nexport type { FirefliesConfig };\nexport type { FireflyParticleConfig } from './particle';\nexport type { Firefly } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { Ember, FlameLayer } from './types';\n\nexport interface FirepitConfig {\n readonly embers?: number;\n readonly flameWidth?: number;\n readonly flameHeight?: number;\n readonly intensity?: number;\n readonly scale?: number;\n}\n\nexport class Firepit extends Effect<FirepitConfig> {\n readonly #scale: number;\n #flameWidth: number;\n #flameHeight: number;\n #intensity: number;\n #maxEmbers: number;\n #time: number = 0;\n #embers: Ember[] = [];\n #flameLayers: FlameLayer[] = [];\n\n constructor(config: FirepitConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxEmbers = config.embers ?? 60;\n this.#flameWidth = config.flameWidth ?? 0.4;\n this.#flameHeight = config.flameHeight ?? 0.35;\n this.#intensity = config.intensity ?? 1;\n\n if (innerWidth < 991) {\n this.#maxEmbers = Math.floor(this.#maxEmbers / 2);\n }\n\n for (let i = 0; i < 5; i++) {\n this.#flameLayers.push({\n x: 0.5 + (MULBERRY.next() - 0.5) * 0.1,\n phase: MULBERRY.next() * Math.PI * 2,\n speed: 1.5 + MULBERRY.next() * 2,\n amplitude: 0.02 + MULBERRY.next() * 0.03,\n width: this.#flameWidth * (0.6 + MULBERRY.next() * 0.4),\n height: this.#flameHeight * (0.7 + MULBERRY.next() * 0.3)\n });\n }\n }\n\n configure(config: Partial<FirepitConfig>): void {\n if (config.intensity !== undefined) {\n this.#intensity = config.intensity;\n }\n if (config.flameWidth !== undefined) {\n this.#flameWidth = config.flameWidth;\n }\n if (config.flameHeight !== undefined) {\n this.#flameHeight = config.flameHeight;\n }\n }\n\n tick(dt: number, _width: number, _height: number): void {\n this.#time += 0.03 * dt * this.#intensity;\n\n if (this.#embers.length < this.#maxEmbers && MULBERRY.next() < 0.3 * this.#intensity * dt) {\n this.#embers.push(this.#createEmber());\n }\n\n let alive = 0;\n\n for (let i = 0; i < this.#embers.length; i++) {\n const ember = this.#embers[i];\n\n ember.x += ember.vx * dt;\n ember.y += ember.vy * dt;\n ember.vx += (MULBERRY.next() - 0.5) * 0.0002 * dt;\n ember.vy -= 0.00005 * dt;\n ember.life -= dt;\n ember.flicker = 0.6 + Math.sin(this.#time * 8 + ember.brightness * 20) * 0.4;\n\n if (ember.life > 0) {\n this.#embers[alive++] = ember;\n }\n }\n\n this.#embers.length = alive;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n this.#drawFlames(ctx, width, height);\n this.#drawEmbers(ctx, width, height);\n }\n\n #drawFlames(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const baseY = height * 0.85;\n const centerX = width * 0.5;\n\n ctx.globalCompositeOperation = 'lighter';\n\n for (let layerIndex = 0; layerIndex < this.#flameLayers.length; layerIndex++) {\n const layer = this.#flameLayers[layerIndex];\n const wobbleX = Math.sin(this.#time * layer.speed + layer.phase) * layer.amplitude * width;\n const flameW = layer.width * width * this.#scale * 0.5;\n const flameH = layer.height * height * this.#scale;\n\n const gradient = ctx.createRadialGradient(\n centerX + wobbleX, baseY, 0,\n centerX + wobbleX, baseY - flameH * 0.5, flameH * 0.6\n );\n\n const alphaBase = (0.15 + layerIndex * 0.03) * this.#intensity;\n const flicker = 0.85 + Math.sin(this.#time * (3 + layerIndex) + layer.phase) * 0.15;\n const alpha = alphaBase * flicker;\n\n if (layerIndex < 2) {\n gradient.addColorStop(0, `rgba(255, 255, 200, ${alpha})`);\n gradient.addColorStop(0.3, `rgba(255, 180, 50, ${alpha * 0.8})`);\n gradient.addColorStop(0.6, `rgba(255, 100, 20, ${alpha * 0.5})`);\n gradient.addColorStop(1, `rgba(200, 30, 0, 0)`);\n } else {\n gradient.addColorStop(0, `rgba(255, 200, 80, ${alpha * 0.7})`);\n gradient.addColorStop(0.4, `rgba(255, 120, 30, ${alpha * 0.5})`);\n gradient.addColorStop(1, `rgba(180, 40, 0, 0)`);\n }\n\n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.ellipse(centerX + wobbleX, baseY, flameW, flameH, 0, 0, Math.PI * 2);\n ctx.fill();\n }\n\n const glowGradient = ctx.createRadialGradient(\n centerX, height * 0.85, 0,\n centerX, height * 0.85, width * 0.35 * this.#scale\n );\n const glowAlpha = 0.06 * this.#intensity * (0.9 + Math.sin(this.#time * 2) * 0.1);\n glowGradient.addColorStop(0, `rgba(255, 150, 50, ${glowAlpha})`);\n glowGradient.addColorStop(0.5, `rgba(255, 80, 20, ${glowAlpha * 0.3})`);\n glowGradient.addColorStop(1, 'rgba(255, 50, 0, 0)');\n ctx.fillStyle = glowGradient;\n ctx.fillRect(0, 0, width, height);\n\n ctx.globalCompositeOperation = 'source-over';\n }\n\n #drawEmbers(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n ctx.globalCompositeOperation = 'lighter';\n\n for (const ember of this.#embers) {\n const px = ember.x * width;\n const py = ember.y * height;\n const lifeRatio = ember.life / ember.maxLife;\n const alpha = lifeRatio * ember.flicker * this.#intensity;\n const size = ember.size * this.#scale * (0.5 + lifeRatio * 0.5);\n\n if (alpha < 0.02) {\n continue;\n }\n\n const gradient = ctx.createRadialGradient(px, py, 0, px, py, size * 3);\n gradient.addColorStop(0, `rgba(255, ${180 + ember.brightness * 75}, ${50 + ember.brightness * 100}, ${alpha})`);\n gradient.addColorStop(0.3, `rgba(255, ${120 + ember.brightness * 50}, 20, ${alpha * 0.5})`);\n gradient.addColorStop(1, `rgba(255, 80, 0, 0)`);\n\n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.arc(px, py, size * 3, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.fillStyle = `rgba(255, ${200 + ember.brightness * 55}, ${100 + ember.brightness * 100}, ${alpha * 0.8})`;\n ctx.beginPath();\n ctx.arc(px, py, size * 0.5, 0, Math.PI * 2);\n ctx.fill();\n }\n\n ctx.globalCompositeOperation = 'source-over';\n }\n\n #createEmber(): Ember {\n const baseY = 0.85;\n const maxLife = 60 + MULBERRY.next() * 120;\n\n return {\n x: 0.5 + (MULBERRY.next() - 0.5) * this.#flameWidth * 0.6,\n y: baseY - MULBERRY.next() * this.#flameHeight * 0.3,\n vx: (MULBERRY.next() - 0.5) * 0.002,\n vy: -(0.001 + MULBERRY.next() * 0.003),\n size: (1 + MULBERRY.next() * 2.5) * this.#scale,\n life: maxLife,\n maxLife,\n brightness: MULBERRY.next(),\n flicker: 1\n };\n }\n}\n","import { Firepit } from './layer';\nimport type { FirepitConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createFirepit(config?: FirepitConfig): Effect<FirepitConfig> {\n return new Firepit(config);\n}\n\nexport type { FirepitConfig };\nexport type { Ember, FlameLayer } from './types';\n","import { mulberry32, type Mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\nexport const FIREWORK_TRAIL_MEMORY = 6;\n","export type ExplosionType = 'peony' | 'chrysanthemum' | 'willow' | 'ring' | 'palm' | 'crackle' | 'crossette' | 'dahlia' | 'brocade' | 'horsetail' | 'strobe' | 'heart' | 'spiral' | 'flower';\n\nexport type FireworkVariant = ExplosionType | 'saturn' | 'concentric';\n\nexport type ParticleShape = 'line' | 'circle' | 'star' | 'diamond';\n\nexport interface ExplosionConfig {\n readonly particleCount: [number, number];\n readonly speed: [number, number];\n readonly friction: number;\n readonly gravity: number;\n readonly decay: [number, number];\n readonly trailMemory: number;\n readonly hueVariation: number;\n readonly brightness: [number, number];\n readonly lineWidthScale: number;\n readonly shape: ParticleShape;\n readonly sparkle: boolean;\n readonly strobe: boolean;\n readonly spread3d: boolean;\n readonly glowSize: number;\n}\n\nexport interface FireworksConfig {\n readonly scale?: number;\n readonly autoSpawn?: boolean;\n readonly variants?: FireworkVariant[];\n}\n\nexport const FIREWORK_VARIANTS: FireworkVariant[] = [\n 'peony', 'chrysanthemum', 'willow', 'ring', 'palm', 'crackle', 'crossette',\n 'saturn', 'dahlia', 'brocade', 'horsetail', 'strobe', 'heart', 'spiral', 'flower', 'concentric'\n];\n\nexport const EXPLOSION_CONFIGS: Record<ExplosionType, ExplosionConfig> = {\n peony: {\n particleCount: [50, 70],\n speed: [2, 10],\n friction: 0.96,\n gravity: 0.8,\n decay: [0.012, 0.025],\n trailMemory: 3,\n hueVariation: 30,\n brightness: [50, 80],\n lineWidthScale: 0.8,\n shape: 'circle',\n sparkle: false,\n strobe: false,\n spread3d: true,\n glowSize: 12\n },\n chrysanthemum: {\n particleCount: [80, 120],\n speed: [3, 12],\n friction: 0.975,\n gravity: 0.5,\n decay: [0.006, 0.012],\n trailMemory: 6,\n hueVariation: 20,\n brightness: [55, 85],\n lineWidthScale: 0.5,\n shape: 'line',\n sparkle: true,\n strobe: false,\n spread3d: true,\n glowSize: 15\n },\n willow: {\n particleCount: [50, 70],\n speed: [3, 10],\n friction: 0.988,\n gravity: 1.5,\n decay: [0.004, 0.008],\n trailMemory: 10,\n hueVariation: 15,\n brightness: [60, 90],\n lineWidthScale: 0.4,\n shape: 'line',\n sparkle: false,\n strobe: false,\n spread3d: false,\n glowSize: 10\n },\n ring: {\n particleCount: [40, 60],\n speed: [6, 8],\n friction: 0.96,\n gravity: 0.4,\n decay: [0.012, 0.022],\n trailMemory: 4,\n hueVariation: 10,\n brightness: [55, 80],\n lineWidthScale: 0.7,\n shape: 'diamond',\n sparkle: false,\n strobe: false,\n spread3d: false,\n glowSize: 14\n },\n palm: {\n particleCount: [20, 30],\n speed: [5, 12],\n friction: 0.97,\n gravity: 1.2,\n decay: [0.006, 0.014],\n trailMemory: 6,\n hueVariation: 20,\n brightness: [55, 85],\n lineWidthScale: 0.6,\n shape: 'line',\n sparkle: false,\n strobe: false,\n spread3d: false,\n glowSize: 12\n },\n crackle: {\n particleCount: [40, 55],\n speed: [2, 8],\n friction: 0.955,\n gravity: 0.8,\n decay: [0.012, 0.025],\n trailMemory: 2,\n hueVariation: 25,\n brightness: [60, 90],\n lineWidthScale: 0.6,\n shape: 'star',\n sparkle: false,\n strobe: false,\n spread3d: true,\n glowSize: 8\n },\n crossette: {\n particleCount: [16, 20],\n speed: [5, 9],\n friction: 0.965,\n gravity: 0.6,\n decay: [0.006, 0.014],\n trailMemory: 4,\n hueVariation: 15,\n brightness: [55, 85],\n lineWidthScale: 0.7,\n shape: 'circle',\n sparkle: false,\n strobe: false,\n spread3d: true,\n glowSize: 12\n },\n dahlia: {\n particleCount: [48, 80],\n speed: [3, 9],\n friction: 0.965,\n gravity: 0.7,\n decay: [0.010, 0.020],\n trailMemory: 4,\n hueVariation: 5,\n brightness: [55, 85],\n lineWidthScale: 0.7,\n shape: 'circle',\n sparkle: false,\n strobe: false,\n spread3d: true,\n glowSize: 12\n },\n brocade: {\n particleCount: [60, 80],\n speed: [3, 9],\n friction: 0.98,\n gravity: 1.3,\n decay: [0.004, 0.010],\n trailMemory: 10,\n hueVariation: 10,\n brightness: [60, 90],\n lineWidthScale: 0.4,\n shape: 'line',\n sparkle: true,\n strobe: false,\n spread3d: false,\n glowSize: 10\n },\n horsetail: {\n particleCount: [30, 40],\n speed: [8, 14],\n friction: 0.975,\n gravity: 2.0,\n decay: [0.004, 0.010],\n trailMemory: 12,\n hueVariation: 15,\n brightness: [60, 90],\n lineWidthScale: 0.5,\n shape: 'line',\n sparkle: false,\n strobe: false,\n spread3d: false,\n glowSize: 10\n },\n strobe: {\n particleCount: [40, 55],\n speed: [2, 8],\n friction: 0.96,\n gravity: 0.7,\n decay: [0.010, 0.020],\n trailMemory: 2,\n hueVariation: 10,\n brightness: [75, 95],\n lineWidthScale: 0.6,\n shape: 'circle',\n sparkle: false,\n strobe: true,\n spread3d: true,\n glowSize: 10\n },\n heart: {\n particleCount: [60, 80],\n speed: [3, 5],\n friction: 0.965,\n gravity: 0.3,\n decay: [0.008, 0.016],\n trailMemory: 4,\n hueVariation: 15,\n brightness: [55, 85],\n lineWidthScale: 0.7,\n shape: 'circle',\n sparkle: false,\n strobe: false,\n spread3d: false,\n glowSize: 12\n },\n spiral: {\n particleCount: [45, 60],\n speed: [2, 10],\n friction: 0.97,\n gravity: 0.4,\n decay: [0.008, 0.016],\n trailMemory: 5,\n hueVariation: 10,\n brightness: [55, 85],\n lineWidthScale: 0.6,\n shape: 'circle',\n sparkle: false,\n strobe: false,\n spread3d: false,\n glowSize: 12\n },\n flower: {\n particleCount: [70, 90],\n speed: [3, 7],\n friction: 0.965,\n gravity: 0.3,\n decay: [0.008, 0.016],\n trailMemory: 4,\n hueVariation: 20,\n brightness: [55, 85],\n lineWidthScale: 0.7,\n shape: 'circle',\n sparkle: false,\n strobe: false,\n spread3d: false,\n glowSize: 12\n }\n};\n","import type { Point } from '../point';\nimport { MULBERRY } from './consts';\nimport { EXPLOSION_CONFIGS, type ExplosionConfig, type ExplosionType, type ParticleShape } from './types';\n\nconst PERSPECTIVE = 800;\n\nexport class Explosion {\n readonly #position: Point;\n readonly #angle: number;\n readonly #brightness: number;\n readonly #config: ExplosionConfig;\n readonly #decay: number;\n readonly #hue: number;\n readonly #lineWidth: number;\n readonly #shape: ParticleShape;\n readonly #trail: Point[] = [];\n readonly #type: ExplosionType;\n #alpha: number = 1;\n #depthScale: number = 1;\n #hasCrackled: boolean = false;\n #hasSplit: boolean = false;\n #speed: number;\n #sparkleTimer: number = 0;\n #vz: number;\n #z: number = 0;\n\n get angle(): number {\n return this.#angle;\n }\n\n get hue(): number {\n return this.#hue;\n }\n\n get isDead(): boolean {\n return this.#alpha <= 0;\n }\n\n get position(): Point {\n return this.#position;\n }\n\n get type(): ExplosionType {\n return this.#type;\n }\n\n constructor(position: Point, hue: number, lineWidth: number, type: ExplosionType, scale: number = 1, angle?: number, speed?: number, vz?: number) {\n const config = EXPLOSION_CONFIGS[type];\n\n this.#config = config;\n this.#type = type;\n this.#shape = config.shape;\n this.#position = {...position};\n this.#alpha = 1;\n this.#angle = angle ?? MULBERRY.nextBetween(0, Math.PI * 2);\n this.#brightness = MULBERRY.nextBetween(config.brightness[0], config.brightness[1]);\n this.#decay = MULBERRY.nextBetween(config.decay[0], config.decay[1]);\n this.#hue = hue + MULBERRY.nextBetween(-config.hueVariation, config.hueVariation);\n this.#lineWidth = lineWidth * config.lineWidthScale;\n this.#speed = (speed ?? MULBERRY.nextBetween(config.speed[0], config.speed[1])) * scale;\n\n if (vz !== undefined) {\n this.#vz = vz * scale;\n } else if (config.spread3d) {\n this.#vz = MULBERRY.nextBetween(-this.#speed * 0.5, this.#speed * 0.5);\n } else {\n this.#vz = 0;\n }\n\n for (let i = 0; i < config.trailMemory; i++) {\n this.#trail.push({...position});\n }\n }\n\n checkCrackle(): boolean {\n if (this.#type !== 'crackle' || this.#hasCrackled) {\n return false;\n }\n\n if (this.#alpha <= 0.4) {\n this.#hasCrackled = true;\n return true;\n }\n\n return false;\n }\n\n checkSplit(): boolean {\n if (this.#type !== 'crossette' || this.#hasSplit) {\n return false;\n }\n\n if (this.#alpha < 0.5) {\n this.#hasSplit = true;\n return true;\n }\n\n return false;\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n if (this.#config.strobe && this.#sparkleTimer % 6 < 3) {\n return;\n }\n\n const ds = this.#depthScale;\n const trailEnd = this.#trail[this.#trail.length - 1];\n const effectiveWidth = this.#shape === 'line' ? this.#lineWidth * ds : this.#lineWidth * 0.4 * ds;\n const effectiveAlpha = this.#alpha * Math.min(ds, 1.2);\n\n ctx.save();\n ctx.lineCap = 'round';\n\n if (this.#trail.length > 2) {\n for (let i = this.#trail.length - 1; i > 0; i--) {\n const progress = i / this.#trail.length;\n const alpha = (1 - progress) * effectiveAlpha * 0.5;\n const width = effectiveWidth * (1 - progress * 0.4);\n\n ctx.beginPath();\n ctx.moveTo(this.#trail[i].x, this.#trail[i].y);\n ctx.lineTo(this.#trail[i - 1].x, this.#trail[i - 1].y);\n ctx.lineWidth = width;\n ctx.strokeStyle = `hsla(${this.#hue}, 100%, ${this.#brightness * 0.7}%, ${alpha})`;\n ctx.stroke();\n }\n }\n\n ctx.beginPath();\n ctx.moveTo(trailEnd.x, trailEnd.y);\n ctx.lineTo(this.#position.x, this.#position.y);\n ctx.lineWidth = effectiveWidth;\n ctx.strokeStyle = `hsla(${this.#hue}, 100%, ${this.#brightness}%, ${effectiveAlpha})`;\n ctx.stroke();\n\n if (this.#shape !== 'line') {\n this.#drawShape(ctx, ds, effectiveAlpha);\n }\n\n if (this.#config.sparkle && this.#sparkleTimer % 4 < 2) {\n ctx.beginPath();\n ctx.arc(this.#position.x, this.#position.y, this.#lineWidth * 0.8 * ds, 0, Math.PI * 2);\n ctx.fillStyle = `hsla(${this.#hue}, 30%, 95%, ${effectiveAlpha * 0.9})`;\n ctx.fill();\n }\n\n ctx.restore();\n }\n\n tick(dt: number): void {\n this.#trail.pop();\n this.#trail.unshift({...this.#position});\n\n this.#speed *= Math.pow(this.#config.friction, dt);\n this.#vz *= Math.pow(this.#config.friction, dt);\n\n this.#position.x += Math.cos(this.#angle) * this.#speed * dt;\n this.#position.y += (Math.sin(this.#angle) * this.#speed + this.#config.gravity) * dt;\n this.#z += this.#vz * dt;\n\n this.#depthScale = PERSPECTIVE / (PERSPECTIVE + this.#z);\n\n this.#alpha -= this.#decay * dt;\n this.#sparkleTimer += dt;\n }\n\n #drawShape(ctx: CanvasRenderingContext2D, ds: number, alpha: number): void {\n const size = this.#lineWidth * 1.2 * ds;\n const color = `hsla(${this.#hue}, 100%, ${this.#brightness}%, ${alpha})`;\n\n switch (this.#shape) {\n case 'circle':\n ctx.beginPath();\n ctx.arc(this.#position.x, this.#position.y, size * 0.5, 0, Math.PI * 2);\n ctx.fillStyle = color;\n ctx.fill();\n break;\n\n case 'star':\n this.#drawStarPath(ctx, this.#position.x, this.#position.y, size * 0.7, 4, this.#sparkleTimer * 0.15);\n ctx.fillStyle = `hsla(${this.#hue}, 60%, ${Math.min(this.#brightness + 10, 100)}%, ${alpha})`;\n ctx.fill();\n break;\n\n case 'diamond':\n this.#drawDiamondPath(ctx, this.#position.x, this.#position.y, size * 0.6, this.#angle);\n ctx.fillStyle = color;\n ctx.fill();\n break;\n }\n }\n\n #drawStarPath(ctx: CanvasRenderingContext2D, cx: number, cy: number, radius: number, points: number, rotation: number): void {\n const innerRadius = radius * 0.4;\n const totalPoints = points * 2;\n\n ctx.beginPath();\n\n for (let i = 0; i < totalPoints; i++) {\n const r = i % 2 === 0 ? radius : innerRadius;\n const angle = (i * Math.PI / points) + rotation;\n const px = cx + Math.cos(angle) * r;\n const py = cy + Math.sin(angle) * r;\n\n if (i === 0) {\n ctx.moveTo(px, py);\n } else {\n ctx.lineTo(px, py);\n }\n }\n\n ctx.closePath();\n }\n\n #drawDiamondPath(ctx: CanvasRenderingContext2D, cx: number, cy: number, size: number, rotation: number): void {\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n const hw = size * 0.5;\n\n ctx.beginPath();\n ctx.moveTo(cx + cos * size - sin * 0, cy + sin * size + cos * 0);\n ctx.lineTo(cx + cos * 0 - sin * hw, cy + sin * 0 + cos * hw);\n ctx.lineTo(cx + cos * -size - sin * 0, cy + sin * -size + cos * 0);\n ctx.lineTo(cx + cos * 0 - sin * -hw, cy + sin * 0 + cos * -hw);\n ctx.closePath();\n }\n}\n","import type { Point } from '../point';\nimport { Explosion } from './explosion';\nimport { EXPLOSION_CONFIGS, type ExplosionType, type FireworkVariant } from './types';\n\nfunction between(rng: () => number, min: number, max: number): number {\n return min + rng() * (max - min);\n}\n\n/**\n * Creates an array of {@link Explosion} particles for the given firework variant.\n * Use this to fire a fully formed explosion burst in your own render loop without\n * needing a {@link Fireworks} instance.\n *\n * @param variant - The firework variant to create.\n * @param position - The center position of the explosion in canvas pixels.\n * @param hue - Base hue in degrees (0–360).\n * @param options - Optional overrides for `lineWidth` (default `5`) and `scale` (default `1`).\n * @param rng - RNG function returning values in [0, 1). Defaults to `Math.random`.\n */\nexport function createExplosion(\n variant: FireworkVariant,\n position: Point,\n hue: number,\n options: { lineWidth?: number; scale?: number } = {},\n rng: () => number = Math.random\n): Explosion[] {\n const lineWidth = options.lineWidth ?? 5;\n const scale = options.scale ?? 1;\n const explosions: Explosion[] = [];\n\n switch (variant) {\n case 'saturn':\n createSaturn(explosions, position, hue, lineWidth, scale, rng);\n break;\n case 'dahlia':\n createDahlia(explosions, position, hue, lineWidth, scale, rng);\n break;\n case 'heart':\n createHeart(explosions, position, hue, lineWidth, scale, rng);\n break;\n case 'spiral':\n createSpiral(explosions, position, hue, lineWidth, scale, rng);\n break;\n case 'flower':\n createFlower(explosions, position, hue, lineWidth, scale, rng);\n break;\n case 'concentric':\n createConcentric(explosions, position, hue, lineWidth, scale, rng);\n break;\n default: {\n const type: ExplosionType = variant;\n const config = EXPLOSION_CONFIGS[type];\n const count = Math.floor(between(rng, config.particleCount[0], config.particleCount[1]));\n const effectiveHue = type === 'brocade' ? between(rng, 35, 50) : hue;\n\n for (let i = 0; i < count; i++) {\n let angle: number | undefined;\n let speed: number | undefined;\n\n if (type === 'ring') {\n angle = (i / count) * Math.PI * 2;\n speed = between(rng, config.speed[0], config.speed[1]) * 0.5 + config.speed[0] * 0.5;\n } else if (type === 'palm' || type === 'horsetail') {\n const spread = type === 'horsetail' ? Math.PI / 8 : Math.PI / 5;\n angle = -Math.PI / 2 + between(rng, -spread, spread);\n }\n\n explosions.push(new Explosion(position, effectiveHue, lineWidth, type, scale, angle, speed));\n }\n }\n }\n\n return explosions;\n}\n\nfunction createSaturn(explosions: Explosion[], position: Point, hue: number, lineWidth: number, scale: number, rng: () => number): void {\n const velocity = between(rng, 4, 6);\n const shellCount = Math.floor(between(rng, 25, 35));\n\n for (let i = 0; i < shellCount; i++) {\n const rad = (i / shellCount) * Math.PI * 2;\n\n explosions.push(new Explosion(\n position, hue, lineWidth, 'peony', scale,\n rad + between(rng, -0.05, 0.05),\n velocity + between(rng, -0.25, 0.25)\n ));\n }\n\n const fillCount = Math.floor(between(rng, 40, 60));\n\n for (let i = 0; i < fillCount; i++) {\n explosions.push(new Explosion(\n position, hue, lineWidth, 'peony', scale,\n between(rng, 0, Math.PI * 2),\n velocity * between(rng, 0, 1)\n ));\n }\n\n const ringRotation = between(rng, 0, Math.PI * 2);\n const ringCount = Math.floor(between(rng, 40, 55));\n const ringVx = velocity * between(rng, 2, 3);\n const ringVy = velocity * 0.6;\n\n for (let i = 0; i < ringCount; i++) {\n const rad = (i / ringCount) * Math.PI * 2;\n const cx = Math.cos(rad) * ringVx + between(rng, -0.25, 0.25);\n const cy = Math.sin(rad) * ringVy + between(rng, -0.25, 0.25);\n const cosR = Math.cos(ringRotation);\n const sinR = Math.sin(ringRotation);\n const vx = cx * cosR - cy * sinR;\n const vy = cx * sinR + cy * cosR;\n const vz = Math.sin(rad) * velocity * 0.8;\n\n explosions.push(new Explosion(\n position, hue + 60, lineWidth, 'ring', scale,\n Math.atan2(vy, vx),\n Math.sqrt(vx * vx + vy * vy),\n vz\n ));\n }\n}\n\nfunction createDahlia(explosions: Explosion[], position: Point, hue: number, lineWidth: number, scale: number, rng: () => number): void {\n const petalCount = Math.floor(between(rng, 6, 9));\n const particlesPerPetal = Math.floor(between(rng, 8, 12));\n\n for (let petal = 0; petal < petalCount; petal++) {\n const baseAngle = (petal / petalCount) * Math.PI * 2;\n const petalHue = hue + (petal % 2 === 0 ? 25 : -25);\n\n for (let i = 0; i < particlesPerPetal; i++) {\n explosions.push(new Explosion(\n position, petalHue, lineWidth, 'dahlia', scale,\n baseAngle + between(rng, -0.3, 0.3)\n ));\n }\n }\n}\n\nfunction createHeart(explosions: Explosion[], position: Point, hue: number, lineWidth: number, scale: number, rng: () => number): void {\n const velocity = between(rng, 3, 5);\n const count = Math.floor(between(rng, 60, 80));\n const rotation = between(rng, -0.3, 0.3);\n const cosR = Math.cos(rotation);\n const sinR = Math.sin(rotation);\n\n for (let i = 0; i < count; i++) {\n const t = (i / count) * Math.PI * 2;\n const hx = 16 * Math.pow(Math.sin(t), 3);\n const hy = -(13 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 * t));\n const s = velocity / 16;\n const vx = hx * s;\n const vy = hy * s;\n const rvx = vx * cosR - vy * sinR;\n const rvy = vx * sinR + vy * cosR;\n\n explosions.push(new Explosion(\n position, hue, lineWidth, 'heart', scale,\n Math.atan2(rvy, rvx),\n Math.max(0.1, Math.sqrt(rvx * rvx + rvy * rvy) + between(rng, -0.15, 0.15))\n ));\n }\n}\n\nfunction createSpiral(explosions: Explosion[], position: Point, hue: number, lineWidth: number, scale: number, rng: () => number): void {\n const arms = Math.floor(between(rng, 3, 5));\n const particlesPerArm = Math.floor(between(rng, 15, 20));\n const twist = between(rng, 2, 3.5);\n const baseRotation = between(rng, 0, Math.PI * 2);\n\n for (let arm = 0; arm < arms; arm++) {\n const baseAngle = baseRotation + (arm / arms) * Math.PI * 2;\n const armHue = hue + arm * (360 / arms / 3);\n\n for (let i = 0; i < particlesPerArm; i++) {\n const progress = i / particlesPerArm;\n\n explosions.push(new Explosion(\n position, armHue, lineWidth, 'spiral', scale,\n baseAngle + progress * twist,\n 2 + progress * 8 + between(rng, -0.3, 0.3)\n ));\n }\n }\n}\n\nfunction createFlower(explosions: Explosion[], position: Point, hue: number, lineWidth: number, scale: number, rng: () => number): void {\n const velocity = between(rng, 4, 7);\n const count = Math.floor(between(rng, 70, 90));\n const petals = Math.floor(between(rng, 2, 4));\n const rotation = between(rng, 0, Math.PI * 2);\n\n for (let i = 0; i < count; i++) {\n const t = (i / count) * Math.PI * 2;\n const r = Math.abs(Math.cos(petals * t));\n const speed = velocity * r;\n\n if (speed < 0.3) {\n continue;\n }\n\n explosions.push(new Explosion(\n position, hue + between(rng, -15, 15), lineWidth, 'flower', scale,\n t + rotation,\n speed + between(rng, -0.2, 0.2)\n ));\n }\n}\n\nfunction createConcentric(explosions: Explosion[], position: Point, hue: number, lineWidth: number, scale: number, rng: () => number): void {\n const outerCount = Math.floor(between(rng, 35, 50));\n const outerSpeed = between(rng, 7, 10);\n\n for (let i = 0; i < outerCount; i++) {\n const angle = (i / outerCount) * Math.PI * 2;\n\n explosions.push(new Explosion(\n position, hue, lineWidth, 'ring', scale,\n angle + between(rng, -0.05, 0.05),\n outerSpeed + between(rng, -0.25, 0.25)\n ));\n }\n\n const innerCount = Math.floor(between(rng, 25, 35));\n const innerSpeed = between(rng, 3, 5);\n\n for (let i = 0; i < innerCount; i++) {\n const angle = (i / innerCount) * Math.PI * 2;\n\n explosions.push(new Explosion(\n position, hue + 120, lineWidth, 'ring', scale,\n angle + between(rng, -0.05, 0.05),\n innerSpeed + between(rng, -0.25, 0.25)\n ));\n }\n}\n","import type { Point } from './point';\n\nexport function distance(a: Point, b: Point): number {\n let x = a.x - b.x;\n let y = a.y - b.y;\n\n return Math.sqrt(x * x + y * y);\n}\n","import type { Point } from '../point';\nimport { MULBERRY } from './consts';\n\nexport class Spark {\n readonly #position: Point;\n readonly #velocity: Point;\n readonly #hue: number;\n readonly #size: number;\n readonly #decay: number;\n readonly #friction: number = 0.94;\n readonly #gravity: number = 0.3;\n #alpha: number = 1;\n\n get isDead(): boolean {\n return this.#alpha <= 0;\n }\n\n get position(): Point {\n return this.#position;\n }\n\n constructor(position: Point, hue: number, velocityX: number = 0, velocityY: number = 0) {\n this.#position = {...position};\n this.#hue = hue + MULBERRY.nextBetween(-20, 20);\n this.#size = MULBERRY.nextBetween(0.5, 1.5);\n this.#decay = MULBERRY.nextBetween(0.03, 0.08);\n this.#velocity = {\n x: velocityX + MULBERRY.nextBetween(-1.5, 1.5),\n y: velocityY + MULBERRY.nextBetween(-2, 2)\n };\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n ctx.beginPath();\n ctx.arc(this.#position.x, this.#position.y, this.#size, 0, Math.PI * 2);\n ctx.fillStyle = `hsla(${this.#hue}, 80%, 70%, ${this.#alpha})`;\n ctx.fill();\n }\n\n tick(dt: number): void {\n this.#velocity.x *= Math.pow(this.#friction, dt);\n this.#velocity.y *= Math.pow(this.#friction, dt);\n this.#velocity.y += this.#gravity * dt;\n\n this.#position.x += this.#velocity.x * dt;\n this.#position.y += this.#velocity.y * dt;\n\n this.#alpha -= this.#decay * dt;\n }\n}\n","import { distance } from '../distance';\nimport type { Point } from '../point';\nimport { FIREWORK_TRAIL_MEMORY, MULBERRY } from './consts';\nimport { Spark } from './spark';\n\nexport class Firework extends EventTarget {\n readonly #position: Point;\n readonly #startPosition: Point;\n readonly #acceleration: number = 1.05;\n readonly #angle: number;\n readonly #baseSize: number;\n readonly #brightness: number = MULBERRY.nextBetween(55, 75);\n readonly #distance: number;\n readonly #hue: number;\n readonly #tailWidth: number;\n readonly #trail: Point[] = [];\n #distanceTraveled: number = 0;\n #speed: number = 1;\n #sparkTimer: number = 0;\n #pendingSparks: Spark[] = [];\n\n get position(): Point {\n return this.#position;\n }\n\n get hue(): number {\n return this.#hue;\n }\n\n constructor(start: Point, target: Point, hue: number, tailWidth: number, baseSize: number) {\n super();\n\n this.#hue = hue;\n this.#tailWidth = tailWidth;\n this.#baseSize = baseSize;\n this.#position = {...start};\n this.#startPosition = {...start};\n this.#angle = Math.atan2(target.y - start.y, target.x - start.x);\n this.#distance = distance(start, target);\n\n for (let i = 0; i < FIREWORK_TRAIL_MEMORY; i++) {\n this.#trail.push({...start});\n }\n }\n\n collectSparks(): Spark[] {\n const sparks = this.#pendingSparks;\n this.#pendingSparks = [];\n return sparks;\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n ctx.save();\n ctx.lineCap = 'round';\n\n for (let i = this.#trail.length - 1; i > 0; i--) {\n const progress = i / this.#trail.length;\n const alpha = (1 - progress) * 0.8;\n const width = this.#tailWidth * (1 - progress * 0.5);\n const hue = this.#hue + MULBERRY.nextBetween(-15, 15);\n\n ctx.beginPath();\n ctx.moveTo(this.#trail[i].x, this.#trail[i].y);\n ctx.lineTo(this.#trail[i - 1].x, this.#trail[i - 1].y);\n ctx.lineWidth = width;\n ctx.strokeStyle = `hsla(${hue}, 100%, ${this.#brightness}%, ${alpha})`;\n ctx.stroke();\n }\n\n ctx.shadowBlur = this.#baseSize * 4;\n ctx.shadowColor = `hsl(${this.#hue}, 100%, 60%)`;\n\n ctx.beginPath();\n ctx.moveTo(this.#trail[0].x, this.#trail[0].y);\n ctx.lineTo(this.#position.x, this.#position.y);\n ctx.lineWidth = this.#tailWidth;\n ctx.strokeStyle = `hsl(${this.#hue}, 100%, ${this.#brightness}%)`;\n ctx.stroke();\n\n ctx.shadowBlur = this.#baseSize * 6;\n ctx.shadowColor = `hsl(${this.#hue}, 80%, 80%)`;\n ctx.beginPath();\n ctx.arc(this.#position.x, this.#position.y, this.#tailWidth * 0.6, 0, Math.PI * 2);\n ctx.fillStyle = `hsl(${this.#hue}, 20%, 92%)`;\n ctx.fill();\n\n ctx.restore();\n }\n\n tick(dt: number): void {\n this.#trail.pop();\n this.#trail.unshift({...this.#position});\n\n this.#speed *= Math.pow(this.#acceleration, dt);\n\n const vx = Math.cos(this.#angle) * this.#speed;\n const vy = Math.sin(this.#angle) * this.#speed;\n\n this.#distanceTraveled = distance(this.#startPosition, {\n x: this.#position.x + vx * dt,\n y: this.#position.y + vy * dt\n });\n\n if (this.#distanceTraveled >= this.#distance) {\n this.dispatchEvent(new CustomEvent('remove'));\n return;\n }\n\n this.#position.x += vx * dt;\n this.#position.y += vy * dt;\n\n this.#sparkTimer += dt;\n\n if (this.#sparkTimer >= 3) {\n this.#sparkTimer -= 3;\n this.#pendingSparks.push(new Spark(\n this.#position,\n this.#hue,\n -vx * 0.1,\n -vy * 0.1\n ));\n }\n }\n}\n","import { Effect } from '../effect';\nimport type { Point } from '../point';\nimport { MULBERRY } from './consts';\nimport { createExplosion } from './create-explosion';\nimport { Explosion } from './explosion';\nimport { Firework } from './firework';\nimport { Spark } from './spark';\nimport { FIREWORK_VARIANTS, type FireworksConfig, type FireworkVariant } from './types';\n\nexport class Fireworks extends Effect<FireworksConfig> {\n #explosions: Explosion[] = [];\n #fireworks: Firework[] = [];\n #sparks: Spark[] = [];\n #hue: number = 120;\n #spawnTimer: number = 0;\n #positionRandom = MULBERRY.fork();\n #autoSpawn: boolean;\n #variants: FireworkVariant[];\n readonly #baseSize: number;\n #scale: number;\n readonly #tailWidth: number;\n #width: number = 960;\n #height: number = 540;\n\n constructor(config: FireworksConfig = {}) {\n super();\n\n const scale = config.scale ?? 1;\n this.#autoSpawn = config.autoSpawn ?? true;\n this.#variants = config.variants?.length ? [...config.variants] : [...FIREWORK_VARIANTS];\n this.#baseSize = 5 * scale;\n this.#scale = scale;\n this.#tailWidth = 2 * scale;\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n }\n\n launch(variant: FireworkVariant, position?: Point): void {\n const pos = position ?? {x: this.#width / 2, y: this.#height * 0.4};\n this.#hue = MULBERRY.nextBetween(0, 360);\n this.#spawnExplosion(pos, this.#hue, variant);\n }\n\n configure(config: Partial<FireworksConfig>): void {\n if (config.scale !== undefined) {\n this.#scale = config.scale;\n }\n if (config.autoSpawn !== undefined) {\n this.#autoSpawn = config.autoSpawn;\n }\n if (Array.isArray(config.variants) && config.variants.length > 0) {\n this.#variants = [...config.variants];\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n this.#spawnTimer += dt;\n\n const isSmall = innerWidth < 991;\n const spawnInterval = isSmall ? 60 : 30;\n\n if (this.#autoSpawn && this.#fireworks.length < 6 && this.#spawnTimer >= spawnInterval) {\n this.#spawnTimer -= spawnInterval;\n let count = MULBERRY.nextBetween(1, 100) < 10 ? 2 : 1;\n\n while (count--) {\n this.#hue = MULBERRY.nextBetween(0, 360);\n this.#createFirework();\n }\n }\n\n for (const firework of this.#fireworks) {\n firework.tick(dt);\n const collected = firework.collectSparks();\n for (let i = 0; i < collected.length; i++) {\n this.#sparks.push(collected[i]);\n }\n }\n\n for (const explosion of this.#explosions) {\n explosion.tick(dt);\n }\n\n for (const spark of this.#sparks) {\n spark.tick(dt);\n }\n\n const newExplosions: Explosion[] = [];\n const newSparks: Spark[] = [];\n\n for (const explosion of this.#explosions) {\n if (explosion.checkSplit()) {\n for (let i = 0; i < 4; i++) {\n const angle = explosion.angle + (Math.PI / 2) * i + Math.PI / 4;\n\n newExplosions.push(new Explosion(\n explosion.position,\n explosion.hue,\n this.#baseSize * 0.6,\n 'peony',\n this.#scale,\n angle,\n MULBERRY.nextBetween(3, 6)\n ));\n }\n }\n\n if (explosion.checkCrackle()) {\n for (let j = 0; j < 14; j++) {\n const angle = MULBERRY.nextBetween(0, Math.PI * 2);\n const speed = MULBERRY.nextBetween(3, 8);\n\n newSparks.push(new Spark(\n explosion.position,\n explosion.hue + MULBERRY.nextBetween(-30, 30),\n Math.cos(angle) * speed,\n Math.sin(angle) * speed\n ));\n }\n }\n }\n\n this.#explosions.push(...newExplosions);\n this.#sparks.push(...newSparks);\n\n let aliveExplosions = 0;\n for (let i = 0; i < this.#explosions.length; i++) {\n if (!this.#explosions[i].isDead) {\n this.#explosions[aliveExplosions++] = this.#explosions[i];\n }\n }\n this.#explosions.length = aliveExplosions;\n\n let aliveSparks = 0;\n for (let i = 0; i < this.#sparks.length; i++) {\n if (!this.#sparks[i].isDead) {\n this.#sparks[aliveSparks++] = this.#sparks[i];\n }\n }\n this.#sparks.length = aliveSparks;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n if (ctx.canvas.width !== width || ctx.canvas.height !== height) {\n ctx.canvas.width = width;\n ctx.canvas.height = height;\n }\n\n ctx.globalCompositeOperation = 'lighter';\n\n for (const spark of this.#sparks) {\n spark.draw(ctx);\n }\n\n for (const explosion of this.#explosions) {\n explosion.draw(ctx);\n }\n\n for (const firework of this.#fireworks) {\n firework.draw(ctx);\n }\n\n ctx.globalCompositeOperation = 'source-over';\n }\n\n #spawnExplosion(position: Point, hue: number, variant?: FireworkVariant): void {\n const selected = variant ?? this.#pickVariant();\n const rng = () => MULBERRY.nextBetween(0, 1);\n this.#explosions.push(...createExplosion(selected, position, hue, {lineWidth: this.#baseSize, scale: this.#scale}, rng));\n }\n\n #createFirework(position?: Point): void {\n const hue = this.#hue;\n const targetX = position?.x || this.#positionRandom.nextBetween(this.#width * .1, this.#width * .9);\n const targetY = position?.y || this.#height * .1 + this.#positionRandom.nextBetween(0, this.#height * .5);\n const startX = this.#width * 0.3 + this.#positionRandom.nextBetween(0, this.#width * 0.4);\n\n const firework = new Firework(\n {x: startX, y: this.#height},\n {x: targetX, y: targetY},\n hue,\n this.#tailWidth,\n this.#baseSize\n );\n\n firework.addEventListener('remove', () => {\n this.#fireworks.splice(this.#fireworks.indexOf(firework), 1);\n this.#spawnExplosion(firework.position, hue);\n }, {once: true});\n\n this.#fireworks.push(firework);\n }\n\n #pickVariant(): FireworkVariant {\n const index = Math.floor(MULBERRY.nextBetween(0, this.#variants.length));\n return this.#variants[index];\n }\n}\n","import { Fireworks } from './layer';\nimport type { FireworksConfig, FireworkVariant } from './types';\nimport type { Point } from '../point';\nimport type { Effect } from '../effect';\n\nexport interface FireworksInstance extends Effect<FireworksConfig> {\n launch(variant: FireworkVariant, position?: Point): void;\n}\n\nexport function createFireworks(config?: FireworksConfig): FireworksInstance {\n return new Fireworks(config) as FireworksInstance;\n}\n\nexport { createExplosion } from './create-explosion';\nexport { Explosion } from './explosion';\nexport { Firework } from './firework';\nexport { Spark } from './spark';\nexport { EXPLOSION_CONFIGS, FIREWORK_VARIANTS } from './types';\nexport type { ExplosionConfig, ExplosionType, FireworksConfig, FireworkVariant, ParticleShape } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { GlitchBlock, GlitchConfig, GlitchSlice } from './types';\n\nconst BURST_COLORS = [\n '#ff0000',\n '#00ff00',\n '#0000ff',\n '#ff00ff',\n '#00ffff',\n '#ffff00',\n '#ffffff'\n];\n\nexport class Glitch extends Effect<GlitchConfig> {\n readonly #scale: number;\n #intensity: number;\n #speed: number;\n #rgbSplit: number;\n readonly #scanlines: boolean;\n readonly #noiseBlocks: boolean;\n readonly #sliceDisplacement: boolean;\n readonly #colorRGB: [number, number, number];\n\n #slices: GlitchSlice[] = [];\n #blocks: GlitchBlock[] = [];\n #time: number = 0;\n #burstTimer: number = 0;\n #burstDuration: number = 0;\n #isBursting: boolean = false;\n #nextBurstIn: number = 0;\n #width: number = 960;\n #height: number = 540;\n\n constructor(config: GlitchConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#intensity = config.intensity ?? 0.5;\n this.#speed = config.speed ?? 1;\n this.#rgbSplit = (config.rgbSplit ?? 3) * this.#scale;\n this.#scanlines = config.scanlines ?? true;\n this.#noiseBlocks = config.noiseBlocks ?? true;\n this.#sliceDisplacement = config.sliceDisplacement ?? true;\n this.#colorRGB = hexToRGB(config.color ?? '#00ff41');\n this.#nextBurstIn = 30 + MULBERRY.next() * 60;\n }\n\n configure(config: Partial<GlitchConfig>): void {\n if (config.intensity !== undefined) {\n this.#intensity = config.intensity;\n }\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.rgbSplit !== undefined) {\n this.#rgbSplit = config.rgbSplit * this.#scale;\n }\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n const speedDt = dt * this.#speed;\n this.#time += speedDt;\n\n // Update existing slices.\n let writeIndex = 0;\n for (let index = 0; index < this.#slices.length; ++index) {\n const slice = this.#slices[index];\n slice.life -= speedDt;\n\n if (slice.life > 0) {\n this.#slices[writeIndex++] = slice;\n }\n }\n this.#slices.length = writeIndex;\n\n // Update existing blocks.\n writeIndex = 0;\n for (let index = 0; index < this.#blocks.length; ++index) {\n const block = this.#blocks[index];\n block.life -= speedDt;\n\n if (block.life > 0) {\n this.#blocks[writeIndex++] = block;\n }\n }\n this.#blocks.length = writeIndex;\n\n // Burst logic.\n if (this.#isBursting) {\n this.#burstTimer -= speedDt;\n\n // Spawn slices during burst.\n if (this.#sliceDisplacement && MULBERRY.next() < 0.4 * this.#intensity) {\n const sliceCount = 1 + Math.floor(MULBERRY.next() * 3 * this.#intensity);\n\n for (let index = 0; index < sliceCount; ++index) {\n this.#slices.push(this.#createSlice(width, height));\n }\n }\n\n // Spawn noise blocks during burst.\n if (this.#noiseBlocks && MULBERRY.next() < 0.3 * this.#intensity) {\n const blockCount = 1 + Math.floor(MULBERRY.next() * 4 * this.#intensity);\n\n for (let index = 0; index < blockCount; ++index) {\n this.#blocks.push(this.#createBlock(width, height));\n }\n }\n\n if (this.#burstTimer <= 0) {\n this.#isBursting = false;\n this.#nextBurstIn = (20 + MULBERRY.next() * 80) * (1 - this.#intensity * 0.7);\n }\n } else {\n this.#nextBurstIn -= speedDt;\n\n if (this.#nextBurstIn <= 0) {\n this.#isBursting = true;\n this.#burstDuration = 5 + MULBERRY.next() * 15 * this.#intensity;\n this.#burstTimer = this.#burstDuration;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const [cr, cg, cb] = this.#colorRGB;\n\n // Scanlines (always subtle, more visible during burst).\n if (this.#scanlines) {\n const scanlineAlpha = this.#isBursting ? 0.08 + this.#intensity * 0.07 : 0.03;\n ctx.fillStyle = `rgba(${cr}, ${cg}, ${cb}, ${scanlineAlpha})`;\n\n const spacing = 3 * this.#scale;\n\n for (let scanY = 0; scanY < height; scanY += spacing) {\n ctx.fillRect(0, scanY, width, 1);\n }\n }\n\n // Slice displacement.\n if (this.#sliceDisplacement) {\n for (const slice of this.#slices) {\n const lifeRatio = slice.life / slice.maxLife;\n const alpha = lifeRatio * 0.3 * this.#intensity;\n\n // Red channel shifted left.\n ctx.fillStyle = `rgba(255, 0, 0, ${alpha * 0.6})`;\n ctx.fillRect(slice.offset - this.#rgbSplit, slice.y, width, slice.height);\n\n // Blue channel shifted right.\n ctx.fillStyle = `rgba(0, 0, 255, ${alpha * 0.6})`;\n ctx.fillRect(slice.offset + this.#rgbSplit, slice.y, width, slice.height);\n\n // Main slice color.\n ctx.fillStyle = `rgba(${cr}, ${cg}, ${cb}, ${alpha})`;\n ctx.fillRect(slice.offset, slice.y, width, slice.height);\n }\n }\n\n // RGB split overlay during burst.\n if (this.#isBursting && this.#rgbSplit > 0) {\n const burstProgress = this.#burstTimer / this.#burstDuration;\n const splitAlpha = burstProgress * 0.04 * this.#intensity;\n\n ctx.fillStyle = `rgba(255, 0, 0, ${splitAlpha})`;\n ctx.fillRect(-this.#rgbSplit, 0, width + this.#rgbSplit * 2, height);\n\n ctx.fillStyle = `rgba(0, 0, 255, ${splitAlpha})`;\n ctx.fillRect(this.#rgbSplit, 0, width + this.#rgbSplit * 2, height);\n }\n\n // Noise blocks.\n if (this.#noiseBlocks) {\n for (const block of this.#blocks) {\n const lifeRatio = block.life / block.maxLife;\n const alpha = lifeRatio * 0.5 * this.#intensity;\n\n ctx.fillStyle = block.color;\n ctx.globalAlpha = alpha;\n ctx.fillRect(block.x, block.y, block.width, block.height);\n }\n ctx.globalAlpha = 1;\n }\n\n // Horizontal scan bar during burst.\n if (this.#isBursting) {\n const barY = (this.#time * 3 % (height + 20)) - 10;\n const barHeight = 2 + MULBERRY.next() * 4 * this.#scale;\n const barAlpha = 0.15 * this.#intensity;\n\n ctx.fillStyle = `rgba(255, 255, 255, ${barAlpha})`;\n ctx.fillRect(0, barY, width, barHeight);\n }\n }\n\n #createSlice(width: number, height: number): GlitchSlice {\n const maxLife = 2 + MULBERRY.next() * 6;\n\n return {\n y: MULBERRY.next() * height,\n height: 1 + MULBERRY.next() * 30 * this.#scale,\n offset: (MULBERRY.next() - 0.5) * width * 0.15 * this.#intensity,\n life: maxLife,\n maxLife\n };\n }\n\n #createBlock(width: number, height: number): GlitchBlock {\n const maxLife = 1 + MULBERRY.next() * 4;\n\n return {\n x: MULBERRY.next() * width,\n y: MULBERRY.next() * height,\n width: 5 + MULBERRY.next() * 60 * this.#scale,\n height: 2 + MULBERRY.next() * 20 * this.#scale,\n life: maxLife,\n maxLife,\n color: BURST_COLORS[Math.floor(MULBERRY.next() * BURST_COLORS.length)]\n };\n }\n}\n","import { Glitch } from './layer';\nimport type { GlitchConfig } from './types';\nimport type { Effect } from '../effect';\n\nexport function createGlitch(config?: GlitchConfig): Effect<GlitchConfig> {\n return new Glitch(config);\n}\n\nexport type { GlitchConfig, GlitchSlice, GlitchBlock } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n\nexport const GLITTER_COLORS: string[] = [\n '#ffd700', // gold\n '#c0c0c0', // silver\n '#ff69b4', // pink\n '#00bfff', // sky blue\n '#ff4500', // orange-red\n '#7fff00', // chartreuse\n '#9370db' // medium purple\n];\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { GLITTER_COLORS, MULBERRY } from './consts';\nimport type { FallingGlitter, GlitterConfig, SettledGlitter } from './types';\n\nexport class Glitter extends Effect<GlitterConfig> {\n readonly #scale: number;\n readonly #size: number;\n #speed: number;\n #groundLevel: number;\n readonly #maxSettled: number;\n readonly #colorRGBs: [number, number, number][];\n #maxCount: number;\n #time: number = 0;\n #falling: FallingGlitter[] = [];\n #settled: SettledGlitter[] = [];\n\n constructor(config: GlitterConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxCount = config.count ?? 80;\n this.#size = (config.size ?? 4) * this.#scale;\n this.#speed = config.speed ?? 1;\n this.#groundLevel = config.groundLevel ?? 0.85;\n this.#maxSettled = config.maxSettled ?? 200;\n\n const colors = config.colors ?? GLITTER_COLORS;\n this.#colorRGBs = colors.map(c => hexToRGB(c));\n\n if (innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n\n for (let i = 0; i < this.#maxCount; ++i) {\n this.#falling.push(this.#createFallingPiece(true));\n }\n }\n\n configure(config: Partial<GlitterConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.groundLevel !== undefined) {\n this.#groundLevel = config.groundLevel;\n }\n }\n\n tick(dt: number, _width: number, _height: number): void {\n this.#time += 0.03 * dt;\n\n let alive = 0;\n\n for (let i = 0; i < this.#falling.length; i++) {\n const piece = this.#falling[i];\n\n piece.y += piece.vy * this.#speed * dt;\n piece.rotation += piece.rotationSpeed * dt;\n piece.flipAngle += piece.flipSpeed * dt;\n\n piece.sparkle = 0.3 + 0.7 * Math.max(0, Math.sin(this.#time * 3 + piece.flipAngle * 2));\n\n if (piece.y >= this.#groundLevel) {\n this.#settleGlitter(piece);\n this.#falling[alive++] = this.#createFallingPiece(false);\n } else if (piece.y > 1.1) {\n this.#falling[alive++] = this.#createFallingPiece(false);\n } else {\n this.#falling[alive++] = piece;\n }\n }\n\n this.#falling.length = alive;\n\n while (this.#settled.length > this.#maxSettled) {\n this.#settled.shift();\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n for (const piece of this.#settled) {\n const px = piece.x * width;\n const py = piece.y * height;\n const [r, g, b] = this.#colorRGBs[piece.colorIndex % this.#colorRGBs.length];\n\n const sparkle = 0.3 + 0.7 * Math.max(0, Math.sin(this.#time * piece.sparkleSpeed + piece.sparklePhase));\n const alpha = 0.4 + 0.6 * sparkle;\n\n this.#drawDiamond(ctx, px, py, piece.size, piece.rotation, r, g, b, alpha, sparkle);\n }\n\n for (const piece of this.#falling) {\n const px = piece.x * width;\n const py = piece.y * height;\n const [r, g, b] = this.#colorRGBs[piece.colorIndex % this.#colorRGBs.length];\n\n const flipFactor = Math.abs(Math.cos(piece.flipAngle));\n const alpha = 0.5 + 0.5 * piece.sparkle;\n\n this.#drawDiamond(ctx, px, py, piece.size, piece.rotation, r, g, b, alpha, piece.sparkle, flipFactor);\n }\n }\n\n #drawDiamond(\n ctx: CanvasRenderingContext2D,\n cx: number,\n cy: number,\n size: number,\n rotation: number,\n r: number,\n g: number,\n b: number,\n alpha: number,\n sparkle: number,\n flipFactor: number = 1\n ): void {\n const halfW = size * flipFactor;\n const halfH = size;\n\n if (halfW < 0.3) {\n return;\n }\n\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n\n const points = [\n {x: 0, y: -halfH},\n {x: halfW, y: 0},\n {x: 0, y: halfH},\n {x: -halfW, y: 0}\n ];\n\n ctx.beginPath();\n ctx.moveTo(cx + points[0].x * cos - points[0].y * sin, cy + points[0].x * sin + points[0].y * cos);\n\n for (let p = 1; p < points.length; p++) {\n ctx.lineTo(cx + points[p].x * cos - points[p].y * sin, cy + points[p].x * sin + points[p].y * cos);\n }\n\n ctx.closePath();\n\n ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${alpha * 0.8})`;\n ctx.fill();\n\n if (sparkle > 0.5) {\n const highlightAlpha = (sparkle - 0.5) * 2 * alpha;\n ctx.fillStyle = `rgba(255, 255, 255, ${highlightAlpha * 0.6})`;\n ctx.fill();\n }\n }\n\n #settleGlitter(piece: FallingGlitter): void {\n this.#settled.push({\n x: piece.x,\n y: this.#groundLevel + MULBERRY.next() * 0.05,\n size: piece.size * 0.8,\n rotation: piece.rotation,\n sparklePhase: MULBERRY.next() * Math.PI * 2,\n sparkleSpeed: 0.5 + MULBERRY.next() * 2,\n colorIndex: piece.colorIndex\n });\n }\n\n #createFallingPiece(initialSpread: boolean): FallingGlitter {\n return {\n x: MULBERRY.next(),\n y: initialSpread ? MULBERRY.next() * this.#groundLevel : -0.05 - MULBERRY.next() * 0.1,\n vy: (0.0008 + MULBERRY.next() * 0.0015) * this.#scale,\n size: (0.5 + MULBERRY.next() * 1) * this.#size,\n rotation: MULBERRY.next() * Math.PI * 2,\n rotationSpeed: (MULBERRY.next() - 0.5) * 0.08,\n flipAngle: MULBERRY.next() * Math.PI * 2,\n flipSpeed: 0.03 + MULBERRY.next() * 0.07,\n sparkle: MULBERRY.next(),\n colorIndex: Math.floor(MULBERRY.next() * this.#colorRGBs.length),\n settled: false\n };\n }\n}\n","import { Glitter } from './layer';\nimport type { GlitterConfig } from './types';\nimport type { Effect } from '../effect';\n\nexport function createGlitter(config?: GlitterConfig): Effect<GlitterConfig> {\n return new Glitter(config);\n}\n\nexport type { GlitterConfig, FallingGlitter, SettledGlitter } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { GradientBlob } from './types';\n\nexport interface GradientFlowConfig {\n readonly speed?: number;\n readonly scale?: number;\n readonly colors?: string[];\n readonly blobs?: number;\n readonly resolution?: number;\n}\n\nconst DEFAULT_COLORS = ['#ff6b6b', '#4ecdc4', '#45b7d1', '#f9ca24', '#6c5ce7'];\n\nexport class GradientFlow extends Effect<GradientFlowConfig> {\n readonly #scale: number;\n #speed: number;\n readonly #resolution: number;\n #blobs: GradientBlob[] = [];\n #offscreen: HTMLCanvasElement | null = null;\n #offscreenCtx: CanvasRenderingContext2D | null = null;\n #imageData: ImageData | null = null;\n\n constructor(config: GradientFlowConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#speed = config.speed ?? 0.5;\n this.#resolution = config.resolution ?? 6;\n\n const colors = config.colors ?? [...DEFAULT_COLORS];\n const blobCount = config.blobs ?? 5;\n\n for (let index = 0; index < blobCount; index++) {\n const colorHex = colors[index % colors.length];\n const [r, g, b] = hexToRGB(colorHex);\n\n this.#blobs.push({\n x: MULBERRY.next(),\n y: MULBERRY.next(),\n vx: (MULBERRY.next() - 0.5) * 0.01,\n vy: (MULBERRY.next() - 0.5) * 0.01,\n radius: (0.15 + MULBERRY.next() * 0.2) * this.#scale,\n color: [r, g, b]\n });\n }\n }\n\n configure(config: Partial<GradientFlowConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n }\n\n tick(dt: number, _width: number, _height: number): void {\n const speed = this.#speed;\n\n for (const blob of this.#blobs) {\n blob.x += blob.vx * dt * speed;\n blob.y += blob.vy * dt * speed;\n\n if (blob.x < 0.05) {\n blob.vx = Math.abs(blob.vx);\n } else if (blob.x > 0.95) {\n blob.vx = -Math.abs(blob.vx);\n }\n\n if (blob.y < 0.05) {\n blob.vy = Math.abs(blob.vy);\n } else if (blob.y > 0.95) {\n blob.vy = -Math.abs(blob.vy);\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const resolution = this.#resolution;\n const offWidth = Math.ceil(width / resolution);\n const offHeight = Math.ceil(height / resolution);\n\n if (!this.#offscreen || this.#offscreen.width !== offWidth || this.#offscreen.height !== offHeight) {\n this.#offscreen = document.createElement('canvas');\n this.#offscreen.width = offWidth;\n this.#offscreen.height = offHeight;\n this.#offscreenCtx = this.#offscreen.getContext('2d');\n this.#imageData = this.#offscreenCtx!.createImageData(offWidth, offHeight);\n }\n\n const data = this.#imageData!.data;\n const blobs = this.#blobs;\n const blobCount = blobs.length;\n\n for (let py = 0; py < offHeight; py++) {\n const normY = py / offHeight;\n\n for (let px = 0; px < offWidth; px++) {\n const normX = px / offWidth;\n\n let totalWeight = 0;\n let red = 0;\n let green = 0;\n let blue = 0;\n\n for (let bi = 0; bi < blobCount; bi++) {\n const blob = blobs[bi];\n const dx = normX - blob.x;\n const dy = normY - blob.y;\n const distSq = dx * dx + dy * dy;\n const radiusSq = blob.radius * blob.radius;\n const weight = radiusSq / (distSq + 0.001);\n\n totalWeight += weight;\n red += blob.color[0] * weight;\n green += blob.color[1] * weight;\n blue += blob.color[2] * weight;\n }\n\n const invWeight = 1 / totalWeight;\n\n const offset = (py * offWidth + px) * 4;\n data[offset] = Math.min(255, red * invWeight);\n data[offset + 1] = Math.min(255, green * invWeight);\n data[offset + 2] = Math.min(255, blue * invWeight);\n data[offset + 3] = 255;\n }\n }\n\n this.#offscreenCtx!.putImageData(this.#imageData!, 0, 0);\n\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(this.#offscreen!, 0, 0, width, height);\n }\n}\n","import { GradientFlow } from './layer';\nimport type { GradientFlowConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createGradientFlow(config?: GradientFlowConfig): Effect<GradientFlowConfig> {\n return new GradientFlow(config);\n}\n\nexport type { GradientFlowConfig };\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n\nexport const HEX_CHARS = '0123456789ABCDEF';\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { HEX_CHARS, MULBERRY } from './consts';\nimport type { HologramConfig, HologramFragment } from './types';\n\nexport class Hologram extends Effect<HologramConfig> {\n readonly #scale: number;\n #speed: number;\n readonly #scanlineSpacing: number;\n #flickerIntensity: number;\n readonly #maxFragments: number;\n readonly #colorRGB: [number, number, number];\n\n #fragments: HologramFragment[] = [];\n #time: number = 0;\n #scanOffset: number = 0;\n #scanBarY: number = -100;\n #scanBarSpeed: number = 0;\n #scanBarActive: boolean = false;\n #flickerAlpha: number = 1;\n #nextDropout: number = 0;\n #dropoutTimer: number = 0;\n #width: number = 960;\n #height: number = 540;\n #initialized: boolean = false;\n\n constructor(config: HologramConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#speed = config.speed ?? 1;\n this.#scanlineSpacing = (config.scanlineSpacing ?? 3) * this.#scale;\n this.#flickerIntensity = config.flickerIntensity ?? 0.3;\n this.#maxFragments = config.dataFragments ?? 15;\n this.#colorRGB = hexToRGB(config.color ?? '#00ccff');\n this.#nextDropout = 40 + MULBERRY.next() * 80;\n }\n\n configure(config: Partial<HologramConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.flickerIntensity !== undefined) {\n this.#flickerIntensity = config.flickerIntensity;\n }\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n if (!this.#initialized) {\n this.#initialized = true;\n\n for (let index = 0; index < this.#maxFragments; ++index) {\n this.#fragments.push(this.#createFragment(width, height));\n }\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n const speedDt = dt * this.#speed;\n this.#time += speedDt * 0.01;\n\n // Scrolling scanlines.\n this.#scanOffset = (this.#scanOffset + speedDt * 0.05) % this.#scanlineSpacing;\n\n // Flicker oscillation.\n const baseFlicker = 1 - this.#flickerIntensity * 0.3;\n const oscillation = Math.sin(this.#time * 12) * 0.05 + Math.sin(this.#time * 31) * 0.03;\n this.#flickerAlpha = baseFlicker + oscillation * this.#flickerIntensity;\n\n // Occasional dropout.\n if (this.#dropoutTimer > 0) {\n this.#dropoutTimer -= speedDt;\n this.#flickerAlpha = 0.05 + MULBERRY.next() * 0.1;\n } else {\n this.#nextDropout -= speedDt;\n\n if (this.#nextDropout <= 0) {\n this.#dropoutTimer = 1 + MULBERRY.next() * 3;\n this.#nextDropout = 40 + MULBERRY.next() * 120;\n }\n }\n\n // Scan bar.\n if (this.#scanBarActive) {\n this.#scanBarY -= this.#scanBarSpeed * speedDt;\n\n if (this.#scanBarY < -20) {\n this.#scanBarActive = false;\n }\n } else if (MULBERRY.next() < 0.002 * this.#speed) {\n this.#scanBarActive = true;\n this.#scanBarY = height + 10;\n this.#scanBarSpeed = 2 + MULBERRY.next() * 4;\n }\n\n // Update fragments.\n for (let index = 0; index < this.#fragments.length; ++index) {\n const fragment = this.#fragments[index];\n fragment.life -= speedDt;\n fragment.y -= fragment.speed * speedDt;\n\n if (fragment.life <= 0 || fragment.y + fragment.height < 0) {\n this.#fragments[index] = this.#createFragment(width, height);\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const [cr, cg, cb] = this.#colorRGB;\n const prevComposite = ctx.globalCompositeOperation;\n\n ctx.globalAlpha = this.#flickerAlpha;\n ctx.globalCompositeOperation = 'lighter';\n\n // Scanlines.\n ctx.fillStyle = `rgba(${cr}, ${cg}, ${cb}, 0.04)`;\n\n for (let scanY = -this.#scanOffset; scanY < height; scanY += this.#scanlineSpacing) {\n ctx.fillRect(0, scanY, width, 1);\n }\n\n // Data fragments.\n for (const fragment of this.#fragments) {\n const lifeRatio = fragment.life / fragment.maxLife;\n const fadeIn = Math.min(lifeRatio * 5, 1);\n const fadeOut = Math.min((1 - lifeRatio) * 5, 1);\n const alpha = fragment.opacity * Math.min(fadeIn, fadeOut);\n\n // Fragment background.\n ctx.fillStyle = `rgba(${cr}, ${cg}, ${cb}, ${alpha * 0.15})`;\n ctx.fillRect(fragment.x, fragment.y, fragment.width, fragment.height);\n\n // Fragment border.\n ctx.strokeStyle = `rgba(${cr}, ${cg}, ${cb}, ${alpha * 0.3})`;\n ctx.lineWidth = 1;\n ctx.strokeRect(fragment.x, fragment.y, fragment.width, fragment.height);\n\n // Simulated text rows (small horizontal lines).\n ctx.fillStyle = `rgba(${cr}, ${cg}, ${cb}, ${alpha * 0.4})`;\n const lineHeight = 4 * this.#scale;\n const padding = 3 * this.#scale;\n const textWidth = fragment.width - padding * 2;\n\n if (textWidth > 0) {\n for (let lineY = fragment.y + padding; lineY < fragment.y + fragment.height - padding; lineY += lineHeight + 2) {\n const rowWidth = textWidth * (0.4 + MULBERRY.next() * 0.6);\n ctx.fillRect(fragment.x + padding, lineY, rowWidth, lineHeight * 0.5);\n }\n }\n }\n\n // Scan bar.\n if (this.#scanBarActive) {\n const barHeight = 6 * this.#scale;\n const gradient = ctx.createLinearGradient(0, this.#scanBarY - barHeight, 0, this.#scanBarY + barHeight);\n gradient.addColorStop(0, `rgba(${cr}, ${cg}, ${cb}, 0)`);\n gradient.addColorStop(0.4, `rgba(${cr}, ${cg}, ${cb}, 0.2)`);\n gradient.addColorStop(0.5, `rgba(${cr}, ${cg}, ${cb}, 0.4)`);\n gradient.addColorStop(0.6, `rgba(${cr}, ${cg}, ${cb}, 0.2)`);\n gradient.addColorStop(1, `rgba(${cr}, ${cg}, ${cb}, 0)`);\n\n ctx.fillStyle = gradient;\n ctx.fillRect(0, this.#scanBarY - barHeight, width, barHeight * 2);\n }\n\n // Subtle overall vignette glow at edges.\n ctx.fillStyle = `rgba(${cr}, ${cg}, ${cb}, 0.02)`;\n ctx.fillRect(0, 0, width, height);\n\n ctx.globalAlpha = 1;\n ctx.globalCompositeOperation = prevComposite;\n }\n\n #createFragment(width: number, height: number): HologramFragment {\n const maxLife = 30 + MULBERRY.next() * 90;\n const fragmentWidth = (20 + MULBERRY.next() * 80) * this.#scale;\n const fragmentHeight = (12 + MULBERRY.next() * 40) * this.#scale;\n\n // Generate random hex string.\n let text = '';\n const textLength = 4 + Math.floor(MULBERRY.next() * 8);\n\n for (let index = 0; index < textLength; ++index) {\n text += HEX_CHARS[Math.floor(MULBERRY.next() * HEX_CHARS.length)];\n }\n\n return {\n x: MULBERRY.next() * (width - fragmentWidth),\n y: MULBERRY.next() * height + height * 0.1,\n width: fragmentWidth,\n height: fragmentHeight,\n opacity: 0.3 + MULBERRY.next() * 0.7,\n speed: 0.1 + MULBERRY.next() * 0.5,\n text,\n life: maxLife,\n maxLife\n };\n }\n}\n","import { Hologram } from './layer';\nimport type { HologramConfig } from './types';\nimport type { Effect } from '../effect';\n\nexport function createHologram(config?: HologramConfig): Effect<HologramConfig> {\n return new Hologram(config);\n}\n\nexport type { HologramConfig, HologramFragment } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(31);\n","import { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { HyperSpaceStar } from './types';\n\nexport interface HyperSpaceConfig {\n readonly count?: number;\n readonly speed?: number;\n readonly color?: string;\n readonly scale?: number;\n}\n\nexport class HyperSpace extends Effect<HyperSpaceConfig> {\n readonly #scale: number;\n #speed: number;\n #colorR: number;\n #colorG: number;\n #colorB: number;\n #stars: HyperSpaceStar[] = [];\n #maxCount: number;\n #width: number = 960;\n #height: number = 540;\n #initialized: boolean = false;\n\n constructor(config: HyperSpaceConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#speed = config.speed ?? 1;\n this.#maxCount = config.count ?? 250;\n\n const parsed = this.#parseHex(config.color ?? '#ffffff');\n this.#colorR = parsed[0];\n this.#colorG = parsed[1];\n this.#colorB = parsed[2];\n\n if (typeof globalThis.innerWidth !== 'undefined' && globalThis.innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n }\n\n configure(config: Partial<HyperSpaceConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n\n if (config.color !== undefined) {\n const parsed = this.#parseHex(config.color);\n this.#colorR = parsed[0];\n this.#colorG = parsed[1];\n this.#colorB = parsed[2];\n }\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n if (!this.#initialized && width > 0 && height > 0) {\n this.#initialized = true;\n this.#stars = [];\n\n for (let i = 0; i < this.#maxCount; ++i) {\n this.#stars.push(this.#createStar(true));\n }\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n const maxRadius = Math.sqrt((width / 2) ** 2 + (height / 2) ** 2);\n\n for (let i = 0; i < this.#stars.length; ++i) {\n const star = this.#stars[i];\n\n star.prevRadius = star.radius;\n\n const acceleration = 1 + (star.radius / maxRadius) * 4;\n star.radius += star.speed * this.#speed * acceleration * dt * 0.3 * this.#scale;\n\n if (star.radius >= maxRadius + 10) {\n this.#stars[i] = this.#createStar(false);\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const cx = width / 2;\n const cy = height / 2;\n const maxRadius = Math.sqrt(cx * cx + cy * cy);\n const cr = this.#colorR;\n const cg = this.#colorG;\n const cb = this.#colorB;\n\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = 1;\n ctx.fillStyle = 'rgb(0, 0, 8)';\n ctx.fillRect(0, 0, width, height);\n\n ctx.globalCompositeOperation = 'lighter';\n\n for (const star of this.#stars) {\n const normalizedRadius = star.radius / maxRadius;\n const alpha = Math.min(1, 0.1 + normalizedRadius * 0.9) * star.brightness;\n const lineWidth = Math.max(0.5, this.#scale * (0.3 + normalizedRadius * 1.5));\n\n const px = cx + Math.cos(star.angle) * star.radius;\n const py = cy + Math.sin(star.angle) * star.radius;\n\n const trailLength = Math.max(star.radius - star.prevRadius, 1);\n const prevRadius = Math.max(0, star.prevRadius);\n const tx = cx + Math.cos(star.angle) * prevRadius;\n const ty = cy + Math.sin(star.angle) * prevRadius;\n\n const gradient = ctx.createLinearGradient(tx, ty, px, py);\n gradient.addColorStop(0, `rgba(${cr}, ${cg}, ${cb}, 0)`);\n gradient.addColorStop(1, `rgba(${cr}, ${cg}, ${cb}, ${alpha})`);\n\n ctx.globalAlpha = 1;\n ctx.beginPath();\n ctx.moveTo(tx, ty);\n ctx.lineTo(px, py);\n ctx.strokeStyle = gradient;\n ctx.lineWidth = lineWidth;\n ctx.lineCap = 'round';\n ctx.stroke();\n\n if (normalizedRadius > 0.5) {\n ctx.globalAlpha = alpha * 0.8;\n ctx.fillStyle = `rgb(${cr}, ${cg}, ${cb})`;\n ctx.beginPath();\n ctx.arc(px, py, lineWidth * 0.7, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n\n ctx.globalAlpha = 1;\n ctx.resetTransform();\n ctx.globalCompositeOperation = 'source-over';\n }\n\n #createStar(spread: boolean): HyperSpaceStar {\n const maxRadius = Math.sqrt((this.#width / 2) ** 2 + (this.#height / 2) ** 2);\n const angle = MULBERRY.next() * Math.PI * 2;\n const radius = spread ? MULBERRY.next() * maxRadius * 0.8 : MULBERRY.next() * maxRadius * 0.05;\n\n return {\n angle,\n radius,\n prevRadius: radius,\n speed: 0.5 + MULBERRY.next() * 1.5,\n size: 0.5 + MULBERRY.next() * 1.5,\n brightness: 0.5 + MULBERRY.next() * 0.5\n };\n }\n\n #parseHex(hex: string): [number, number, number] {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n\n if (!result) {\n return [255, 255, 255];\n }\n\n return [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)];\n }\n}\n","import { HyperSpace } from './layer';\nimport type { HyperSpaceConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createHyperSpace(config?: HyperSpaceConfig): Effect<HyperSpaceConfig> {\n return new HyperSpace(config);\n}\n\nexport type { HyperSpaceConfig };\nexport type { HyperSpaceStar } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n\nexport const DEFAULT_COLORS: string[] = [\n '#ff0066',\n '#0066ff',\n '#00ff66'\n];\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { DEFAULT_COLORS } from './consts';\n\nexport interface InterferenceConfig {\n readonly speed?: number;\n readonly scale?: number;\n readonly resolution?: number;\n readonly layers?: number;\n readonly colors?: string[];\n}\n\nexport class Interference extends Effect<InterferenceConfig> {\n #speed: number;\n #scale: number;\n readonly #resolution: number;\n readonly #layerCount: number;\n readonly #colorRGBs: [number, number, number][];\n #time: number = 0;\n #offscreen: HTMLCanvasElement | null = null;\n #offscreenCtx: CanvasRenderingContext2D | null = null;\n #imageData: ImageData | null = null;\n #centers: { x: number; y: number; freqX: number; freqY: number; phaseX: number; phaseY: number; speedMul: number }[];\n\n constructor(config: InterferenceConfig = {}) {\n super();\n\n this.#speed = config.speed ?? 1;\n this.#scale = config.scale ?? 1;\n this.#resolution = config.resolution ?? 3;\n this.#layerCount = config.layers ?? 3;\n\n const colors = config.colors ?? DEFAULT_COLORS;\n this.#colorRGBs = colors.map(c => hexToRGB(c));\n\n this.#centers = [];\n\n for (let idx = 0; idx < this.#layerCount; idx++) {\n this.#centers.push({\n x: 0,\n y: 0,\n freqX: 0.3 + idx * 0.17,\n freqY: 0.2 + idx * 0.13,\n phaseX: idx * Math.PI * 2 / this.#layerCount,\n phaseY: idx * Math.PI * 1.3 / this.#layerCount,\n speedMul: 0.7 + idx * 0.3\n });\n }\n }\n\n configure(config: Partial<InterferenceConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.scale !== undefined) {\n this.#scale = config.scale;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#time += 0.015 * dt * this.#speed;\n\n for (let idx = 0; idx < this.#centers.length; idx++) {\n const center = this.#centers[idx];\n center.x = (0.5 + 0.35 * Math.sin(this.#time * center.freqX + center.phaseX)) * width;\n center.y = (0.5 + 0.35 * Math.cos(this.#time * center.freqY + center.phaseY)) * height;\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const resolution = this.#resolution;\n const offWidth = Math.ceil(width / resolution);\n const offHeight = Math.ceil(height / resolution);\n\n if (!this.#offscreen || this.#offscreen.width !== offWidth || this.#offscreen.height !== offHeight) {\n this.#offscreen = document.createElement('canvas');\n this.#offscreen.width = offWidth;\n this.#offscreen.height = offHeight;\n this.#offscreenCtx = this.#offscreen.getContext('2d');\n this.#imageData = this.#offscreenCtx!.createImageData(offWidth, offHeight);\n }\n\n const data = this.#imageData!.data;\n const scale = this.#scale;\n const freq = 30 * scale;\n const centers = this.#centers;\n const centerCount = centers.length;\n const colorRGBs = this.#colorRGBs;\n const colorCount = colorRGBs.length;\n\n for (let py = 0; py < offHeight; py++) {\n const worldY = py * resolution;\n\n for (let px = 0; px < offWidth; px++) {\n const worldX = px * resolution;\n\n let totalR = 0;\n let totalG = 0;\n let totalB = 0;\n\n for (let ci = 0; ci < centerCount; ci++) {\n const center = centers[ci];\n const dx = worldX - center.x;\n const dy = worldY - center.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n const wave = (Math.sin(dist / freq) + 1) * 0.5;\n const color = colorRGBs[ci % colorCount];\n\n totalR += color[0] * wave;\n totalG += color[1] * wave;\n totalB += color[2] * wave;\n }\n\n const maxVal = centerCount * 255;\n const offset = (py * offWidth + px) * 4;\n data[offset] = Math.min(255, (totalR / maxVal) * 255) | 0;\n data[offset + 1] = Math.min(255, (totalG / maxVal) * 255) | 0;\n data[offset + 2] = Math.min(255, (totalB / maxVal) * 255) | 0;\n data[offset + 3] = 255;\n }\n }\n\n this.#offscreenCtx!.putImageData(this.#imageData!, 0, 0);\n\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(this.#offscreen!, 0, 0, width, height);\n }\n}\n","import { Interference } from './layer';\nimport type { InterferenceConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createInterference(config?: InterferenceConfig): Effect<InterferenceConfig> {\n return new Interference(config);\n}\n\nexport type { InterferenceConfig };\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n\nexport const DEFAULT_COLORS: string[] = [\n '#ff3366',\n '#33ccff',\n '#ffcc00',\n '#66ff66',\n '#cc66ff',\n '#ff9933'\n];\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { DEFAULT_COLORS, MULBERRY } from './consts';\nimport type { KaleidoscopeConfig, KaleidoscopeShape } from './types';\n\nexport class Kaleidoscope extends Effect<KaleidoscopeConfig> {\n #segments: number;\n #speed: number;\n #shapeCount: number;\n #colors: string[];\n #scale: number;\n #shapes: KaleidoscopeShape[] = [];\n #sourceCanvas: HTMLCanvasElement | null = null;\n #sourceCtx: CanvasRenderingContext2D | null = null;\n #sourceRadius: number = 0;\n #time: number = 0;\n #initialized: boolean = false;\n\n constructor(config: KaleidoscopeConfig = {}) {\n super();\n\n this.#segments = config.segments ?? 8;\n this.#speed = config.speed ?? 1;\n this.#shapeCount = config.shapes ?? 15;\n this.#colors = config.colors ?? DEFAULT_COLORS;\n this.#scale = config.scale ?? 1;\n }\n\n configure(config: Partial<KaleidoscopeConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n }\n\n onResize(width: number, height: number): void {\n this.#sourceRadius = Math.min(width, height) / 2;\n\n const size = Math.ceil(this.#sourceRadius * 2);\n this.#sourceCanvas = document.createElement('canvas');\n this.#sourceCanvas.width = size;\n this.#sourceCanvas.height = size;\n this.#sourceCtx = this.#sourceCanvas.getContext('2d')!;\n\n if (!this.#initialized) {\n this.#initialized = true;\n this.#shapes = [];\n\n for (let index = 0; index < this.#shapeCount; index++) {\n this.#shapes.push(this.#createShape());\n }\n }\n }\n\n tick(dt: number, _width: number, _height: number): void {\n const speedMul = this.#speed * dt;\n this.#time += 0.02 * speedMul;\n\n const radius = this.#sourceRadius * 0.8;\n\n for (const shape of this.#shapes) {\n shape.x += shape.vx * speedMul;\n shape.y += shape.vy * speedMul;\n shape.rotation += shape.rotationSpeed * speedMul;\n\n const dist = Math.sqrt(shape.x * shape.x + shape.y * shape.y);\n\n if (dist + shape.size > radius) {\n const nx = shape.x / dist;\n const ny = shape.y / dist;\n const dot = shape.vx * nx + shape.vy * ny;\n shape.vx -= 2 * dot * nx;\n shape.vy -= 2 * dot * ny;\n\n const overlap = dist + shape.size - radius;\n shape.x -= nx * overlap;\n shape.y -= ny * overlap;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n if (!this.#sourceCanvas || !this.#sourceCtx) {\n return;\n }\n\n const sourceCtx = this.#sourceCtx;\n const radius = this.#sourceRadius;\n const segmentAngle = (Math.PI * 2) / this.#segments;\n const centerX = width / 2;\n const centerY = height / 2;\n\n sourceCtx.clearRect(0, 0, this.#sourceCanvas.width, this.#sourceCanvas.height);\n sourceCtx.save();\n\n sourceCtx.beginPath();\n sourceCtx.moveTo(radius, radius);\n sourceCtx.arc(radius, radius, radius, -segmentAngle / 2, segmentAngle / 2);\n sourceCtx.closePath();\n sourceCtx.clip();\n\n for (const shape of this.#shapes) {\n const px = radius + shape.x * this.#scale;\n const py = radius + shape.y * this.#scale;\n const size = shape.size * this.#scale;\n const [cr, cg, cb] = hexToRGB(shape.color);\n\n sourceCtx.save();\n sourceCtx.translate(px, py);\n sourceCtx.rotate(shape.rotation);\n\n if (shape.type === 0) {\n const gradient = sourceCtx.createRadialGradient(0, 0, 0, 0, 0, size);\n gradient.addColorStop(0, `rgba(${cr}, ${cg}, ${cb}, 0.9)`);\n gradient.addColorStop(0.5, `rgba(${cr}, ${cg}, ${cb}, 0.5)`);\n gradient.addColorStop(1, `rgba(${cr}, ${cg}, ${cb}, 0)`);\n sourceCtx.fillStyle = gradient;\n sourceCtx.beginPath();\n sourceCtx.arc(0, 0, size, 0, Math.PI * 2);\n sourceCtx.fill();\n } else if (shape.type === 1) {\n sourceCtx.fillStyle = `rgba(${cr}, ${cg}, ${cb}, 0.7)`;\n sourceCtx.beginPath();\n for (let point = 0; point < 6; point++) {\n const angle = (point / 6) * Math.PI * 2;\n const hx = Math.cos(angle) * size;\n const hy = Math.sin(angle) * size;\n\n if (point === 0) {\n sourceCtx.moveTo(hx, hy);\n } else {\n sourceCtx.lineTo(hx, hy);\n }\n }\n sourceCtx.closePath();\n sourceCtx.fill();\n\n sourceCtx.strokeStyle = `rgba(${Math.min(255, cr + 60)}, ${Math.min(255, cg + 60)}, ${Math.min(255, cb + 60)}, 0.5)`;\n sourceCtx.lineWidth = 1.5;\n sourceCtx.stroke();\n } else if (shape.type === 2) {\n const petalCount = 5;\n\n sourceCtx.fillStyle = `rgba(${cr}, ${cg}, ${cb}, 0.6)`;\n\n for (let petal = 0; petal < petalCount; petal++) {\n const angle = (petal / petalCount) * Math.PI * 2;\n sourceCtx.save();\n sourceCtx.rotate(angle);\n sourceCtx.beginPath();\n sourceCtx.ellipse(0, -size * 0.5, size * 0.3, size * 0.6, 0, 0, Math.PI * 2);\n sourceCtx.fill();\n sourceCtx.restore();\n }\n\n const coreGradient = sourceCtx.createRadialGradient(0, 0, 0, 0, 0, size * 0.25);\n coreGradient.addColorStop(0, `rgba(255, 255, 255, 0.8)`);\n coreGradient.addColorStop(1, `rgba(${cr}, ${cg}, ${cb}, 0.3)`);\n sourceCtx.fillStyle = coreGradient;\n sourceCtx.beginPath();\n sourceCtx.arc(0, 0, size * 0.25, 0, Math.PI * 2);\n sourceCtx.fill();\n } else {\n const gradient = sourceCtx.createRadialGradient(0, 0, size * 0.3, 0, 0, size);\n gradient.addColorStop(0, `rgba(${cr}, ${cg}, ${cb}, 0)`);\n gradient.addColorStop(0.4, `rgba(${cr}, ${cg}, ${cb}, 0.6)`);\n gradient.addColorStop(0.6, `rgba(${cr}, ${cg}, ${cb}, 0.6)`);\n gradient.addColorStop(1, `rgba(${cr}, ${cg}, ${cb}, 0)`);\n sourceCtx.fillStyle = gradient;\n sourceCtx.beginPath();\n sourceCtx.arc(0, 0, size, 0, Math.PI * 2);\n sourceCtx.fill();\n }\n\n sourceCtx.restore();\n }\n\n sourceCtx.restore();\n\n for (let index = 0; index < this.#segments; index++) {\n const angle = segmentAngle * index;\n const mirrored = index % 2 === 1;\n\n ctx.save();\n ctx.translate(centerX, centerY);\n ctx.rotate(angle);\n\n if (mirrored) {\n ctx.scale(1, -1);\n }\n\n ctx.drawImage(this.#sourceCanvas, -radius, -radius);\n ctx.restore();\n }\n }\n\n #createShape(): KaleidoscopeShape {\n const maxDist = this.#sourceRadius * 0.6;\n const angle = MULBERRY.next() * Math.PI * 2;\n const dist = MULBERRY.next() * maxDist;\n\n return {\n x: Math.cos(angle) * dist,\n y: Math.sin(angle) * dist,\n vx: (MULBERRY.next() - 0.5) * 1.2,\n vy: (MULBERRY.next() - 0.5) * 1.2,\n size: 8 + MULBERRY.next() * 25,\n color: this.#colors[Math.floor(MULBERRY.next() * this.#colors.length)],\n type: Math.floor(MULBERRY.next() * 4),\n rotation: MULBERRY.next() * Math.PI * 2,\n rotationSpeed: (MULBERRY.next() - 0.5) * 0.06\n };\n }\n}\n","import { Kaleidoscope } from './layer';\nimport type { KaleidoscopeConfig } from './types';\nimport type { Effect } from '../effect';\n\nexport function createKaleidoscope(config?: KaleidoscopeConfig): Effect<KaleidoscopeConfig> {\n return new Kaleidoscope(config);\n}\n\nexport type { KaleidoscopeConfig, KaleidoscopeShape } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n\nexport const LANTERN_COLORS: string[] = [\n '#ff6b35', // warm orange\n '#ff8c42', // light orange\n '#ffd166', // golden\n '#ffb347', // amber\n '#e85d04', // deep orange\n '#f4845f', // coral\n '#c1121f' // red\n];\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { LANTERN_COLORS, MULBERRY } from './consts';\nimport type { Lantern, LanternsConfig } from './types';\n\nexport class Lanterns extends Effect<LanternsConfig> {\n readonly #scale: number;\n #speed: number;\n readonly #size: number;\n readonly #colorRGBs: [number, number, number][];\n #maxCount: number;\n #time: number = 0;\n #lanterns: Lantern[] = [];\n #sortedLanterns: Lantern[] = [];\n #sortDirty: boolean = true;\n\n constructor(config: LanternsConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxCount = config.count ?? 25;\n this.#size = (config.size ?? 20) * this.#scale;\n this.#speed = config.speed ?? 0.5;\n\n const colors = config.colors ?? LANTERN_COLORS;\n this.#colorRGBs = colors.map(c => hexToRGB(c));\n\n if (innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n\n for (let i = 0; i < this.#maxCount; ++i) {\n this.#lanterns.push(this.#createLantern(true));\n }\n }\n\n configure(config: Partial<LanternsConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#time += 0.02 * dt * this.#speed;\n\n for (let i = 0; i < this.#lanterns.length; i++) {\n const lantern = this.#lanterns[i];\n\n lantern.y -= (lantern.vy * this.#speed * dt) / (height * 1.5);\n\n const sway = Math.sin(this.#time * lantern.swaySpeed + lantern.swayPhase) * lantern.swayAmplitude;\n lantern.x += sway * dt / (width * 8);\n\n if (lantern.y < -0.15) {\n this.#lanterns[i] = this.#createLantern(false);\n this.#sortDirty = true;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n if (this.#sortDirty) {\n this.#sortedLanterns = [...this.#lanterns].sort((a, b) => a.size - b.size);\n this.#sortDirty = false;\n }\n\n const sorted = this.#sortedLanterns;\n\n for (const lantern of sorted) {\n const px = lantern.x * width;\n const py = lantern.y * height;\n const size = lantern.size;\n const [r, g, b] = this.#colorRGBs[lantern.colorIndex];\n\n const glowPulse = 0.6 + 0.4 * Math.sin(this.#time * lantern.glowSpeed + lantern.glowPhase);\n const alpha = lantern.opacity * glowPulse;\n\n const glowRadius = size * 3;\n const glowGradient = ctx.createRadialGradient(px, py, 0, px, py, glowRadius);\n glowGradient.addColorStop(0, `rgba(${r}, ${g}, ${b}, ${alpha * 0.35})`);\n glowGradient.addColorStop(0.3, `rgba(${r}, ${g}, ${b}, ${alpha * 0.15})`);\n glowGradient.addColorStop(0.6, `rgba(${r}, ${g}, ${b}, ${alpha * 0.05})`);\n glowGradient.addColorStop(1, `rgba(${r}, ${g}, ${b}, 0)`);\n\n ctx.fillStyle = glowGradient;\n ctx.beginPath();\n ctx.arc(px, py, glowRadius, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.save();\n ctx.transform(1, 0, 0, 1, px, py);\n\n const bodyW = size * 0.8;\n const bodyH = size;\n const topW = bodyW * 0.6;\n\n ctx.beginPath();\n ctx.moveTo(-topW, -bodyH * 0.5);\n ctx.quadraticCurveTo(-bodyW, 0, -bodyW * 0.7, bodyH * 0.5);\n ctx.lineTo(bodyW * 0.7, bodyH * 0.5);\n ctx.quadraticCurveTo(bodyW, 0, topW, -bodyH * 0.5);\n ctx.closePath();\n\n const bodyGradient = ctx.createLinearGradient(0, -bodyH * 0.5, 0, bodyH * 0.5);\n bodyGradient.addColorStop(0, `rgba(${Math.min(255, r + 60)}, ${Math.min(255, g + 60)}, ${Math.min(255, b + 30)}, ${alpha * 0.9})`);\n bodyGradient.addColorStop(0.5, `rgba(${r}, ${g}, ${b}, ${alpha * 0.85})`);\n bodyGradient.addColorStop(1, `rgba(${Math.max(0, r - 30)}, ${Math.max(0, g - 30)}, ${Math.max(0, b - 20)}, ${alpha * 0.8})`);\n\n ctx.fillStyle = bodyGradient;\n ctx.fill();\n\n ctx.beginPath();\n ctx.moveTo(-topW * 0.7, -bodyH * 0.55);\n ctx.lineTo(topW * 0.7, -bodyH * 0.55);\n ctx.lineWidth = size * 0.06;\n ctx.strokeStyle = `rgba(${Math.max(0, r - 40)}, ${Math.max(0, g - 40)}, ${Math.max(0, b - 40)}, ${alpha * 0.7})`;\n ctx.stroke();\n\n const flameH = bodyH * 0.3;\n const flameW = bodyW * 0.15;\n const flameFlicker = Math.sin(this.#time * 8 + lantern.glowPhase) * flameW * 0.3;\n\n const flameGradient = ctx.createRadialGradient(\n flameFlicker, -flameH * 0.1, 0,\n flameFlicker, -flameH * 0.1, flameH\n );\n flameGradient.addColorStop(0, `rgba(255, 255, 200, ${alpha * 0.95})`);\n flameGradient.addColorStop(0.3, `rgba(255, 200, 80, ${alpha * 0.7})`);\n flameGradient.addColorStop(0.7, `rgba(255, 140, 40, ${alpha * 0.3})`);\n flameGradient.addColorStop(1, `rgba(255, 100, 20, 0)`);\n\n ctx.beginPath();\n ctx.moveTo(-flameW + flameFlicker, flameH * 0.2);\n ctx.quadraticCurveTo(-flameW * 0.5 + flameFlicker, -flameH * 0.3, flameFlicker, -flameH);\n ctx.quadraticCurveTo(flameW * 0.5 + flameFlicker, -flameH * 0.3, flameW + flameFlicker, flameH * 0.2);\n ctx.closePath();\n ctx.fillStyle = flameGradient;\n ctx.fill();\n\n const stringLen = size * 0.6;\n const stringDrift = Math.sin(this.#time * 1.5 + lantern.swayPhase) * size * 0.1;\n\n ctx.beginPath();\n ctx.moveTo(0, bodyH * 0.5);\n ctx.quadraticCurveTo(\n stringDrift,\n bodyH * 0.5 + stringLen * 0.5,\n -stringDrift * 0.5,\n bodyH * 0.5 + stringLen\n );\n ctx.strokeStyle = `rgba(${r}, ${g}, ${b}, ${alpha * 0.4})`;\n ctx.lineWidth = size * 0.04;\n ctx.stroke();\n\n ctx.restore();\n }\n }\n\n #createLantern(initialSpread: boolean): Lantern {\n const colorIndex = Math.floor(MULBERRY.next() * this.#colorRGBs.length);\n const sizeVariation = 0.6 + MULBERRY.next() * 0.8;\n\n return {\n x: 0.05 + MULBERRY.next() * 0.9,\n y: initialSpread ? MULBERRY.next() * 1.3 : 1.15 + MULBERRY.next() * 0.2,\n vx: 0,\n vy: 0.2 + MULBERRY.next() * 0.6,\n size: this.#size * sizeVariation,\n glowPhase: MULBERRY.next() * Math.PI * 2,\n glowSpeed: 0.8 + MULBERRY.next() * 1.2,\n swayPhase: MULBERRY.next() * Math.PI * 2,\n swaySpeed: 0.4 + MULBERRY.next() * 0.8,\n swayAmplitude: 0.3 + MULBERRY.next() * 0.7,\n colorIndex,\n opacity: 0.7 + MULBERRY.next() * 0.3\n };\n }\n}\n","import { Lanterns } from './layer';\nimport type { LanternsConfig } from './types';\nimport type { Effect } from '../effect';\n\nexport function createLanterns(config?: LanternsConfig): Effect<LanternsConfig> {\n return new Lanterns(config);\n}\n\nexport type { LanternsConfig, Lantern } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(37);\n","import { parseColor } from '../color';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { LavaBlob } from './types';\n\nexport interface LavaConfig {\n readonly count?: number;\n readonly speed?: number;\n readonly colors?: string[];\n readonly scale?: number;\n}\n\nconst DEFAULT_COLORS = ['#ff4400', '#ff8800', '#ffcc00', '#ff0066'];\nconst SPRITE_SIZE = 512;\nconst SPRITE_CENTER = SPRITE_SIZE / 2;\nconst SPRITE_RADIUS = SPRITE_SIZE / 2;\n\nexport class Lava extends Effect<LavaConfig> {\n readonly #scale: number;\n #speed: number;\n #count: number;\n #colors: string[];\n #blobs: LavaBlob[] = [];\n #sprites: HTMLCanvasElement[] = [];\n #time: number = 0;\n\n constructor(config: LavaConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#speed = config.speed ?? 1;\n this.#count = config.count ?? 12;\n this.#colors = config.colors ?? [...DEFAULT_COLORS];\n\n if (typeof innerWidth !== 'undefined' && innerWidth < 991) {\n this.#count = Math.floor(this.#count * 0.7);\n }\n\n this.#sprites = this.#createSprites();\n\n for (let index = 0; index < this.#count; index++) {\n this.#blobs.push(this.#createBlob());\n }\n }\n\n configure(config: Partial<LavaConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n\n if (config.count !== undefined) {\n this.#count = config.count;\n }\n }\n\n tick(dt: number, _width: number, _height: number): void {\n this.#time += 0.001 * dt * this.#speed;\n\n for (const blob of this.#blobs) {\n blob.phase += 0.008 * dt * blob.speed * this.#speed;\n blob.driftPhase += 0.0015 * dt * this.#speed;\n\n blob.y = blob.baseY + Math.sin(blob.phase) * blob.amplitude;\n blob.x += Math.sin(blob.driftPhase) * blob.driftX * 0.0001 * dt;\n\n if (blob.x < -0.15) {\n blob.x = 1.15;\n } else if (blob.x > 1.15) {\n blob.x = -0.15;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n ctx.globalCompositeOperation = 'screen';\n ctx.filter = 'blur(20px)';\n\n const canvasScale = Math.min(width, height) / 600;\n\n for (const blob of this.#blobs) {\n const px = blob.x * width;\n const py = blob.y * height;\n const displayRadius = blob.radius * this.#scale * canvasScale;\n const displaySize = displayRadius * 2;\n\n ctx.globalAlpha = 0.6 + 0.4 * Math.sin(this.#time * 3 + blob.phase);\n ctx.drawImage(\n this.#sprites[blob.colorIndex],\n px - displayRadius,\n py - displayRadius,\n displaySize,\n displaySize\n );\n }\n\n ctx.filter = '';\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = 1;\n ctx.resetTransform();\n }\n\n #createSprites(): HTMLCanvasElement[] {\n const sprites: HTMLCanvasElement[] = [];\n\n for (const color of this.#colors) {\n const {r, g, b} = parseColor(color);\n const canvas = document.createElement('canvas');\n canvas.width = SPRITE_SIZE;\n canvas.height = SPRITE_SIZE;\n const spriteCtx = canvas.getContext('2d')!;\n\n const gradient = spriteCtx.createRadialGradient(\n SPRITE_CENTER, SPRITE_CENTER, 0,\n SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS\n );\n\n gradient.addColorStop(0, `rgba(${r}, ${g}, ${b}, 1)`);\n gradient.addColorStop(0.3, `rgba(${r}, ${g}, ${b}, 0.8)`);\n gradient.addColorStop(0.6, `rgba(${r}, ${g}, ${b}, 0.4)`);\n gradient.addColorStop(0.85, `rgba(${r}, ${g}, ${b}, 0.1)`);\n gradient.addColorStop(1, `rgba(${r}, ${g}, ${b}, 0)`);\n\n spriteCtx.fillStyle = gradient;\n spriteCtx.beginPath();\n spriteCtx.arc(SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS, 0, Math.PI * 2);\n spriteCtx.fill();\n\n sprites.push(canvas);\n }\n\n return sprites;\n }\n\n #createBlob(): LavaBlob {\n const minRadius = 80 * this.#scale;\n const maxRadius = 160 * this.#scale;\n\n return {\n x: MULBERRY.next(),\n y: 0.2 + MULBERRY.next() * 0.6,\n baseY: 0.2 + MULBERRY.next() * 0.6,\n radius: minRadius + MULBERRY.next() * (maxRadius - minRadius),\n colorIndex: Math.floor(MULBERRY.next() * this.#colors.length),\n speed: 0.5 + MULBERRY.next() * 1.5,\n phase: MULBERRY.next() * Math.PI * 2,\n amplitude: 0.05 + MULBERRY.next() * 0.2,\n directionY: MULBERRY.next() > 0.5 ? 1 : -1,\n driftX: (MULBERRY.next() - 0.5) * 2,\n driftPhase: MULBERRY.next() * Math.PI * 2\n };\n }\n}\n","import { Lava } from './layer';\nimport type { LavaConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createLava(config?: LavaConfig): Effect<LavaConfig> {\n return new Lava(config);\n}\n\nexport type { LavaConfig };\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n\nexport const LEAF_COLORS: string[] = [\n '#c0392b', // deep red\n '#e74c3c', // bright red\n '#d35400', // burnt orange\n '#e67e22', // orange\n '#f39c12', // amber\n '#f1c40f', // golden yellow\n '#d4a017', // dark gold\n '#8b4513', // saddle brown\n '#a0522d', // sienna\n '#6b8e23' // olive (some green still)\n];\n","import { Effect } from '../effect';\nimport { LEAF_COLORS, MULBERRY } from './consts';\nimport type { Leaf, LeavesConfig } from './types';\n\nexport class Leaves extends Effect<LeavesConfig> {\n readonly #scale: number;\n readonly #size: number;\n #speed: number;\n #wind: number;\n readonly #colors: string[];\n #maxCount: number;\n #time: number = 0;\n #leaves: Leaf[] = [];\n #sprites: HTMLCanvasElement[] = [];\n #height: number = 540;\n\n constructor(config: LeavesConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxCount = config.count ?? 80;\n this.#size = (config.size ?? 22) * this.#scale;\n this.#speed = config.speed ?? 1;\n this.#wind = config.wind ?? 0.3;\n this.#colors = config.colors ?? LEAF_COLORS;\n\n if (innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n\n this.#sprites = this.#createSprites();\n\n for (let i = 0; i < this.#maxCount; ++i) {\n this.#leaves.push(this.#createLeaf(true));\n }\n }\n\n onResize(_width: number, height: number): void {\n this.#height = height;\n }\n\n configure(config: Partial<LeavesConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.wind !== undefined) {\n this.#wind = config.wind;\n }\n }\n\n tick(dt: number, _width: number, height: number): void {\n this.#height = height;\n const speedFactor = (height / 540) / this.#speed;\n\n this.#time += 0.015 * dt;\n\n const globalWind = Math.sin(this.#time * 0.5) * 0.4\n + Math.sin(this.#time * 1.3 + 2) * 0.2\n + Math.sin(this.#time * 3.1) * 0.1;\n\n for (let index = 0; index < this.#leaves.length; index++) {\n const leaf = this.#leaves[index];\n\n const swing = Math.sin(this.#time * leaf.swingFrequency + leaf.swingOffset) * leaf.swingAmplitude;\n\n leaf.x += (swing + (this.#wind + globalWind * 0.5) * leaf.depth) * dt / (2500 * speedFactor);\n leaf.y += (leaf.fallSpeed * 2 + leaf.depth + leaf.size * 0.05) * dt / (500 * speedFactor);\n\n leaf.rotation += leaf.rotationSpeed * dt;\n leaf.flipAngle += leaf.flipSpeed * dt;\n\n if (leaf.x > 1.15 || leaf.x < -0.15 || leaf.y > 1.05) {\n const recycled = this.#createLeaf(false);\n\n if (this.#wind + globalWind > 0.15) {\n recycled.x = -0.15;\n recycled.y = MULBERRY.next() * 0.7;\n } else if (this.#wind + globalWind < -0.15) {\n recycled.x = 1.15;\n recycled.y = MULBERRY.next() * 0.7;\n } else {\n recycled.x = MULBERRY.next();\n recycled.y = -0.05 - MULBERRY.next() * 0.15;\n }\n\n this.#leaves[index] = recycled;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n for (const leaf of this.#leaves) {\n const px = leaf.x * width;\n const py = leaf.y * height;\n const displaySize = leaf.size * leaf.depth;\n const scaleX = Math.cos(leaf.flipAngle);\n const cos = Math.cos(leaf.rotation);\n const sin = Math.sin(leaf.rotation);\n\n ctx.save();\n ctx.transform(cos * scaleX, sin * scaleX, -sin, cos, px, py);\n ctx.globalAlpha = 0.3 + leaf.depth * 0.7;\n ctx.drawImage(\n this.#sprites[leaf.colorIndex % this.#sprites.length],\n -displaySize / 2,\n -displaySize / 2,\n displaySize,\n displaySize\n );\n ctx.restore();\n }\n\n ctx.globalAlpha = 1;\n }\n\n #createSprites(): HTMLCanvasElement[] {\n const sprites: HTMLCanvasElement[] = [];\n\n for (const color of this.#colors) {\n sprites.push(this.#createLeafSprite(color, 0));\n sprites.push(this.#createLeafSprite(color, 1));\n sprites.push(this.#createLeafSprite(color, 2));\n }\n\n return sprites;\n }\n\n #createLeafSprite(color: string, shape: number): HTMLCanvasElement {\n const size = 64;\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n const ctx = canvas.getContext('2d')!;\n\n const cx = size / 2;\n const cy = size / 2;\n\n ctx.fillStyle = color;\n\n switch (shape) {\n case 0:\n this.#drawOvalLeaf(ctx, cx, cy, size);\n break;\n case 1:\n this.#drawMapleLeaf(ctx, cx, cy, size);\n break;\n case 2:\n this.#drawPointedLeaf(ctx, cx, cy, size);\n break;\n }\n\n return canvas;\n }\n\n #drawOvalLeaf(ctx: CanvasRenderingContext2D, cx: number, cy: number, size: number): void {\n const hw = size * 0.3;\n const hh = size * 0.42;\n\n ctx.beginPath();\n ctx.moveTo(cx, cy - hh);\n ctx.bezierCurveTo(cx + hw * 1.2, cy - hh * 0.5, cx + hw, cy + hh * 0.5, cx, cy + hh);\n ctx.bezierCurveTo(cx - hw, cy + hh * 0.5, cx - hw * 1.2, cy - hh * 0.5, cx, cy - hh);\n ctx.fill();\n\n ctx.strokeStyle = 'rgba(0, 0, 0, 0.15)';\n ctx.lineWidth = 0.8;\n ctx.beginPath();\n ctx.moveTo(cx, cy - hh * 0.8);\n ctx.lineTo(cx, cy + hh * 0.8);\n ctx.stroke();\n\n for (const offset of [-0.3, 0, 0.3]) {\n const py = cy + hh * offset;\n ctx.beginPath();\n ctx.moveTo(cx, py);\n ctx.quadraticCurveTo(cx + hw * 0.5, py - 3, cx + hw * 0.7, py - 1);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(cx, py);\n ctx.quadraticCurveTo(cx - hw * 0.5, py - 3, cx - hw * 0.7, py - 1);\n ctx.stroke();\n }\n }\n\n #drawMapleLeaf(ctx: CanvasRenderingContext2D, cx: number, cy: number, size: number): void {\n const r = size * 0.38;\n\n ctx.beginPath();\n ctx.moveTo(cx, cy - r);\n\n const points = 5;\n for (let i = 0; i < points; i++) {\n const angle = (i / points) * Math.PI * 2 - Math.PI / 2;\n const nextAngle = ((i + 1) / points) * Math.PI * 2 - Math.PI / 2;\n const outerR = r * (0.85 + (i % 2) * 0.15);\n const innerR = r * 0.45;\n const midAngle = (angle + nextAngle) / 2;\n\n ctx.lineTo(cx + Math.cos(angle) * outerR, cy + Math.sin(angle) * outerR);\n ctx.lineTo(cx + Math.cos(midAngle) * innerR, cy + Math.sin(midAngle) * innerR);\n }\n\n ctx.closePath();\n ctx.fill();\n\n ctx.strokeStyle = 'rgba(0, 0, 0, 0.12)';\n ctx.lineWidth = 0.7;\n for (let i = 0; i < points; i++) {\n const angle = (i / points) * Math.PI * 2 - Math.PI / 2;\n const outerR = r * 0.7;\n ctx.beginPath();\n ctx.moveTo(cx, cy);\n ctx.lineTo(cx + Math.cos(angle) * outerR, cy + Math.sin(angle) * outerR);\n ctx.stroke();\n }\n }\n\n #drawPointedLeaf(ctx: CanvasRenderingContext2D, cx: number, cy: number, size: number): void {\n const hw = size * 0.22;\n const hh = size * 0.44;\n\n ctx.beginPath();\n ctx.moveTo(cx, cy - hh);\n ctx.quadraticCurveTo(cx + hw * 1.6, cy - hh * 0.1, cx + hw * 0.3, cy + hh * 0.6);\n ctx.quadraticCurveTo(cx, cy + hh, cx, cy + hh);\n ctx.quadraticCurveTo(cx, cy + hh, cx - hw * 0.3, cy + hh * 0.6);\n ctx.quadraticCurveTo(cx - hw * 1.6, cy - hh * 0.1, cx, cy - hh);\n ctx.fill();\n\n ctx.strokeStyle = 'rgba(0, 0, 0, 0.15)';\n ctx.lineWidth = 0.8;\n ctx.beginPath();\n ctx.moveTo(cx, cy - hh * 0.7);\n ctx.lineTo(cx, cy + hh * 0.9);\n ctx.stroke();\n }\n\n #createLeaf(initialSpread: boolean): Leaf {\n const depth = 0.3 + MULBERRY.next() * 0.7;\n\n return {\n x: MULBERRY.next(),\n y: initialSpread ? MULBERRY.next() * 2 - 1 : -0.05 - MULBERRY.next() * 0.15,\n size: (MULBERRY.next() * 0.6 + 0.5) * this.#size,\n depth,\n rotation: MULBERRY.next() * Math.PI * 2,\n rotationSpeed: (MULBERRY.next() - 0.5) * 0.04,\n flipAngle: MULBERRY.next() * Math.PI * 2,\n flipSpeed: 0.02 + MULBERRY.next() * 0.04,\n swingAmplitude: 0.4 + MULBERRY.next() * 0.8,\n swingFrequency: 0.5 + MULBERRY.next() * 1.5,\n swingOffset: MULBERRY.next() * Math.PI * 2,\n fallSpeed: 0.3 + MULBERRY.next() * 0.7,\n shape: Math.floor(MULBERRY.next() * 3),\n colorIndex: Math.floor(MULBERRY.next() * this.#colors.length * 3)\n };\n }\n}\n","import { Leaves } from './layer';\nimport type { LeavesConfig } from './types';\nimport type { Effect } from '../effect';\n\nexport function createLeaves(config?: LeavesConfig): Effect<LeavesConfig> {\n return new Leaves(config);\n}\n\nexport type { LeavesConfig, Leaf } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import type { LightningBolt, LightningBranch } from './types';\n\nexport interface LightningSystemConfig {\n readonly frequency?: number;\n readonly color?: [number, number, number];\n readonly branches?: boolean;\n readonly flash?: boolean;\n readonly scale?: number;\n readonly groundLevel?: number;\n}\n\nexport class LightningSystem {\n readonly #frequency: number;\n readonly #colorR: number;\n readonly #colorG: number;\n readonly #colorB: number;\n readonly #enableBranches: boolean;\n readonly #enableFlash: boolean;\n readonly #scale: number;\n readonly #groundLevel: number;\n readonly #rng: () => number;\n #bolts: LightningBolt[] = [];\n #flashAlpha: number = 0;\n #cooldown: number = 0;\n\n get flashAlpha(): number {\n return this.#flashAlpha;\n }\n\n constructor(config: LightningSystemConfig, rng: () => number) {\n this.#frequency = config.frequency ?? 1;\n this.#enableBranches = config.branches ?? true;\n this.#enableFlash = config.flash ?? true;\n this.#scale = config.scale ?? 1;\n this.#groundLevel = config.groundLevel ?? 1;\n this.#rng = rng;\n\n const color = config.color ?? [180, 200, 255];\n this.#colorR = color[0];\n this.#colorG = color[1];\n this.#colorB = color[2];\n\n this.#cooldown = this.#nextCooldown();\n }\n\n tick(dt: number): void {\n this.#cooldown -= dt;\n\n if (this.#cooldown <= 0) {\n this.#bolts.push(this.#createBolt());\n\n if (this.#enableFlash) {\n this.#flashAlpha = 0.3;\n }\n\n this.#cooldown = this.#nextCooldown();\n }\n\n let alive = 0;\n\n for (let i = 0; i < this.#bolts.length; i++) {\n const bolt = this.#bolts[i];\n\n bolt.ticksAlive += dt;\n bolt.alpha = Math.max(0, 1 - bolt.ticksAlive / bolt.lifetime);\n\n if (bolt.alpha > 0) {\n this.#bolts[alive++] = bolt;\n }\n }\n\n this.#bolts.length = alive;\n\n if (this.#flashAlpha > 0) {\n this.#flashAlpha -= 0.012 * dt;\n\n if (this.#flashAlpha < 0) {\n this.#flashAlpha = 0;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n ctx.globalCompositeOperation = 'lighter';\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n\n for (const bolt of this.#bolts) {\n if (bolt.alpha <= 0) {\n continue;\n }\n\n this.#drawSegments(ctx, bolt.segments, bolt.alpha, 6 * this.#scale, 2 * this.#scale, width, height);\n\n for (const branch of bolt.branches) {\n const branchAlpha = bolt.alpha * branch.alpha;\n this.#drawSegments(ctx, branch.segments, branchAlpha, 3 * this.#scale, 1 * this.#scale, width, height);\n }\n }\n\n ctx.globalCompositeOperation = 'source-over';\n }\n\n #drawSegments(ctx: CanvasRenderingContext2D, segments: { x: number; y: number }[], alpha: number, outerWidth: number, innerWidth: number, width: number, height: number): void {\n if (segments.length < 2) {\n return;\n }\n\n // Outer glow\n ctx.beginPath();\n ctx.moveTo(segments[0].x * width, segments[0].y * height);\n\n for (let i = 1; i < segments.length; i++) {\n ctx.lineTo(segments[i].x * width, segments[i].y * height);\n }\n\n ctx.strokeStyle = `rgba(${this.#colorR}, ${this.#colorG}, ${this.#colorB}, ${alpha * 0.4})`;\n ctx.lineWidth = outerWidth;\n ctx.stroke();\n\n // Inner bright line\n ctx.beginPath();\n ctx.moveTo(segments[0].x * width, segments[0].y * height);\n\n for (let i = 1; i < segments.length; i++) {\n ctx.lineTo(segments[i].x * width, segments[i].y * height);\n }\n\n ctx.strokeStyle = `rgba(255, 255, 255, ${alpha})`;\n ctx.lineWidth = innerWidth;\n ctx.stroke();\n }\n\n #createBolt(): LightningBolt {\n const startX = 0.1 + this.#rng() * 0.8;\n const segments: { x: number; y: number }[] = [{x: startX, y: 0}];\n const branches: LightningBranch[] = [];\n\n let currentX = startX;\n let currentY = 0;\n const steps = 10 + Math.floor(this.#rng() * 10);\n\n for (let i = 0; i < steps; i++) {\n currentX += (this.#rng() - 0.5) * 0.1;\n currentY += (0.6 + this.#rng() * 0.4) / steps;\n currentX = Math.max(0.02, Math.min(0.98, currentX));\n segments.push({x: currentX, y: Math.min(currentY, this.#groundLevel)});\n\n if (this.#enableBranches && i > 1 && i < steps - 2 && this.#rng() < 0.35) {\n branches.push(this.#createBranch(currentX, currentY));\n }\n\n if (currentY >= this.#groundLevel) {\n break;\n }\n }\n\n return {\n segments,\n branches,\n alpha: 1,\n lifetime: 40 + this.#rng() * 40,\n ticksAlive: 0\n };\n }\n\n #createBranch(startX: number, startY: number): LightningBranch {\n const segments: { x: number; y: number }[] = [{x: startX, y: startY}];\n const direction = this.#rng() > 0.5 ? 1 : -1;\n const branchSteps = 3 + Math.floor(this.#rng() * 5);\n\n let bx = startX;\n let by = startY;\n\n for (let i = 0; i < branchSteps; i++) {\n bx += (0.02 + this.#rng() * 0.04) * direction;\n by += (0.02 + this.#rng() * 0.04);\n bx = Math.max(0.02, Math.min(0.98, bx));\n segments.push({x: bx, y: Math.min(by, this.#groundLevel)});\n\n if (by >= this.#groundLevel) {\n break;\n }\n }\n\n return {\n segments,\n alpha: 0.4 + this.#rng() * 0.4\n };\n }\n\n #nextCooldown(): number {\n const baseCooldown = 180 / this.#frequency;\n return baseCooldown + this.#rng() * baseCooldown;\n }\n}\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { LightningConfig } from './types';\nimport { LightningSystem } from './system';\n\nexport class Lightning extends Effect<LightningConfig> {\n readonly #system: LightningSystem;\n readonly #enableFlash: boolean;\n\n constructor(config: LightningConfig = {}) {\n super();\n\n this.#enableFlash = config.flash ?? true;\n\n const [r, g, b] = hexToRGB(config.color ?? '#b4c8ff');\n this.#system = new LightningSystem(\n {\n frequency: config.frequency ?? 1,\n color: [r, g, b],\n branches: config.branches ?? true,\n flash: this.#enableFlash,\n scale: config.scale ?? 1\n },\n () => MULBERRY.next()\n );\n }\n\n tick(dt: number, _width: number, _height: number): void {\n this.#system.tick(dt);\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n if (this.#system.flashAlpha > 0) {\n ctx.fillStyle = `rgba(255, 255, 255, ${this.#system.flashAlpha})`;\n ctx.fillRect(0, 0, width, height);\n }\n\n this.#system.draw(ctx, width, height);\n }\n}\n","import { Lightning } from './layer';\nimport type { LightningConfig } from './types';\nimport type { Effect } from '../effect';\n\nexport function createLightning(config?: LightningConfig): Effect<LightningConfig> {\n return new Lightning(config);\n}\n\nexport { LightningSystem } from './system';\nexport type { LightningSystemConfig } from './system';\nexport type { LightningConfig, LightningBolt, LightningBranch } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n\nexport const MATRIX_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MATRIX_CHARS, MULBERRY } from './consts';\nimport type { MatrixColumn, MatrixConfig } from './types';\n\nexport class Matrix extends Effect<MatrixConfig> {\n readonly #scale: number;\n #speed: number;\n readonly #fontSize: number;\n #trailLength: number;\n readonly #colorRGB: [number, number, number];\n #maxColumns: number;\n #columns: MatrixColumn[] = [];\n #respawnTimers: number[] = [];\n #width: number = 960;\n #height: number = 540;\n #initialized: boolean = false;\n\n constructor(config: MatrixConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxColumns = config.columns ?? 40;\n this.#speed = config.speed ?? 1;\n this.#fontSize = (config.fontSize ?? 14) * this.#scale;\n this.#trailLength = config.trailLength ?? 20;\n this.#colorRGB = hexToRGB(config.color ?? '#00ff41');\n\n if (innerWidth < 991) {\n this.#maxColumns = Math.floor(this.#maxColumns / 2);\n }\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n if (!this.#initialized) {\n this.#initialized = true;\n this.#columns = [];\n this.#respawnTimers = [];\n\n const columnWidth = this.#fontSize;\n const totalSlots = Math.floor(width / columnWidth);\n const columnCount = Math.min(this.#maxColumns, totalSlots);\n\n for (let i = 0; i < columnCount; ++i) {\n const column = this.#createColumn(totalSlots, height);\n this.#columns.push(column);\n this.#respawnTimers.push(0);\n }\n }\n }\n\n configure(config: Partial<MatrixConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.trailLength !== undefined) {\n this.#trailLength = config.trailLength;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n const columnWidth = this.#fontSize;\n const totalSlots = Math.floor(width / columnWidth);\n\n for (let i = 0; i < this.#columns.length; ++i) {\n if (this.#respawnTimers[i] > 0) {\n this.#respawnTimers[i] -= dt;\n\n if (this.#respawnTimers[i] <= 0) {\n this.#columns[i] = this.#createColumn(totalSlots, height);\n }\n\n continue;\n }\n\n const column = this.#columns[i];\n\n column.y += column.speed * this.#speed * dt;\n\n for (let ci = 0; ci < column.chars.length; ++ci) {\n if (MULBERRY.next() < 0.03) {\n column.chars[ci] = MATRIX_CHARS[Math.floor(MULBERRY.next() * MATRIX_CHARS.length)];\n }\n }\n\n const topOfTrail = column.y - (column.chars.length - 1) * this.#fontSize;\n\n if (topOfTrail > height) {\n this.#respawnTimers[i] = 10 + MULBERRY.next() * 60;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n ctx.fillStyle = 'rgb(0, 0, 0)';\n ctx.fillRect(0, 0, width, height);\n\n const [cr, cg, cb] = this.#colorRGB;\n\n ctx.font = `${this.#fontSize}px monospace`;\n ctx.textAlign = 'center';\n\n for (const column of this.#columns) {\n const charCount = column.chars.length;\n\n for (let ci = 0; ci < charCount; ++ci) {\n const charY = column.y - (charCount - 1 - ci) * this.#fontSize;\n\n if (charY < -this.#fontSize || charY > height + this.#fontSize) {\n continue;\n }\n\n const isHead = ci === charCount - 1;\n\n if (isHead) {\n const headAlpha = column.headBrightness;\n ctx.fillStyle = `rgba(255, 255, 255, ${headAlpha})`;\n } else {\n const trailProgress = ci / (charCount - 1);\n const alpha = trailProgress * 0.8 + 0.05;\n ctx.fillStyle = `rgba(${cr}, ${cg}, ${cb}, ${alpha})`;\n }\n\n ctx.fillText(column.chars[ci], column.x, charY);\n }\n }\n }\n\n #createColumn(totalSlots: number, height: number): MatrixColumn {\n const columnWidth = this.#fontSize;\n const slot = Math.floor(MULBERRY.next() * totalSlots);\n const length = Math.floor(this.#trailLength * 0.5 + MULBERRY.next() * this.#trailLength);\n const chars: string[] = [];\n\n for (let ci = 0; ci < length; ++ci) {\n chars.push(MATRIX_CHARS[Math.floor(MULBERRY.next() * MATRIX_CHARS.length)]);\n }\n\n return {\n x: slot * columnWidth + columnWidth / 2,\n y: -(MULBERRY.next() * height),\n speed: 1.5 + MULBERRY.next() * 3,\n chars,\n length,\n headBrightness: 0.8 + MULBERRY.next() * 0.2\n };\n }\n}\n","import { Matrix } from './layer';\nimport type { MatrixConfig } from './types';\nimport type { Effect } from '../effect';\n\nexport function createMatrix(config?: MatrixConfig): Effect<MatrixConfig> {\n return new Matrix(config);\n}\n\nexport type { MatrixConfig, MatrixColumn } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { MurmurationBird } from './types';\n\nconst CELL_SIZE = 50;\nconst MAX_SPEED = 4;\nconst BOUNDARY_MARGIN = 0.1;\n\nexport interface MurmurationConfig {\n readonly count?: number;\n readonly speed?: number;\n readonly cohesion?: number;\n readonly alignment?: number;\n readonly separation?: number;\n readonly turnRadius?: number;\n readonly color?: string;\n readonly scale?: number;\n}\n\nexport class Murmuration extends Effect<MurmurationConfig> {\n readonly #scale: number;\n readonly #color: string;\n #speed: number;\n #cohesion: number;\n #alignment: number;\n #separation: number;\n #turnRadius: number;\n #maxCount: number;\n #time: number = 0;\n #birds: MurmurationBird[] = [];\n #grid: Map<number, MurmurationBird[]> = new Map();\n #width: number = 960;\n #height: number = 540;\n #gridCols: number = 0;\n\n constructor(config: MurmurationConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#speed = config.speed ?? 1;\n this.#cohesion = config.cohesion ?? 0.5;\n this.#alignment = config.alignment ?? 0.8;\n this.#separation = config.separation ?? 0.4;\n this.#turnRadius = config.turnRadius ?? 0.7;\n this.#color = config.color ?? '#1a1a2e';\n this.#maxCount = config.count ?? 300;\n\n if (innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n }\n\n configure(config: Partial<MurmurationConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.cohesion !== undefined) {\n this.#cohesion = config.cohesion;\n }\n if (config.alignment !== undefined) {\n this.#alignment = config.alignment;\n }\n if (config.separation !== undefined) {\n this.#separation = config.separation;\n }\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n this.#gridCols = Math.ceil(width / CELL_SIZE);\n\n this.#birds = [];\n\n for (let i = 0; i < this.#maxCount; ++i) {\n this.#birds.push(this.#createBird());\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n this.#gridCols = Math.ceil(width / CELL_SIZE);\n this.#time += 0.001 * this.#speed * dt;\n\n const dtFactor = dt / 16;\n const speedFactor = this.#speed * dtFactor;\n\n this.#buildGrid();\n\n const waveX = Math.sin(this.#time * 1.7) * width * 0.3 + width * 0.5;\n const waveForce = Math.sin(this.#time * 2.3) * 0.3 * this.#turnRadius;\n\n for (const bird of this.#birds) {\n let cohX = 0;\n let cohY = 0;\n let cohCount = 0;\n let aliVx = 0;\n let aliVy = 0;\n let aliCount = 0;\n let sepX = 0;\n let sepY = 0;\n\n const cellX = Math.floor(bird.x / CELL_SIZE);\n const cellY = Math.floor(bird.y / CELL_SIZE);\n\n for (let ox = -1; ox <= 1; ox++) {\n for (let oy = -1; oy <= 1; oy++) {\n const key = (cellX + ox) + (cellY + oy) * this.#gridCols;\n const cell = this.#grid.get(key);\n\n if (!cell) {\n continue;\n }\n\n for (const other of cell) {\n if (other === bird) {\n continue;\n }\n\n const dx = other.x - bird.x;\n const dy = other.y - bird.y;\n const distSq = dx * dx + dy * dy;\n\n if (distSq > CELL_SIZE * CELL_SIZE) {\n continue;\n }\n\n const dist = Math.sqrt(distSq);\n\n cohX += other.x;\n cohY += other.y;\n cohCount++;\n\n aliVx += other.vx;\n aliVy += other.vy;\n aliCount++;\n\n if (dist < 15) {\n const repel = 1 / (dist + 0.1);\n sepX -= dx * repel;\n sepY -= dy * repel;\n }\n }\n }\n }\n\n let ax = 0;\n let ay = 0;\n\n if (cohCount > 0) {\n const centerX = cohX / cohCount;\n const centerY = cohY / cohCount;\n ax += (centerX - bird.x) * this.#cohesion * 0.001;\n ay += (centerY - bird.y) * this.#cohesion * 0.001;\n }\n\n if (aliCount > 0) {\n const avgVx = aliVx / aliCount;\n const avgVy = aliVy / aliCount;\n ax += (avgVx - bird.vx) * this.#alignment * 0.05;\n ay += (avgVy - bird.vy) * this.#alignment * 0.05;\n }\n\n ax += sepX * this.#separation * 0.1;\n ay += sepY * this.#separation * 0.1;\n\n const waveDist = bird.x - waveX;\n const waveInfluence = Math.exp(-(waveDist * waveDist) / (width * width * 0.02));\n ay += waveForce * waveInfluence * speedFactor;\n\n const marginX = width * BOUNDARY_MARGIN;\n const marginY = height * BOUNDARY_MARGIN;\n\n if (bird.x < marginX) {\n ax += (marginX - bird.x) * 0.003;\n } else if (bird.x > width - marginX) {\n ax -= (bird.x - (width - marginX)) * 0.003;\n }\n\n if (bird.y < marginY) {\n ay += (marginY - bird.y) * 0.003;\n } else if (bird.y > height - marginY) {\n ay -= (bird.y - (height - marginY)) * 0.003;\n }\n\n bird.vx += ax * speedFactor;\n bird.vy += ay * speedFactor;\n\n const speed = Math.sqrt(bird.vx * bird.vx + bird.vy * bird.vy);\n\n if (speed > MAX_SPEED * this.#speed) {\n const ratio = (MAX_SPEED * this.#speed) / speed;\n bird.vx *= ratio;\n bird.vy *= ratio;\n } else if (speed < 0.5) {\n const ratio = 0.5 / (speed + 0.001);\n bird.vx *= ratio;\n bird.vy *= ratio;\n }\n\n bird.x += bird.vx * speedFactor;\n bird.y += bird.vy * speedFactor;\n\n if (bird.x < -20) {\n bird.x = width + 20;\n } else if (bird.x > width + 20) {\n bird.x = -20;\n }\n\n if (bird.y < -20) {\n bird.y = height + 20;\n } else if (bird.y > height + 20) {\n bird.y = -20;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n ctx.fillStyle = this.#color;\n\n for (const bird of this.#birds) {\n const angle = Math.atan2(bird.vy, bird.vx);\n const size = bird.size * this.#scale;\n\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n\n const tipX = bird.x + cos * size * 2;\n const tipY = bird.y + sin * size * 2;\n\n const leftX = bird.x + (-cos * size - sin * size);\n const leftY = bird.y + (-sin * size + cos * size);\n\n const rightX = bird.x + (-cos * size + sin * size);\n const rightY = bird.y + (-sin * size - cos * size);\n\n ctx.beginPath();\n ctx.moveTo(tipX, tipY);\n ctx.lineTo(leftX, leftY);\n ctx.lineTo(bird.x - cos * size * 0.3, bird.y - sin * size * 0.3);\n ctx.lineTo(rightX, rightY);\n ctx.closePath();\n ctx.fill();\n }\n }\n\n #buildGrid(): void {\n this.#grid.clear();\n\n for (const bird of this.#birds) {\n const cellX = Math.floor(bird.x / CELL_SIZE);\n const cellY = Math.floor(bird.y / CELL_SIZE);\n const key = cellX + cellY * this.#gridCols;\n\n let cell = this.#grid.get(key);\n\n if (!cell) {\n cell = [];\n this.#grid.set(key, cell);\n }\n\n cell.push(bird);\n }\n }\n\n #createBird(): MurmurationBird {\n const angle = MULBERRY.next() * Math.PI * 2;\n const speed = 1 + MULBERRY.next() * 2;\n\n return {\n x: MULBERRY.next() * this.#width,\n y: MULBERRY.next() * this.#height,\n vx: Math.cos(angle) * speed,\n vy: Math.sin(angle) * speed,\n size: 1.5 + MULBERRY.next() * 1.5\n };\n }\n}\n","import { Murmuration } from './layer';\nimport type { MurmurationConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createMurmuration(config?: MurmurationConfig): Effect<MurmurationConfig> {\n return new Murmuration(config);\n}\n\nexport type { MurmurationConfig };\nexport type { MurmurationBird } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(19);\n","import { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { NebulaBlob, NebulaStar } from './types';\n\nexport interface NebulaConfig {\n readonly starCount?: number;\n readonly speed?: number;\n readonly colors?: string[];\n readonly scale?: number;\n}\n\nconst DEFAULT_COLORS = ['#ff6b9d', '#c44dff', '#4d79ff', '#00d4ff'];\n\nexport class Nebula extends Effect<NebulaConfig> {\n readonly #scale: number;\n #speed: number;\n #time: number = 0;\n #colors: string[];\n #blobs: NebulaBlob[] = [];\n #stars: NebulaStar[] = [];\n #maxStars: number;\n\n constructor(config: NebulaConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#speed = config.speed ?? 0.3;\n this.#colors = config.colors ?? DEFAULT_COLORS;\n this.#maxStars = config.starCount ?? 150;\n\n if (typeof globalThis.innerWidth !== 'undefined' && globalThis.innerWidth < 991) {\n this.#maxStars = Math.floor(this.#maxStars / 2);\n }\n\n this.#initBlobs();\n this.#initStars();\n }\n\n configure(config: Partial<NebulaConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n\n if (config.colors !== undefined) {\n this.#colors = config.colors;\n }\n }\n\n tick(dt: number, _width: number, _height: number): void {\n this.#time += 0.001 * this.#speed * dt;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = 1;\n ctx.fillStyle = 'rgb(2, 0, 20)';\n ctx.fillRect(0, 0, width, height);\n\n ctx.globalCompositeOperation = 'screen';\n\n for (const blob of this.#blobs) {\n const cx = (blob.x + Math.sin(this.#time * blob.driftSpeedX + blob.driftOffsetX) * 0.12) * width;\n const cy = (blob.y + Math.cos(this.#time * blob.driftSpeedY + blob.driftOffsetY) * 0.09) * height;\n const radius = blob.radius * Math.min(width, height) * this.#scale;\n\n const gradient = ctx.createRadialGradient(cx, cy, 0, cx, cy, radius);\n const color = this.#colors[blob.colorIndex % this.#colors.length];\n gradient.addColorStop(0, this.#colorWithAlpha(color, blob.opacity));\n gradient.addColorStop(0.4, this.#colorWithAlpha(color, blob.opacity * 0.4));\n gradient.addColorStop(1, this.#colorWithAlpha(color, 0));\n\n ctx.globalAlpha = 1;\n ctx.beginPath();\n ctx.ellipse(cx, cy, radius, radius * (0.6 + blob.opacity * 0.4), this.#time * 0.05 * blob.driftSpeedX, 0, Math.PI * 2);\n ctx.fillStyle = gradient;\n ctx.fill();\n }\n\n ctx.globalCompositeOperation = 'source-over';\n\n for (const star of this.#stars) {\n const px = star.x * width;\n const py = star.y * height;\n const twinkle = 0.4 + 0.6 * (0.5 + 0.5 * Math.sin(this.#time * star.twinkleSpeed * 60 + star.twinkleOffset));\n const alpha = star.brightness * twinkle;\n const size = star.size * this.#scale;\n\n ctx.globalAlpha = alpha;\n ctx.fillStyle = '#ffffff';\n ctx.beginPath();\n ctx.arc(px, py, size, 0, Math.PI * 2);\n ctx.fill();\n\n if (star.brightness > 0.7 && size > 1) {\n ctx.globalAlpha = alpha * 0.4;\n ctx.beginPath();\n ctx.arc(px, py, size * 2.5, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n\n ctx.globalAlpha = 1;\n ctx.resetTransform();\n ctx.globalCompositeOperation = 'source-over';\n }\n\n #initBlobs(): void {\n const blobCount = 8 + this.#colors.length * 2;\n\n for (let i = 0; i < blobCount; ++i) {\n this.#blobs.push({\n x: 0.1 + MULBERRY.next() * 0.8,\n y: 0.1 + MULBERRY.next() * 0.8,\n radius: 0.3 + MULBERRY.next() * 0.3,\n driftSpeedX: 0.3 + MULBERRY.next() * 0.7,\n driftSpeedY: 0.2 + MULBERRY.next() * 0.6,\n driftOffsetX: MULBERRY.next() * Math.PI * 2,\n driftOffsetY: MULBERRY.next() * Math.PI * 2,\n colorIndex: Math.floor(MULBERRY.next() * this.#colors.length),\n opacity: 0.2 + MULBERRY.next() * 0.3\n });\n }\n }\n\n #initStars(): void {\n for (let i = 0; i < this.#maxStars; ++i) {\n this.#stars.push({\n x: MULBERRY.next(),\n y: MULBERRY.next(),\n size: 0.5 + MULBERRY.next() * 1.5,\n twinkleSpeed: 0.5 + MULBERRY.next() * 2,\n twinkleOffset: MULBERRY.next() * Math.PI * 2,\n brightness: 0.3 + MULBERRY.next() * 0.7\n });\n }\n }\n\n #colorWithAlpha(hex: string, alpha: number): string {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n\n if (!result) {\n return `rgba(255, 255, 255, ${alpha})`;\n }\n\n const r = parseInt(result[1], 16);\n const g = parseInt(result[2], 16);\n const b = parseInt(result[3], 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n }\n}\n","import { Nebula } from './layer';\nimport type { NebulaConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createNebula(config?: NebulaConfig): Effect<NebulaConfig> {\n return new Nebula(config);\n}\n\nexport type { NebulaConfig };\nexport type { NebulaBlob, NebulaStar } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(47);\n\nexport const DEFAULT_COLORS = ['#ff0080', '#00ffff', '#ffff00', '#ff6600', '#aa00ff'];\n","import { parseColor } from '../color';\nimport { Effect } from '../effect';\nimport { DEFAULT_COLORS, MULBERRY } from './consts';\nimport type { NeonTube, NeonTubeShape } from './types';\n\nexport interface NeonConfig {\n readonly count?: number;\n readonly speed?: number;\n readonly colors?: string[];\n readonly flicker?: boolean;\n readonly scale?: number;\n}\n\nexport class Neon extends Effect<NeonConfig> {\n readonly #scale: number;\n #speed: number;\n #flicker: boolean;\n readonly #colors: string[];\n #tubes: NeonTube[] = [];\n #time: number = 0;\n #initialized: boolean = false;\n readonly #count: number;\n\n constructor(config: NeonConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#speed = config.speed ?? 1;\n this.#flicker = config.flicker ?? true;\n this.#colors = config.colors ?? DEFAULT_COLORS;\n this.#count = config.count ?? 8;\n }\n\n configure(config: Partial<NeonConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.flicker !== undefined) {\n this.#flicker = config.flicker;\n }\n }\n\n onResize(width: number, height: number): void {\n if (!this.#initialized && width > 0 && height > 0) {\n this.#initialized = true;\n this.#tubes = [];\n for (let i = 0; i < this.#count; i++) {\n this.#tubes.push(this.#createTube());\n }\n }\n }\n\n tick(dt: number, _width: number, _height: number): void {\n this.#time += 0.01 * dt * this.#speed;\n\n for (const tube of this.#tubes) {\n tube.angle += tube.rotationSpeed * dt * this.#speed;\n\n if (this.#flicker) {\n if (!tube.flickering && MULBERRY.next() < 0.002) {\n tube.flickering = true;\n tube.flickerTarget = 0.15 + MULBERRY.next() * 0.25;\n tube.flickerProgress = 0;\n }\n\n if (tube.flickering) {\n tube.flickerProgress += dt * 0.008;\n\n if (tube.flickerProgress < 0.3) {\n tube.flickerAlpha = 1 - (1 - tube.flickerTarget) * (tube.flickerProgress / 0.3);\n } else if (tube.flickerProgress < 0.6) {\n tube.flickerAlpha = tube.flickerTarget;\n } else if (tube.flickerProgress < 1) {\n tube.flickerAlpha = tube.flickerTarget + (1 - tube.flickerTarget) * ((tube.flickerProgress - 0.6) / 0.4);\n } else {\n tube.flickerAlpha = 1;\n tube.flickering = false;\n tube.flickerProgress = 0;\n }\n }\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n ctx.globalCompositeOperation = 'lighter';\n\n for (const tube of this.#tubes) {\n const alpha = tube.flickerAlpha;\n const parsed = parseColor(tube.color);\n const r = parsed.r;\n const g = parsed.g;\n const b = parsed.b;\n\n ctx.save();\n ctx.translate(tube.x * width, tube.y * height);\n ctx.rotate(tube.angle);\n\n const canvasScale = Math.min(width, height) / 600;\n const size = tube.size * this.#scale * canvasScale;\n\n // Outer blurry glow\n ctx.lineWidth = size * 0.18;\n ctx.strokeStyle = `rgba(${r}, ${g}, ${b}, ${0.06 * alpha})`;\n ctx.lineJoin = 'round';\n ctx.lineCap = 'round';\n this.#drawTubeShape(ctx, tube, size, this.#time);\n\n // Medium glow\n ctx.lineWidth = size * 0.1;\n ctx.strokeStyle = `rgba(${r}, ${g}, ${b}, ${0.25 * alpha})`;\n this.#drawTubeShape(ctx, tube, size, this.#time);\n\n // Inner glow\n ctx.lineWidth = size * 0.055;\n ctx.strokeStyle = `rgba(${r}, ${g}, ${b}, ${0.55 * alpha})`;\n this.#drawTubeShape(ctx, tube, size, this.#time);\n\n // Bright core\n ctx.lineWidth = size * 0.022;\n ctx.strokeStyle = `rgba(255, 255, 255, ${0.9 * alpha})`;\n this.#drawTubeShape(ctx, tube, size, this.#time);\n\n ctx.restore();\n }\n\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = 1;\n ctx.resetTransform();\n }\n\n #drawTubeShape(ctx: CanvasRenderingContext2D, tube: NeonTube, size: number, time: number): void {\n ctx.beginPath();\n\n switch (tube.shape) {\n case 'circle': {\n const cx = Math.cos(time * 0.3 + tube.phaseOffset) * size * 0.08;\n const cy = Math.sin(time * 0.2 + tube.phaseOffset) * size * 0.08;\n ctx.arc(cx, cy, size * 0.45, 0, Math.PI * 2);\n break;\n }\n\n case 'wave': {\n const steps = 32;\n const halfW = size * 0.55;\n for (let i = 0; i <= steps; i++) {\n const tx = (i / steps) * halfW * 2 - halfW;\n const ty = Math.sin((i / steps) * Math.PI * 2 * tube.frequency + time * tube.frequency * 0.5 + tube.phaseOffset) * size * tube.amplitude;\n if (i === 0) {\n ctx.moveTo(tx, ty);\n } else {\n ctx.lineTo(tx, ty);\n }\n }\n break;\n }\n\n case 'zigzag': {\n const zigSteps = 8;\n const zigW = size * 0.55;\n for (let i = 0; i <= zigSteps; i++) {\n const tx = (i / zigSteps) * zigW * 2 - zigW;\n const ty = (i % 2 === 0 ? 1 : -1) * size * 0.28;\n if (i === 0) {\n ctx.moveTo(tx, ty);\n } else {\n ctx.lineTo(tx, ty);\n }\n }\n break;\n }\n\n case 'curve': {\n const cx1 = -size * 0.55;\n const cy1 = Math.sin(time * 0.5 + tube.phaseOffset) * size * 0.35;\n const cx2 = size * 0.55;\n const cy2 = Math.sin(time * 0.5 + tube.phaseOffset + Math.PI) * size * 0.35;\n const cp1x = -size * 0.2;\n const cp1y = size * 0.4 * tube.amplitude;\n const cp2x = size * 0.2;\n const cp2y = -size * 0.4 * tube.amplitude;\n ctx.moveTo(cx1, cy1);\n ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, cx2, cy2);\n break;\n }\n }\n\n ctx.stroke();\n }\n\n #createTube(): NeonTube {\n const shapes: NeonTubeShape[] = ['circle', 'wave', 'zigzag', 'curve'];\n const shape = shapes[Math.floor(MULBERRY.next() * shapes.length)];\n const color = this.#colors[Math.floor(MULBERRY.next() * this.#colors.length)];\n\n return {\n shape,\n color,\n x: 0.1 + MULBERRY.next() * 0.8,\n y: 0.1 + MULBERRY.next() * 0.8,\n size: 80 + MULBERRY.next() * 120,\n angle: MULBERRY.next() * Math.PI * 2,\n rotationSpeed: (MULBERRY.next() - 0.5) * 0.0008,\n phaseOffset: MULBERRY.next() * Math.PI * 2,\n flickerAlpha: 1,\n flickering: false,\n flickerTarget: 1,\n flickerProgress: 0,\n amplitude: 0.2 + MULBERRY.next() * 0.25,\n frequency: 1 + Math.floor(MULBERRY.next() * 3)\n };\n }\n}\n","import { Neon } from './layer';\nimport type { NeonConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createNeon(config?: NeonConfig): Effect<NeonConfig> {\n return new Neon(config);\n}\n\nexport type { NeonConfig };\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n\nexport const ORBIT_COLORS: string[] = [\n '#60a5fa', // blue\n '#a78bfa', // purple\n '#f472b6', // pink\n '#34d399', // emerald\n '#fbbf24', // amber\n '#fb923c', // orange\n '#38bdf8' // sky\n];\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY, ORBIT_COLORS } from './consts';\nimport type { OrbitalCenter, Orbiter, OrbitsConfig } from './types';\n\nexport class Orbits extends Effect<OrbitsConfig> {\n readonly #centerCount: number;\n readonly #orbitersPerCenter: number;\n #speed: number;\n readonly #colors: string[];\n #trailLength: number;\n #showCenters: boolean;\n #scale: number;\n #centers: OrbitalCenter[] = [];\n #orbiters: Orbiter[] = [];\n #time: number = 0;\n #initialized: boolean = false;\n\n constructor(config: OrbitsConfig = {}) {\n super();\n\n this.#centerCount = config.centers ?? 3;\n this.#orbitersPerCenter = config.orbitersPerCenter ?? 8;\n this.#speed = config.speed ?? 1;\n this.#colors = config.colors ?? ORBIT_COLORS;\n this.#trailLength = config.trailLength ?? 15;\n this.#showCenters = config.showCenters ?? true;\n this.#scale = config.scale ?? 1;\n }\n\n onResize(_width: number, _height: number): void {\n if (!this.#initialized) {\n this.#initialized = true;\n this.#centers = [];\n this.#orbiters = [];\n\n for (let i = 0; i < this.#centerCount; i++) {\n this.#centers.push({\n x: 0.15 + MULBERRY.next() * 0.7,\n y: 0.15 + MULBERRY.next() * 0.7\n });\n }\n\n const count = innerWidth < 991\n ? Math.floor(this.#orbitersPerCenter / 2)\n : this.#orbitersPerCenter;\n\n for (let ci = 0; ci < this.#centers.length; ci++) {\n for (let oi = 0; oi < count; oi++) {\n this.#orbiters.push(this.#createOrbiter(ci));\n }\n }\n }\n }\n\n configure(config: Partial<OrbitsConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.trailLength !== undefined) {\n this.#trailLength = config.trailLength;\n }\n if (config.showCenters !== undefined) {\n this.#showCenters = config.showCenters;\n }\n if (config.scale !== undefined) {\n this.#scale = config.scale;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#time += 0.01 * dt * this.#speed;\n\n for (const orbiter of this.#orbiters) {\n const center = this.#centers[orbiter.centerIndex];\n const cx = center.x * width;\n const cy = center.y * height;\n\n orbiter.angle += orbiter.angularSpeed * dt * this.#speed;\n\n const cosAngle = Math.cos(orbiter.angle);\n const sinAngle = Math.sin(orbiter.angle);\n const cosTilt = Math.cos(orbiter.tilt);\n\n const localX = cosAngle * orbiter.radiusX * this.#scale;\n const localY = sinAngle * orbiter.radiusY * this.#scale * cosTilt;\n\n const rotatedX = localX * Math.cos(orbiter.tilt * 0.3) - localY * Math.sin(orbiter.tilt * 0.3);\n const rotatedY = localX * Math.sin(orbiter.tilt * 0.3) + localY * Math.cos(orbiter.tilt * 0.3);\n\n const px = cx + rotatedX;\n const py = cy + rotatedY;\n\n const trail = orbiter.trail;\n const maxLen = this.#trailLength;\n\n if (trail.length < maxLen) {\n trail.push({x: px, y: py});\n orbiter.trailHead = trail.length - 1;\n } else {\n const next = (orbiter.trailHead + 1) % maxLen;\n trail[next].x = px;\n trail[next].y = py;\n orbiter.trailHead = next;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n if (this.#showCenters) {\n ctx.globalCompositeOperation = 'lighter';\n\n for (const center of this.#centers) {\n const cx = center.x * width;\n const cy = center.y * height;\n const glowRadius = 30 * this.#scale;\n\n const gradient = ctx.createRadialGradient(cx, cy, 0, cx, cy, glowRadius);\n gradient.addColorStop(0, 'rgba(255, 255, 255, 0.3)');\n gradient.addColorStop(0.4, 'rgba(200, 200, 255, 0.1)');\n gradient.addColorStop(1, 'rgba(200, 200, 255, 0)');\n\n ctx.globalAlpha = 1;\n ctx.beginPath();\n ctx.arc(cx, cy, glowRadius, 0, Math.PI * 2);\n ctx.fillStyle = gradient;\n ctx.fill();\n }\n\n ctx.globalCompositeOperation = 'source-over';\n }\n\n ctx.globalCompositeOperation = 'lighter';\n\n for (const orbiter of this.#orbiters) {\n const [cr, cg, cb] = hexToRGB(orbiter.color);\n const trail = orbiter.trail;\n const trailLen = trail.length;\n\n if (trailLen > 1) {\n const isFull = trailLen === this.#trailLength;\n const oldest = isFull ? (orbiter.trailHead + 1) % trailLen : 0;\n\n for (let ti = 0; ti < trailLen - 1; ti++) {\n const progress = (ti + 1) / trailLen;\n const trailAlpha = progress * 0.5;\n const trailWidth = orbiter.size * progress * this.#scale;\n\n if (trailAlpha < 0.01) {\n continue;\n }\n\n const idx0 = (oldest + ti) % trailLen;\n const idx1 = (oldest + ti + 1) % trailLen;\n\n ctx.globalAlpha = trailAlpha;\n ctx.strokeStyle = `rgb(${cr}, ${cg}, ${cb})`;\n ctx.lineWidth = trailWidth;\n ctx.beginPath();\n ctx.moveTo(trail[idx0].x, trail[idx0].y);\n ctx.lineTo(trail[idx1].x, trail[idx1].y);\n ctx.stroke();\n }\n }\n\n if (trailLen > 0) {\n const head = trail[orbiter.trailHead];\n const headSize = orbiter.size * this.#scale;\n\n const glow = ctx.createRadialGradient(\n head.x, head.y, 0,\n head.x, head.y, headSize * 3\n );\n glow.addColorStop(0, `rgba(${cr}, ${cg}, ${cb}, 0.9)`);\n glow.addColorStop(0.3, `rgba(${cr}, ${cg}, ${cb}, 0.3)`);\n glow.addColorStop(1, `rgba(${cr}, ${cg}, ${cb}, 0)`);\n\n ctx.globalAlpha = 1;\n ctx.beginPath();\n ctx.arc(head.x, head.y, headSize * 3, 0, Math.PI * 2);\n ctx.fillStyle = glow;\n ctx.fill();\n\n ctx.beginPath();\n ctx.arc(head.x, head.y, headSize, 0, Math.PI * 2);\n ctx.fillStyle = `rgb(${cr}, ${cg}, ${cb})`;\n ctx.fill();\n }\n }\n\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = 1;\n }\n\n #createOrbiter(centerIndex: number): Orbiter {\n const minRadius = 40;\n const maxRadius = 160;\n\n return {\n centerIndex,\n angle: MULBERRY.next() * Math.PI * 2,\n angularSpeed: 0.01 + MULBERRY.next() * 0.03,\n radiusX: minRadius + MULBERRY.next() * (maxRadius - minRadius),\n radiusY: (minRadius + MULBERRY.next() * (maxRadius - minRadius)) * (0.3 + MULBERRY.next() * 0.7),\n tilt: MULBERRY.next() * Math.PI,\n size: 1.5 + MULBERRY.next() * 2.5,\n color: this.#colors[Math.floor(MULBERRY.next() * this.#colors.length)],\n trail: [],\n trailHead: 0\n };\n }\n}\n","import { Orbits } from './layer';\nimport type { OrbitsConfig } from './types';\nimport type { Effect } from '../effect';\n\nexport function createOrbits(config?: OrbitsConfig): Effect<OrbitsConfig> {\n return new Orbits(config);\n}\n\nexport type { OrbitsConfig, OrbitalCenter, Orbiter } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { NetworkParticle, ParticleMouseMode } from './types';\n\nexport interface ParticlesConfig {\n readonly count?: number;\n readonly color?: string;\n readonly lineColor?: string;\n readonly size?: [number, number];\n readonly speed?: [number, number];\n readonly connectionDistance?: number;\n readonly lineWidth?: number;\n readonly mouseMode?: ParticleMouseMode;\n readonly mouseRadius?: number;\n readonly mouseStrength?: number;\n readonly particleForces?: boolean;\n readonly glow?: boolean;\n readonly background?: string | null;\n readonly scale?: number;\n}\n\nexport class Particles extends Effect<ParticlesConfig> {\n #scale: number;\n #connectionDistance: number;\n #lineWidth: number;\n #mouseMode: ParticleMouseMode;\n #mouseRadius: number;\n #mouseStrength: number;\n #particleForces: boolean;\n #glow: boolean;\n readonly #background: string | null;\n readonly #colorRGB: [number, number, number];\n readonly #lineColorRGB: [number, number, number];\n readonly #sizeRange: [number, number];\n readonly #speedRange: [number, number];\n readonly #onMouseMoveBound: (evt: MouseEvent) => void;\n readonly #onMouseLeaveBound: () => void;\n #maxCount: number;\n #mouseX: number = -1;\n #mouseY: number = -1;\n #mouseOnCanvas: boolean = false;\n #particles: NetworkParticle[] = [];\n #grid: Map<string, number[]> = new Map();\n #cellSize: number;\n #width: number = 960;\n #height: number = 540;\n #initialized: boolean = false;\n\n constructor(config: ParticlesConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxCount = config.count ?? 100;\n this.#connectionDistance = (config.connectionDistance ?? 120) * this.#scale;\n this.#lineWidth = config.lineWidth ?? 0.5;\n this.#mouseMode = config.mouseMode ?? 'connect';\n this.#mouseRadius = (config.mouseRadius ?? 150) * this.#scale;\n this.#mouseStrength = config.mouseStrength ?? 0.03;\n this.#particleForces = config.particleForces ?? false;\n this.#glow = config.glow ?? false;\n this.#background = config.background ?? null;\n this.#cellSize = this.#connectionDistance;\n\n this.#colorRGB = hexToRGB(config.color ?? '#6366f1');\n this.#lineColorRGB = hexToRGB(config.lineColor ?? '#6366f1');\n\n this.#sizeRange = config.size ?? [1, 3];\n this.#speedRange = config.speed ?? [0.2, 0.8];\n\n if (innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n\n this.#onMouseMoveBound = this.#onMouseMove.bind(this);\n this.#onMouseLeaveBound = this.#onMouseLeave.bind(this);\n }\n\n configure(config: Partial<ParticlesConfig>): void {\n if (config.scale !== undefined) {\n this.#scale = config.scale;\n }\n if (config.connectionDistance !== undefined) {\n this.#connectionDistance = config.connectionDistance * this.#scale;\n }\n if (config.lineWidth !== undefined) {\n this.#lineWidth = config.lineWidth;\n }\n if (config.mouseMode !== undefined) {\n this.#mouseMode = config.mouseMode;\n }\n if (config.mouseRadius !== undefined) {\n this.#mouseRadius = config.mouseRadius * this.#scale;\n }\n if (config.mouseStrength !== undefined) {\n this.#mouseStrength = config.mouseStrength;\n }\n if (config.particleForces !== undefined) {\n this.#particleForces = config.particleForces;\n }\n if (config.glow !== undefined) {\n this.#glow = config.glow;\n }\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n if (!this.#initialized) {\n this.#initialized = true;\n this.#particles = [];\n\n for (let i = 0; i < this.#maxCount; ++i) {\n this.#particles.push(this.#createParticle(this.#sizeRange, this.#speedRange));\n }\n }\n }\n\n onMount(canvas: HTMLCanvasElement): void {\n if (this.#mouseMode !== 'none') {\n canvas.addEventListener('mousemove', this.#onMouseMoveBound, {passive: true});\n canvas.addEventListener('mouseleave', this.#onMouseLeaveBound, {passive: true});\n }\n }\n\n onUnmount(canvas: HTMLCanvasElement): void {\n canvas.removeEventListener('mousemove', this.#onMouseMoveBound);\n canvas.removeEventListener('mouseleave', this.#onMouseLeaveBound);\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n this.#grid.clear();\n\n for (let i = 0; i < this.#particles.length; i++) {\n const particle = this.#particles[i];\n const col = Math.floor(particle.x / this.#cellSize);\n const row = Math.floor(particle.y / this.#cellSize);\n const key = `${col},${row}`;\n const cell = this.#grid.get(key);\n\n if (cell) {\n cell.push(i);\n } else {\n this.#grid.set(key, [i]);\n }\n }\n\n for (const particle of this.#particles) {\n particle.x += particle.vx * dt;\n particle.y += particle.vy * dt;\n\n if (particle.x < 0) {\n particle.x = 0;\n particle.vx = Math.abs(particle.vx);\n } else if (particle.x > width) {\n particle.x = width;\n particle.vx = -Math.abs(particle.vx);\n }\n\n if (particle.y < 0) {\n particle.y = 0;\n particle.vy = Math.abs(particle.vy);\n } else if (particle.y > height) {\n particle.y = height;\n particle.vy = -Math.abs(particle.vy);\n }\n }\n\n if (this.#mouseOnCanvas && (this.#mouseMode === 'attract' || this.#mouseMode === 'repel')) {\n const direction = this.#mouseMode === 'attract' ? -1 : 1;\n\n for (const particle of this.#particles) {\n const dx = particle.x - this.#mouseX;\n const dy = particle.y - this.#mouseY;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n if (dist < this.#mouseRadius && dist > 0) {\n const force = (1 - dist / this.#mouseRadius) * this.#mouseStrength * dt;\n particle.vx += (dx / dist) * force * direction * 100;\n particle.vy += (dy / dist) * force * direction * 100;\n }\n }\n }\n\n if (this.#particleForces) {\n const repelDist = 30 * this.#scale;\n\n for (let i = 0; i < this.#particles.length; i++) {\n const pa = this.#particles[i];\n const col = Math.floor(pa.x / this.#cellSize);\n const row = Math.floor(pa.y / this.#cellSize);\n\n for (let dc = -1; dc <= 1; dc++) {\n for (let dr = -1; dr <= 1; dr++) {\n const key = `${col + dc},${row + dr}`;\n const neighbors = this.#grid.get(key);\n\n if (!neighbors) {\n continue;\n }\n\n for (const j of neighbors) {\n if (j <= i) {\n continue;\n }\n\n const pb = this.#particles[j];\n const dx = pa.x - pb.x;\n const dy = pa.y - pb.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n if (dist < repelDist && dist > 0) {\n const force = (1 - dist / repelDist) * 0.5 * dt;\n const nx = dx / dist;\n const ny = dy / dist;\n pa.vx += nx * force;\n pa.vy += ny * force;\n pb.vx -= nx * force;\n pb.vy -= ny * force;\n }\n }\n }\n }\n }\n }\n\n for (const particle of this.#particles) {\n const currentSpeed = Math.sqrt(particle.vx * particle.vx + particle.vy * particle.vy);\n\n if (currentSpeed > particle.baseSpeed) {\n const damping = Math.pow(0.98, dt);\n particle.vx *= damping;\n particle.vy *= damping;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n if (this.#background) {\n ctx.fillStyle = this.#background;\n ctx.fillRect(0, 0, width, height);\n }\n\n const [lr, lg, lb] = this.#lineColorRGB;\n const [pr, pg, pb] = this.#colorRGB;\n const connDist = this.#connectionDistance;\n\n ctx.lineWidth = this.#lineWidth;\n\n const drawn = new Set<string>();\n\n for (let i = 0; i < this.#particles.length; i++) {\n const pa = this.#particles[i];\n const col = Math.floor(pa.x / this.#cellSize);\n const row = Math.floor(pa.y / this.#cellSize);\n\n for (let dc = -1; dc <= 1; dc++) {\n for (let dr = -1; dr <= 1; dr++) {\n const key = `${col + dc},${row + dr}`;\n const neighbors = this.#grid.get(key);\n\n if (!neighbors) {\n continue;\n }\n\n for (const j of neighbors) {\n if (j <= i) {\n continue;\n }\n\n const pairKey = `${i},${j}`;\n\n if (drawn.has(pairKey)) {\n continue;\n }\n\n drawn.add(pairKey);\n\n const pb2 = this.#particles[j];\n const dx = pa.x - pb2.x;\n const dy = pa.y - pb2.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n if (dist < connDist) {\n const alpha = 1 - dist / connDist;\n ctx.beginPath();\n ctx.moveTo(pa.x, pa.y);\n ctx.lineTo(pb2.x, pb2.y);\n ctx.strokeStyle = `rgba(${lr}, ${lg}, ${lb}, ${alpha * 0.6})`;\n ctx.stroke();\n }\n }\n }\n }\n }\n\n if (this.#mouseOnCanvas && this.#mouseMode === 'connect') {\n for (const particle of this.#particles) {\n const dx = particle.x - this.#mouseX;\n const dy = particle.y - this.#mouseY;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n if (dist < this.#mouseRadius) {\n const alpha = 1 - dist / this.#mouseRadius;\n ctx.beginPath();\n ctx.moveTo(this.#mouseX, this.#mouseY);\n ctx.lineTo(particle.x, particle.y);\n ctx.strokeStyle = `rgba(${lr}, ${lg}, ${lb}, ${alpha * 0.8})`;\n ctx.stroke();\n }\n }\n }\n\n if (this.#glow) {\n ctx.shadowColor = `rgb(${pr}, ${pg}, ${pb})`;\n ctx.shadowBlur = 8 * this.#scale;\n }\n\n for (const particle of this.#particles) {\n ctx.beginPath();\n ctx.arc(particle.x, particle.y, particle.radius * this.#scale, 0, Math.PI * 2);\n ctx.fillStyle = `rgb(${pr}, ${pg}, ${pb})`;\n ctx.fill();\n }\n\n if (this.#glow) {\n ctx.shadowBlur = 0;\n }\n }\n\n #onMouseMove(evt: MouseEvent): void {\n const target = evt.currentTarget as HTMLCanvasElement;\n const rect = target.getBoundingClientRect();\n this.#mouseX = evt.clientX - rect.left;\n this.#mouseY = evt.clientY - rect.top;\n this.#mouseOnCanvas = true;\n }\n\n #onMouseLeave(): void {\n this.#mouseOnCanvas = false;\n }\n\n #createParticle(sizeRange: [number, number], speedRange: [number, number]): NetworkParticle {\n const angle = MULBERRY.next() * Math.PI * 2;\n const speed = speedRange[0] + MULBERRY.next() * (speedRange[1] - speedRange[0]);\n\n return {\n x: MULBERRY.next() * this.#width,\n y: MULBERRY.next() * this.#height,\n vx: Math.cos(angle) * speed,\n vy: Math.sin(angle) * speed,\n radius: sizeRange[0] + MULBERRY.next() * (sizeRange[1] - sizeRange[0]),\n baseSpeed: speed\n };\n }\n}\n","import { Particles } from './layer';\nimport type { ParticlesConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createParticles(config?: ParticlesConfig): Effect<ParticlesConfig> {\n return new Particles(config);\n}\n\nexport type { ParticlesConfig };\nexport type { NetworkParticle, ParticleMouseMode } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n\nexport const PETAL_COLORS: string[] = [\n '#ffb7c5', // sakura pink\n '#ffc0cb', // pink\n '#ffd1dc', // pastel pink\n '#ffe4e9', // light pink\n '#fff0f3', // near white pink\n '#f8c3cd', // rose pink\n '#f4a7b9' // deeper pink\n];\n","import { Effect } from '../effect';\nimport { MULBERRY, PETAL_COLORS } from './consts';\nimport type { Petal } from './types';\n\nexport interface PetalsConfig {\n readonly count?: number;\n readonly colors?: string[];\n readonly size?: number;\n readonly speed?: number;\n readonly wind?: number;\n readonly scale?: number;\n}\n\nexport class Petals extends Effect<PetalsConfig> {\n readonly #scale: number;\n readonly #size: number;\n #speed: number;\n #wind: number;\n readonly #colors: string[];\n #maxCount: number;\n #time: number = 0;\n #petals: Petal[] = [];\n #sprites: HTMLCanvasElement[] = [];\n\n constructor(config: PetalsConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxCount = config.count ?? 100;\n this.#size = (config.size ?? 24) * this.#scale;\n this.#speed = config.speed ?? 0.7;\n this.#wind = config.wind ?? 0.15;\n this.#colors = config.colors ?? PETAL_COLORS;\n\n if (innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n\n this.#sprites = this.#createSprites();\n\n for (let i = 0; i < this.#maxCount; ++i) {\n this.#petals.push(this.#createPetal(true));\n }\n }\n\n configure(config: Partial<PetalsConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.wind !== undefined) {\n this.#wind = config.wind;\n }\n }\n\n tick(dt: number, _width: number, height: number): void {\n const speedFactor = (height / 540) / this.#speed;\n\n this.#time += 0.012 * dt;\n\n const globalWind = Math.sin(this.#time * 0.4) * 0.3\n + Math.sin(this.#time * 1.1 + 1.5) * 0.15\n + Math.sin(this.#time * 2.7) * 0.08;\n\n for (let index = 0; index < this.#petals.length; index++) {\n const petal = this.#petals[index];\n\n const swing = Math.sin(this.#time * petal.swingFrequency + petal.swingOffset) * petal.swingAmplitude;\n\n petal.x += (swing + (this.#wind + globalWind * 0.4) * petal.depth) * dt / (3000 * speedFactor);\n petal.y += (petal.fallSpeed * 1.5 + petal.depth * 0.5) * dt / (600 * speedFactor);\n\n petal.rotation += petal.rotationSpeed * dt;\n petal.flipAngle += petal.flipSpeed * dt;\n\n if (petal.x > 1.15 || petal.x < -0.15 || petal.y > 1.05) {\n const recycled = this.#createPetal(false);\n\n if (this.#wind + globalWind > 0.1) {\n recycled.x = -0.15;\n recycled.y = MULBERRY.next() * 0.6;\n } else {\n recycled.x = MULBERRY.next();\n recycled.y = -0.05 - MULBERRY.next() * 0.15;\n }\n\n this.#petals[index] = recycled;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n for (const petal of this.#petals) {\n const px = petal.x * width;\n const py = petal.y * height;\n const displaySize = petal.size * petal.depth;\n const scaleX = Math.cos(petal.flipAngle);\n const cos = Math.cos(petal.rotation);\n const sin = Math.sin(petal.rotation);\n\n ctx.save();\n ctx.transform(cos * scaleX, sin * scaleX, -sin, cos, px, py);\n ctx.globalAlpha = 0.4 + petal.depth * 0.6;\n ctx.drawImage(\n this.#sprites[petal.colorIndex % this.#sprites.length],\n -displaySize / 2,\n -displaySize / 2,\n displaySize,\n displaySize\n );\n ctx.restore();\n }\n\n ctx.globalAlpha = 1;\n }\n\n #createSprites(): HTMLCanvasElement[] {\n const sprites: HTMLCanvasElement[] = [];\n\n for (const color of this.#colors) {\n sprites.push(this.#createPetalSprite(color));\n }\n\n return sprites;\n }\n\n #createPetalSprite(color: string): HTMLCanvasElement {\n const size = 64;\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n const ctx = canvas.getContext('2d')!;\n\n const cx = size / 2;\n const cy = size / 2;\n const hw = size * 0.28;\n const hh = size * 0.38;\n\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(cx, cy - hh);\n ctx.bezierCurveTo(cx + hw * 1.4, cy - hh * 0.6, cx + hw * 1.1, cy + hh * 0.3, cx, cy + hh);\n ctx.bezierCurveTo(cx - hw * 1.1, cy + hh * 0.3, cx - hw * 1.4, cy - hh * 0.6, cx, cy - hh);\n ctx.fill();\n\n ctx.strokeStyle = 'rgba(200, 100, 120, 0.15)';\n ctx.lineWidth = 0.6;\n ctx.beginPath();\n ctx.moveTo(cx, cy - hh * 0.6);\n ctx.quadraticCurveTo(cx + 1, cy, cx, cy + hh * 0.7);\n ctx.stroke();\n\n return canvas;\n }\n\n #createPetal(initialSpread: boolean): Petal {\n const depth = 0.5 + MULBERRY.next() * 0.5;\n\n return {\n x: MULBERRY.next(),\n y: initialSpread ? MULBERRY.next() * 2 - 1 : -0.05 - MULBERRY.next() * 0.15,\n size: (MULBERRY.next() * 0.4 + 0.6) * this.#size,\n depth,\n rotation: MULBERRY.next() * Math.PI * 2,\n rotationSpeed: (MULBERRY.next() - 0.5) * 0.03,\n flipAngle: MULBERRY.next() * Math.PI * 2,\n flipSpeed: 0.015 + MULBERRY.next() * 0.03,\n swingAmplitude: 0.5 + MULBERRY.next() * 1.0,\n swingFrequency: 0.4 + MULBERRY.next() * 1.2,\n swingOffset: MULBERRY.next() * Math.PI * 2,\n fallSpeed: 0.2 + MULBERRY.next() * 0.5,\n colorIndex: Math.floor(MULBERRY.next() * this.#colors.length)\n };\n }\n}\n","import { Petals } from './layer';\nimport type { PetalsConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createPetals(config?: PetalsConfig): Effect<PetalsConfig> {\n return new Petals(config);\n}\n\nexport type { PetalsConfig };\nexport type { Petal } from './types';\n","import { Effect } from '../effect';\nimport type { PlasmaColor } from './types';\n\nexport interface PlasmaConfig {\n readonly speed?: number;\n readonly scale?: number;\n readonly resolution?: number;\n readonly palette?: PlasmaColor[];\n}\n\nconst DEFAULT_PALETTE: PlasmaColor[] = [\n {r: 0, g: 255, b: 255},\n {r: 255, g: 0, b: 255},\n {r: 255, g: 255, b: 0},\n {r: 0, g: 100, b: 255},\n {r: 0, g: 255, b: 100}\n];\n\nexport class Plasma extends Effect<PlasmaConfig> {\n #speed: number;\n #scale: number;\n readonly #resolution: number;\n readonly #palette: PlasmaColor[];\n #time: number = 0;\n #offscreen: HTMLCanvasElement | null = null;\n #offscreenCtx: CanvasRenderingContext2D | null = null;\n #imageData: ImageData | null = null;\n\n constructor(config: PlasmaConfig = {}) {\n super();\n\n this.#speed = config.speed ?? 1;\n this.#scale = config.scale ?? 1;\n this.#resolution = config.resolution ?? 4;\n this.#palette = config.palette ?? DEFAULT_PALETTE;\n }\n\n configure(config: Partial<PlasmaConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.scale !== undefined) {\n this.#scale = config.scale;\n }\n }\n\n tick(dt: number, _width: number, _height: number): void {\n this.#time += 0.02 * dt * this.#speed;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const resolution = this.#resolution;\n const offWidth = Math.ceil(width / resolution);\n const offHeight = Math.ceil(height / resolution);\n\n if (!this.#offscreen || this.#offscreen.width !== offWidth || this.#offscreen.height !== offHeight) {\n this.#offscreen = document.createElement('canvas');\n this.#offscreen.width = offWidth;\n this.#offscreen.height = offHeight;\n this.#offscreenCtx = this.#offscreen.getContext('2d');\n this.#imageData = this.#offscreenCtx!.createImageData(offWidth, offHeight);\n }\n\n const data = this.#imageData!.data;\n const time = this.#time;\n const scale = this.#scale;\n const freq = 50 * scale;\n const palette = this.#palette;\n const paletteLen = palette.length;\n\n for (let py = 0; py < offHeight; py++) {\n const worldY = py * resolution;\n\n for (let px = 0; px < offWidth; px++) {\n const worldX = px * resolution;\n\n const value = Math.sin(worldX / freq + time)\n + Math.sin(worldY / freq + time * 0.7)\n + Math.sin((worldX + worldY) / (freq * 1.3) + time * 1.3)\n + Math.sin(Math.sqrt(worldX * worldX + worldY * worldY) / freq + time * 0.5);\n\n const normalized = (value + 4) / 8;\n const mapped = normalized * (paletteLen - 1);\n const index = Math.floor(mapped);\n const frac = mapped - index;\n\n const colorA = palette[index];\n const colorB = palette[Math.min(index + 1, paletteLen - 1)];\n\n const red = colorA.r + (colorB.r - colorA.r) * frac;\n const green = colorA.g + (colorB.g - colorA.g) * frac;\n const blue = colorA.b + (colorB.b - colorA.b) * frac;\n\n const offset = (py * offWidth + px) * 4;\n data[offset] = red;\n data[offset + 1] = green;\n data[offset + 2] = blue;\n data[offset + 3] = 255;\n }\n }\n\n this.#offscreenCtx!.putImageData(this.#imageData!, 0, 0);\n\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(this.#offscreen!, 0, 0, width, height);\n }\n}\n","import { Plasma } from './layer';\nimport type { PlasmaConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createPlasma(config?: PlasmaConfig): Effect<PlasmaConfig> {\n return new Plasma(config);\n}\n\nexport type { PlasmaConfig };\nexport type { PlasmaColor } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { PollenParticle } from './types';\n\nconst TAU = Math.PI * 2;\nconst SPRITE_SIZE = 64;\nconst SPRITE_CENTER = SPRITE_SIZE / 2;\nconst SPRITE_RADIUS = SPRITE_SIZE / 2;\n\nexport interface PollenConfig {\n readonly count?: number;\n readonly speed?: number;\n readonly size?: number;\n readonly color?: string;\n readonly glowSize?: number;\n readonly wind?: number;\n readonly scale?: number;\n}\n\nexport class Pollen extends Effect<PollenConfig> {\n readonly #scale: number;\n readonly #size: number;\n readonly #glowSize: number;\n #speed: number;\n #wind: number;\n #maxCount: number;\n #time: number = 0;\n #particles: PollenParticle[] = [];\n #sprite: HTMLCanvasElement;\n #width: number = 0;\n #height: number = 0;\n\n constructor(config: PollenConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxCount = config.count ?? 40;\n this.#size = (config.size ?? 3) * this.#scale;\n this.#speed = config.speed ?? 0.5;\n this.#wind = config.wind ?? 0.3;\n this.#glowSize = config.glowSize ?? 2;\n\n if (innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n\n const {r, g, b} = this.#parseColor(config.color ?? '#fff8e1');\n this.#sprite = this.#createSprite(r, g, b);\n }\n\n configure(config: Partial<PollenConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.wind !== undefined) {\n this.#wind = config.wind;\n }\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n this.#particles = [];\n\n for (let idx = 0; idx < this.#maxCount; ++idx) {\n this.#particles.push(this.#createParticle(\n MULBERRY.next() * width,\n MULBERRY.next() * height\n ));\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#time += 0.02 * dt * this.#speed;\n\n const windForce = this.#wind * this.#speed;\n\n for (const particle of this.#particles) {\n // Brownian-like motion with gentle drift.\n const brownianX = Math.sin(this.#time * 3 + particle.phase) * 0.4;\n const brownianY = Math.cos(this.#time * 2.5 + particle.phase * 1.3) * 0.3;\n\n particle.x += (windForce + brownianX) * particle.drift * dt * 0.5;\n particle.y += (-0.2 * particle.speed * this.#speed + brownianY) * dt * 0.5;\n\n // Pulsing opacity (catching sunlight).\n particle.opacity = 0.3 + 0.7 * Math.abs(Math.sin(this.#time * particle.phaseSpeed + particle.phase));\n\n // Recycle particles that leave bounds.\n if (particle.x > width + 20) {\n particle.x = -10;\n particle.y = MULBERRY.next() * height;\n } else if (particle.x < -20) {\n particle.x = width + 10;\n particle.y = MULBERRY.next() * height;\n }\n\n if (particle.y < -20) {\n particle.y = height + 10;\n particle.x = MULBERRY.next() * width;\n } else if (particle.y > height + 20) {\n particle.y = -10;\n particle.x = MULBERRY.next() * width;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, _width: number, _height: number): void {\n ctx.globalCompositeOperation = 'lighter';\n\n for (const particle of this.#particles) {\n if (particle.opacity < 0.05) {\n continue;\n }\n\n const displaySize = particle.size * this.#glowSize * 2;\n\n ctx.globalAlpha = particle.opacity;\n ctx.drawImage(\n this.#sprite,\n particle.x - displaySize / 2,\n particle.y - displaySize / 2,\n displaySize,\n displaySize\n );\n }\n\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = 1;\n }\n\n #parseColor(color: string): { r: number; g: number; b: number } {\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d')!;\n ctx.fillStyle = color;\n ctx.fillRect(0, 0, 1, 1);\n const data = ctx.getImageData(0, 0, 1, 1).data;\n return {r: data[0], g: data[1], b: data[2]};\n }\n\n #createSprite(r: number, g: number, b: number): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.width = SPRITE_SIZE;\n canvas.height = SPRITE_SIZE;\n const ctx = canvas.getContext('2d')!;\n\n const gradient = ctx.createRadialGradient(\n SPRITE_CENTER, SPRITE_CENTER, 0,\n SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS\n );\n\n gradient.addColorStop(0, `rgba(${r}, ${g}, ${b}, 1)`);\n gradient.addColorStop(0.15, `rgba(${r}, ${g}, ${b}, 0.6)`);\n gradient.addColorStop(0.4, `rgba(${r}, ${g}, ${b}, 0.2)`);\n gradient.addColorStop(0.7, `rgba(${r}, ${g}, ${b}, 0.05)`);\n gradient.addColorStop(1, `rgba(${r}, ${g}, ${b}, 0)`);\n\n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.arc(SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS, 0, TAU);\n ctx.fill();\n\n return canvas;\n }\n\n #createParticle(px: number, py: number): PollenParticle {\n return {\n x: px,\n y: py,\n size: (MULBERRY.next() * 0.6 + 0.7) * this.#size,\n speed: 0.3 + MULBERRY.next() * 0.7,\n phase: MULBERRY.next() * TAU,\n phaseSpeed: 0.5 + MULBERRY.next() * 1.5,\n opacity: MULBERRY.next(),\n drift: 0.5 + MULBERRY.next() * 1\n };\n }\n}\n","import { Pollen } from './layer';\nimport type { PollenConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createPollen(config?: PollenConfig): Effect<PollenConfig> {\n return new Pollen(config);\n}\n\nexport type { PollenConfig };\nexport type { PollenParticle } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { PopcornKernel } from './types';\n\nexport interface PopcornConfig {\n readonly count?: number;\n readonly speed?: number;\n readonly gravity?: number;\n readonly bounciness?: number;\n readonly color?: string;\n readonly popRate?: number;\n readonly scale?: number;\n}\n\nexport class Popcorn extends Effect<PopcornConfig> {\n readonly #scale: number;\n readonly #maxCount: number;\n readonly #bounciness: number;\n readonly #colorRGB: [number, number, number];\n #speed: number;\n #gravity: number;\n #popRate: number;\n #kernels: PopcornKernel[] = [];\n #spawnAccumulator: number = 0;\n\n constructor(config: PopcornConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxCount = config.count ?? 25;\n this.#speed = config.speed ?? 1;\n this.#gravity = config.gravity ?? 1;\n this.#bounciness = config.bounciness ?? 0.6;\n this.#popRate = config.popRate ?? 2;\n this.#colorRGB = hexToRGB(config.color ?? '#fff8dc');\n }\n\n configure(config: Partial<PopcornConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.gravity !== undefined) {\n this.#gravity = config.gravity;\n }\n if (config.popRate !== undefined) {\n this.#popRate = config.popRate;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n const speed = this.#speed;\n const gravity = this.#gravity;\n const bounciness = this.#bounciness;\n const groundY = height * 0.95;\n const scale = this.#scale;\n\n this.#spawnAccumulator += this.#popRate * speed * dt / 60;\n\n while (this.#spawnAccumulator >= 1 && this.#kernels.length < this.#maxCount) {\n this.#spawnAccumulator -= 1;\n this.#kernels.push(this.#createKernel(width, height));\n }\n\n if (this.#spawnAccumulator >= 1) {\n this.#spawnAccumulator = 0;\n }\n\n let alive = 0;\n\n for (let idx = 0; idx < this.#kernels.length; idx++) {\n const kernel = this.#kernels[idx];\n\n if (kernel.settled) {\n kernel.opacity -= 0.005 * speed * dt;\n\n if (kernel.opacity <= 0) {\n continue;\n }\n\n this.#kernels[alive++] = kernel;\n continue;\n }\n\n kernel.vy += 0.15 * gravity * scale * speed * dt;\n kernel.x += kernel.vx * speed * dt;\n kernel.y += kernel.vy * speed * dt;\n kernel.rotation += kernel.rotationSpeed * speed * dt;\n\n if (!kernel.popped && kernel.vy < 0) {\n kernel.popped = true;\n kernel.size *= 2.2;\n }\n\n if (kernel.y >= groundY) {\n kernel.y = groundY;\n kernel.vy = -Math.abs(kernel.vy) * bounciness;\n kernel.vx *= 0.8;\n kernel.bounces++;\n\n if (kernel.bounces > 3) {\n kernel.settled = true;\n kernel.vy = 0;\n kernel.vx = 0;\n }\n }\n\n if (kernel.x < -50 || kernel.x > width + 50) {\n continue;\n }\n\n this.#kernels[alive++] = kernel;\n }\n\n this.#kernels.length = alive;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const [red, green, blue] = this.#colorRGB;\n\n for (let idx = 0; idx < this.#kernels.length; idx++) {\n const kernel = this.#kernels[idx];\n const alpha = kernel.opacity;\n\n if (alpha <= 0) {\n continue;\n }\n\n ctx.globalAlpha = alpha;\n\n if (!kernel.popped) {\n this.#drawUnpopped(ctx, kernel, red, green, blue);\n } else {\n this.#drawPopped(ctx, kernel, red, green, blue);\n }\n }\n\n ctx.globalAlpha = 1;\n }\n\n #drawUnpopped(ctx: CanvasRenderingContext2D, kernel: PopcornKernel, red: number, green: number, blue: number): void {\n const size = kernel.size;\n const cos = Math.cos(kernel.rotation);\n const sin = Math.sin(kernel.rotation);\n\n ctx.save();\n ctx.transform(cos, sin, -sin, cos, kernel.x, kernel.y);\n ctx.beginPath();\n ctx.arc(0, 0, size, 0, Math.PI * 2);\n ctx.fillStyle = `rgb(${(red * 0.7) | 0}, ${(green * 0.7) | 0}, ${(blue * 0.5) | 0})`;\n ctx.fill();\n ctx.restore();\n }\n\n #drawPopped(ctx: CanvasRenderingContext2D, kernel: PopcornKernel, red: number, green: number, blue: number): void {\n const size = kernel.size;\n const cos = Math.cos(kernel.rotation);\n const sin = Math.sin(kernel.rotation);\n\n ctx.save();\n ctx.transform(cos, sin, -sin, cos, kernel.x, kernel.y);\n ctx.beginPath();\n\n const lobes = 5;\n\n for (let idx = 0; idx < lobes; idx++) {\n const angle = (idx / lobes) * Math.PI * 2;\n const lumpRadius = size * (0.7 + 0.3 * Math.sin(idx * 2.7 + kernel.rotation));\n const lx = Math.cos(angle) * lumpRadius;\n const ly = Math.sin(angle) * lumpRadius;\n const cpAngle = ((idx + 0.5) / lobes) * Math.PI * 2;\n const cpRadius = size * 1.1;\n const cpx = Math.cos(cpAngle) * cpRadius;\n const cpy = Math.sin(cpAngle) * cpRadius;\n\n if (idx === 0) {\n ctx.moveTo(lx, ly);\n }\n\n const nextIdx = (idx + 1) % lobes;\n const nextAngle = (nextIdx / lobes) * Math.PI * 2;\n const nextLumpRadius = size * (0.7 + 0.3 * Math.sin(nextIdx * 2.7 + kernel.rotation));\n const nlx = Math.cos(nextAngle) * nextLumpRadius;\n const nly = Math.sin(nextAngle) * nextLumpRadius;\n\n ctx.quadraticCurveTo(cpx, cpy, nlx, nly);\n }\n\n ctx.closePath();\n ctx.fillStyle = `rgb(${red}, ${green}, ${blue})`;\n ctx.fill();\n\n ctx.beginPath();\n ctx.arc(-size * 0.2, -size * 0.2, size * 0.3, 0, Math.PI * 2);\n ctx.fillStyle = `rgba(255, 255, 255, 0.3)`;\n ctx.fill();\n\n ctx.restore();\n }\n\n #createKernel(width: number, height: number): PopcornKernel {\n const scale = this.#scale;\n\n return {\n x: width * (0.15 + MULBERRY.next() * 0.7),\n y: height * (0.7 + MULBERRY.next() * 0.25),\n vx: (MULBERRY.next() - 0.5) * 2 * scale,\n vy: -(3 + MULBERRY.next() * 5) * scale,\n size: (3 + MULBERRY.next() * 3) * scale,\n rotation: MULBERRY.next() * Math.PI * 2,\n rotationSpeed: (MULBERRY.next() - 0.5) * 0.15,\n popped: false,\n opacity: 1,\n settled: false,\n bounces: 0\n };\n }\n}\n","import { Popcorn } from './layer';\nimport type { PopcornConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createPopcorn(config?: PopcornConfig): Effect<PopcornConfig> {\n return new Popcorn(config);\n}\n\nexport type { PopcornConfig };\nexport type { PopcornKernel } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { PortalDirection, PortalParticle } from './types';\n\nexport interface PortalConfig {\n readonly speed?: number;\n readonly particles?: number;\n readonly size?: number;\n readonly color?: string;\n readonly secondaryColor?: string;\n readonly direction?: PortalDirection;\n readonly scale?: number;\n}\n\nexport class Portal extends Effect<PortalConfig> {\n #speed: number;\n #scale: number;\n readonly #size: number;\n readonly #colorRGB: [number, number, number];\n readonly #secondaryRGB: [number, number, number];\n readonly #direction: PortalDirection;\n #count: number;\n #particles: PortalParticle[] = [];\n #width: number = 960;\n #height: number = 540;\n #time: number = 0;\n #initialized: boolean = false;\n\n constructor(config: PortalConfig = {}) {\n super();\n\n let count = config.particles ?? 100;\n\n this.#speed = config.speed ?? 1;\n this.#scale = config.scale ?? 1;\n this.#size = config.size ?? 0.3;\n this.#colorRGB = hexToRGB(config.color ?? '#8844ff');\n this.#secondaryRGB = hexToRGB(config.secondaryColor ?? '#44aaff');\n this.#direction = config.direction ?? 'inward';\n\n if (innerWidth < 991) {\n count = Math.floor(count / 2);\n }\n\n this.#count = count;\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n if (!this.#initialized) {\n this.#initialized = true;\n this.#particles = [];\n\n for (let i = 0; i < this.#count; ++i) {\n this.#particles.push(this.#createParticle(true));\n }\n }\n }\n\n configure(config: Partial<PortalConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.scale !== undefined) {\n this.#scale = config.scale;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n this.#time += dt * this.#speed * 0.01;\n\n const portalRadius = Math.min(width, height) * this.#size * this.#scale;\n const maxDistance = Math.sqrt((width / 2) ** 2 + (height / 2) ** 2);\n\n let alive = 0;\n\n for (let i = 0; i < this.#particles.length; ++i) {\n const particle = this.#particles[i];\n\n particle.angle += particle.rotationSpeed * this.#speed * dt * this.#scale;\n\n if (this.#direction === 'inward') {\n const normalizedDistance = particle.distance / maxDistance;\n const acceleration = 1 + (1 - normalizedDistance) * 2;\n particle.distance -= particle.speed * this.#speed * acceleration * dt * this.#scale;\n\n particle.opacity = Math.min(1, normalizedDistance * 2);\n\n if (particle.distance > portalRadius * 0.1) {\n this.#particles[alive++] = particle;\n } else {\n this.#particles[alive++] = this.#createParticle(false);\n }\n } else {\n const normalizedDistance = particle.distance / maxDistance;\n const acceleration = 1 + normalizedDistance * 2;\n particle.distance += particle.speed * this.#speed * acceleration * dt * this.#scale;\n\n particle.opacity = Math.min(1, (1 - normalizedDistance) * 2);\n\n if (particle.distance < maxDistance + 20) {\n this.#particles[alive++] = particle;\n } else {\n this.#particles[alive++] = this.#createParticle(false);\n }\n }\n }\n\n this.#particles.length = alive;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const cx = width / 2;\n const cy = height / 2;\n const portalRadius = Math.min(width, height) * this.#size * this.#scale;\n const [pr, pg, pb] = this.#colorRGB;\n const [sr, sg, sb] = this.#secondaryRGB;\n\n ctx.globalCompositeOperation = 'lighter';\n\n // Inner glow\n const innerGlow = ctx.createRadialGradient(cx, cy, 0, cx, cy, portalRadius * 0.5);\n innerGlow.addColorStop(0, `rgba(255, 255, 255, 0.15)`);\n innerGlow.addColorStop(0.3, `rgba(${pr}, ${pg}, ${pb}, 0.1)`);\n innerGlow.addColorStop(1, `rgba(${pr}, ${pg}, ${pb}, 0)`);\n\n ctx.beginPath();\n ctx.arc(cx, cy, portalRadius * 0.5, 0, Math.PI * 2);\n ctx.fillStyle = innerGlow;\n ctx.fill();\n\n // Ring with distortion and swirl\n const ringSegments = 6;\n const time = this.#time;\n\n for (let ring = 0; ring < ringSegments; ++ring) {\n const ringPhase = (ring / ringSegments) * Math.PI * 2;\n const ringAlpha = 0.15 - ring * 0.015;\n const ringWidth = 3 + ring * 1.5;\n\n ctx.beginPath();\n ctx.lineWidth = ringWidth * this.#scale;\n\n for (let angle = 0; angle <= Math.PI * 2; angle += 0.02) {\n const distortion = 1\n + Math.sin(angle * 3 + time * 2 + ringPhase) * 0.04\n + Math.sin(angle * 5 + time * 3.7) * 0.02\n + Math.sin(angle * 7 + time * 1.3 + ringPhase) * 0.015;\n\n const radius = portalRadius * distortion;\n const px = cx + Math.cos(angle + time * 0.5 + ringPhase * 0.3) * radius;\n const py = cy + Math.sin(angle + time * 0.5 + ringPhase * 0.3) * radius;\n\n if (angle === 0) {\n ctx.moveTo(px, py);\n } else {\n ctx.lineTo(px, py);\n }\n }\n\n ctx.closePath();\n\n const mixFactor = ring / ringSegments;\n const colorR = Math.round(pr + (sr - pr) * mixFactor);\n const colorG = Math.round(pg + (sg - pg) * mixFactor);\n const colorB = Math.round(pb + (sb - pb) * mixFactor);\n\n ctx.strokeStyle = `rgba(${colorR}, ${colorG}, ${colorB}, ${ringAlpha})`;\n ctx.stroke();\n }\n\n // Ring glow\n const ringGlow = ctx.createRadialGradient(cx, cy, portalRadius * 0.8, cx, cy, portalRadius * 1.3);\n ringGlow.addColorStop(0, `rgba(${pr}, ${pg}, ${pb}, 0)`);\n ringGlow.addColorStop(0.5, `rgba(${pr}, ${pg}, ${pb}, 0.08)`);\n ringGlow.addColorStop(1, `rgba(${pr}, ${pg}, ${pb}, 0)`);\n\n ctx.beginPath();\n ctx.arc(cx, cy, portalRadius * 1.3, 0, Math.PI * 2);\n ctx.fillStyle = ringGlow;\n ctx.fill();\n\n // Particles\n for (const particle of this.#particles) {\n const px = cx + Math.cos(particle.angle) * particle.distance;\n const py = cy + Math.sin(particle.angle) * particle.distance;\n\n const trailAngle = this.#direction === 'inward' ? particle.angle + Math.PI : particle.angle;\n const trailLength = (8 + particle.speed * 4) * this.#scale;\n const tx = px + Math.cos(trailAngle) * trailLength;\n const ty = py + Math.sin(trailAngle) * trailLength;\n\n const alpha = Math.max(0.05, Math.min(1, particle.opacity));\n const lineWidth = Math.max(0.5, particle.size * this.#scale);\n\n const gradient = ctx.createLinearGradient(px, py, tx, ty);\n gradient.addColorStop(0, `rgba(${sr}, ${sg}, ${sb}, ${alpha})`);\n gradient.addColorStop(1, `rgba(${sr}, ${sg}, ${sb}, 0)`);\n\n ctx.globalAlpha = 1;\n ctx.beginPath();\n ctx.moveTo(px, py);\n ctx.lineTo(tx, ty);\n ctx.strokeStyle = gradient;\n ctx.lineWidth = lineWidth;\n ctx.stroke();\n\n // Glowing dot at particle head\n ctx.globalAlpha = alpha;\n ctx.beginPath();\n ctx.arc(px, py, lineWidth * 0.8, 0, Math.PI * 2);\n ctx.fillStyle = `rgb(${sr}, ${sg}, ${sb})`;\n ctx.fill();\n }\n\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = 1;\n }\n\n #createParticle(spread: boolean): PortalParticle {\n const maxDistance = Math.sqrt((this.#width / 2) ** 2 + (this.#height / 2) ** 2);\n const portalRadius = Math.min(this.#width, this.#height) * this.#size * this.#scale;\n const angle = MULBERRY.next() * Math.PI * 2;\n\n let distance: number;\n\n if (this.#direction === 'inward') {\n distance = spread\n ? portalRadius + MULBERRY.next() * (maxDistance - portalRadius)\n : maxDistance * (0.7 + MULBERRY.next() * 0.3);\n } else {\n distance = spread\n ? portalRadius + MULBERRY.next() * (maxDistance - portalRadius)\n : portalRadius * (1 + MULBERRY.next() * 0.2);\n }\n\n return {\n angle,\n distance,\n speed: 0.3 + MULBERRY.next() * 1.2,\n size: 0.8 + MULBERRY.next() * 2,\n opacity: 1,\n rotationSpeed: (0.002 + MULBERRY.next() * 0.006) * (MULBERRY.next() > 0.5 ? 1 : -1)\n };\n }\n}\n","import { Portal } from './layer';\nimport type { PortalConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createPortal(config?: PortalConfig): Effect<PortalConfig> {\n return new Portal(config);\n}\n\nexport type { PortalConfig };\nexport type { PortalDirection, PortalParticle } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { PulseWave } from './types';\n\nexport interface PulseGridConfig {\n readonly spacing?: number;\n readonly speed?: number;\n readonly color?: string;\n readonly dotSize?: number;\n readonly waveCount?: number;\n readonly waveSpeed?: number;\n readonly scale?: number;\n}\n\nconst DEFAULT_SPACING = 30;\nconst DEFAULT_DOT_SIZE = 2;\nconst DEFAULT_WAVE_COUNT = 3;\nconst DEFAULT_WAVE_SPEED = 100;\nconst TWO_PI = Math.PI * 2;\n\nexport class PulseGrid extends Effect<PulseGridConfig> {\n readonly #scale: number;\n readonly #dotSize: number;\n readonly #r: number;\n readonly #g: number;\n readonly #b: number;\n #speed: number;\n #waveSpeed: number;\n #spacing: number;\n #waveCount: number;\n #gridX: Float32Array = new Float32Array(0);\n #gridY: Float32Array = new Float32Array(0);\n #gridCount: number = 0;\n #waves: PulseWave[] = [];\n #spawnTimer: number = 0;\n #width: number = 0;\n #height: number = 0;\n\n constructor(config: PulseGridConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#spacing = (config.spacing ?? DEFAULT_SPACING) * this.#scale;\n this.#speed = config.speed ?? 1;\n this.#dotSize = (config.dotSize ?? DEFAULT_DOT_SIZE) * this.#scale;\n this.#waveCount = config.waveCount ?? DEFAULT_WAVE_COUNT;\n this.#waveSpeed = (config.waveSpeed ?? DEFAULT_WAVE_SPEED) * this.#scale;\n\n const [r, g, b] = hexToRGB(config.color ?? '#4488ff');\n this.#r = r;\n this.#g = g;\n this.#b = b;\n }\n\n configure(config: Partial<PulseGridConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.waveSpeed !== undefined) {\n this.#waveSpeed = (config.waveSpeed) * this.#scale;\n }\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n this.#buildGrid(width, height);\n }\n\n tick(dt: number, _width: number, _height: number): void {\n const dtSeconds = dt * 0.008 * this.#speed;\n\n // Update existing waves.\n let writeIndex = 0;\n\n for (let index = 0; index < this.#waves.length; index++) {\n const wave = this.#waves[index];\n wave.radius += wave.speed * dtSeconds;\n wave.life -= dtSeconds * 0.5;\n\n if (wave.life > 0 && wave.radius < wave.maxRadius) {\n this.#waves[writeIndex++] = wave;\n }\n }\n\n this.#waves.length = writeIndex;\n\n // Spawn new waves periodically.\n this.#spawnTimer += dtSeconds;\n\n const spawnInterval = 1.5 / this.#waveCount;\n\n while (this.#spawnTimer >= spawnInterval && this.#waves.length < this.#waveCount * 2) {\n this.#spawnTimer -= spawnInterval;\n this.#spawnWave();\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, _width: number, _height: number): void {\n const waveCount = this.#waves.length;\n\n if (waveCount === 0) {\n return;\n }\n\n ctx.globalCompositeOperation = 'lighter';\n\n const dotSize = this.#dotSize;\n const r = this.#r;\n const g = this.#g;\n const b = this.#b;\n\n for (let index = 0; index < this.#gridCount; index++) {\n const px = this.#gridX[index];\n const py = this.#gridY[index];\n\n let brightness = 0;\n\n for (let wi = 0; wi < waveCount; wi++) {\n const wave = this.#waves[wi];\n const dx = px - wave.x;\n const dy = py - wave.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const ringDist = Math.abs(dist - wave.radius);\n const ringWidth = 20 * this.#scale;\n\n // Gaussian brightness based on distance to wave ring.\n const intensity = Math.exp(-(ringDist * ringDist) / (2 * ringWidth * ringWidth));\n brightness += intensity * wave.life;\n }\n\n if (brightness < 0.01) {\n continue;\n }\n\n if (brightness > 1) {\n brightness = 1;\n }\n\n ctx.globalAlpha = brightness;\n ctx.fillStyle = `rgb(${r}, ${g}, ${b})`;\n ctx.beginPath();\n ctx.arc(px, py, dotSize + dotSize * brightness * 0.5, 0, TWO_PI);\n ctx.fill();\n }\n\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = 1;\n }\n\n #buildGrid(width: number, height: number): void {\n const spacing = this.#spacing;\n const cols = Math.ceil(width / spacing) + 1;\n const rows = Math.ceil(height / spacing) + 1;\n const total = cols * rows;\n\n this.#gridX = new Float32Array(total);\n this.#gridY = new Float32Array(total);\n this.#gridCount = total;\n\n let index = 0;\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n this.#gridX[index] = col * spacing;\n this.#gridY[index] = row * spacing;\n index++;\n }\n }\n }\n\n #spawnWave(): void {\n const maxDim = Math.max(this.#width, this.#height);\n\n this.#waves.push({\n x: MULBERRY.next() * this.#width,\n y: MULBERRY.next() * this.#height,\n radius: 0,\n maxRadius: maxDim * 0.8 + MULBERRY.next() * maxDim * 0.4,\n speed: this.#waveSpeed * (0.8 + MULBERRY.next() * 0.4),\n life: 1\n });\n }\n}\n","import { PulseGrid } from './layer';\nimport type { PulseGridConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createPulseGrid(config?: PulseGridConfig): Effect<PulseGridConfig> {\n return new PulseGrid(config);\n}\n\nexport type { PulseGridConfig };\nexport type { PulseWave } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { parseColor } from '../color';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { Raindrop, RainVariant, Splash } from './types';\n\nexport interface RainConfig {\n readonly variant?: RainVariant;\n readonly drops?: number;\n readonly wind?: number;\n readonly speed?: number;\n readonly splashes?: boolean;\n readonly color?: string;\n readonly groundLevel?: number;\n readonly scale?: number;\n}\n\nconst VARIANT_PRESETS: Record<RainVariant, { drops: number; speed: number; wind: number; splashes: boolean }> = {\n drizzle: {drops: 70, speed: 0.55, wind: 0.1, splashes: false},\n downpour: {drops: 200, speed: 0.85, wind: 0.25, splashes: true},\n thunderstorm: {drops: 300, speed: 1, wind: 0.4, splashes: true}\n};\n\nexport class Rain extends Effect<RainConfig> {\n readonly #scale: number;\n #speed: number;\n #wind: number;\n readonly #groundLevel: number;\n #enableSplashes: boolean;\n readonly #colorR: number;\n readonly #colorG: number;\n readonly #colorB: number;\n #maxDrops: number;\n #drops: Raindrop[] = [];\n #splashes: Splash[] = [];\n\n constructor(config: RainConfig = {}) {\n super();\n\n const variant = config.variant ?? 'downpour';\n const preset = VARIANT_PRESETS[variant];\n\n this.#scale = config.scale ?? 1;\n this.#maxDrops = config.drops ?? preset.drops;\n this.#speed = config.speed ?? preset.speed;\n this.#wind = config.wind ?? preset.wind;\n this.#groundLevel = config.groundLevel ?? 1.0;\n this.#enableSplashes = config.splashes ?? preset.splashes;\n\n const {r, g, b} = parseColor(config.color ?? 'rgba(174, 194, 224, 0.6)');\n this.#colorR = r;\n this.#colorG = g;\n this.#colorB = b;\n\n if (innerWidth < 991) {\n this.#maxDrops = Math.floor(this.#maxDrops / 2);\n }\n\n for (let i = 0; i < this.#maxDrops; ++i) {\n this.#drops.push(this.#createDrop(true));\n }\n }\n\n configure(config: Partial<RainConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.wind !== undefined) {\n this.#wind = config.wind;\n }\n if (config.splashes !== undefined) {\n this.#enableSplashes = config.splashes;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n // Update raindrops\n let aliveDrops = 0;\n\n for (let i = 0; i < this.#drops.length; i++) {\n const drop = this.#drops[i];\n\n drop.x += (drop.vx * dt) / width;\n drop.y += (drop.vy * dt) / height;\n\n if (drop.y >= this.#groundLevel) {\n if (this.#enableSplashes) {\n this.#createSplashBurst(drop.x, this.#groundLevel);\n }\n\n this.#drops[aliveDrops++] = this.#createDrop(false);\n } else {\n this.#drops[aliveDrops++] = drop;\n }\n }\n\n this.#drops.length = aliveDrops;\n\n // Refill drops\n while (this.#drops.length < this.#maxDrops) {\n this.#drops.push(this.#createDrop(false));\n }\n\n // Update splashes\n let aliveSplashes = 0;\n\n for (let i = 0; i < this.#splashes.length; i++) {\n const splash = this.#splashes[i];\n\n splash.x += (splash.vx * dt) / width;\n splash.y += (splash.vy * dt) / height;\n splash.vy += splash.gravity * dt;\n splash.alpha -= 0.04 * dt;\n\n if (splash.alpha > 0) {\n this.#splashes[aliveSplashes++] = splash;\n }\n }\n\n this.#splashes.length = aliveSplashes;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n // Raindrops\n ctx.lineCap = 'round';\n for (const drop of this.#drops) {\n const px = drop.x * width;\n const py = drop.y * height;\n const lineWidth = (0.4 + drop.depth * 1) * this.#scale;\n\n // Draw line along velocity direction\n const speed = Math.sqrt(drop.vx * drop.vx + drop.vy * drop.vy);\n const nx = speed > 0 ? drop.vx / speed : 0;\n const ny = speed > 0 ? drop.vy / speed : -1;\n const tailLength = drop.length * drop.depth;\n\n ctx.beginPath();\n ctx.moveTo(px, py);\n ctx.lineTo(px - nx * tailLength, py - ny * tailLength);\n ctx.strokeStyle = `rgba(${this.#colorR}, ${this.#colorG}, ${this.#colorB}, ${drop.opacity * drop.depth})`;\n ctx.lineWidth = lineWidth;\n ctx.stroke();\n }\n\n // Splashes\n for (const splash of this.#splashes) {\n const px = splash.x * width;\n const py = splash.y * height;\n\n ctx.beginPath();\n ctx.arc(px, py, splash.size * this.#scale, 0, Math.PI * 2);\n ctx.fillStyle = `rgba(${this.#colorR}, ${this.#colorG}, ${this.#colorB}, ${splash.alpha})`;\n ctx.fill();\n }\n }\n\n #createDrop(initialSpread: boolean): Raindrop {\n const depth = 0.3 + MULBERRY.next() * 0.7;\n const fallSpeed = (3.5 + MULBERRY.next() * 5) * depth * this.#speed;\n\n // Extend spawn range upstream of wind direction so the windward edge stays covered.\n // Drops blowing right need to also spawn left of the canvas (negative x), and vice versa.\n const windOffset = Math.abs(this.#wind) * 0.5;\n const xMin = this.#wind > 0 ? -windOffset : 0;\n const xMax = this.#wind < 0 ? 1 + windOffset : 1;\n\n return {\n x: xMin + MULBERRY.next() * (xMax - xMin),\n y: initialSpread ? MULBERRY.next() * this.#groundLevel : -MULBERRY.next() * 0.1,\n vx: this.#wind * fallSpeed * 0.6,\n vy: fallSpeed,\n length: (8 + MULBERRY.next() * 15) * this.#scale,\n speed: fallSpeed,\n depth,\n opacity: 0.3 + MULBERRY.next() * 0.4\n };\n }\n\n #createSplashBurst(x: number, y: number): void {\n const count = 2 + Math.floor(MULBERRY.next() * 2);\n\n for (let i = 0; i < count; i++) {\n this.#splashes.push({\n x,\n y,\n vx: (MULBERRY.next() - 0.5) * 2,\n vy: -(1 + MULBERRY.next() * 2),\n alpha: 0.5 + MULBERRY.next() * 0.3,\n size: 1 + MULBERRY.next() * 2,\n gravity: 0.15\n });\n }\n }\n\n}\n","import type { Point } from '../point';\n\nexport interface RaindropParticleConfig {\n readonly depth?: number;\n readonly groundY?: number;\n readonly length?: number;\n readonly scale?: number;\n}\n\nexport interface SplashParticleConfig {\n readonly gravity?: number;\n readonly scale?: number;\n readonly size?: number;\n}\n\nexport class RaindropParticle {\n readonly #color: [number, number, number];\n readonly #depth: number;\n readonly #length: number;\n readonly #groundY: number;\n readonly #scale: number;\n readonly #opacity: number;\n readonly #vx: number;\n readonly #vy: number;\n #x: number;\n #y: number;\n\n get isDead(): boolean {\n return this.#y >= this.#groundY;\n }\n\n get position(): Point {\n return {x: this.#x, y: this.#y};\n }\n\n constructor(position: Point, velocity: Point, color: [number, number, number], config: RaindropParticleConfig = {}) {\n this.#x = position.x;\n this.#y = position.y;\n this.#vx = velocity.x;\n this.#vy = velocity.y;\n this.#color = color;\n this.#depth = config.depth ?? (0.3 + Math.random() * 0.7);\n this.#groundY = config.groundY ?? Number.POSITIVE_INFINITY;\n this.#length = (config.length ?? (8 + Math.random() * 15)) * (config.scale ?? 1);\n this.#opacity = 0.3 + Math.random() * 0.4;\n this.#scale = config.scale ?? 1;\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n const [r, g, b] = this.#color;\n const speed = Math.sqrt(this.#vx * this.#vx + this.#vy * this.#vy);\n const nx = speed > 0 ? this.#vx / speed : 0;\n const ny = speed > 0 ? this.#vy / speed : -1;\n\n ctx.beginPath();\n ctx.moveTo(this.#x, this.#y);\n ctx.lineTo(this.#x - nx * this.#length * this.#depth, this.#y - ny * this.#length * this.#depth);\n ctx.strokeStyle = `rgba(${r}, ${g}, ${b}, ${this.#opacity * this.#depth})`;\n ctx.lineWidth = (0.4 + this.#depth * 1) * this.#scale;\n ctx.lineCap = 'round';\n ctx.stroke();\n }\n\n tick(dt: number = 1): void {\n this.#x += this.#vx * dt;\n this.#y += this.#vy * dt;\n }\n}\n\nexport class SplashParticle {\n readonly #color: [number, number, number];\n readonly #gravity: number;\n readonly #size: number;\n readonly #scale: number;\n #x: number;\n #y: number;\n #vx: number;\n #vy: number;\n #alpha: number;\n\n get isDead(): boolean {\n return this.#alpha <= 0;\n }\n\n get position(): Point {\n return {x: this.#x, y: this.#y};\n }\n\n constructor(position: Point, velocity: Point, color: [number, number, number], config: SplashParticleConfig = {}) {\n this.#x = position.x;\n this.#y = position.y;\n this.#vx = velocity.x;\n this.#vy = velocity.y;\n this.#color = color;\n this.#alpha = 0.5 + Math.random() * 0.3;\n this.#gravity = config.gravity ?? 0.15;\n this.#size = config.size ?? (1 + Math.random() * 2);\n this.#scale = config.scale ?? 1;\n }\n\n static burst(position: Point, color: [number, number, number], config?: SplashParticleConfig): SplashParticle[] {\n const count = 2 + Math.floor(Math.random() * 3);\n const particles: SplashParticle[] = [];\n\n for (let i = 0; i < count; i++) {\n particles.push(new SplashParticle(\n position,\n {x: (Math.random() - 0.5) * 4, y: -(1 + Math.random() * 3)},\n color,\n config\n ));\n }\n\n return particles;\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n const [r, g, b] = this.#color;\n\n ctx.beginPath();\n ctx.arc(this.#x, this.#y, this.#size * this.#scale, 0, Math.PI * 2);\n ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${this.#alpha})`;\n ctx.fill();\n }\n\n tick(dt: number = 1): void {\n this.#x += this.#vx * dt;\n this.#y += this.#vy * dt;\n this.#vy += this.#gravity * dt;\n this.#alpha -= 0.04 * dt;\n }\n}\n","import { Rain } from './layer';\nimport type { RainConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createRain(config?: RainConfig): Effect<RainConfig> {\n return new Rain(config);\n}\n\nexport { RaindropParticle, SplashParticle } from './particle';\nexport type { RainConfig };\nexport type { RaindropParticleConfig, SplashParticleConfig } from './particle';\nexport type { Raindrop, RainVariant, Splash } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(61);\n","import { parseColor } from '../color';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { RootSystem, RootTip } from './types';\n\nexport interface RootsConfig {\n readonly count?: number;\n readonly speed?: number;\n readonly color?: string;\n readonly branchProbability?: number;\n readonly maxSegments?: number;\n readonly scale?: number;\n}\n\nexport class Roots extends Effect<RootsConfig> {\n readonly #scale: number;\n #speed: number;\n readonly #colorR: number;\n readonly #colorG: number;\n readonly #colorB: number;\n readonly #branchProbability: number;\n readonly #maxSegments: number;\n readonly #count: number;\n #systems: RootSystem[] = [];\n #initialized: boolean = false;\n #width: number = 800;\n #height: number = 600;\n\n constructor(config: RootsConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#speed = config.speed ?? 1;\n this.#branchProbability = config.branchProbability ?? 0.3;\n this.#maxSegments = config.maxSegments ?? 200;\n this.#count = config.count ?? 5;\n\n const parsed = parseColor(config.color ?? '#4a3728');\n this.#colorR = parsed.r;\n this.#colorG = parsed.g;\n this.#colorB = parsed.b;\n }\n\n configure(config: Partial<RootsConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n if (!this.#initialized && width > 0 && height > 0) {\n this.#initialized = true;\n this.#systems = [];\n for (let i = 0; i < this.#count; i++) {\n this.#systems.push(this.#createSystem(width, height));\n }\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n const growSteps = Math.ceil(this.#speed * dt / 16 * 2);\n\n for (const system of this.#systems) {\n if (system.phase === 'growing') {\n for (let step = 0; step < growSteps; step++) {\n this.#growSystem(system);\n }\n } else {\n system.opacity -= 0.04 * this.#speed * dt / 16;\n if (system.opacity <= 0) {\n this.#resetSystem(system, width, height);\n }\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, _width: number, _height: number): void {\n for (const system of this.#systems) {\n if (system.opacity <= 0) {\n continue;\n }\n\n ctx.globalAlpha = system.opacity;\n this.#drawSystem(ctx, system);\n }\n\n ctx.globalAlpha = 1;\n ctx.resetTransform();\n }\n\n #growSystem(system: RootSystem): void {\n if (system.segmentCount >= this.#maxSegments) {\n system.phase = 'fading';\n return;\n }\n\n const activeTips = system.tips.filter(tip => tip.alive);\n if (activeTips.length === 0) {\n system.phase = 'fading';\n return;\n }\n\n for (const tip of activeTips) {\n // Grow upward with slight deviation\n const angleDeviation = (MULBERRY.next() - 0.5) * 0.6;\n tip.angle += angleDeviation;\n\n // Keep growing upward (bias)\n tip.angle = tip.angle * 0.85 + (-Math.PI / 2) * 0.15;\n\n const stepSize = (3 + MULBERRY.next() * 4) * this.#scale;\n const newX = tip.x + Math.cos(tip.angle) * stepSize;\n const newY = tip.y + Math.sin(tip.angle) * stepSize;\n\n tip.points.push({ x: newX, y: newY });\n tip.x = newX;\n tip.y = newY;\n system.segmentCount++;\n\n // Branch\n if (tip.depth < 6 && MULBERRY.next() < this.#branchProbability * 0.04 && system.segmentCount < this.#maxSegments * 0.8) {\n const branchAngle = tip.angle + (MULBERRY.next() > 0.5 ? 1 : -1) * (0.3 + MULBERRY.next() * 0.5);\n const newTip: RootTip = {\n x: tip.x,\n y: tip.y,\n angle: branchAngle,\n depth: tip.depth + 1,\n points: [{ x: tip.x, y: tip.y }],\n alive: true,\n lineWidth: Math.max(0.5, tip.lineWidth * 0.7),\n colorVariant: MULBERRY.next() * 0.3\n };\n system.tips.push(newTip);\n system.allTips.push(newTip);\n }\n\n // Kill tips that go off screen\n if (newX < -50 || newX > this.#width + 50 || newY < -50) {\n tip.alive = false;\n }\n }\n }\n\n #drawSystem(ctx: CanvasRenderingContext2D, system: RootSystem): void {\n const r = this.#colorR;\n const g = this.#colorG;\n const b = this.#colorB;\n\n for (const tip of system.allTips) {\n if (tip.points.length < 2) {\n continue;\n }\n\n const darkness = tip.colorVariant;\n const cr = Math.max(0, r - darkness * 40);\n const cg = Math.max(0, g - darkness * 30);\n const cb = Math.max(0, b - darkness * 20);\n\n ctx.strokeStyle = `rgb(${cr}, ${cg}, ${cb})`;\n ctx.lineWidth = tip.lineWidth * this.#scale;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n\n ctx.beginPath();\n ctx.moveTo(tip.points[0].x, tip.points[0].y);\n\n for (let i = 1; i < tip.points.length - 1; i++) {\n const mx = (tip.points[i].x + tip.points[i + 1].x) / 2;\n const my = (tip.points[i].y + tip.points[i + 1].y) / 2;\n ctx.quadraticCurveTo(tip.points[i].x, tip.points[i].y, mx, my);\n }\n\n const last = tip.points[tip.points.length - 1];\n ctx.lineTo(last.x, last.y);\n ctx.stroke();\n }\n }\n\n #createSystem(width: number, height: number): RootSystem {\n const startX = width * (0.2 + MULBERRY.next() * 0.6);\n const startY = height + 10;\n const baseWidth = 3 + MULBERRY.next() * 3;\n\n const rootTip: RootTip = {\n x: startX,\n y: startY,\n angle: -Math.PI / 2 + (MULBERRY.next() - 0.5) * 0.3,\n depth: 0,\n points: [{ x: startX, y: startY }],\n alive: true,\n lineWidth: baseWidth,\n colorVariant: MULBERRY.next() * 0.2\n };\n\n return {\n tips: [rootTip],\n allTips: [rootTip],\n segmentCount: 0,\n phase: 'growing',\n opacity: 0.8 + MULBERRY.next() * 0.2\n };\n }\n\n #resetSystem(system: RootSystem, width: number, height: number): void {\n const newSystem = this.#createSystem(width, height);\n system.tips = newSystem.tips;\n system.allTips = newSystem.allTips;\n system.segmentCount = 0;\n system.phase = 'growing';\n system.opacity = 0.8 + MULBERRY.next() * 0.2;\n }\n}\n","import { Roots } from './layer';\nimport type { RootsConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createRoots(config?: RootsConfig): Effect<RootsConfig> {\n return new Roots(config);\n}\n\nexport type { RootsConfig };\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { SandGrain } from './types';\n\nexport interface SandstormConfig {\n readonly count?: number;\n readonly wind?: number;\n readonly turbulence?: number;\n readonly color?: string;\n readonly hazeOpacity?: number;\n readonly scale?: number;\n}\n\nexport class Sandstorm extends Effect<SandstormConfig> {\n readonly #scale: number;\n #wind: number;\n #turbulence: number;\n readonly #colorR: number;\n readonly #colorG: number;\n readonly #colorB: number;\n readonly #hazeOpacity: number;\n #maxCount: number;\n #time: number = 0;\n #grains: SandGrain[] = [];\n\n constructor(config: SandstormConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxCount = config.count ?? 300;\n this.#wind = config.wind ?? 1;\n this.#turbulence = config.turbulence ?? 1;\n this.#hazeOpacity = config.hazeOpacity ?? 0.15;\n\n const {r, g, b} = this.#parseColor(config.color ?? '#c2956b');\n this.#colorR = r;\n this.#colorG = g;\n this.#colorB = b;\n\n if (innerWidth < 991) {\n this.#maxCount = Math.floor(this.#maxCount / 2);\n }\n\n for (let i = 0; i < this.#maxCount; ++i) {\n this.#grains.push(this.#createGrain(true));\n }\n }\n\n configure(config: Partial<SandstormConfig>): void {\n if (config.wind !== undefined) {\n this.#wind = config.wind;\n }\n if (config.turbulence !== undefined) {\n this.#turbulence = config.turbulence;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#time += 0.02 * dt;\n\n const gustX = Math.sin(this.#time * 0.3) * 0.5\n + Math.sin(this.#time * 0.8 + 1) * 0.3\n + Math.sin(this.#time * 2.1) * 0.2;\n\n const gustY = Math.sin(this.#time * 0.5 + 2) * 0.15;\n\n const baseWindX = (3 + gustX * 2) * this.#wind;\n const baseWindY = gustY * this.#turbulence;\n\n for (let index = 0; index < this.#grains.length; index++) {\n const grain = this.#grains[index];\n\n const turbX = Math.sin(this.#time * 3 + grain.turbulenceOffset) * this.#turbulence * 0.5;\n const turbY = Math.cos(this.#time * 2.5 + grain.turbulenceOffset * 1.3) * this.#turbulence * 0.3;\n\n grain.vx = (baseWindX + turbX) * grain.depth;\n grain.vy = (baseWindY + turbY) * grain.depth + 0.3 * grain.depth;\n\n grain.x += (grain.vx * dt) / width;\n grain.y += (grain.vy * dt) / height;\n\n if (grain.x > 1.1 || grain.x < -0.1 || grain.y > 1.1 || grain.y < -0.1) {\n const recycled = this.#createGrain(false);\n\n if (baseWindX > 0) {\n recycled.x = -0.1;\n } else {\n recycled.x = 1.1;\n }\n\n recycled.y = MULBERRY.next();\n this.#grains[index] = recycled;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n const hazeFlicker = 0.9 + Math.sin(this.#time * 0.7) * 0.1;\n ctx.fillStyle = `rgba(${this.#colorR}, ${this.#colorG}, ${this.#colorB}, ${this.#hazeOpacity * hazeFlicker})`;\n ctx.fillRect(0, 0, width, height);\n\n for (const grain of this.#grains) {\n const px = grain.x * width;\n const py = grain.y * height;\n const size = grain.size * grain.depth * this.#scale;\n\n if (size < 0.3) {\n continue;\n }\n\n const speed = Math.sqrt(grain.vx * grain.vx + grain.vy * grain.vy);\n const nx = speed > 0 ? grain.vx / speed : 1;\n const ny = speed > 0 ? grain.vy / speed : 0;\n const streakLength = size * 2 + speed * 3;\n\n ctx.beginPath();\n ctx.moveTo(px, py);\n ctx.lineTo(px - nx * streakLength, py - ny * streakLength);\n ctx.strokeStyle = `rgba(${this.#colorR}, ${this.#colorG}, ${this.#colorB}, ${grain.opacity * grain.depth})`;\n ctx.lineWidth = size;\n ctx.lineCap = 'round';\n ctx.stroke();\n }\n }\n\n #parseColor(color: string): { r: number; g: number; b: number } {\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d')!;\n ctx.fillStyle = color;\n ctx.fillRect(0, 0, 1, 1);\n const data = ctx.getImageData(0, 0, 1, 1).data;\n return {r: data[0], g: data[1], b: data[2]};\n }\n\n #createGrain(initialSpread: boolean): SandGrain {\n const depth = 0.2 + MULBERRY.next() * 0.8;\n\n return {\n x: initialSpread ? MULBERRY.next() : -0.1,\n y: MULBERRY.next(),\n vx: 0,\n vy: 0,\n size: (0.5 + MULBERRY.next() * 2) * this.#scale,\n depth,\n opacity: 0.3 + MULBERRY.next() * 0.5,\n turbulenceOffset: MULBERRY.next() * Math.PI * 2\n };\n }\n}\n","import { Sandstorm } from './layer';\nimport type { SandstormConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createSandstorm(config?: SandstormConfig): Effect<SandstormConfig> {\n return new Sandstorm(config);\n}\n\nexport type { SandstormConfig };\nexport type { SandGrain } from './types';\n","import { LimitedFrameRateCanvas } from './canvas';\nimport { applyEdgeFade } from './fade';\nimport type { SimulationLayer } from './layer';\n\n/**\n * Internal canvas runner that drives all layers in a Scene.\n */\nclass SceneCanvas extends LimitedFrameRateCanvas {\n readonly #layers: SimulationLayer[];\n readonly #contextOptions: CanvasRenderingContext2DSettings;\n #offscreen: HTMLCanvasElement | null = null;\n #offscreenCtx: CanvasRenderingContext2D | null = null;\n\n constructor(canvas: HTMLCanvasElement, layers: SimulationLayer[], frameRate: number, options: CanvasRenderingContext2DSettings) {\n super(canvas, frameRate, options);\n this.#layers = layers;\n this.#contextOptions = options;\n\n canvas.style.position = 'absolute';\n canvas.style.top = '0';\n canvas.style.left = '0';\n canvas.style.height = '100%';\n canvas.style.width = '100%';\n }\n\n start(): void {\n for (const layer of this.#layers) {\n layer.onMount(this.canvas);\n }\n super.start();\n }\n\n destroy(): void {\n for (const layer of this.#layers) {\n layer.onUnmount(this.canvas);\n }\n super.destroy();\n }\n\n draw(): void {\n const dpr = this.dpr;\n this.canvas.height = this.height * dpr;\n this.canvas.width = this.width * dpr;\n\n const ctx = this.context;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, this.width, this.height);\n\n for (const layer of this.#layers) {\n if (layer.fade) {\n const offCtx = this.#getOffscreenCtx(this.width * dpr, this.height * dpr);\n offCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n offCtx.clearRect(0, 0, this.width, this.height);\n layer.draw(offCtx, this.width, this.height);\n applyEdgeFade(offCtx, this.width, this.height, layer.fade);\n ctx.drawImage(this.#offscreen!, 0, 0, this.width, this.height);\n } else {\n ctx.save();\n layer.draw(ctx, this.width, this.height);\n ctx.restore();\n }\n }\n }\n\n tick(): void {\n const dt = (this.delta > 0 && this.delta < 200 ? this.delta / (1000 / 60) : 1) * this.speed * LimitedFrameRateCanvas.globalSpeed;\n\n for (const layer of this.#layers) {\n layer.tick(dt, this.width, this.height);\n }\n }\n\n onResize(): void {\n super.onResize();\n\n if (this.#offscreen) {\n this.#offscreen.width = this.width * this.dpr;\n this.#offscreen.height = this.height * this.dpr;\n }\n\n for (const layer of this.#layers) {\n layer.onResize(this.width, this.height);\n }\n }\n\n #getOffscreenCtx(width: number, height: number): CanvasRenderingContext2D {\n if (!this.#offscreen) {\n this.#offscreen = document.createElement('canvas');\n this.#offscreen.width = width;\n this.#offscreen.height = height;\n this.#offscreenCtx = this.#offscreen.getContext('2d', this.#contextOptions)!;\n }\n\n return this.#offscreenCtx!;\n }\n}\n\n/**\n * Composable canvas that renders multiple Effect layers in order (first = bottom, last = top).\n *\n * @example\n * const scene = new Scene()\n * .mount(canvas)\n * .layer(new Aurora({ bands: 5 }))\n * .layer(new Stars().withFade({ bottom: 0.4 }))\n * .start();\n */\nexport class Scene {\n readonly #layers: SimulationLayer[] = [];\n readonly #frameRate: number;\n readonly #defaultOptions: CanvasRenderingContext2DSettings;\n #runner: SceneCanvas | null = null;\n\n constructor(frameRate: number = 60, options: CanvasRenderingContext2DSettings = {colorSpace: 'display-p3'}) {\n this.#frameRate = frameRate;\n this.#defaultOptions = options;\n }\n\n /**\n * Mount the scene to a canvas element or CSS selector.\n */\n mount(canvas: HTMLCanvasElement | string, options?: CanvasRenderingContext2DSettings): this {\n if (typeof canvas === 'string') {\n const el = document.querySelector<HTMLCanvasElement>(canvas);\n\n if (!el) {\n throw new Error(`Scene.mount(): no element found for selector \"${canvas}\".`);\n }\n\n canvas = el;\n }\n\n this.#runner?.destroy();\n this.#runner = new SceneCanvas(canvas, this.#layers, this.#frameRate, options ?? this.#defaultOptions);\n return this;\n }\n\n /**\n * Add an effect layer. Layers are rendered in the order they are added.\n * If the scene is already running, the layer is mounted immediately.\n */\n layer(effect: SimulationLayer): this {\n this.#layers.push(effect);\n\n if (this.#runner?.isTicking) {\n effect.onMount(this.#runner.canvas);\n }\n\n return this;\n }\n\n /**\n * Start the render loop.\n */\n start(): this {\n this.#runner?.start();\n return this;\n }\n\n /**\n * Pause rendering without destroying state. Use resume() to continue.\n */\n pause(): this {\n this.#runner?.pause();\n return this;\n }\n\n /**\n * Resume rendering after pause().\n */\n resume(): this {\n this.#runner?.resume();\n return this;\n }\n\n /**\n * Stop and destroy all layers.\n */\n destroy(): void {\n this.#runner?.destroy();\n this.#runner = null;\n }\n\n get speed(): number {\n return this.#runner?.speed ?? 1;\n }\n\n set speed(value: number) {\n if (this.#runner) {\n this.#runner.speed = value;\n }\n }\n\n get isTicking(): boolean {\n return this.#runner?.isTicking ?? false;\n }\n}\n\n/**\n * Factory alternative to `new Scene()`. Call .mount() and .layer() on the returned instance.\n */\nexport function createScene(frameRate?: number, options?: CanvasRenderingContext2DSettings): Scene {\n return new Scene(frameRate, options);\n}\n","import type { ShootingStar } from './types';\n\nexport interface ShootingStarSystemConfig {\n readonly interval: [number, number];\n readonly color?: [number, number, number];\n readonly trailLength?: number;\n readonly trailAlphaFactor?: number;\n readonly speed?: number;\n readonly scale?: number;\n readonly alphaMin?: number;\n readonly alphaRange?: number;\n readonly decayMin?: number;\n readonly decayRange?: number;\n}\n\nexport class ShootingStarSystem {\n readonly #interval: [number, number];\n readonly #color: [number, number, number];\n readonly #trailLength: number;\n readonly #trailAlphaFactor: number;\n readonly #speed: number;\n readonly #scale: number;\n readonly #alphaMin: number;\n readonly #alphaRange: number;\n readonly #decayMin: number;\n readonly #decayRange: number;\n readonly #rng: () => number;\n #cooldown: number;\n #stars: ShootingStar[] = [];\n\n constructor(config: ShootingStarSystemConfig, rng: () => number) {\n this.#interval = config.interval;\n this.#color = config.color ?? [200, 230, 255];\n this.#trailLength = config.trailLength ?? 18;\n this.#trailAlphaFactor = config.trailAlphaFactor ?? 0.5;\n this.#speed = config.speed ?? 1;\n this.#scale = config.scale ?? 1;\n this.#alphaMin = config.alphaMin ?? 0.7;\n this.#alphaRange = config.alphaRange ?? 0.3;\n this.#decayMin = config.decayMin ?? 0.008;\n this.#decayRange = config.decayRange ?? 0.01;\n this.#rng = rng;\n this.#cooldown = this.#interval[0] + this.#rng() * (this.#interval[1] - this.#interval[0]);\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#cooldown -= dt;\n\n if (this.#cooldown <= 0) {\n this.#stars.push(this.#create(width, height));\n this.#cooldown = this.#interval[0] + this.#rng() * (this.#interval[1] - this.#interval[0]);\n }\n\n let alive = 0;\n\n for (let i = 0; i < this.#stars.length; i++) {\n const star = this.#stars[i];\n\n const trail = star.trail;\n const maxLen = this.#trailLength;\n\n if (trail.length < maxLen) {\n trail.push({x: star.x, y: star.y});\n star.trailHead = trail.length - 1;\n } else {\n const next = (star.trailHead + 1) % maxLen;\n trail[next].x = star.x;\n trail[next].y = star.y;\n star.trailHead = next;\n }\n\n star.x += star.vx * this.#speed * dt;\n star.y += star.vy * this.#speed * dt;\n star.alpha -= star.decay * dt;\n\n const inBounds = star.alpha > 0 && star.x > -50 && star.x < width + 50 && star.y < height + 50;\n\n if (inBounds) {\n this.#stars[alive++] = star;\n }\n }\n\n this.#stars.length = alive;\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n const [cr, cg, cb] = this.#color;\n\n ctx.globalCompositeOperation = 'lighter';\n\n for (const star of this.#stars) {\n const trail = star.trail;\n const trailLen = trail.length;\n const isFull = trailLen === this.#trailLength;\n const oldest = isFull ? (star.trailHead + 1) % trailLen : 0;\n\n for (let t = 0; t < trailLen; t++) {\n const progress = t / trailLen;\n const trailAlpha = star.alpha * progress * this.#trailAlphaFactor;\n const trailSize = star.size * progress * this.#scale;\n\n if (trailAlpha < 0.01) {\n continue;\n }\n\n const idx = (oldest + t) % trailLen;\n\n ctx.globalAlpha = trailAlpha;\n ctx.beginPath();\n ctx.arc(trail[idx].x, trail[idx].y, trailSize, 0, Math.PI * 2);\n ctx.fillStyle = `rgb(${cr}, ${cg}, ${cb})`;\n ctx.fill();\n }\n\n const alpha = star.alpha;\n const headSize = star.size * 2 * this.#scale;\n const glow = ctx.createRadialGradient(star.x, star.y, 0, star.x, star.y, headSize);\n glow.addColorStop(0, `rgba(${cr}, ${cg}, ${cb}, ${alpha})`);\n glow.addColorStop(0.5, `rgba(${cr}, ${cg}, ${cb}, ${alpha * 0.3})`);\n glow.addColorStop(1, `rgba(${cr}, ${cg}, ${cb}, 0)`);\n\n ctx.globalAlpha = 1;\n ctx.beginPath();\n ctx.arc(star.x, star.y, headSize, 0, Math.PI * 2);\n ctx.fillStyle = glow;\n ctx.fill();\n }\n\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = 1;\n }\n\n #create(width: number, height: number): ShootingStar {\n const startX = this.#rng() * width * 0.8;\n const startY = this.#rng() * height * 0.4;\n const angle = 0.3 + this.#rng() * 0.5;\n const speed = 8 + this.#rng() * 12;\n\n return {\n x: startX,\n y: startY,\n vx: Math.cos(angle) * speed * this.#scale,\n vy: Math.sin(angle) * speed * this.#scale,\n alpha: this.#alphaMin + this.#rng() * this.#alphaRange,\n size: 1.5 + this.#rng() * 2,\n decay: this.#decayMin + this.#rng() * this.#decayRange,\n trail: [],\n trailHead: 0\n };\n }\n}\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(7);\n","import { parseColor } from '../color';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { SmokeParticle } from './types';\n\nexport interface SmokeConfig {\n readonly color?: string;\n readonly count?: number;\n readonly scale?: number;\n readonly speed?: number;\n readonly spread?: number;\n}\n\nconst SPRITE_SIZE = 128;\nconst SPRITE_CENTER = SPRITE_SIZE / 2;\nconst SPRITE_RADIUS = SPRITE_SIZE / 2;\nconst SPRITE_VARIANTS = 4;\n\nexport class Smoke extends Effect<SmokeConfig> {\n readonly #scale: number;\n #speed: number;\n #count: number;\n #spread: number;\n #time: number = 0;\n #particles: SmokeParticle[] = [];\n #sprites: HTMLCanvasElement[] = [];\n #colorR: number = 136;\n #colorG: number = 136;\n #colorB: number = 136;\n\n constructor(config: SmokeConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#speed = config.speed ?? 1;\n this.#count = config.count ?? 40;\n this.#spread = config.spread ?? 0.3;\n\n const {r, g, b} = parseColor(config.color ?? '#888888');\n this.#colorR = r;\n this.#colorG = g;\n this.#colorB = b;\n\n if (innerWidth < 991) {\n this.#count = Math.floor(this.#count / 2);\n }\n\n this.#sprites = this.#createSprites(r, g, b);\n\n for (let i = 0; i < this.#count; ++i) {\n this.#particles.push(this.#createParticle(true));\n }\n }\n\n configure(config: Partial<SmokeConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n\n if (config.spread !== undefined) {\n this.#spread = config.spread;\n }\n\n if (config.color !== undefined) {\n const {r, g, b} = parseColor(config.color);\n this.#colorR = r;\n this.#colorG = g;\n this.#colorB = b;\n this.#sprites = this.#createSprites(r, g, b);\n }\n }\n\n tick(dt: number, _width: number, _height: number): void {\n this.#time += 0.008 * dt;\n\n for (let index = 0; index < this.#particles.length; index++) {\n const particle = this.#particles[index];\n\n particle.age += dt;\n\n const progress = particle.age / particle.lifetime;\n\n const turbulence = Math.sin(this.#time * particle.turbulenceSpeed + particle.turbulenceOffset) * 0.0002\n + Math.sin(this.#time * particle.turbulenceSpeed * 1.7 + particle.turbulenceOffset + 2.1) * 0.0001;\n\n particle.x += (particle.vx + turbulence) * dt;\n particle.y += particle.vy * dt;\n particle.radius = particle.maxRadius * Math.min(1, progress * 3);\n particle.opacity = progress < 0.15\n ? progress / 0.15 * 0.35\n : (1 - progress) * 0.35;\n\n if (particle.age >= particle.lifetime || particle.y < -0.3) {\n this.#particles[index] = this.#createParticle(false);\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n ctx.globalCompositeOperation = 'screen';\n\n for (const particle of this.#particles) {\n const px = particle.x * width;\n const py = particle.y * height;\n const displayRadius = particle.radius * this.#scale * Math.min(width, height) * 0.5;\n\n if (displayRadius < 1) {\n continue;\n }\n\n ctx.globalAlpha = particle.opacity;\n ctx.drawImage(\n this.#sprites[particle.spriteIndex],\n px - displayRadius,\n py - displayRadius,\n displayRadius * 2,\n displayRadius * 2\n );\n }\n\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = 1;\n ctx.resetTransform();\n }\n\n #createSprites(r: number, g: number, b: number): HTMLCanvasElement[] {\n const sprites: HTMLCanvasElement[] = [];\n\n for (let variant = 0; variant < SPRITE_VARIANTS; variant++) {\n const canvas = document.createElement('canvas');\n canvas.width = SPRITE_SIZE;\n canvas.height = SPRITE_SIZE;\n const spriteCtx = canvas.getContext('2d')!;\n\n const offsets = [\n {dx: 0, dy: 0, r: SPRITE_RADIUS},\n {dx: SPRITE_RADIUS * 0.15, dy: -SPRITE_RADIUS * 0.1, r: SPRITE_RADIUS * 0.85},\n {dx: -SPRITE_RADIUS * 0.1, dy: SPRITE_RADIUS * 0.05, r: SPRITE_RADIUS * 0.7}\n ];\n\n for (const offset of offsets) {\n const cx = SPRITE_CENTER + offset.dx;\n const cy = SPRITE_CENTER + offset.dy;\n const gradient = spriteCtx.createRadialGradient(cx, cy, 0, cx, cy, offset.r);\n gradient.addColorStop(0, `rgba(${r}, ${g}, ${b}, 0.25)`);\n gradient.addColorStop(0.4, `rgba(${r}, ${g}, ${b}, 0.12)`);\n gradient.addColorStop(0.75, `rgba(${r}, ${g}, ${b}, 0.03)`);\n gradient.addColorStop(1, `rgba(${r}, ${g}, ${b}, 0)`);\n\n spriteCtx.fillStyle = gradient;\n spriteCtx.beginPath();\n spriteCtx.arc(cx, cy, offset.r, 0, Math.PI * 2);\n spriteCtx.fill();\n }\n\n sprites.push(canvas);\n }\n\n return sprites;\n }\n\n #createParticle(initialSpread: boolean): SmokeParticle {\n const lifetime = (4 + MULBERRY.next() * 6) * (1 / this.#speed) * 60;\n const startX = 0.5 + (MULBERRY.next() - 0.5) * this.#spread;\n const startY = initialSpread ? 0.6 + MULBERRY.next() * 0.5 : 1.05;\n\n return {\n x: startX,\n y: startY,\n vx: (MULBERRY.next() - 0.5) * 0.0002,\n vy: -(0.0008 + MULBERRY.next() * 0.001) * this.#speed,\n age: initialSpread ? MULBERRY.next() * lifetime : 0,\n lifetime,\n radius: 0,\n maxRadius: 0.15 + MULBERRY.next() * 0.25,\n opacity: 0,\n turbulenceOffset: MULBERRY.next() * Math.PI * 2,\n turbulenceSpeed: 0.5 + MULBERRY.next() * 1.5,\n spriteIndex: Math.floor(MULBERRY.next() * SPRITE_VARIANTS)\n };\n }\n}\n","import { Smoke } from './layer';\nimport type { SmokeConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createSmoke(config?: SmokeConfig): Effect<SmokeConfig> {\n return new Smoke(config);\n}\n\nexport type { SmokeConfig };\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { parseColor } from '../color';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { Snowflake } from './snowflake';\n\nexport interface SnowConfig {\n readonly fillStyle?: string;\n readonly particles?: number;\n readonly scale?: number;\n readonly size?: number;\n readonly speed?: number;\n}\n\nconst SPRITE_SIZE = 64;\nconst SPRITE_CENTER = SPRITE_SIZE / 2;\nconst SPRITE_RADIUS = SPRITE_SIZE / 2;\n\nexport class Snow extends Effect<SnowConfig> {\n readonly #scale: number;\n readonly #size: number;\n #speed: number;\n readonly #baseOpacity: number;\n #maxParticles: number;\n #time: number = 0;\n #ratio: number = 1;\n #snowflakes: Snowflake[] = [];\n #sprites: HTMLCanvasElement[] = [];\n #height: number = 540;\n\n constructor(config: SnowConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#maxParticles = config.particles ?? 200;\n this.#size = (config.size ?? 9) * this.#scale;\n this.#speed = config.speed ?? 2;\n\n const {r, g, b, a} = parseColor(config.fillStyle ?? 'rgb(255 255 255 / .75)');\n this.#baseOpacity = a;\n\n if (innerWidth < 991) {\n this.#maxParticles = Math.floor(this.#maxParticles / 2);\n }\n\n this.#sprites = this.#createSprites(r, g, b);\n\n for (let i = 0; i < this.#maxParticles; ++i) {\n this.#snowflakes.push(this.#createSnowflake(true));\n }\n }\n\n configure(config: Partial<SnowConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n }\n\n onResize(_width: number, height: number): void {\n this.#height = height;\n }\n\n tick(dt: number, _width: number, height: number): void {\n this.#height = height;\n\n const speedFactor = height / (420 * this.#ratio) / this.#speed;\n\n this.#time += 0.015 * speedFactor * dt;\n\n const wind = Math.sin(this.#time * 0.7) * 0.5\n + Math.sin(this.#time * 1.9 + 3) * 0.25\n + Math.sin(this.#time * 4.3 + 1) * 0.1;\n\n for (let index = 0; index < this.#snowflakes.length; index++) {\n const snowflake = this.#snowflakes[index];\n\n const swing = Math.sin(this.#time * snowflake.swingFrequency + snowflake.swingOffset) * snowflake.swingAmplitude;\n\n snowflake.x += (swing + wind * snowflake.depth * 2) * dt / (4000 * speedFactor);\n snowflake.y += (snowflake.fallSpeed * 2 + snowflake.depth + snowflake.radius * 0.15) * dt / (700 * speedFactor);\n\n snowflake.rotation += snowflake.rotationSpeed * dt / speedFactor;\n\n if (snowflake.x > 1.15 || snowflake.x < -0.15 || snowflake.y > 1.05) {\n const recycled = this.#createSnowflake(false);\n\n if (index % 3 > 0) {\n recycled.x = MULBERRY.next();\n recycled.y = -0.05 - MULBERRY.next() * 0.15;\n } else if (wind > 0.2) {\n recycled.x = -0.15;\n recycled.y = MULBERRY.next() * 0.8;\n } else if (wind < -0.2) {\n recycled.x = 1.15;\n recycled.y = MULBERRY.next() * 0.8;\n } else {\n recycled.x = MULBERRY.next();\n recycled.y = -0.05 - MULBERRY.next() * 0.15;\n }\n\n this.#snowflakes[index] = recycled;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n for (const snowflake of this.#snowflakes) {\n const px = snowflake.x * width;\n const py = snowflake.y * height;\n const displayRadius = snowflake.radius * snowflake.depth * this.#ratio;\n const displaySize = displayRadius * 2;\n\n if (displaySize < 0.5) {\n continue;\n }\n\n ctx.globalAlpha = this.#baseOpacity * (0.15 + snowflake.depth * 0.85);\n\n if (snowflake.spriteIndex === 3) {\n const cos = Math.cos(snowflake.rotation);\n const sin = Math.sin(snowflake.rotation);\n ctx.save();\n ctx.transform(cos, sin, -sin, cos, px, py);\n ctx.drawImage(\n this.#sprites[snowflake.spriteIndex],\n -displayRadius,\n -displayRadius,\n displaySize,\n displaySize\n );\n ctx.restore();\n } else {\n ctx.drawImage(\n this.#sprites[snowflake.spriteIndex],\n px - displayRadius,\n py - displayRadius,\n displaySize,\n displaySize\n );\n }\n }\n\n ctx.globalAlpha = 1;\n }\n\n #createSprites(r: number, g: number, b: number): HTMLCanvasElement[] {\n const sprites: HTMLCanvasElement[] = [];\n\n const gradientProfiles: [number, number][][] = [\n [[0, 0.8], [0.3, 0.4], [0.7, 0.1], [1, 0]],\n [[0, 1], [0.15, 0.7], [0.5, 0.2], [1, 0]],\n [[0, 0.9], [0.25, 0.5], [0.5, 0.1], [1, 0]]\n ];\n\n for (const profile of gradientProfiles) {\n const canvas = document.createElement('canvas');\n canvas.width = SPRITE_SIZE;\n canvas.height = SPRITE_SIZE;\n const ctx = canvas.getContext('2d')!;\n\n const gradient = ctx.createRadialGradient(\n SPRITE_CENTER, SPRITE_CENTER, 0,\n SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS\n );\n\n for (const [stop, alpha] of profile) {\n gradient.addColorStop(stop, `rgba(${r}, ${g}, ${b}, ${alpha})`);\n }\n\n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.arc(SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS, 0, Math.PI * 2);\n ctx.fill();\n\n sprites.push(canvas);\n }\n\n sprites.push(this.#createCrystalSprite(r, g, b));\n\n return sprites;\n }\n\n #createCrystalSprite(r: number, g: number, b: number): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.width = SPRITE_SIZE;\n canvas.height = SPRITE_SIZE;\n const ctx = canvas.getContext('2d')!;\n\n const glow = ctx.createRadialGradient(\n SPRITE_CENTER, SPRITE_CENTER, 0,\n SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS\n );\n glow.addColorStop(0, `rgba(${r}, ${g}, ${b}, 0.6)`);\n glow.addColorStop(0.25, `rgba(${r}, ${g}, ${b}, 0.25)`);\n glow.addColorStop(0.6, `rgba(${r}, ${g}, ${b}, 0.05)`);\n glow.addColorStop(1, `rgba(${r}, ${g}, ${b}, 0)`);\n ctx.fillStyle = glow;\n ctx.beginPath();\n ctx.arc(SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.strokeStyle = `rgba(${r}, ${g}, ${b}, 0.7)`;\n ctx.lineWidth = 1.5;\n ctx.lineCap = 'round';\n\n const armLength = SPRITE_RADIUS * 0.75;\n\n for (let arm = 0; arm < 6; arm++) {\n const angle = (arm / 6) * Math.PI * 2 - Math.PI / 2;\n const tipX = SPRITE_CENTER + Math.cos(angle) * armLength;\n const tipY = SPRITE_CENTER + Math.sin(angle) * armLength;\n\n ctx.beginPath();\n ctx.moveTo(SPRITE_CENTER, SPRITE_CENTER);\n ctx.lineTo(tipX, tipY);\n ctx.stroke();\n\n for (const position of [0.4, 0.65]) {\n const branchX = SPRITE_CENTER + Math.cos(angle) * armLength * position;\n const branchY = SPRITE_CENTER + Math.sin(angle) * armLength * position;\n const branchLength = armLength * (0.4 - position * 0.3);\n\n for (const side of [-1, 1]) {\n const branchAngle = angle + side * Math.PI / 3;\n ctx.beginPath();\n ctx.moveTo(branchX, branchY);\n ctx.lineTo(\n branchX + Math.cos(branchAngle) * branchLength,\n branchY + Math.sin(branchAngle) * branchLength\n );\n ctx.stroke();\n }\n }\n }\n\n const centerGlow = ctx.createRadialGradient(\n SPRITE_CENTER, SPRITE_CENTER, 0,\n SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS * 0.12\n );\n centerGlow.addColorStop(0, `rgba(${r}, ${g}, ${b}, 0.9)`);\n centerGlow.addColorStop(1, `rgba(${r}, ${g}, ${b}, 0)`);\n ctx.fillStyle = centerGlow;\n ctx.beginPath();\n ctx.arc(SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS * 0.12, 0, Math.PI * 2);\n ctx.fill();\n\n return canvas;\n }\n\n #createSnowflake(initialSpread: boolean): Snowflake {\n const depth = 0.3 + MULBERRY.next() * 0.7;\n const radius = MULBERRY.next() * this.#size + 2 * this.#scale;\n\n let spriteIndex: number;\n if (depth > 0.85 && radius > this.#size * 0.6 && MULBERRY.next() > 0.65) {\n spriteIndex = 3;\n } else if (depth < 0.45) {\n spriteIndex = 2;\n } else {\n spriteIndex = MULBERRY.next() > 0.5 ? 0 : 1;\n }\n\n return {\n x: MULBERRY.next(),\n y: initialSpread ? MULBERRY.next() * 2 - 1 : -0.05 - MULBERRY.next() * 0.15,\n depth,\n radius,\n rotation: MULBERRY.next() * Math.PI * 2,\n rotationSpeed: (MULBERRY.next() - 0.5) * 0.03,\n swingAmplitude: 0.3 + MULBERRY.next() * 0.7,\n swingFrequency: 0.5 + MULBERRY.next() * 1.5,\n swingOffset: MULBERRY.next() * Math.PI * 2,\n fallSpeed: 0.5 + MULBERRY.next() * 0.5,\n spriteIndex\n };\n }\n}\n","import { Snow } from './layer';\nimport type { SnowConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createSnow(config?: SnowConfig): Effect<SnowConfig> {\n return new Snow(config);\n}\n\nexport type { SnowConfig };\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { SparklerSpark } from './types';\n\nexport interface SparklersConfig {\n readonly emitRate?: number;\n readonly maxSparks?: number;\n readonly colors?: string[];\n readonly speed?: [number, number];\n readonly friction?: number;\n readonly gravity?: number;\n readonly decay?: [number, number];\n readonly trailLength?: number;\n readonly hoverMode?: boolean;\n readonly scale?: number;\n}\n\nconst DEFAULT_COLORS = ['#ffcc33', '#ff9900', '#ffffff', '#ffee88'];\n\nexport class Sparklers extends Effect<SparklersConfig> {\n #scale: number;\n #emitRate: number;\n readonly #maxSparks: number;\n readonly #colorRGBs: [number, number, number][];\n readonly #speedRange: [number, number];\n #friction: number;\n #gravity: number;\n readonly #decayRange: [number, number];\n #trailLength: number;\n #hoverMode: boolean;\n readonly #onMouseMoveBound: (evt: MouseEvent) => void;\n readonly #onMouseLeaveBound: () => void;\n #emitX: number = 0.5;\n #emitY: number = 0.5;\n #mouseOnCanvas: boolean = false;\n #sparks: SparklerSpark[] = [];\n #mountedCanvas: HTMLCanvasElement | null = null;\n #cachedRect: DOMRect | null = null;\n\n constructor(config: SparklersConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#emitRate = config.emitRate ?? 8;\n this.#maxSparks = config.maxSparks ?? 300;\n this.#speedRange = config.speed ?? [2, 8];\n this.#friction = config.friction ?? 0.96;\n this.#gravity = config.gravity ?? 0.8;\n this.#decayRange = config.decay ?? [0.02, 0.05];\n this.#trailLength = config.trailLength ?? 3;\n this.#hoverMode = config.hoverMode ?? false;\n\n const colors = config.colors ?? DEFAULT_COLORS;\n this.#colorRGBs = colors.map(c => hexToRGB(c));\n\n this.#onMouseMoveBound = this.#onMouseMove.bind(this);\n this.#onMouseLeaveBound = this.#onMouseLeave.bind(this);\n }\n\n moveTo(x: number, y: number): void {\n this.#emitX = x;\n this.#emitY = y;\n }\n\n onMount(canvas: HTMLCanvasElement): void {\n this.#mountedCanvas = canvas;\n this.#cachedRect = canvas.getBoundingClientRect();\n\n if (this.#hoverMode) {\n canvas.addEventListener('mousemove', this.#onMouseMoveBound, {passive: true});\n canvas.addEventListener('mouseleave', this.#onMouseLeaveBound, {passive: true});\n }\n }\n\n onUnmount(canvas: HTMLCanvasElement): void {\n canvas.removeEventListener('mousemove', this.#onMouseMoveBound);\n canvas.removeEventListener('mouseleave', this.#onMouseLeaveBound);\n this.#mountedCanvas = null;\n this.#cachedRect = null;\n }\n\n onResize(): void {\n if (this.#mountedCanvas) {\n this.#cachedRect = this.#mountedCanvas.getBoundingClientRect();\n }\n }\n\n configure(config: Partial<SparklersConfig>): void {\n if (config.scale !== undefined) {\n this.#scale = config.scale;\n }\n if (config.emitRate !== undefined) {\n this.#emitRate = config.emitRate;\n }\n if (config.friction !== undefined) {\n this.#friction = config.friction;\n }\n if (config.gravity !== undefined) {\n this.#gravity = config.gravity;\n }\n if (config.trailLength !== undefined) {\n this.#trailLength = config.trailLength;\n }\n if (config.hoverMode !== undefined) {\n this.#hoverMode = config.hoverMode;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n if (!this.#hoverMode || this.#mouseOnCanvas) {\n const emitCount = Math.min(this.#emitRate, this.#maxSparks - this.#sparks.length);\n\n for (let i = 0; i < emitCount; i++) {\n this.#sparks.push(this.#createSpark(width, height));\n }\n }\n\n const frictionFactor = Math.pow(this.#friction, dt);\n let alive = 0;\n\n for (let i = 0; i < this.#sparks.length; i++) {\n const spark = this.#sparks[i];\n\n spark.trail.push({x: spark.x, y: spark.y});\n\n if (spark.trail.length > this.#trailLength) {\n spark.trail.shift();\n }\n\n spark.vx *= frictionFactor;\n spark.vy *= frictionFactor;\n spark.vy += this.#gravity * this.#scale * dt;\n\n spark.x += spark.vx * dt;\n spark.y += spark.vy * dt;\n\n spark.alpha -= spark.decay * dt;\n\n if (spark.alpha > 0) {\n this.#sparks[alive++] = spark;\n }\n }\n\n this.#sparks.length = alive;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n ctx.globalCompositeOperation = 'lighter';\n\n if (!this.#hoverMode || this.#mouseOnCanvas) {\n const cx = this.#emitX * width;\n const cy = this.#emitY * height;\n const glowRadius = 15 * this.#scale;\n const glow = ctx.createRadialGradient(cx, cy, 0, cx, cy, glowRadius);\n glow.addColorStop(0, 'rgba(255, 220, 100, 0.8)');\n glow.addColorStop(0.3, 'rgba(255, 180, 50, 0.3)');\n glow.addColorStop(1, 'rgba(255, 150, 0, 0)');\n ctx.fillStyle = glow;\n ctx.beginPath();\n ctx.arc(cx, cy, glowRadius, 0, Math.PI * 2);\n ctx.fill();\n }\n\n for (const spark of this.#sparks) {\n const [r, g, b] = spark.color;\n\n for (let t = 0; t < spark.trail.length; t++) {\n const trailAlpha = spark.alpha * (t / spark.trail.length) * 0.5;\n\n if (trailAlpha < 0.01) {\n continue;\n }\n\n const trailSize = spark.size * (t / spark.trail.length) * this.#scale;\n\n ctx.beginPath();\n ctx.arc(spark.trail[t].x, spark.trail[t].y, trailSize, 0, Math.PI * 2);\n ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${trailAlpha})`;\n ctx.fill();\n }\n\n ctx.beginPath();\n ctx.arc(spark.x, spark.y, spark.size * this.#scale, 0, Math.PI * 2);\n ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${spark.alpha})`;\n ctx.fill();\n }\n\n ctx.globalCompositeOperation = 'source-over';\n }\n\n #onMouseMove(evt: MouseEvent): void {\n const rect = this.#cachedRect ?? (evt.currentTarget as HTMLCanvasElement).getBoundingClientRect();\n this.#emitX = (evt.clientX - rect.left) / rect.width;\n this.#emitY = (evt.clientY - rect.top) / rect.height;\n this.#mouseOnCanvas = true;\n }\n\n #onMouseLeave(): void {\n this.#mouseOnCanvas = false;\n }\n\n #createSpark(width: number, height: number): SparklerSpark {\n const angle = MULBERRY.next() * Math.PI * 2;\n const speed = this.#speedRange[0] + MULBERRY.next() * (this.#speedRange[1] - this.#speedRange[0]);\n const colorIndex = Math.floor(MULBERRY.next() * this.#colorRGBs.length);\n\n return {\n x: this.#emitX * width,\n y: this.#emitY * height,\n vx: Math.cos(angle) * speed * this.#scale,\n vy: Math.sin(angle) * speed * this.#scale,\n alpha: 0.8 + MULBERRY.next() * 0.2,\n color: this.#colorRGBs[colorIndex],\n size: 1 + MULBERRY.next() * 2,\n decay: this.#decayRange[0] + MULBERRY.next() * (this.#decayRange[1] - this.#decayRange[0]),\n trail: []\n };\n }\n}\n","import type { Point } from '../point';\n\nexport interface SparklerParticleConfig {\n readonly decay?: number;\n readonly friction?: number;\n readonly gravity?: number;\n readonly scale?: number;\n readonly size?: number;\n readonly trailLength?: number;\n}\n\nexport class SparklerParticle {\n readonly #color: [number, number, number];\n readonly #decay: number;\n readonly #friction: number;\n readonly #gravity: number;\n readonly #scale: number;\n readonly #size: number;\n readonly #trailLength: number;\n readonly #trail: Point[] = [];\n #x: number;\n #y: number;\n #vx: number;\n #vy: number;\n #alpha: number = 1;\n\n get isDead(): boolean {\n return this.#alpha <= 0;\n }\n\n get position(): Point {\n return {x: this.#x, y: this.#y};\n }\n\n constructor(position: Point, velocity: Point, color: [number, number, number], config: SparklerParticleConfig = {}) {\n this.#x = position.x;\n this.#y = position.y;\n this.#vx = velocity.x;\n this.#vy = velocity.y;\n this.#color = color;\n this.#decay = config.decay ?? (0.02 + Math.random() * 0.03);\n this.#friction = config.friction ?? 0.96;\n this.#gravity = config.gravity ?? 0.8;\n this.#scale = config.scale ?? 1;\n this.#size = config.size ?? (1 + Math.random() * 2);\n this.#trailLength = config.trailLength ?? 3;\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n const [r, g, b] = this.#color;\n\n for (let t = 0; t < this.#trail.length; t++) {\n const trailAlpha = this.#alpha * (t / this.#trail.length) * 0.5;\n\n if (trailAlpha < 0.01) {\n continue;\n }\n\n const trailSize = this.#size * (t / this.#trail.length) * this.#scale;\n\n ctx.beginPath();\n ctx.arc(this.#trail[t].x, this.#trail[t].y, trailSize, 0, Math.PI * 2);\n ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${trailAlpha})`;\n ctx.fill();\n }\n\n ctx.beginPath();\n ctx.arc(this.#x, this.#y, this.#size * this.#scale, 0, Math.PI * 2);\n ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${this.#alpha})`;\n ctx.fill();\n }\n\n tick(dt: number = 1): void {\n this.#trail.push({x: this.#x, y: this.#y});\n\n if (this.#trail.length > this.#trailLength) {\n this.#trail.shift();\n }\n\n this.#vx *= Math.pow(this.#friction, dt);\n this.#vy *= Math.pow(this.#friction, dt);\n this.#vy += this.#gravity * this.#scale * dt;\n\n this.#x += this.#vx * dt;\n this.#y += this.#vy * dt;\n\n this.#alpha -= this.#decay * dt;\n }\n}\n","import { Sparklers } from './layer';\nimport type { SparklersConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport interface SparklersInstance extends Effect<SparklersConfig> {\n moveTo(x: number, y: number): void;\n}\n\nexport function createSparklers(config?: SparklersConfig): SparklersInstance {\n return new Sparklers(config) as SparklersInstance;\n}\n\nexport { SparklerParticle } from './particle';\nexport type { SparklersConfig };\nexport type { SparklerParticleConfig } from './particle';\nexport type { SparklerSpark } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { ShootingStarSystem } from '../shooting-stars';\nimport { MULBERRY } from './consts';\nimport type { Star, StarMode } from './types';\n\nexport interface StarsConfig {\n readonly mode?: StarMode;\n readonly starCount?: number;\n readonly shootingInterval?: [number, number];\n readonly shootingSpeed?: number;\n readonly twinkleSpeed?: number;\n readonly color?: string;\n readonly shootingColor?: string;\n readonly trailLength?: number;\n readonly scale?: number;\n}\n\nexport class Stars extends Effect<StarsConfig> {\n readonly #mode: StarMode;\n #twinkleSpeed: number;\n readonly #colorRGB: [number, number, number];\n #scale: number;\n readonly #shootingStarSystem: ShootingStarSystem | null;\n #starCount: number;\n #time: number = 0;\n #stars: Star[] = [];\n\n constructor(config: StarsConfig = {}) {\n super();\n\n this.#mode = config.mode ?? 'both';\n this.#starCount = config.starCount ?? 150;\n this.#twinkleSpeed = config.twinkleSpeed ?? 1;\n this.#scale = config.scale ?? 1;\n\n this.#colorRGB = hexToRGB(config.color ?? '#ffffff');\n\n const shootingColorRGB = hexToRGB(config.shootingColor ?? '#ffffff');\n const enableShooting = this.#mode === 'shooting' || this.#mode === 'both';\n\n this.#shootingStarSystem = enableShooting\n ? new ShootingStarSystem(\n {\n interval: config.shootingInterval ?? [120, 360],\n color: shootingColorRGB,\n trailLength: config.trailLength ?? 15,\n trailAlphaFactor: 0.6,\n speed: config.shootingSpeed ?? 1,\n scale: this.#scale,\n alphaMin: 0.8,\n alphaRange: 0.2,\n decayMin: 0.01,\n decayRange: 0.015\n },\n () => MULBERRY.next()\n )\n : null;\n\n if (this.#mode === 'sky' || this.#mode === 'both') {\n for (let i = 0; i < this.#starCount; ++i) {\n this.#stars.push(this.#createStar());\n }\n }\n }\n\n configure(config: Partial<StarsConfig>): void {\n if (config.twinkleSpeed !== undefined) {\n this.#twinkleSpeed = config.twinkleSpeed;\n }\n if (config.scale !== undefined) {\n this.#scale = config.scale;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#time += 0.02 * dt;\n this.#shootingStarSystem?.tick(dt, width, height);\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const [sr, sg, sb] = this.#colorRGB;\n\n // Background stars\n if (this.#mode === 'sky' || this.#mode === 'both') {\n ctx.globalCompositeOperation = 'source-over';\n\n for (const star of this.#stars) {\n const px = star.x * width;\n const py = star.y * height;\n const alpha = star.brightness * (0.3 + 0.7 * (0.5 + 0.5 * Math.sin(this.#time * star.twinkleSpeed * this.#twinkleSpeed + star.twinklePhase)));\n const size = star.size * this.#scale;\n\n ctx.globalAlpha = alpha;\n\n // Star dot\n ctx.beginPath();\n ctx.arc(px, py, size, 0, Math.PI * 2);\n ctx.fillStyle = `rgb(${sr}, ${sg}, ${sb})`;\n ctx.fill();\n\n // Cross sparkle for larger stars\n if (star.size > 1.5) {\n const sparkleLength = size * 3;\n const sparkleAlpha = alpha * 0.4;\n ctx.globalAlpha = sparkleAlpha;\n ctx.strokeStyle = `rgb(${sr}, ${sg}, ${sb})`;\n ctx.lineWidth = 0.5;\n\n ctx.beginPath();\n ctx.moveTo(px - sparkleLength, py);\n ctx.lineTo(px + sparkleLength, py);\n ctx.stroke();\n\n ctx.beginPath();\n ctx.moveTo(px, py - sparkleLength);\n ctx.lineTo(px, py + sparkleLength);\n ctx.stroke();\n }\n }\n }\n\n // Shooting stars\n this.#shootingStarSystem?.draw(ctx);\n\n ctx.globalAlpha = 1;\n }\n\n #createStar(): Star {\n return {\n x: MULBERRY.next(),\n y: MULBERRY.next(),\n size: 0.5 + MULBERRY.next() * 2,\n twinklePhase: MULBERRY.next() * Math.PI * 2,\n twinkleSpeed: 0.5 + MULBERRY.next() * 2,\n brightness: 0.3 + MULBERRY.next() * 0.7\n };\n }\n}\n","import { Stars } from './layer';\nimport type { StarsConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createStars(config?: StarsConfig): Effect<StarsConfig> {\n return new Stars(config);\n}\n\nexport type { StarsConfig };\nexport type { Star, StarMode, ShootingStar } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n\nexport const STREAMER_COLORS: string[] = [\n '#ff6b6b', // red\n '#ffd93d', // yellow\n '#6bcb77', // green\n '#4d96ff', // blue\n '#ff6bb5', // pink\n '#845ec2', // purple\n '#ff9671', // coral\n '#00c9a7' // teal\n];\n","import { Effect } from '../effect';\nimport { MULBERRY, STREAMER_COLORS } from './consts';\nimport type { Streamer } from './types';\n\nexport interface StreamersConfig {\n readonly count?: number;\n readonly colors?: string[];\n readonly speed?: number;\n readonly scale?: number;\n}\n\nexport class Streamers extends Effect<StreamersConfig> {\n readonly #colors: string[];\n readonly #scale: number;\n #speed: number;\n #count: number;\n #streamers: Streamer[] = [];\n #width: number = 960;\n #height: number = 540;\n #initialized: boolean = false;\n\n constructor(config: StreamersConfig = {}) {\n super();\n\n this.#colors = config.colors ?? STREAMER_COLORS;\n this.#scale = config.scale ?? 1;\n this.#speed = config.speed ?? 1;\n this.#count = config.count ?? 20;\n\n if (innerWidth < 991) {\n this.#count = Math.floor(this.#count / 2);\n }\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n if (!this.#initialized) {\n this.#initialized = true;\n this.#streamers = [];\n\n for (let i = 0; i < this.#count; i++) {\n this.#streamers.push(this.#createStreamer(true));\n }\n }\n }\n\n configure(config: Partial<StreamersConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n let alive = 0;\n\n for (let i = 0; i < this.#streamers.length; i++) {\n const streamer = this.#streamers[i];\n\n streamer.y += streamer.fallSpeed * this.#speed * dt;\n streamer.swayPhase += streamer.swaySpeed * dt;\n\n const swayOffset = Math.sin(streamer.swayPhase) * streamer.swayAmplitude;\n streamer.x += swayOffset * dt * 0.3;\n\n this.#updateSegments(streamer, dt);\n\n const tail = streamer.segments[streamer.segments.length - 1];\n const tailY = tail ? tail.y : streamer.y;\n\n if (tailY > height + 50) {\n this.#streamers[alive++] = this.#createStreamer(false);\n } else {\n this.#streamers[alive++] = streamer;\n }\n }\n\n this.#streamers.length = alive;\n\n while (this.#streamers.length < this.#count) {\n this.#streamers.push(this.#createStreamer(false));\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n for (const streamer of this.#streamers) {\n this.#drawStreamer(ctx, streamer);\n }\n }\n\n #createStreamer(initialSpread: boolean): Streamer {\n const scale = this.#scale;\n const segmentCount = 12 + Math.floor(MULBERRY.next() * 8);\n const length = (80 + MULBERRY.next() * 120) * scale;\n const width = (3 + MULBERRY.next() * 5) * scale;\n const startX = MULBERRY.next() * this.#width;\n const startY = initialSpread\n ? MULBERRY.next() * this.#height\n : -(MULBERRY.next() * 100 + length);\n const depth = 0.4 + MULBERRY.next() * 0.6;\n const curl = (0.3 + MULBERRY.next() * 0.7) * scale;\n const fallSpeed = (1.5 + MULBERRY.next() * 2.5) * depth * scale;\n const swayAmplitude = (0.3 + MULBERRY.next() * 0.6) * scale;\n const swaySpeed = 0.02 + MULBERRY.next() * 0.04;\n const swayPhase = MULBERRY.next() * Math.PI * 2;\n const color = this.#colors[Math.floor(MULBERRY.next() * this.#colors.length)];\n\n const segments: { x: number; y: number }[] = [];\n const segmentLength = length / segmentCount;\n\n for (let i = 0; i < segmentCount; i++) {\n segments.push({\n x: startX + Math.sin(i * curl * 0.5) * curl * 8,\n y: startY - i * segmentLength\n });\n }\n\n return {\n x: startX,\n y: startY,\n length,\n width,\n segments,\n fallSpeed,\n swayPhase,\n swaySpeed,\n swayAmplitude,\n color,\n curl,\n depth\n };\n }\n\n #updateSegments(streamer: Streamer, dt: number): void {\n const segments = streamer.segments;\n\n if (segments.length === 0) {\n return;\n }\n\n segments[0].x = streamer.x;\n segments[0].y = streamer.y;\n\n const segmentLength = streamer.length / segments.length;\n\n for (let i = 1; i < segments.length; i++) {\n const prev = segments[i - 1];\n const curr = segments[i];\n\n const curlOffset = Math.sin(streamer.swayPhase + i * streamer.curl * 0.8) * streamer.curl * 6;\n\n const targetX = prev.x + curlOffset;\n const targetY = prev.y - segmentLength;\n\n const follow = 0.08 * dt;\n curr.x += (targetX - curr.x) * follow;\n curr.y += (targetY - curr.y) * follow;\n\n const dx = curr.x - prev.x;\n const dy = curr.y - prev.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n if (dist > segmentLength * 1.5) {\n const nx = dx / dist;\n const ny = dy / dist;\n curr.x = prev.x + nx * segmentLength * 1.5;\n curr.y = prev.y + ny * segmentLength * 1.5;\n }\n }\n }\n\n #drawStreamer(ctx: CanvasRenderingContext2D, streamer: Streamer): void {\n const segments = streamer.segments;\n\n if (segments.length < 2) {\n return;\n }\n\n const alpha = 0.6 + streamer.depth * 0.4;\n const maxWidth = streamer.width * streamer.depth;\n const last = segments[segments.length - 1];\n\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n\n ctx.beginPath();\n ctx.moveTo(segments[0].x, segments[0].y);\n\n for (let i = 1; i < segments.length - 1; i++) {\n const curr = segments[i];\n const next = segments[i + 1];\n const midX = (curr.x + next.x) / 2;\n const midY = (curr.y + next.y) / 2;\n\n ctx.quadraticCurveTo(curr.x, curr.y, midX, midY);\n }\n\n ctx.lineTo(last.x, last.y);\n\n const gradient = ctx.createLinearGradient(\n segments[0].x, segments[0].y,\n last.x, last.y\n );\n gradient.addColorStop(0, this.#adjustAlpha(streamer.color, alpha * 0.3));\n gradient.addColorStop(0.3, this.#adjustAlpha(streamer.color, alpha));\n gradient.addColorStop(0.7, this.#adjustAlpha(streamer.color, alpha));\n gradient.addColorStop(1, this.#adjustAlpha(streamer.color, alpha * 0.1));\n\n ctx.strokeStyle = gradient;\n ctx.lineWidth = maxWidth;\n ctx.stroke();\n }\n\n #adjustAlpha(color: string, alpha: number): string {\n const clampedAlpha = Math.max(0, Math.min(1, alpha));\n return color + Math.round(clampedAlpha * 255).toString(16).padStart(2, '0');\n }\n}\n","import { Streamers } from './layer';\nimport type { StreamersConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createStreamers(config?: StreamersConfig): Effect<StreamersConfig> {\n return new Streamers(config);\n}\n\nexport type { StreamersConfig };\nexport type { Streamer } from './types';\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\n\nexport interface TopographyConfig {\n readonly speed?: number;\n readonly scale?: number;\n readonly resolution?: number;\n readonly contourSpacing?: number;\n readonly lineWidth?: number;\n readonly color?: string;\n}\n\nexport class Topography extends Effect<TopographyConfig> {\n #speed: number;\n #scale: number;\n readonly #resolution: number;\n readonly #contourSpacing: number;\n readonly #lineWidth: number;\n readonly #colorR: number;\n readonly #colorG: number;\n readonly #colorB: number;\n #time: number = 0;\n #offscreen: HTMLCanvasElement | null = null;\n #offscreenCtx: CanvasRenderingContext2D | null = null;\n #imageData: ImageData | null = null;\n\n constructor(config: TopographyConfig = {}) {\n super();\n\n this.#speed = config.speed ?? 0.5;\n this.#scale = config.scale ?? 1;\n this.#resolution = config.resolution ?? 2;\n this.#contourSpacing = config.contourSpacing ?? 0.1;\n this.#lineWidth = config.lineWidth ?? 1.5;\n\n const [cr, cg, cb] = hexToRGB(config.color ?? '#2d5016');\n this.#colorR = cr;\n this.#colorG = cg;\n this.#colorB = cb;\n }\n\n configure(config: Partial<TopographyConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.scale !== undefined) {\n this.#scale = config.scale;\n }\n }\n\n tick(dt: number, _width: number, _height: number): void {\n this.#time += 0.02 * dt * this.#speed;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const resolution = this.#resolution;\n const offWidth = Math.ceil(width / resolution);\n const offHeight = Math.ceil(height / resolution);\n\n if (!this.#offscreen || this.#offscreen.width !== offWidth || this.#offscreen.height !== offHeight) {\n this.#offscreen = document.createElement('canvas');\n this.#offscreen.width = offWidth;\n this.#offscreen.height = offHeight;\n this.#offscreenCtx = this.#offscreen.getContext('2d');\n this.#imageData = this.#offscreenCtx!.createImageData(offWidth, offHeight);\n }\n\n const data = this.#imageData!.data;\n const time = this.#time;\n const scale = this.#scale;\n const spacing = this.#contourSpacing;\n const lineWidth = this.#lineWidth;\n const colorR = this.#colorR;\n const colorG = this.#colorG;\n const colorB = this.#colorB;\n\n const freq1 = 80 * scale;\n const freq2 = 50 * scale;\n const freq3 = 30 * scale;\n\n const heightField = new Float32Array(offWidth * offHeight);\n\n for (let py = 0; py < offHeight; py++) {\n const worldY = py * resolution;\n\n for (let px = 0; px < offWidth; px++) {\n const worldX = px * resolution;\n\n const value = Math.sin(worldX / freq1 + time) * Math.sin(worldY / freq1 + time * 0.7)\n + 0.5 * Math.sin(worldX / freq2 + worldY / freq2 + time * 1.3)\n + 0.25 * Math.sin(worldX / freq3 - time * 0.5) * Math.sin(worldY / freq3 + time * 0.9);\n\n heightField[py * offWidth + px] = value;\n }\n }\n\n for (let py = 0; py < offHeight; py++) {\n for (let px = 0; px < offWidth; px++) {\n const index = py * offWidth + px;\n const value = heightField[index];\n const contourLevel = Math.floor(value / spacing);\n\n let isContour = false;\n\n if (px < offWidth - 1) {\n const rightLevel = Math.floor(heightField[index + 1] / spacing);\n if (contourLevel !== rightLevel) {\n isContour = true;\n }\n }\n\n if (!isContour && py < offHeight - 1) {\n const belowLevel = Math.floor(heightField[index + offWidth] / spacing);\n if (contourLevel !== belowLevel) {\n isContour = true;\n }\n }\n\n const offset = index * 4;\n\n if (isContour) {\n const alpha = Math.min(255, 255 * lineWidth);\n data[offset] = colorR;\n data[offset + 1] = colorG;\n data[offset + 2] = colorB;\n data[offset + 3] = alpha;\n } else {\n data[offset] = colorR;\n data[offset + 1] = colorG;\n data[offset + 2] = colorB;\n data[offset + 3] = 10;\n }\n }\n }\n\n this.#offscreenCtx!.putImageData(this.#imageData!, 0, 0);\n\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(this.#offscreen!, 0, 0, width, height);\n }\n}\n","import { Topography } from './layer';\nimport type { TopographyConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createTopography(config?: TopographyConfig): Effect<TopographyConfig> {\n return new Topography(config);\n}\n\nexport type { TopographyConfig };\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { TornadoDebris, TornadoParticle } from './types';\n\nexport interface TornadoConfig {\n readonly speed?: number;\n readonly debris?: number;\n readonly width?: number;\n readonly intensity?: number;\n readonly color?: string;\n readonly scale?: number;\n}\n\nexport class Tornado extends Effect<TornadoConfig> {\n readonly #scale: number;\n #speed: number;\n #intensity: number;\n readonly #funnelWidth: number;\n readonly #particleCount: number;\n readonly #debrisCount: number;\n #time: number = 0;\n #particles: TornadoParticle[] = [];\n #debris: TornadoDebris[] = [];\n #colorR: number;\n #colorG: number;\n #colorB: number;\n\n constructor(config: TornadoConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#speed = config.speed ?? 1;\n this.#funnelWidth = config.width ?? 0.3;\n this.#intensity = config.intensity ?? 1;\n\n let particleCount = 400;\n let debrisCount = config.debris ?? 40;\n\n if (innerWidth < 991) {\n particleCount = Math.floor(particleCount / 2);\n debrisCount = Math.floor(debrisCount / 2);\n }\n\n this.#particleCount = particleCount;\n this.#debrisCount = debrisCount;\n\n const {r, g, b} = this.#parseColor(config.color ?? '#8B7355');\n this.#colorR = r;\n this.#colorG = g;\n this.#colorB = b;\n\n for (let i = 0; i < this.#particleCount; ++i) {\n this.#particles.push(this.#createParticle());\n }\n\n for (let i = 0; i < this.#debrisCount; ++i) {\n this.#debris.push(this.#createDebris(true));\n }\n }\n\n configure(config: Partial<TornadoConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.intensity !== undefined) {\n this.#intensity = config.intensity;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#time += 0.015 * dt * this.#speed;\n\n for (const particle of this.#particles) {\n const speedMultiplier = 1 + (1 - particle.height) * 2;\n particle.angle += particle.speed * speedMultiplier * this.#intensity * 0.06 * dt;\n particle.height += 0.0008 * dt * this.#speed * (0.5 + particle.layer * 0.5);\n\n if (particle.height > 1.1) {\n particle.height = -0.05;\n particle.angle = MULBERRY.next() * Math.PI * 2;\n particle.radiusOffset = 0.6 + MULBERRY.next() * 0.8;\n }\n }\n\n const baseY = height * 0.92;\n const swayX = this.#getSway(width);\n const baseCX = width * 0.5 + swayX * 0.3;\n\n let alive = 0;\n\n for (let i = 0; i < this.#debris.length; ++i) {\n const debris = this.#debris[i];\n debris.life += dt;\n\n if (debris.life > debris.maxLife) {\n this.#debris[alive++] = this.#createDebris(false);\n continue;\n }\n\n debris.vy += 0.12 * dt;\n debris.vx *= 0.995;\n debris.vy *= 0.995;\n\n const distToCenter = debris.x - baseCX;\n debris.vx -= distToCenter * 0.0003 * dt * this.#intensity;\n debris.vy -= 0.15 * dt * this.#intensity;\n\n debris.x += debris.vx * dt;\n debris.y += debris.vy * dt;\n debris.rotation += debris.rotationSpeed * dt;\n debris.opacity = 1 - debris.life / debris.maxLife;\n\n if (debris.y > baseY + 10) {\n debris.y = baseY + 10;\n debris.vy = -Math.abs(debris.vy) * 0.3;\n }\n\n this.#debris[alive++] = debris;\n }\n\n this.#debris.length = alive;\n\n while (this.#debris.length < this.#debrisCount) {\n this.#debris.push(this.#createDebris(false));\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const baseY = height * 0.92;\n const topY = height * 0.05;\n const funnelHeight = baseY - topY;\n const swayX = this.#getSway(width);\n const baseCX = width * 0.5 + swayX * 0.3;\n const topCX = width * 0.5 + swayX;\n const baseRadius = this.#funnelWidth * width * 0.12 * this.#scale;\n const topRadius = this.#funnelWidth * width * 0.5 * this.#scale;\n const cr = this.#colorR;\n const cg = this.#colorG;\n const cb = this.#colorB;\n\n this.#drawDustCloud(ctx, baseCX, baseY, width, cr, cg, cb);\n\n for (const particle of this.#particles) {\n if (particle.height < 0 || particle.height > 1) {\n continue;\n }\n\n const t = particle.height;\n const easeT = t * t;\n\n const cx = baseCX + (topCX - baseCX) * easeT;\n const cy = baseY - funnelHeight * t;\n const radius = baseRadius + (topRadius - baseRadius) * easeT;\n\n const orbitRadius = radius * particle.radiusOffset;\n const px = cx + Math.cos(particle.angle) * orbitRadius;\n const py = cy + Math.sin(particle.angle * 0.4) * radius * 0.08;\n\n const depthFactor = (Math.sin(particle.angle) + 1) * 0.5;\n const heightFade = t < 0.05 ? t / 0.05 : (t > 0.95 ? (1 - t) / 0.05 : 1);\n const layerAlpha = particle.layer === 0 ? 0.3 : (particle.layer === 1 ? 0.2 : 0.12);\n const alpha = particle.opacity * heightFade * (0.4 + depthFactor * 0.6) * layerAlpha * this.#intensity;\n\n if (alpha < 0.01) {\n continue;\n }\n\n const size = particle.size * this.#scale * (0.6 + t * 0.8);\n\n ctx.globalAlpha = alpha;\n ctx.fillStyle = `rgb(${cr + (255 - cr) * depthFactor * 0.3 | 0}, ${cg + (255 - cg) * depthFactor * 0.2 | 0}, ${cb + (255 - cb) * depthFactor * 0.15 | 0})`;\n ctx.beginPath();\n ctx.arc(px, py, size, 0, Math.PI * 2);\n ctx.fill();\n }\n\n ctx.fillStyle = `rgb(${cr}, ${cg}, ${cb})`;\n ctx.strokeStyle = `rgb(${cr * 0.6 | 0}, ${cg * 0.6 | 0}, ${cb * 0.6 | 0})`;\n ctx.lineCap = 'round';\n\n for (const debris of this.#debris) {\n if (debris.opacity < 0.05) {\n continue;\n }\n\n const size = debris.size * this.#scale;\n ctx.globalAlpha = debris.opacity * 0.8;\n ctx.lineWidth = Math.max(1, size * 0.5);\n\n const cos = Math.cos(debris.rotation);\n const sin = Math.sin(debris.rotation);\n const hx = cos * size;\n const hy = sin * size;\n\n ctx.beginPath();\n ctx.moveTo(debris.x - hx, debris.y - hy);\n ctx.lineTo(debris.x + hx, debris.y + hy);\n ctx.stroke();\n }\n\n ctx.globalAlpha = 1;\n }\n\n #drawDustCloud(ctx: CanvasRenderingContext2D, cx: number, baseY: number, _width: number, r: number, g: number, b: number): void {\n const cloudRadius = this.#funnelWidth * 80 * this.#scale;\n\n const gradient = ctx.createRadialGradient(\n cx, baseY, 0,\n cx, baseY, cloudRadius\n );\n gradient.addColorStop(0, `rgba(${r}, ${g}, ${b}, ${0.15 * this.#intensity})`);\n gradient.addColorStop(0.5, `rgba(${r}, ${g}, ${b}, ${0.06 * this.#intensity})`);\n gradient.addColorStop(1, `rgba(${r}, ${g}, ${b}, 0)`);\n\n ctx.globalAlpha = 1;\n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.arc(cx, baseY, cloudRadius, 0, Math.PI * 2);\n ctx.fill();\n }\n\n #getSway(width: number): number {\n return Math.sin(this.#time * 0.8) * width * 0.06\n + Math.sin(this.#time * 1.9 + 1.5) * width * 0.03\n + Math.sin(this.#time * 3.1 + 0.7) * width * 0.01;\n }\n\n #createParticle(): TornadoParticle {\n const layer = MULBERRY.next() < 0.4 ? 0 : (MULBERRY.next() < 0.6 ? 1 : 2);\n\n return {\n angle: MULBERRY.next() * Math.PI * 2,\n height: MULBERRY.next(),\n radiusOffset: layer === 0\n ? (0.85 + MULBERRY.next() * 0.3)\n : layer === 1\n ? (0.5 + MULBERRY.next() * 0.5)\n : (1.1 + MULBERRY.next() * 0.4),\n speed: 0.5 + MULBERRY.next() * 0.8,\n size: (1.5 + MULBERRY.next() * 3) * (layer === 2 ? 0.7 : 1),\n opacity: 0.6 + MULBERRY.next() * 0.4,\n layer\n };\n }\n\n #createDebris(spread: boolean): TornadoDebris {\n return {\n x: 0,\n y: 0,\n vx: (MULBERRY.next() - 0.5) * 4 * this.#intensity,\n vy: -MULBERRY.next() * 3 * this.#intensity,\n size: 2 + MULBERRY.next() * 5,\n rotation: MULBERRY.next() * Math.PI * 2,\n rotationSpeed: (MULBERRY.next() - 0.5) * 0.15,\n opacity: spread ? MULBERRY.next() : 1,\n life: spread ? MULBERRY.next() * 120 : 0,\n maxLife: 120 + MULBERRY.next() * 180\n };\n }\n\n #parseColor(color: string): { r: number; g: number; b: number } {\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const colorCtx = canvas.getContext('2d')!;\n colorCtx.fillStyle = color;\n colorCtx.fillRect(0, 0, 1, 1);\n const data = colorCtx.getImageData(0, 0, 1, 1).data;\n return {r: data[0], g: data[1], b: data[2]};\n }\n}\n","import { Tornado } from './layer';\nimport type { TornadoConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createTornado(config?: TornadoConfig): Effect<TornadoConfig> {\n return new Tornado(config);\n}\n\nexport type { TornadoConfig };\nexport type { TornadoDebris, TornadoParticle } from './types';\n","import { distance } from './distance';\nimport { Spark } from './fireworks/spark';\nimport type { Point } from './point';\n\nexport interface TrailConfig {\n readonly acceleration?: number;\n readonly brightness?: number;\n readonly glow?: number;\n readonly hue?: number;\n readonly length?: number;\n readonly speed?: number;\n readonly width?: number;\n}\n\nexport class Trail {\n readonly #startPosition: Point;\n readonly #position: Point;\n readonly #angle: number;\n readonly #totalDistance: number;\n readonly #trail: Point[];\n readonly #acceleration: number;\n readonly #brightness: number;\n readonly #glow: number;\n readonly #hue: number;\n readonly #width: number;\n #speed: number;\n #distanceTraveled: number = 0;\n #isDone: boolean = false;\n #sparkTimer: number = 0;\n #pendingSparks: Spark[] = [];\n\n get hue(): number {\n return this.#hue;\n }\n\n get isDone(): boolean {\n return this.#isDone;\n }\n\n get position(): Point {\n return {...this.#position};\n }\n\n collectSparks(): Spark[] {\n const sparks = this.#pendingSparks;\n this.#pendingSparks = [];\n return sparks;\n }\n\n constructor(start: Point, end: Point, config: TrailConfig = {}) {\n this.#startPosition = {...start};\n this.#position = {...start};\n this.#angle = Math.atan2(end.y - start.y, end.x - start.x);\n this.#totalDistance = distance(start, end);\n this.#acceleration = config.acceleration ?? 1.05;\n this.#brightness = config.brightness ?? 65;\n this.#glow = config.glow ?? 10;\n this.#hue = config.hue ?? Math.random() * 360;\n this.#speed = config.speed ?? 1;\n this.#width = config.width ?? 2;\n\n const length = config.length ?? 6;\n this.#trail = Array.from({length}, () => ({...start}));\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n if (this.#isDone) {\n return;\n }\n\n ctx.save();\n ctx.lineCap = 'round';\n\n for (let i = this.#trail.length - 1; i > 0; i--) {\n const progress = i / this.#trail.length;\n const alpha = (1 - progress) * 0.8;\n const width = this.#width * (1 - progress * 0.5);\n\n ctx.beginPath();\n ctx.moveTo(this.#trail[i].x, this.#trail[i].y);\n ctx.lineTo(this.#trail[i - 1].x, this.#trail[i - 1].y);\n ctx.lineWidth = width;\n ctx.strokeStyle = `hsla(${this.#hue}, 100%, ${this.#brightness}%, ${alpha})`;\n ctx.stroke();\n }\n\n ctx.shadowBlur = this.#glow;\n ctx.shadowColor = `hsl(${this.#hue}, 100%, 60%)`;\n\n ctx.beginPath();\n ctx.moveTo(this.#trail[0].x, this.#trail[0].y);\n ctx.lineTo(this.#position.x, this.#position.y);\n ctx.lineWidth = this.#width;\n ctx.strokeStyle = `hsl(${this.#hue}, 100%, ${this.#brightness}%)`;\n ctx.stroke();\n\n ctx.shadowBlur = this.#glow * 1.5;\n ctx.shadowColor = `hsl(${this.#hue}, 80%, 80%)`;\n ctx.beginPath();\n ctx.arc(this.#position.x, this.#position.y, this.#width * 0.6, 0, Math.PI * 2);\n ctx.fillStyle = `hsl(${this.#hue}, 20%, 92%)`;\n ctx.fill();\n\n ctx.restore();\n }\n\n tick(dt: number = 1): void {\n if (this.#isDone) {\n return;\n }\n\n this.#trail.pop();\n this.#trail.unshift({...this.#position});\n\n this.#speed *= Math.pow(this.#acceleration, dt);\n\n const vx = Math.cos(this.#angle) * this.#speed;\n const vy = Math.sin(this.#angle) * this.#speed;\n\n this.#distanceTraveled = distance(this.#startPosition, {\n x: this.#position.x + vx * dt,\n y: this.#position.y + vy * dt\n });\n\n if (this.#distanceTraveled >= this.#totalDistance) {\n this.#isDone = true;\n return;\n }\n\n this.#position.x += vx * dt;\n this.#position.y += vy * dt;\n\n this.#sparkTimer += dt;\n\n if (this.#sparkTimer >= 3) {\n this.#sparkTimer -= 3;\n this.#pendingSparks.push(new Spark(this.#position, this.#hue, -vx * 0.1, -vy * 0.1));\n }\n }\n}\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { VoronoiCell } from './types';\n\nexport interface VoronoiConfig {\n readonly cells?: number;\n readonly speed?: number;\n readonly colors?: string[];\n readonly edgeColor?: string;\n readonly edgeWidth?: number;\n readonly scale?: number;\n}\n\nconst DEFAULT_COLORS = ['#ff6b6b', '#4ecdc4', '#45b7d1', '#f9ca24', '#6c5ce7', '#fd79a8', '#00b894', '#e17055'];\n\nexport class Voronoi extends Effect<VoronoiConfig> {\n #speed: number;\n #scale: number;\n readonly #cellCount: number;\n readonly #edgeWidth: number;\n readonly #colorStrings: string[];\n readonly #edgeColor: string;\n #cells: VoronoiCell[] = [];\n\n constructor(config: VoronoiConfig = {}) {\n super();\n\n this.#speed = config.speed ?? 0.5;\n this.#scale = config.scale ?? 1;\n this.#cellCount = config.cells ?? 20;\n this.#edgeWidth = config.edgeWidth ?? 2;\n\n const colors = config.colors ?? DEFAULT_COLORS;\n const colorRGBs = colors.map(c => hexToRGB(c));\n this.#colorStrings = colorRGBs.map(([r, g, b]) => `rgb(${r}, ${g}, ${b})`);\n\n const [er, eg, eb] = hexToRGB(config.edgeColor ?? '#ffffff');\n this.#edgeColor = `rgb(${er}, ${eg}, ${eb})`;\n }\n\n configure(config: Partial<VoronoiConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.scale !== undefined) {\n this.#scale = config.scale;\n }\n }\n\n onResize(width: number, height: number): void {\n this.#cells = [];\n\n for (let idx = 0; idx < this.#cellCount; idx++) {\n this.#cells.push({\n x: MULBERRY.next() * width,\n y: MULBERRY.next() * height,\n vx: (MULBERRY.next() - 0.5) * 60,\n vy: (MULBERRY.next() - 0.5) * 60,\n color: idx % this.#colorStrings.length\n });\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n const speed = this.#speed;\n\n for (let idx = 0; idx < this.#cells.length; idx++) {\n const cell = this.#cells[idx];\n\n cell.x += cell.vx * dt * 0.02 * speed;\n cell.y += cell.vy * dt * 0.02 * speed;\n\n if (cell.x < 0) {\n cell.x = 0;\n cell.vx = -cell.vx;\n } else if (cell.x > width) {\n cell.x = width;\n cell.vx = -cell.vx;\n }\n\n if (cell.y < 0) {\n cell.y = 0;\n cell.vy = -cell.vy;\n } else if (cell.y > height) {\n cell.y = height;\n cell.vy = -cell.vy;\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const cells = this.#cells;\n const cellCount = cells.length;\n\n if (cellCount === 0) {\n return;\n }\n\n const edgeWidth = this.#edgeWidth * this.#scale;\n const pad = 2;\n const bounds: [number, number][] = [\n [-pad, -pad],\n [width + pad, -pad],\n [width + pad, height + pad],\n [-pad, height + pad]\n ];\n\n for (let ci = 0; ci < cellCount; ci++) {\n const cell = cells[ci];\n let polygon = bounds;\n\n for (let cj = 0; cj < cellCount; cj++) {\n if (ci === cj) {\n continue;\n }\n\n const other = cells[cj];\n const mx = (cell.x + other.x) * 0.5;\n const my = (cell.y + other.y) * 0.5;\n const nx = other.x - cell.x;\n const ny = other.y - cell.y;\n\n polygon = this.#clipPolygon(polygon, mx, my, nx, ny);\n\n if (polygon.length === 0) {\n break;\n }\n }\n\n if (polygon.length < 3) {\n continue;\n }\n\n ctx.fillStyle = this.#colorStrings[cell.color];\n ctx.beginPath();\n ctx.moveTo(polygon[0][0], polygon[0][1]);\n\n for (let vi = 1; vi < polygon.length; vi++) {\n ctx.lineTo(polygon[vi][0], polygon[vi][1]);\n }\n\n ctx.closePath();\n ctx.fill();\n\n if (edgeWidth > 0) {\n ctx.strokeStyle = this.#edgeColor;\n ctx.lineWidth = edgeWidth;\n ctx.lineJoin = 'round';\n ctx.stroke();\n }\n }\n }\n\n #clipPolygon(polygon: [number, number][], mx: number, my: number, nx: number, ny: number): [number, number][] {\n const output: [number, number][] = [];\n const len = polygon.length;\n\n if (len === 0) {\n return output;\n }\n\n let prevX = polygon[len - 1][0];\n let prevY = polygon[len - 1][1];\n let prevDot = (prevX - mx) * nx + (prevY - my) * ny;\n\n for (let vi = 0; vi < len; vi++) {\n const currX = polygon[vi][0];\n const currY = polygon[vi][1];\n const currDot = (currX - mx) * nx + (currY - my) * ny;\n\n if (currDot <= 0) {\n if (prevDot > 0) {\n const t = prevDot / (prevDot - currDot);\n output.push([\n prevX + (currX - prevX) * t,\n prevY + (currY - prevY) * t\n ]);\n }\n\n output.push([currX, currY]);\n } else if (prevDot <= 0) {\n const t = prevDot / (prevDot - currDot);\n output.push([\n prevX + (currX - prevX) * t,\n prevY + (currY - prevY) * t\n ]);\n }\n\n prevX = currX;\n prevY = currY;\n prevDot = currDot;\n }\n\n return output;\n }\n}\n","import { Voronoi } from './layer';\nimport type { VoronoiConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createVoronoi(config?: VoronoiConfig): Effect<VoronoiConfig> {\n return new Voronoi(config);\n}\n\nexport type { VoronoiConfig };\nexport type { VoronoiCell } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { VolcanoProjectile } from './types';\n\nexport interface VolcanoConfig {\n readonly speed?: number;\n readonly projectiles?: number;\n readonly embers?: number;\n readonly intensity?: number;\n readonly color?: string;\n readonly smokeColor?: string;\n readonly scale?: number;\n}\n\nexport class Volcano extends Effect<VolcanoConfig> {\n readonly #scale: number;\n readonly #color: string;\n readonly #smokeColor: string;\n #speed: number;\n #intensity: number;\n #maxProjectiles: number;\n #maxEmbers: number;\n #time: number = 0;\n #particles: VolcanoProjectile[] = [];\n #canvasWidth: number = 800;\n #canvasHeight: number = 600;\n\n constructor(config: VolcanoConfig = {}) {\n super();\n\n this.#scale = config.scale ?? 1;\n this.#speed = config.speed ?? 1;\n this.#maxProjectiles = config.projectiles ?? 30;\n this.#maxEmbers = config.embers ?? 60;\n this.#intensity = config.intensity ?? 1;\n this.#color = config.color ?? '#ff4400';\n this.#smokeColor = config.smokeColor ?? '#444444';\n\n if (innerWidth < 991) {\n this.#maxProjectiles = Math.floor(this.#maxProjectiles / 2);\n this.#maxEmbers = Math.floor(this.#maxEmbers / 2);\n }\n }\n\n configure(config: Partial<VolcanoConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.intensity !== undefined) {\n this.#intensity = config.intensity;\n }\n }\n\n onResize(width: number, height: number): void {\n this.#canvasWidth = width;\n this.#canvasHeight = height;\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#canvasWidth = width;\n this.#canvasHeight = height;\n this.#time += 0.02 * dt * this.#speed;\n\n const eruptX = width * 0.5;\n const eruptY = height * 0.85;\n\n const lavaCount = this.#countByType('lava');\n const emberCount = this.#countByType('ember');\n const smokeCount = this.#countByType('smoke');\n\n if (lavaCount < this.#maxProjectiles && MULBERRY.next() < 0.15 * this.#intensity * dt) {\n this.#particles.push(this.#createLava(eruptX, eruptY));\n }\n\n if (emberCount < this.#maxEmbers && MULBERRY.next() < 0.4 * this.#intensity * dt) {\n this.#particles.push(this.#createEmber(eruptX, eruptY));\n }\n\n if (smokeCount < 40 && MULBERRY.next() < 0.2 * this.#intensity * dt) {\n this.#particles.push(this.#createSmoke(eruptX, eruptY));\n }\n\n let alive = 0;\n\n for (let i = 0; i < this.#particles.length; i++) {\n const particle = this.#particles[i];\n\n particle.x += particle.vx * dt * this.#speed;\n particle.y += particle.vy * dt * this.#speed;\n particle.life += dt;\n\n if (particle.type === 'lava') {\n particle.vy += 0.015 * dt;\n particle.vx *= 0.999;\n } else if (particle.type === 'ember') {\n particle.vy -= 0.002 * dt;\n particle.vx += (MULBERRY.next() - 0.5) * 0.02 * dt;\n } else {\n particle.vy -= 0.003 * dt;\n particle.vx += (MULBERRY.next() - 0.5) * 0.01 * dt;\n particle.size += 0.03 * dt;\n }\n\n if (particle.life < particle.maxLife) {\n this.#particles[alive++] = particle;\n }\n }\n\n this.#particles.length = alive;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n this.#drawGlow(ctx, width, height);\n this.#drawSmoke(ctx);\n this.#drawLavaAndEmbers(ctx);\n }\n\n #drawGlow(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const eruptX = width * 0.5;\n const eruptY = height * 0.85;\n const glowRadius = 120 * this.#scale * this.#intensity;\n const flicker = 0.8 + Math.sin(this.#time * 5) * 0.2;\n\n const gradient = ctx.createRadialGradient(eruptX, eruptY, 0, eruptX, eruptY, glowRadius);\n gradient.addColorStop(0, `rgba(255, 200, 50, ${0.4 * flicker * this.#intensity})`);\n gradient.addColorStop(0.3, `rgba(255, 100, 20, ${0.2 * flicker * this.#intensity})`);\n gradient.addColorStop(0.6, `rgba(255, 50, 0, ${0.08 * flicker * this.#intensity})`);\n gradient.addColorStop(1, 'rgba(255, 30, 0, 0)');\n\n ctx.globalCompositeOperation = 'lighter';\n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.arc(eruptX, eruptY, glowRadius, 0, Math.PI * 2);\n ctx.fill();\n ctx.globalCompositeOperation = 'source-over';\n }\n\n #drawSmoke(ctx: CanvasRenderingContext2D): void {\n for (const particle of this.#particles) {\n if (particle.type !== 'smoke') {\n continue;\n }\n\n const lifeRatio = particle.life / particle.maxLife;\n const alpha = (1 - lifeRatio) * 0.3 * this.#intensity;\n const size = particle.size * this.#scale;\n\n if (alpha < 0.01) {\n continue;\n }\n\n ctx.globalAlpha = alpha;\n ctx.fillStyle = this.#smokeColor;\n ctx.beginPath();\n ctx.arc(particle.x, particle.y, size, 0, Math.PI * 2);\n ctx.fill();\n }\n\n ctx.globalAlpha = 1;\n }\n\n #drawLavaAndEmbers(ctx: CanvasRenderingContext2D): void {\n ctx.globalCompositeOperation = 'lighter';\n\n for (const particle of this.#particles) {\n if (particle.type === 'smoke') {\n continue;\n }\n\n const lifeRatio = particle.life / particle.maxLife;\n const alpha = (1 - lifeRatio) * this.#intensity;\n const size = particle.size * this.#scale;\n\n if (alpha < 0.02) {\n continue;\n }\n\n if (particle.type === 'lava') {\n const gradient = ctx.createRadialGradient(\n particle.x, particle.y, 0,\n particle.x, particle.y, size * 2\n );\n gradient.addColorStop(0, `rgba(255, 220, 100, ${alpha})`);\n gradient.addColorStop(0.4, `rgba(255, 100, 20, ${alpha * 0.7})`);\n gradient.addColorStop(1, `rgba(200, 30, 0, 0)`);\n\n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.arc(particle.x, particle.y, size * 2, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.fillStyle = `rgba(255, 240, 180, ${alpha * 0.9})`;\n ctx.beginPath();\n ctx.arc(particle.x, particle.y, size * 0.5, 0, Math.PI * 2);\n ctx.fill();\n } else {\n ctx.fillStyle = `rgba(255, ${150 + MULBERRY.next() * 80 | 0}, 30, ${alpha})`;\n ctx.beginPath();\n ctx.arc(particle.x, particle.y, size, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = 1;\n }\n\n #countByType(type: VolcanoProjectile['type']): number {\n let count = 0;\n\n for (let i = 0; i < this.#particles.length; i++) {\n if (this.#particles[i].type === type) {\n count++;\n }\n }\n\n return count;\n }\n\n #createLava(eruptX: number, eruptY: number): VolcanoProjectile {\n const angle = -Math.PI / 2 + (MULBERRY.next() - 0.5) * 0.8;\n const force = (3 + MULBERRY.next() * 4) * this.#intensity;\n\n return {\n x: eruptX + (MULBERRY.next() - 0.5) * 20 * this.#scale,\n y: eruptY,\n vx: Math.cos(angle) * force,\n vy: Math.sin(angle) * force,\n size: 3 + MULBERRY.next() * 5,\n life: 0,\n maxLife: 80 + MULBERRY.next() * 60,\n type: 'lava'\n };\n }\n\n #createEmber(eruptX: number, eruptY: number): VolcanoProjectile {\n return {\n x: eruptX + (MULBERRY.next() - 0.5) * 30 * this.#scale,\n y: eruptY - MULBERRY.next() * 10,\n vx: (MULBERRY.next() - 0.5) * 1.5,\n vy: -(0.5 + MULBERRY.next() * 1.5),\n size: 1 + MULBERRY.next() * 2,\n life: 0,\n maxLife: 60 + MULBERRY.next() * 80,\n type: 'ember'\n };\n }\n\n #createSmoke(eruptX: number, eruptY: number): VolcanoProjectile {\n return {\n x: eruptX + (MULBERRY.next() - 0.5) * 40 * this.#scale,\n y: eruptY - MULBERRY.next() * 20,\n vx: (MULBERRY.next() - 0.5) * 0.5,\n vy: -(0.3 + MULBERRY.next() * 0.5),\n size: 8 + MULBERRY.next() * 12,\n life: 0,\n maxLife: 120 + MULBERRY.next() * 100,\n type: 'smoke'\n };\n }\n}\n","import { Volcano } from './layer';\nimport type { VolcanoConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createVolcano(config?: VolcanoConfig): Effect<VolcanoConfig> {\n return new Volcano(config);\n}\n\nexport type { VolcanoConfig };\nexport type { VolcanoProjectile } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { Wave } from './types';\n\nconst DEFAULT_COLORS = ['#0a3d6b', '#0e5a8a', '#1a7ab5', '#3399cc', '#66c2e0'];\n\nexport interface WavesConfig {\n readonly layers?: number;\n readonly speed?: number;\n readonly colors?: string[];\n readonly foamColor?: string;\n readonly foamAmount?: number;\n readonly scale?: number;\n}\n\nexport class Waves extends Effect<WavesConfig> {\n #speed: number;\n #foamAmount: number;\n #scale: number;\n readonly #foamRGB: [number, number, number];\n #waves: Wave[] = [];\n #foamParticles: { x: number; y: number; alpha: number; size: number }[] = [];\n #maxFoamParticles: number;\n\n constructor(config: WavesConfig = {}) {\n super();\n\n const layers = config.layers ?? 5;\n const colors = config.colors ?? DEFAULT_COLORS;\n this.#speed = config.speed ?? 1;\n this.#foamAmount = config.foamAmount ?? 0.4;\n this.#scale = config.scale ?? 1;\n this.#maxFoamParticles = 120;\n this.#foamRGB = hexToRGB(config.foamColor ?? '#ffffff');\n\n if (innerWidth < 991) {\n this.#maxFoamParticles = Math.floor(this.#maxFoamParticles / 2);\n }\n\n for (let i = 0; i < layers; i++) {\n const depth = i / Math.max(layers - 1, 1);\n const color = colors[i % colors.length];\n\n this.#waves.push({\n amplitude: (20 + MULBERRY.next() * 30) * (1 - depth * 0.4),\n frequency: 0.005 + MULBERRY.next() * 0.008 + depth * 0.002,\n speed: 0.4 + MULBERRY.next() * 0.6 + depth * 0.3,\n phase: MULBERRY.next() * Math.PI * 2,\n baseY: 0.35 + depth * 0.13,\n color,\n foamThreshold: 0.6 + MULBERRY.next() * 0.3,\n rgb: hexToRGB(color)\n });\n }\n }\n\n configure(config: Partial<WavesConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.foamAmount !== undefined) {\n this.#foamAmount = config.foamAmount;\n }\n if (config.scale !== undefined) {\n this.#scale = config.scale;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n for (const wave of this.#waves) {\n wave.phase += 0.015 * wave.speed * this.#speed * dt;\n }\n\n let aliveFoam = 0;\n\n for (let i = 0; i < this.#foamParticles.length; i++) {\n const foam = this.#foamParticles[i];\n foam.alpha -= (0.008 + MULBERRY.next() * 0.006) * dt;\n foam.x += (MULBERRY.next() - 0.5) * 0.5 * dt;\n foam.y += (MULBERRY.next() - 0.5) * 0.3 * dt;\n\n if (foam.alpha > 0) {\n this.#foamParticles[aliveFoam++] = foam;\n }\n }\n\n this.#foamParticles.length = aliveFoam;\n\n if (this.#foamAmount > 0 && width > 0 && height > 0) {\n const spawnCount = Math.ceil(2 * this.#foamAmount * dt);\n\n for (let s = 0; s < spawnCount && this.#foamParticles.length < this.#maxFoamParticles; s++) {\n const waveIndex = Math.floor(MULBERRY.next() * this.#waves.length);\n const wave = this.#waves[waveIndex];\n const x = MULBERRY.next() * width;\n const centerY = wave.baseY * height;\n const primary = wave.amplitude * Math.sin(wave.frequency * x + wave.phase);\n const secondary = wave.amplitude * 0.4 * Math.sin(wave.frequency * 2.3 * x + wave.phase * 1.7 + 1.3);\n const waveY = centerY + (primary + secondary) * this.#scale;\n\n const slopeCheck = Math.cos(wave.frequency * x + wave.phase);\n\n if (slopeCheck > wave.foamThreshold - 1) {\n this.#foamParticles.push({\n x,\n y: waveY - MULBERRY.next() * 4 * this.#scale,\n alpha: 0.4 + MULBERRY.next() * 0.6,\n size: 1 + MULBERRY.next() * 3\n });\n }\n }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n const step = 2;\n\n for (let wi = 0; wi < this.#waves.length; wi++) {\n const wave = this.#waves[wi];\n const [wr, wg, wb] = wave.rgb;\n const centerY = wave.baseY * height;\n\n ctx.beginPath();\n ctx.moveTo(0, height);\n\n for (let x = 0; x <= width; x += step) {\n const primary = wave.amplitude * Math.sin(wave.frequency * x + wave.phase);\n const secondary = wave.amplitude * 0.4 * Math.sin(wave.frequency * 2.3 * x + wave.phase * 1.7 + 1.3);\n const tertiary = wave.amplitude * 0.15 * Math.sin(wave.frequency * 4.1 * x + wave.phase * 0.6 + 2.8);\n const waveY = centerY + (primary + secondary + tertiary) * this.#scale;\n\n ctx.lineTo(x, waveY);\n }\n\n ctx.lineTo(width, height);\n ctx.closePath();\n\n const gradient = ctx.createLinearGradient(0, centerY - wave.amplitude * this.#scale, 0, height);\n gradient.addColorStop(0, `rgba(${wr}, ${wg}, ${wb}, 0.85)`);\n gradient.addColorStop(0.4, `rgb(${wr}, ${wg}, ${wb})`);\n gradient.addColorStop(1, `rgb(${Math.floor(wr * 0.6)}, ${Math.floor(wg * 0.6)}, ${Math.floor(wb * 0.6)})`);\n\n ctx.fillStyle = gradient;\n ctx.fill();\n }\n\n if (this.#foamAmount > 0) {\n const [fr, fg, fb] = this.#foamRGB;\n\n for (const foam of this.#foamParticles) {\n if (foam.alpha <= 0) {\n continue;\n }\n\n ctx.beginPath();\n ctx.arc(foam.x, foam.y, foam.size * this.#scale, 0, Math.PI * 2);\n ctx.fillStyle = `rgba(${fr}, ${fg}, ${fb}, ${foam.alpha * this.#foamAmount})`;\n ctx.fill();\n }\n }\n }\n}\n","import { Waves } from './layer';\nimport type { WavesConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createWaves(config?: WavesConfig): Effect<WavesConfig> {\n return new Waves(config);\n}\n\nexport type { WavesConfig };\nexport type { Wave } from './types';\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { Effect } from '../effect';\nimport { MULBERRY } from './consts';\nimport type { WormholeDirection, WormholeParticle } from './types';\n\nexport interface WormholeConfig {\n readonly count?: number;\n readonly speed?: number;\n readonly color?: string;\n readonly direction?: WormholeDirection;\n readonly scale?: number;\n}\n\nexport class Wormhole extends Effect<WormholeConfig> {\n #speed: number;\n readonly #colorRGB: [number, number, number];\n readonly #direction: WormholeDirection;\n #scale: number;\n #count: number;\n #particles: WormholeParticle[] = [];\n #width: number = 960;\n #height: number = 540;\n #initialized: boolean = false;\n\n constructor(config: WormholeConfig = {}) {\n super();\n\n let count = config.count ?? 200;\n\n this.#speed = config.speed ?? 1;\n this.#colorRGB = hexToRGB(config.color ?? '#6699ff');\n this.#direction = config.direction ?? 'inward';\n this.#scale = config.scale ?? 1;\n\n if (innerWidth < 991) {\n count = Math.floor(count / 2);\n }\n\n this.#count = count;\n }\n\n onResize(width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n if (!this.#initialized) {\n this.#initialized = true;\n this.#particles = [];\n\n for (let i = 0; i < this.#count; ++i) {\n this.#particles.push(this.#createParticle(true));\n }\n }\n }\n\n configure(config: Partial<WormholeConfig>): void {\n if (config.speed !== undefined) {\n this.#speed = config.speed;\n }\n if (config.scale !== undefined) {\n this.#scale = config.scale;\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#width = width;\n this.#height = height;\n\n const maxRadius = Math.sqrt((width / 2) ** 2 + (height / 2) ** 2);\n\n let alive = 0;\n\n for (let i = 0; i < this.#particles.length; ++i) {\n const particle = this.#particles[i];\n\n if (this.#direction === 'inward') {\n const normalizedDistance = particle.distance / maxRadius;\n const acceleration = 1 + (1 - normalizedDistance) * 3;\n particle.distance -= particle.speed * this.#speed * acceleration * dt * this.#scale;\n\n particle.trail = 5 + (1 - normalizedDistance) * 25;\n\n if (particle.distance > 0) {\n this.#particles[alive++] = particle;\n } else {\n this.#particles[alive++] = this.#createParticle(false);\n }\n } else {\n const normalizedDistance = particle.distance / maxRadius;\n const acceleration = 1 + normalizedDistance * 3;\n particle.distance += particle.speed * this.#speed * acceleration * dt * this.#scale;\n\n particle.trail = 5 + normalizedDistance * 25;\n\n if (particle.distance < maxRadius + 20) {\n this.#particles[alive++] = particle;\n } else {\n this.#particles[alive++] = this.#createParticle(false);\n }\n }\n\n particle.angle += (MULBERRY.next() - 0.5) * 0.002 * dt;\n }\n\n this.#particles.length = alive;\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n const cx = width / 2;\n const cy = height / 2;\n const maxRadius = Math.sqrt(cx * cx + cy * cy);\n const [cr, cg, cb] = this.#colorRGB;\n\n\n const glowRadius = 40 * this.#scale;\n const glow = ctx.createRadialGradient(cx, cy, 0, cx, cy, glowRadius);\n glow.addColorStop(0, `rgba(${cr}, ${cg}, ${cb}, 0.25)`);\n glow.addColorStop(0.4, `rgba(${cr}, ${cg}, ${cb}, 0.08)`);\n glow.addColorStop(1, `rgba(${cr}, ${cg}, ${cb}, 0)`);\n\n ctx.globalCompositeOperation = 'lighter';\n ctx.globalAlpha = 1;\n ctx.beginPath();\n ctx.arc(cx, cy, glowRadius, 0, Math.PI * 2);\n ctx.fillStyle = glow;\n ctx.fill();\n\n for (const particle of this.#particles) {\n const normalizedDistance = particle.distance / maxRadius;\n const px = cx + Math.cos(particle.angle) * particle.distance;\n const py = cy + Math.sin(particle.angle) * particle.distance;\n\n const trailFactor = this.#direction === 'inward' ? 1 : -1;\n const trailLength = particle.trail * this.#scale;\n const tx = px + Math.cos(particle.angle) * trailLength * trailFactor;\n const ty = py + Math.sin(particle.angle) * trailLength * trailFactor;\n\n let intensity: number;\n\n if (this.#direction === 'inward') {\n intensity = particle.brightness * (1 - normalizedDistance);\n } else {\n intensity = particle.brightness * normalizedDistance;\n }\n\n const alpha = Math.max(0.05, Math.min(1, intensity));\n const lineWidth = Math.max(0.5, particle.size * this.#scale * (0.5 + intensity * 0.5));\n\n const gradient = ctx.createLinearGradient(px, py, tx, ty);\n gradient.addColorStop(0, `rgba(${cr}, ${cg}, ${cb}, ${alpha})`);\n gradient.addColorStop(1, `rgba(${cr}, ${cg}, ${cb}, 0)`);\n\n ctx.globalAlpha = 1;\n ctx.beginPath();\n ctx.moveTo(px, py);\n ctx.lineTo(tx, ty);\n ctx.strokeStyle = gradient;\n ctx.lineWidth = lineWidth;\n ctx.stroke();\n\n ctx.globalAlpha = alpha;\n ctx.beginPath();\n ctx.arc(px, py, lineWidth * 0.6, 0, Math.PI * 2);\n ctx.fillStyle = `rgb(${cr}, ${cg}, ${cb})`;\n ctx.fill();\n }\n\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = 1;\n }\n\n #createParticle(spread: boolean): WormholeParticle {\n const maxRadius = Math.sqrt((this.#width / 2) ** 2 + (this.#height / 2) ** 2);\n const angle = MULBERRY.next() * Math.PI * 2;\n\n let distance: number;\n\n if (this.#direction === 'inward') {\n distance = spread\n ? MULBERRY.next() * maxRadius\n : maxRadius * (0.8 + MULBERRY.next() * 0.2);\n } else {\n distance = spread\n ? MULBERRY.next() * maxRadius\n : MULBERRY.next() * maxRadius * 0.1;\n }\n\n return {\n angle,\n distance,\n speed: 0.5 + MULBERRY.next() * 1.5,\n size: 0.8 + MULBERRY.next() * 2.2,\n brightness: 0.4 + MULBERRY.next() * 0.6,\n trail: 5\n };\n }\n}\n","import { Wormhole } from './layer';\nimport type { WormholeConfig } from './layer';\nimport type { Effect } from '../effect';\n\nexport function createWormhole(config?: WormholeConfig): Effect<WormholeConfig> {\n return new Wormhole(config);\n}\n\nexport type { WormholeConfig };\nexport type { WormholeDirection, WormholeParticle } from './types';\n"],"mappings":"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"}