@basmilius/sparkle 2.2.0 → 2.3.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.
- package/dist/index.d.mts +12 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +158 -107
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/canvas.ts +80 -2
- package/src/confetti/shapes.ts +84 -97
- package/src/effect.ts +2 -2
- package/src/scene.ts +9 -6
- package/src/simulation-canvas.ts +9 -6
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["#globalSpeed","#canvas","#context","#frameRate","#target","#delta","#then","#speed","#isStopped","#ticks","#height","#width","#current","#frame","#now","#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\n static get globalSpeed(): number {\n return LimitedFrameRateCanvas.#globalSpeed;\n }\n\n static set globalSpeed(value: number) {\n LimitedFrameRateCanvas.#globalSpeed = 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\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 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 = 1000 / frameRate;\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 if (this.#then > 0 && this.#current - this.#then + 1 < this.#target) {\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 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 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 this.canvas.height = this.height;\n this.canvas.width = this.width;\n\n const ctx = this.context;\n\n if (this.#simulation.fade) {\n const offCtx = this.#getOffscreenCtx(this.width, this.height);\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);\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;\n this.#offscreen.height = this.height;\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'}): 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, 60, 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\nexport const SHAPE_PATHS: Record<Shape, Path2D> = {\n bowtie: (() => {\n const path = new Path2D();\n path.moveTo(-1, -0.7);\n path.lineTo(0, 0);\n path.lineTo(-1, 0.7);\n path.closePath();\n path.moveTo(1, -0.7);\n path.lineTo(0, 0);\n path.lineTo(1, 0.7);\n path.closePath();\n return path;\n })(),\n circle: (() => {\n const path = new Path2D();\n path.ellipse(0, 0, 0.6, 1, 0, 0, TWO_PI);\n return path;\n })(),\n crescent: (() => {\n const path = new Path2D();\n path.arc(0, 0, 1, 0, TWO_PI, false);\n path.arc(0.45, 0, 0.9, 0, TWO_PI, true);\n return path;\n })(),\n diamond: (() => {\n const path = new Path2D();\n path.moveTo(0, -1);\n path.lineTo(0.6, 0);\n path.lineTo(0, 1);\n path.lineTo(-0.6, 0);\n path.closePath();\n return path;\n })(),\n heart: (() => {\n const path = new Path2D();\n path.moveTo(0, 1);\n path.bezierCurveTo(-0.4, 0.55, -1, 0.1, -1, -0.35);\n path.bezierCurveTo(-1, -0.8, -0.5, -1, 0, -0.6);\n path.bezierCurveTo(0.5, -1, 1, -0.8, 1, -0.35);\n path.bezierCurveTo(1, 0.1, 0.4, 0.55, 0, 1);\n path.closePath();\n return path;\n })(),\n hexagon: (() => {\n const path = 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 path.moveTo(Math.cos(angle), Math.sin(angle));\n } else {\n path.lineTo(Math.cos(angle), Math.sin(angle));\n }\n }\n path.closePath();\n return path;\n })(),\n ribbon: (() => {\n const path = new Path2D();\n path.rect(-0.2, -1, 0.4, 2);\n return path;\n })(),\n ring: (() => {\n const path = new Path2D();\n path.arc(0, 0, 1, 0, TWO_PI, false);\n path.arc(0, 0, 0.55, 0, TWO_PI, true);\n return path;\n })(),\n square: (() => {\n const path = new Path2D();\n path.rect(-0.7, -0.7, 1.4, 1.4);\n return path;\n })(),\n star: (() => {\n const path = 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 path.moveTo(r * Math.cos(angle), r * Math.sin(angle));\n } else {\n path.lineTo(r * Math.cos(angle), r * Math.sin(angle));\n }\n }\n path.closePath();\n return path;\n })(),\n triangle: (() => {\n const path = 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 path.moveTo(Math.cos(angle), Math.sin(angle));\n } else {\n path.lineTo(Math.cos(angle), Math.sin(angle));\n }\n }\n path.closePath();\n return path;\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 this.canvas.height = this.height;\n this.canvas.width = this.width;\n\n const ctx = this.context;\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, this.height);\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);\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;\n this.#offscreen.height = this.height;\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","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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"}
|