@basmilius/sparkle 2.0.0 → 2.1.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 +1192 -14
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +4552 -370
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -1
- package/src/aurora/consts.ts +3 -0
- package/src/aurora/index.ts +4 -0
- package/src/aurora/layer.ts +152 -0
- package/src/aurora/simulation.ts +19 -0
- package/src/aurora/types.ts +13 -0
- package/src/balloons/consts.ts +3 -0
- package/src/balloons/index.ts +6 -0
- package/src/balloons/layer.ts +138 -0
- package/src/balloons/particle.ts +110 -0
- package/src/balloons/simulation.ts +19 -0
- package/src/balloons/types.ts +14 -0
- package/src/bubbles/consts.ts +3 -0
- package/src/bubbles/index.ts +4 -0
- package/src/bubbles/layer.ts +233 -0
- package/src/bubbles/simulation.ts +20 -0
- package/src/bubbles/types.ts +21 -0
- package/src/canvas.ts +20 -1
- package/src/color.ts +10 -0
- package/src/confetti/consts.ts +13 -13
- package/src/confetti/index.ts +6 -0
- package/src/confetti/layer.ts +152 -0
- package/src/confetti/particle.ts +105 -0
- package/src/confetti/shapes.ts +104 -0
- package/src/confetti/simulation.ts +9 -203
- package/src/confetti/types.ts +4 -1
- package/src/distance.ts +1 -1
- package/src/donuts/consts.ts +19 -0
- package/src/donuts/donut.ts +12 -0
- package/src/donuts/index.ts +3 -0
- package/src/donuts/layer.ts +270 -0
- package/src/donuts/simulation.ts +25 -0
- package/src/fireflies/consts.ts +3 -0
- package/src/fireflies/index.ts +6 -0
- package/src/fireflies/layer.ts +152 -0
- package/src/fireflies/particle.ts +124 -0
- package/src/fireflies/simulation.ts +18 -0
- package/src/fireflies/types.ts +17 -0
- package/src/firepit/consts.ts +3 -0
- package/src/firepit/index.ts +4 -0
- package/src/firepit/layer.ts +174 -0
- package/src/firepit/simulation.ts +17 -0
- package/src/firepit/types.ts +20 -0
- package/src/fireworks/explosion.ts +8 -8
- package/src/fireworks/firework.ts +9 -8
- package/src/fireworks/index.ts +6 -2
- package/src/fireworks/layer.ts +452 -0
- package/src/fireworks/simulation.ts +9 -484
- package/src/fireworks/spark.ts +7 -7
- package/src/glitter/consts.ts +13 -0
- package/src/glitter/index.ts +4 -0
- package/src/glitter/layer.ts +173 -0
- package/src/glitter/simulation.ts +19 -0
- package/src/glitter/types.ts +23 -0
- package/src/index.ts +28 -0
- package/src/lanterns/consts.ts +13 -0
- package/src/lanterns/index.ts +4 -0
- package/src/lanterns/layer.ts +166 -0
- package/src/lanterns/simulation.ts +17 -0
- package/src/lanterns/types.ts +14 -0
- package/src/layer.ts +24 -0
- package/src/layered.ts +185 -0
- package/src/leaves/consts.ts +16 -0
- package/src/leaves/index.ts +4 -0
- package/src/leaves/layer.ts +251 -0
- package/src/leaves/simulation.ts +18 -0
- package/src/leaves/types.ts +16 -0
- package/src/lightning/consts.ts +3 -0
- package/src/lightning/index.ts +6 -0
- package/src/lightning/layer.ts +41 -0
- package/src/lightning/simulation.ts +17 -0
- package/src/lightning/system.ts +196 -0
- package/src/lightning/types.ts +12 -0
- package/src/matrix/consts.ts +5 -0
- package/src/matrix/index.ts +4 -0
- package/src/matrix/layer.ts +146 -0
- package/src/matrix/simulation.ts +18 -0
- package/src/matrix/types.ts +8 -0
- package/src/orbits/consts.ts +13 -0
- package/src/orbits/index.ts +4 -0
- package/src/orbits/layer.ts +183 -0
- package/src/orbits/simulation.ts +19 -0
- package/src/orbits/types.ts +16 -0
- package/src/particles/consts.ts +3 -0
- package/src/particles/index.ts +4 -0
- package/src/particles/layer.ts +317 -0
- package/src/particles/simulation.ts +26 -0
- package/src/particles/types.ts +10 -0
- package/src/petals/consts.ts +13 -0
- package/src/petals/index.ts +4 -0
- package/src/petals/layer.ts +158 -0
- package/src/petals/simulation.ts +18 -0
- package/src/petals/types.ts +15 -0
- package/src/plasma/consts.ts +3 -0
- package/src/plasma/index.ts +4 -0
- package/src/plasma/layer.ts +92 -0
- package/src/plasma/simulation.ts +17 -0
- package/src/plasma/types.ts +5 -0
- package/src/rain/consts.ts +3 -0
- package/src/rain/index.ts +6 -0
- package/src/rain/layer.ts +172 -0
- package/src/rain/particle.ts +132 -0
- package/src/rain/simulation.ts +21 -0
- package/src/rain/types.ts +22 -0
- package/src/sandstorm/consts.ts +3 -0
- package/src/sandstorm/index.ts +4 -0
- package/src/sandstorm/layer.ts +135 -0
- package/src/sandstorm/simulation.ts +18 -0
- package/src/sandstorm/types.ts +10 -0
- package/src/shooting-stars/index.ts +3 -0
- package/src/shooting-stars/system.ts +149 -0
- package/src/shooting-stars/types.ts +10 -0
- package/src/simulation-canvas.ts +47 -0
- package/src/snow/consts.ts +2 -2
- package/src/snow/index.ts +1 -0
- package/src/snow/layer.ts +263 -0
- package/src/snow/simulation.ts +4 -288
- package/src/sparklers/consts.ts +3 -0
- package/src/sparklers/index.ts +6 -0
- package/src/sparklers/layer.ts +174 -0
- package/src/sparklers/particle.ts +89 -0
- package/src/sparklers/simulation.ts +30 -0
- package/src/sparklers/types.ts +13 -0
- package/src/stars/consts.ts +3 -0
- package/src/stars/index.ts +4 -0
- package/src/stars/layer.ts +133 -0
- package/src/stars/simulation.ts +22 -0
- package/src/stars/types.ts +12 -0
- package/src/streamers/consts.ts +14 -0
- package/src/streamers/index.ts +4 -0
- package/src/streamers/layer.ts +211 -0
- package/src/streamers/simulation.ts +16 -0
- package/src/streamers/types.ts +14 -0
- package/src/trail.ts +140 -0
- package/src/waves/consts.ts +3 -0
- package/src/waves/index.ts +4 -0
- package/src/waves/layer.ts +167 -0
- package/src/waves/simulation.ts +18 -0
- package/src/waves/types.ts +9 -0
- package/src/wormhole/consts.ts +3 -0
- package/src/wormhole/index.ts +4 -0
- package/src/wormhole/layer.ts +181 -0
- package/src/wormhole/simulation.ts +17 -0
- package/src/wormhole/types.ts +10 -0
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["#canvas","#context","#frameRate","#target","#delta","#then","#isStopped","#ticks","#height","#width","#current","#frame","#now","MULBERRY","#scale","#createParticle","MULBERRY","#tickParticle","#particles","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","#autoSpawn","#baseSize","#scale","#tailWidth","#sparks","#explosions","#fireworks","#hue","#createExplosion","#createFirework","#pickVariant","#createSaturnExplosion","#createDahliaExplosion","#createHeartExplosion","#createSpiralExplosion","#createFlowerExplosion","#createConcentricExplosion","#positionRandom","#scale","#size","#speed","#baseOpacity","#maxParticles","#parseColor","#sprites","#createSprites","#snowflakes","#createSnowflake","#ratio","#time","#createCrystalSprite"],"sources":["../src/canvas.ts","../src/confetti/consts.ts","../src/confetti/simulation.ts","../src/fireworks/consts.ts","../src/fireworks/types.ts","../src/fireworks/explosion.ts","../src/distance.ts","../src/fireworks/spark.ts","../src/fireworks/firework.ts","../src/fireworks/simulation.ts","../src/snow/consts.ts","../src/snow/simulation.ts"],"sourcesContent":["export class LimitedFrameRateCanvas {\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 #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;\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 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 { mulberry32 } from '@basmilius/utils';\nimport type { Config } from './types';\n\nexport const DEFAULT_CONFIG: Config = {\n angle: 90,\n colors: [\n '#26ccff',\n '#a25afd',\n '#ff5e7e',\n '#88ff5a',\n '#fcff42',\n '#ffa62d',\n '#ff36ff'\n ],\n decay: 0.9,\n gravity: 1,\n particles: 50,\n shapes: ['circle', 'diamond', 'ribbon', '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(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { LimitedFrameRateCanvas } from '../canvas';\nimport { DEFAULT_CONFIG, MULBERRY } from './consts';\nimport type { Config, Particle, ParticleConfig, Shape } from './types';\n\nconst TWO_PI = Math.PI * 2;\n\n// Precomputed unit-size (size=1) Path2D objects per shape.\n// Size is encoded into the context transform, so each path is drawn once and reused every frame.\nconst SHAPE_PATHS: Record<Shape, Path2D> = {\n circle: (() => {\n const path = new Path2D();\n path.ellipse(0, 0, 0.6, 1, 0, 0, TWO_PI);\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 ribbon: (() => {\n const path = new Path2D();\n path.rect(-0.2, -1, 0.4, 2);\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) path.moveTo(r * Math.cos(angle), r * Math.sin(angle));\n else path.lineTo(r * Math.cos(angle), r * Math.sin(angle));\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) path.moveTo(Math.cos(angle), Math.sin(angle));\n else path.lineTo(Math.cos(angle), Math.sin(angle));\n }\n path.closePath();\n return path;\n })()\n};\n\nexport interface ConfettiSimulationConfig {\n readonly scale?: number;\n readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class ConfettiSimulation extends LimitedFrameRateCanvas {\n\n readonly #scale: number;\n #particles: Particle[] = [];\n\n constructor(canvas: HTMLCanvasElement, config: ConfettiSimulationConfig = {}) {\n super(canvas, 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n\n this.#scale = config.scale ?? 1;\n\n this.canvas.style.position = 'absolute';\n this.canvas.style.top = '0';\n this.canvas.style.left = '0';\n this.canvas.style.height = '100%';\n this.canvas.style.width = '100%';\n }\n\n fire(config: Partial<Config>): void {\n this.onResize();\n this.draw();\n\n const resolved = { ...DEFAULT_CONFIG, ...config };\n const { angle, colors, 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: this.width * x,\n y: this.height * y\n });\n\n this.#tickParticle(particle);\n this.#particles.push(particle);\n }\n\n if (!this.isTicking) {\n this.start();\n }\n }\n\n draw(): void {\n const { context, width, height } = this;\n context.clearRect(0, 0, width, height);\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 // Encode translate + rotate + scale(flipCos, 1) + scale(size, size) in a single setTransform call,\n // avoiding save()/translate()/rotate()/scale()/restore() — 5 API calls replaced by 1.\n context.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 context.globalAlpha = 1 - p.tick / p.totalTicks;\n context.fillStyle = p.colorStr;\n context.fill(SHAPE_PATHS[p.shape]);\n }\n\n context.resetTransform();\n }\n\n tick(): void {\n const particles = this.#particles;\n let alive = 0;\n\n // Normalize to 60fps-equivalent units so physics is frame-rate independent.\n // dt ≈ 1.0 at 60fps, 0.5 at 120fps, 2.0 at 30fps.\n // Cap at 200ms to avoid large jumps after tab switches or dropped frames.\n const dt = this.delta > 0 && this.delta < 200 ? this.delta / (1000 / 60) : 1;\n\n // Single pass: tick live particles and compact the array in-place.\n // Avoids filter() allocation and a separate forEach pass.\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 particles[alive++] = p;\n }\n }\n\n particles.length = alive;\n\n if (alive === 0) {\n this.stop();\n }\n }\n\n onResize(): void {\n super.onResize();\n this.canvas.width = this.width;\n this.canvas.height = this.height;\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 // dt defaults to 1 (60fps-equivalent) for the initial kick in fire() before the loop starts.\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}\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 FireworkSimulationConfig {\n readonly scale?: number;\n readonly autoSpawn?: boolean;\n readonly canvasOptions?: CanvasRenderingContext2DSettings;\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 <= this.#decay * 3) {\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(): void {\n this.#trail.pop();\n this.#trail.unshift({...this.#position});\n\n this.#speed *= this.#config.friction;\n this.#vz *= this.#config.friction;\n\n this.#position.x += Math.cos(this.#angle) * this.#speed;\n this.#position.y += Math.sin(this.#angle) * this.#speed + this.#config.gravity;\n this.#z += this.#vz;\n\n this.#depthScale = PERSPECTIVE / (PERSPECTIVE + this.#z);\n\n this.#alpha -= this.#decay;\n this.#sparkleTimer++;\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';\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(Math.pow(x, 2) + Math.pow(y, 2));\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.6;\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, 0.5)\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(): void {\n this.#velocity.x *= this.#friction;\n this.#velocity.y *= this.#friction;\n this.#velocity.y += this.#gravity;\n\n this.#position.x += this.#velocity.x;\n this.#position.y += this.#velocity.y;\n\n this.#alpha -= this.#decay;\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(): void {\n this.#trail.pop();\n this.#trail.unshift({...this.#position});\n\n this.#speed *= this.#acceleration;\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,\n y: this.#position.y + vy\n });\n\n if (this.#distanceTraveled >= this.#distance) {\n this.dispatchEvent(new CustomEvent('remove'));\n return;\n }\n\n this.#position.x += vx;\n this.#position.y += vy;\n\n this.#sparkTimer++;\n\n if (this.#sparkTimer % 3 === 0) {\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 { LimitedFrameRateCanvas } from '../canvas';\nimport type { Point } from '../point';\nimport { MULBERRY } from './consts';\nimport { Explosion } from './explosion';\nimport { Firework } from './firework';\nimport { Spark } from './spark';\nimport { EXPLOSION_CONFIGS, type ExplosionType, type FireworkSimulationConfig, type FireworkVariant } from './types';\n\nexport class FireworkSimulation extends LimitedFrameRateCanvas {\n #explosions: Explosion[] = [];\n #fireworks: Firework[] = [];\n #sparks: Spark[] = [];\n #hue: number = 120;\n #positionRandom = MULBERRY.fork();\n readonly #autoSpawn: boolean;\n readonly #baseSize: number;\n readonly #scale: number;\n readonly #tailWidth: number;\n\n constructor(canvas: HTMLCanvasElement, config: FireworkSimulationConfig = {}) {\n super(canvas, 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n\n const scale = config.scale ?? 1;\n this.#autoSpawn = config.autoSpawn ?? true;\n this.#baseSize = 5 * scale;\n this.#scale = scale;\n this.#tailWidth = 2 * scale;\n\n this.canvas.style.position = 'absolute';\n this.canvas.style.top = '0';\n this.canvas.style.left = '0';\n this.canvas.style.height = '100%';\n this.canvas.style.width = '100%';\n }\n\n draw(): void {\n if (this.canvas.width !== this.width || this.canvas.height !== this.height) {\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n }\n\n this.context.clearRect(0, 0, this.width, this.height);\n this.context.globalCompositeOperation = 'lighter';\n\n for (const spark of this.#sparks) {\n spark.draw(this.context);\n }\n\n for (const explosion of this.#explosions) {\n explosion.draw(this.context);\n }\n\n for (const firework of this.#fireworks) {\n firework.draw(this.context);\n }\n }\n\n fireExplosion(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.#createExplosion(pos, this.#hue, variant);\n }\n\n tick(): void {\n if (this.#autoSpawn && this.#fireworks.length < 6 && this.ticks % (this.isSmall ? 60 : 30) === 0) {\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();\n this.#sparks.push(...firework.collectSparks());\n }\n\n for (const explosion of this.#explosions) {\n explosion.tick();\n }\n\n for (const spark of this.#sparks) {\n spark.tick();\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 < 8; j++) {\n newSparks.push(new Spark(\n explosion.position,\n explosion.hue + MULBERRY.nextBetween(-30, 30)\n ));\n }\n }\n }\n\n this.#explosions.push(...newExplosions);\n this.#sparks.push(...newSparks);\n\n this.#explosions = this.#explosions.filter(e => !e.isDead);\n this.#sparks = this.#sparks.filter(s => !s.isDead);\n }\n\n #createExplosion(position: Point, hue: number, variant?: FireworkVariant): void {\n const selected = variant ?? this.#pickVariant();\n\n if (selected === 'saturn') {\n this.#createSaturnExplosion(position, hue);\n return;\n }\n\n if (selected === 'dahlia') {\n this.#createDahliaExplosion(position, hue);\n return;\n }\n\n if (selected === 'heart') {\n this.#createHeartExplosion(position, hue);\n return;\n }\n\n if (selected === 'spiral') {\n this.#createSpiralExplosion(position, hue);\n return;\n }\n\n if (selected === 'flower') {\n this.#createFlowerExplosion(position, hue);\n return;\n }\n\n if (selected === 'concentric') {\n this.#createConcentricExplosion(position, hue);\n return;\n }\n\n const type: ExplosionType = selected;\n const config = EXPLOSION_CONFIGS[type];\n const particleCount = Math.floor(MULBERRY.nextBetween(config.particleCount[0], config.particleCount[1]));\n\n const effectiveHue = type === 'brocade'\n ? MULBERRY.nextBetween(35, 50)\n : hue;\n\n for (let i = 0; i < particleCount; i++) {\n let angle: number | undefined;\n let speed: number | undefined;\n\n if (type === 'ring') {\n angle = (i / particleCount) * Math.PI * 2;\n speed = MULBERRY.nextBetween(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 + MULBERRY.nextBetween(-spread, spread);\n }\n\n this.#explosions.push(new Explosion(position, effectiveHue, this.#baseSize, type, this.#scale, angle, speed));\n }\n }\n\n #createSaturnExplosion(position: Point, hue: number): void {\n const velocity = MULBERRY.nextBetween(4, 6);\n\n // Outer shell — evenly spaced circle\n const shellCount = Math.floor(MULBERRY.nextBetween(25, 35));\n\n for (let i = 0; i < shellCount; i++) {\n const rad = (i / shellCount) * Math.PI * 2;\n\n this.#explosions.push(new Explosion(\n position,\n hue,\n this.#baseSize,\n 'peony',\n this.#scale,\n rad + MULBERRY.nextBetween(-0.05, 0.05),\n velocity + MULBERRY.nextBetween(-0.25, 0.25)\n ));\n }\n\n // Filled interior — random speeds from 0 to velocity for sphere fill\n const fillCount = Math.floor(MULBERRY.nextBetween(40, 60));\n\n for (let i = 0; i < fillCount; i++) {\n const rad = MULBERRY.nextBetween(0, Math.PI * 2);\n const speed = velocity * MULBERRY.nextBetween(0, 1);\n\n this.#explosions.push(new Explosion(\n position,\n hue,\n this.#baseSize,\n 'peony',\n this.#scale,\n rad,\n speed\n ));\n }\n\n // Elliptical ring — rotated 2D ellipse with z-depth\n const ringRotation = MULBERRY.nextBetween(0, Math.PI * 2);\n const ringCount = Math.floor(MULBERRY.nextBetween(40, 55));\n const ringVx = velocity * MULBERRY.nextBetween(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\n const cx = Math.cos(rad) * ringVx + MULBERRY.nextBetween(-0.25, 0.25);\n const cy = Math.sin(rad) * ringVy + MULBERRY.nextBetween(-0.25, 0.25);\n\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\n const screenAngle = Math.atan2(vy, vx);\n const screenSpeed = Math.sqrt(vx * vx + vy * vy);\n const vz = Math.sin(rad) * velocity * 0.8;\n\n this.#explosions.push(new Explosion(\n position,\n hue + 60,\n this.#baseSize,\n 'ring',\n this.#scale,\n screenAngle,\n screenSpeed,\n vz\n ));\n }\n }\n\n #createDahliaExplosion(position: Point, hue: number): void {\n const petalCount = Math.floor(MULBERRY.nextBetween(6, 9));\n const particlesPerPetal = Math.floor(MULBERRY.nextBetween(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 const angle = baseAngle + MULBERRY.nextBetween(-0.3, 0.3);\n\n this.#explosions.push(new Explosion(\n position,\n petalHue,\n this.#baseSize,\n 'dahlia',\n this.#scale,\n angle\n ));\n }\n }\n }\n\n #createHeartExplosion(position: Point, hue: number): void {\n const velocity = MULBERRY.nextBetween(3, 5);\n const count = Math.floor(MULBERRY.nextBetween(60, 80));\n const rotation = MULBERRY.nextBetween(-0.3, 0.3);\n\n for (let i = 0; i < count; i++) {\n const t = (i / count) * Math.PI * 2;\n\n // Parametric heart curve\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\n const scale = velocity / 16;\n const vx = hx * scale;\n const vy = hy * scale;\n\n // Rotate slightly\n const cosR = Math.cos(rotation);\n const sinR = Math.sin(rotation);\n const rvx = vx * cosR - vy * sinR;\n const rvy = vx * sinR + vy * cosR;\n\n const angle = Math.atan2(rvy, rvx);\n const speed = Math.sqrt(rvx * rvx + rvy * rvy);\n\n this.#explosions.push(new Explosion(\n position,\n hue,\n this.#baseSize,\n 'heart',\n this.#scale,\n angle,\n Math.max(0.1, speed + MULBERRY.nextBetween(-0.15, 0.15))\n ));\n }\n }\n\n #createSpiralExplosion(position: Point, hue: number): void {\n const arms = Math.floor(MULBERRY.nextBetween(3, 5));\n const particlesPerArm = Math.floor(MULBERRY.nextBetween(15, 20));\n const twist = MULBERRY.nextBetween(2, 3.5);\n const baseRotation = MULBERRY.nextBetween(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 const angle = baseAngle + progress * twist;\n const speed = 2 + progress * 8;\n\n this.#explosions.push(new Explosion(\n position,\n armHue,\n this.#baseSize,\n 'spiral',\n this.#scale,\n angle,\n speed + MULBERRY.nextBetween(-0.3, 0.3)\n ));\n }\n }\n }\n\n #createFlowerExplosion(position: Point, hue: number): void {\n const velocity = MULBERRY.nextBetween(4, 7);\n const count = Math.floor(MULBERRY.nextBetween(70, 90));\n const petals = Math.floor(MULBERRY.nextBetween(2, 4));\n const rotation = MULBERRY.nextBetween(0, Math.PI * 2);\n\n for (let i = 0; i < count; i++) {\n const t = (i / count) * Math.PI * 2;\n\n // Rose curve: r = |cos(n * theta)|\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 this.#explosions.push(new Explosion(\n position,\n hue + MULBERRY.nextBetween(-15, 15),\n this.#baseSize,\n 'flower',\n this.#scale,\n t + rotation,\n speed + MULBERRY.nextBetween(-0.2, 0.2)\n ));\n }\n }\n\n #createConcentricExplosion(position: Point, hue: number): void {\n const outerCount = Math.floor(MULBERRY.nextBetween(35, 50));\n const outerSpeed = MULBERRY.nextBetween(7, 10);\n\n for (let i = 0; i < outerCount; i++) {\n const angle = (i / outerCount) * Math.PI * 2;\n\n this.#explosions.push(new Explosion(\n position,\n hue,\n this.#baseSize,\n 'ring',\n this.#scale,\n angle + MULBERRY.nextBetween(-0.05, 0.05),\n outerSpeed + MULBERRY.nextBetween(-0.25, 0.25)\n ));\n }\n\n const innerCount = Math.floor(MULBERRY.nextBetween(25, 35));\n const innerSpeed = MULBERRY.nextBetween(3, 5);\n\n for (let i = 0; i < innerCount; i++) {\n const angle = (i / innerCount) * Math.PI * 2;\n\n this.#explosions.push(new Explosion(\n position,\n hue + 120,\n this.#baseSize,\n 'ring',\n this.#scale,\n angle + MULBERRY.nextBetween(-0.05, 0.05),\n innerSpeed + MULBERRY.nextBetween(-0.25, 0.25)\n ));\n }\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.#createExplosion(firework.position, hue);\n }, {once: true});\n\n this.#fireworks.push(firework);\n }\n\n #pickVariant(): FireworkVariant {\n const roll = MULBERRY.nextBetween(0, 100);\n\n if (roll < 12) {\n return 'peony';\n }\n\n if (roll < 22) {\n return 'chrysanthemum';\n }\n\n if (roll < 29) {\n return 'willow';\n }\n\n if (roll < 34) {\n return 'ring';\n }\n\n if (roll < 39) {\n return 'palm';\n }\n\n if (roll < 44) {\n return 'crackle';\n }\n\n if (roll < 48) {\n return 'crossette';\n }\n\n if (roll < 55) {\n return 'saturn';\n }\n\n if (roll < 62) {\n return 'dahlia';\n }\n\n if (roll < 67) {\n return 'brocade';\n }\n\n if (roll < 71) {\n return 'horsetail';\n }\n\n if (roll < 75) {\n return 'strobe';\n }\n\n if (roll < 82) {\n return 'heart';\n }\n\n if (roll < 89) {\n return 'spiral';\n }\n\n if (roll < 94) {\n return 'flower';\n }\n\n return 'concentric';\n }\n}\n","import { mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY = mulberry32(13);\n","import { LimitedFrameRateCanvas } from '../canvas';\nimport { MULBERRY } from './consts';\nimport type { Snowflake } from './snowflake';\n\nexport interface SnowSimulationConfig {\n readonly fillStyle?: string;\n readonly particles?: number;\n readonly scale?: number;\n readonly size?: number;\n readonly speed?: number;\n readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nconst SPRITE_SIZE = 64;\nconst SPRITE_CENTER = SPRITE_SIZE / 2;\nconst SPRITE_RADIUS = SPRITE_SIZE / 2;\n\nexport class SnowSimulation extends LimitedFrameRateCanvas {\n readonly #scale: number;\n readonly #size: number;\n readonly #speed: number;\n readonly #baseOpacity: number;\n #maxParticles: number;\n #time: number = 0;\n #ratio: number = 1;\n #snowflakes: Snowflake[] = [];\n #sprites: HTMLCanvasElement[] = [];\n\n constructor(canvas: HTMLCanvasElement, config: SnowSimulationConfig = {}) {\n super(canvas, 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\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} = this.#parseColor(config.fillStyle ?? 'rgb(255 255 255 / .75)');\n this.#baseOpacity = a;\n\n this.canvas.style.position = 'absolute';\n this.canvas.style.top = '0';\n this.canvas.style.left = '0';\n this.canvas.style.height = '100%';\n this.canvas.style.width = '100%';\n\n if (this.isSmall) {\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 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 snowflake of this.#snowflakes) {\n const px = snowflake.x * this.width;\n const py = snowflake.y * this.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 ctx.save();\n ctx.translate(px, py);\n ctx.rotate(snowflake.rotation);\n ctx.drawImage(\n this.#sprites[snowflake.spriteIndex],\n -displayRadius,\n -displayRadius,\n displaySize,\n displaySize\n );\n ctx.restore();\n } else {\n ctx.drawImage(\n this.#sprites[snowflake.spriteIndex],\n px - displayRadius,\n py - displayRadius,\n displaySize,\n displaySize\n );\n }\n }\n\n ctx.globalAlpha = 1;\n }\n\n tick(): void {\n const speedFactor = (this.height / (420 * this.#ratio) / this.#speed) * this.deltaFactor;\n\n this.#time += 0.015 * speedFactor;\n\n // Multi-frequency wind for organic movement\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 // Individual swing oscillation\n const swing = Math.sin(this.#time * snowflake.swingFrequency + snowflake.swingOffset) * snowflake.swingAmplitude;\n\n // Horizontal: personal swing + global wind (deeper = more wind influence)\n snowflake.x += (swing + wind * snowflake.depth * 2) / (4000 * speedFactor);\n\n // Vertical: individual speed + depth + size influence\n snowflake.y += (snowflake.fallSpeed * 2 + snowflake.depth + snowflake.radius * 0.15) / (700 * speedFactor);\n\n // Rotation (only visually relevant for crystal sprites)\n snowflake.rotation += snowflake.rotationSpeed / speedFactor;\n\n // Recycle out-of-bounds particles\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 #parseColor(fillStyle: string): {r: number; g: number; b: number; a: number} {\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 return {r: data[0], g: data[1], b: data[2], a: data[3] / 255};\n }\n\n #createSprites(r: number, g: number, b: number): HTMLCanvasElement[] {\n const sprites: HTMLCanvasElement[] = [];\n\n const gradientProfiles: [number, number][][] = [\n // 0: Soft glow\n [[0, 0.8], [0.3, 0.4], [0.7, 0.1], [1, 0]],\n // 1: Bright center\n [[0, 1], [0.15, 0.7], [0.5, 0.2], [1, 0]],\n // 2: Compact dot\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 // 3: Crystal snowflake\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 // Soft glow base\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 // Crystal arms\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 // Main arm\n ctx.beginPath();\n ctx.moveTo(SPRITE_CENTER, SPRITE_CENTER);\n ctx.lineTo(tipX, tipY);\n ctx.stroke();\n\n // Side branches at 40% and 65% along the arm\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 // Center dot\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["MULBERRY","DEFAULT_COLORS","#speed","#intensity","#waveAmplitude","#verticalPosition","#rgbToHue","#bands","MULBERRY","#time","#globalSpeed","#canvas","#context","#frameRate","#target","#delta","#then","#speed","#isStopped","#ticks","#height","#width","#current","#frame","#now","#simulation","MULBERRY","DEFAULT_COLORS","#scale","#speed","#driftAmount","#stringLengthMul","#sizeRange","#colorRGBs","#maxCount","#balloons","#createBalloon","#time","MULBERRY","#color","#driftAmp","#driftFreq","#driftPhase","#radiusX","#radiusY","#riseSpeed","#rotationSpeed","#scale","#stringLength","#y","#x","#rotation","#time","MULBERRY","DEFAULT_COLORS","#scale","#speed","#sizeRange","#wobbleAmount","#popOnClick","#popRadius","#baseHues","#onClickBound","#maxCount","#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","#vx","#vy","#decay","#flipAngle","#flipSpeed","#rotAngle","#rotCos","#rotSin","#rotSpeed","#swing","#swingAmp","#swingSpeed","#layer","MULBERRY","#background","#collisionPadding","#colors","#count","#mouseAvoidance","#mouseAvoidanceRadius","#mouseAvoidanceStrength","#radiusRange","#repulsionStrength","#rotationSpeedRange","#scale","#speedRange","#thickness","#onMouseMoveBound","#onMouseLeaveBound","#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","#speed","#glowSpeed","#maxCount","#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","#flameWidth","#flameHeight","#intensity","#maxEmbers","#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","#autoSpawn","#baseSize","#scale","#tailWidth","#width","#height","#hue","#createExplosion","#spawnTimer","#fireworks","#createFirework","#sparks","#explosions","#pickVariant","#createSaturnExplosion","#createDahliaExplosion","#createHeartExplosion","#createSpiralExplosion","#createFlowerExplosion","#createConcentricExplosion","#positionRandom","#layer","MULBERRY","#scale","#size","#speed","#groundLevel","#maxSettled","#colorRGBs","#maxCount","#falling","#createFallingPiece","#time","#settleGlitter","#settled","#drawDiamond","MULBERRY","MULBERRY","#scale","#speed","#size","#colorRGBs","#maxCount","#lanterns","#createLantern","#time","MULBERRY","#layers","#contextOptions","#getOffscreenCtx","#offscreen","#offscreenCtx","MULBERRY","#scale","#size","#speed","#wind","#colors","#maxCount","#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","#speed","#fontSize","#trailLength","#colorRGB","#maxColumns","#width","#height","#initialized","#columns","#respawnTimers","#createColumn","MULBERRY","MULBERRY","#centerCount","#orbitersPerCenter","#speed","#colors","#trailLength","#showCenters","#scale","#initialized","#centers","#orbiters","MULBERRY","#createOrbiter","#time","MULBERRY","#scale","#connectionDistance","#lineWidth","#mouseMode","#mouseRadius","#mouseStrength","#particleForces","#glow","#background","#colorRGB","#lineColorRGB","#sizeRange","#speedRange","#onMouseMoveBound","#onMouseLeaveBound","#maxCount","#cellSize","#onMouseMove","#onMouseLeave","#width","#height","#initialized","#particles","#createParticle","#grid","#mouseOnCanvas","#mouseX","#mouseY","MULBERRY","MULBERRY","#scale","#size","#speed","#wind","#colors","#maxCount","#sprites","#createSprites","#petals","#createPetal","#time","MULBERRY","#createPetalSprite","#speed","#scale","#resolution","#palette","#time","#offscreen","#offscreenCtx","#imageData","MULBERRY","#scale","#speed","#wind","#groundLevel","#enableSplashes","#colorR","#colorG","#colorB","#maxDrops","#drops","#createDrop","#createSplashBurst","#splashes","MULBERRY","#color","#depth","#length","#groundY","#scale","#opacity","#vx","#vy","#y","#x","#gravity","#size","#alpha","MULBERRY","#scale","#wind","#turbulence","#colorR","#colorG","#colorB","#hazeOpacity","#maxCount","#parseColor","#grains","#createGrain","#time","MULBERRY","#interval","#color","#trailLength","#trailAlphaFactor","#speed","#scale","#alphaMin","#alphaRange","#decayMin","#decayRange","#verticalFade","#rng","#cooldown","#height","#stars","#create","MULBERRY","#scale","#size","#speed","#baseOpacity","#maxParticles","#sprites","#createSprites","#snowflakes","#createSnowflake","#height","#ratio","#time","MULBERRY","#createCrystalSprite","MULBERRY","DEFAULT_COLORS","#scale","#emitRate","#maxSparks","#colorRGBs","#speedRange","#friction","#gravity","#decayRange","#trailLength","#hoverMode","#onMouseMoveBound","#onMouseLeaveBound","#onMouseMove","#onMouseLeave","#emitX","#emitY","#mouseOnCanvas","#sparks","#createSpark","MULBERRY","#color","#decay","#friction","#gravity","#scale","#size","#trailLength","#trail","#alpha","#x","#y","#vx","#vy","#layer","MULBERRY","#mode","#twinkleSpeed","#colorRGB","#scale","#verticalFade","#shootingStarSystem","#starCount","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","#speed","#foamColor","#foamAmount","#scale","#maxFoamParticles","#waves","MULBERRY","#time","#foamParticles","#adjustAlpha","#darkenColor","#speed","#colorRGB","#direction","#scale","#count","#width","#height","#initialized","#particles","#createParticle"],"sources":["../src/layer.ts","../src/aurora/consts.ts","../src/aurora/layer.ts","../src/canvas.ts","../src/simulation-canvas.ts","../src/aurora/simulation.ts","../src/color.ts","../src/balloons/consts.ts","../src/balloons/layer.ts","../src/balloons/particle.ts","../src/balloons/simulation.ts","../src/bubbles/consts.ts","../src/bubbles/layer.ts","../src/bubbles/simulation.ts","../src/confetti/consts.ts","../src/confetti/shapes.ts","../src/confetti/layer.ts","../src/confetti/particle.ts","../src/confetti/simulation.ts","../src/donuts/consts.ts","../src/donuts/layer.ts","../src/donuts/simulation.ts","../src/fireflies/consts.ts","../src/fireflies/layer.ts","../src/fireflies/particle.ts","../src/fireflies/simulation.ts","../src/firepit/consts.ts","../src/firepit/layer.ts","../src/firepit/simulation.ts","../src/fireworks/consts.ts","../src/fireworks/types.ts","../src/fireworks/explosion.ts","../src/distance.ts","../src/fireworks/spark.ts","../src/fireworks/firework.ts","../src/fireworks/layer.ts","../src/fireworks/simulation.ts","../src/glitter/consts.ts","../src/glitter/layer.ts","../src/glitter/simulation.ts","../src/lanterns/consts.ts","../src/lanterns/layer.ts","../src/lanterns/simulation.ts","../src/layered.ts","../src/leaves/consts.ts","../src/leaves/layer.ts","../src/leaves/simulation.ts","../src/lightning/consts.ts","../src/lightning/system.ts","../src/lightning/layer.ts","../src/lightning/simulation.ts","../src/matrix/consts.ts","../src/matrix/layer.ts","../src/matrix/simulation.ts","../src/orbits/consts.ts","../src/orbits/layer.ts","../src/orbits/simulation.ts","../src/particles/consts.ts","../src/particles/layer.ts","../src/particles/simulation.ts","../src/petals/consts.ts","../src/petals/layer.ts","../src/petals/simulation.ts","../src/plasma/layer.ts","../src/plasma/simulation.ts","../src/rain/consts.ts","../src/rain/layer.ts","../src/rain/particle.ts","../src/rain/simulation.ts","../src/sandstorm/consts.ts","../src/sandstorm/layer.ts","../src/sandstorm/simulation.ts","../src/shooting-stars/system.ts","../src/snow/consts.ts","../src/snow/layer.ts","../src/snow/simulation.ts","../src/sparklers/consts.ts","../src/sparklers/layer.ts","../src/sparklers/particle.ts","../src/sparklers/simulation.ts","../src/stars/consts.ts","../src/stars/layer.ts","../src/stars/simulation.ts","../src/streamers/consts.ts","../src/streamers/layer.ts","../src/streamers/simulation.ts","../src/trail.ts","../src/waves/consts.ts","../src/waves/layer.ts","../src/waves/simulation.ts","../src/wormhole/consts.ts","../src/wormhole/layer.ts","../src/wormhole/simulation.ts"],"sourcesContent":["export type EdgeFadeSide = number | [number, number];\n\nexport type EdgeFade = {\n readonly top?: EdgeFadeSide;\n readonly bottom?: EdgeFadeSide;\n readonly left?: EdgeFadeSide;\n readonly right?: EdgeFadeSide;\n};\n\nexport abstract class SimulationLayer {\n fade: EdgeFade | null = null;\n\n abstract tick(dt: number, width: number, height: number): void;\n abstract draw(ctx: CanvasRenderingContext2D, width: number, height: number): void;\n\n onResize(_width: number, _height: number): void {}\n onMount(_canvas: HTMLCanvasElement): void {}\n onUnmount(_canvas: HTMLCanvasElement): void {}\n\n withFade(fade: EdgeFade): this {\n this.fade = fade;\n return this;\n }\n}\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { SimulationLayer } from '../layer';\nimport { MULBERRY } from './consts';\nimport type { AuroraSimulationConfig } from './simulation';\nimport type { AuroraBand } from './types';\n\nconst DEFAULT_COLORS = ['#9922ff', '#4455ff', '#0077ee', '#00aabb', '#22ddff'];\nconst TOP_HUE = 265;\n\nexport class AuroraLayer extends SimulationLayer {\n readonly #speed: number;\n readonly #intensity: number;\n readonly #waveAmplitude: number;\n readonly #verticalPosition: number;\n #time: number = 0;\n #bands: AuroraBand[] = [];\n\n constructor(config: AuroraSimulationConfig = {}) {\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: this.#verticalPosition + (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) * this.#speed,\n hue,\n opacity: (0.5 + MULBERRY.next() * 0.3) * this.#intensity\n });\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#time += 0.016 * dt * this.#speed;\n\n for (const band of this.#bands) {\n band.phase1 += 0.005 * band.speed * dt;\n band.phase2 += 0.008 * band.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 = 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 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 const eff = alpha * band.opacity;\n\n const gradient = ctx.createLinearGradient(0, fadeBottom, 0, colTop);\n gradient.addColorStop(0, `hsla(${band.hue}, 100%, 90%, 0)`);\n gradient.addColorStop(0.04, `hsla(${band.hue}, 100%, 90%, ${eff * 0.55})`);\n gradient.addColorStop(0.1, `hsla(${band.hue}, 90%, 72%, ${eff})`);\n gradient.addColorStop(0.32, `hsla(${band.hue}, 85%, 62%, ${eff * 0.75})`);\n gradient.addColorStop(0.62, `hsla(${midHue}, 80%, 56%, ${eff * 0.35})`);\n gradient.addColorStop(0.86, `hsla(${TOP_HUE}, 75%, 50%, ${eff * 0.12})`);\n gradient.addColorStop(1, `hsla(${TOP_HUE}, 70%, 45%, 0)`);\n\n ctx.fillStyle = gradient;\n ctx.fillRect(x, colTop, step, fadeBottom - colTop + 1);\n }\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","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 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 { LimitedFrameRateCanvas } from './canvas';\nimport type { SimulationLayer } from './layer';\n\nexport class SimulationCanvas extends LimitedFrameRateCanvas {\n readonly #simulation: SimulationLayer;\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\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 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 ctx.save();\n this.#simulation.draw(ctx, this.width, this.height);\n ctx.restore();\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 this.#simulation.onResize(this.width, this.height);\n }\n}\n","import { SimulationCanvas } from '../simulation-canvas';\nimport { AuroraLayer } from './layer';\n\nexport interface AuroraSimulationConfig {\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 readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class AuroraSimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: AuroraSimulationConfig = {}) {\n super(canvas, new AuroraLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\n}\n","export function parseColor(fillStyle: string): {r: number; g: number; b: number; a: number} {\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 return {r: data[0], g: data[1], b: data[2], a: data[3] / 255};\n}\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { SimulationLayer } from '../layer';\nimport { MULBERRY } from './consts';\nimport type { BalloonSimulationConfig } from './simulation';\nimport type { Balloon } from './types';\n\nconst DEFAULT_COLORS = ['#ff4444', '#4488ff', '#44cc44', '#ffcc00', '#ff88cc', '#8844ff'];\n\nexport class BalloonLayer extends SimulationLayer {\n readonly #scale: number;\n readonly #speed: number;\n readonly #driftAmount: number;\n readonly #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: BalloonSimulationConfig = {}) {\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 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\n ctx.save();\n ctx.translate(px, py);\n ctx.rotate(balloon.rotation);\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 drift = Math.sin(this.#time * 2 + balloon.driftPhase) * 8 * this.#scale * this.#driftAmount;\n ctx.beginPath();\n ctx.moveTo(0, knotY + 5 * this.#scale);\n ctx.quadraticCurveTo(\n drift,\n knotY + 5 * this.#scale + stringLen * 0.5,\n -drift * 0.5,\n knotY + 5 * this.#scale + stringLen\n );\n ctx.strokeStyle = `rgba(${r}, ${g}, ${b}, 0.4)`;\n ctx.lineWidth = 1;\n ctx.stroke();\n\n ctx.restore();\n }\n }\n\n #createBalloon(initialSpread: boolean): Balloon {\n const colorIndex = Math.floor(MULBERRY.next() * this.#colorRGBs.length);\n const baseRadius = this.#sizeRange[0] + MULBERRY.next() * (this.#sizeRange[1] - this.#sizeRange[0]);\n\n return {\n x: 0.1 + MULBERRY.next() * 0.8,\n y: initialSpread ? MULBERRY.next() * 1.2 : 1.2 + MULBERRY.next() * 0.2,\n radiusX: baseRadius * 0.85,\n radiusY: baseRadius,\n color: this.#colorRGBs[colorIndex],\n driftPhase: MULBERRY.next() * Math.PI * 2,\n driftFreq: 0.5 + MULBERRY.next() * 1,\n driftAmp: 0.3 + MULBERRY.next() * 0.7,\n riseSpeed: 0.3 + MULBERRY.next() * 0.7,\n rotation: 0,\n rotationSpeed: 0.5 + MULBERRY.next() * 1.5,\n stringLength: 30 + MULBERRY.next() * 40\n };\n }\n}\n","import type { Point } from '../point';\n\nexport interface BalloonParticleConfig {\n readonly driftAmp?: number;\n readonly driftFreq?: number;\n readonly driftPhase?: number;\n readonly radiusX?: number;\n readonly radiusY?: number;\n readonly riseSpeed?: number;\n readonly rotationSpeed?: number;\n readonly scale?: number;\n readonly stringLength?: number;\n}\n\nexport class BalloonParticle {\n readonly #color: [number, number, number];\n readonly #driftAmp: number;\n readonly #driftFreq: number;\n readonly #driftPhase: number;\n readonly #radiusX: number;\n readonly #radiusY: number;\n readonly #riseSpeed: number;\n readonly #rotationSpeed: number;\n readonly #scale: number;\n readonly #stringLength: number;\n #x: number;\n #y: number;\n #rotation: number = 0;\n #time: number = 0;\n\n get isDone(): boolean {\n return this.#y < -(this.#radiusY * 2 + this.#stringLength);\n }\n\n get position(): Point {\n return {x: this.#x, y: this.#y};\n }\n\n constructor(position: Point, color: [number, number, number], config: BalloonParticleConfig = {}) {\n this.#x = position.x;\n this.#y = position.y;\n this.#color = color;\n this.#driftAmp = config.driftAmp ?? (0.3 + Math.random() * 0.7);\n this.#driftFreq = config.driftFreq ?? (0.5 + Math.random() * 1);\n this.#driftPhase = config.driftPhase ?? (Math.random() * Math.PI * 2);\n this.#radiusX = (config.radiusX ?? (25 + Math.random() * 20)) * (config.scale ?? 1);\n this.#radiusY = (config.radiusY ?? (config.radiusX ? config.radiusX * (1 / 0.85) : 30 + Math.random() * 23)) * (config.scale ?? 1);\n this.#riseSpeed = config.riseSpeed ?? (0.5 + Math.random() * 0.8);\n this.#rotationSpeed = config.rotationSpeed ?? (0.5 + Math.random() * 1.5);\n this.#scale = config.scale ?? 1;\n this.#stringLength = (config.stringLength ?? (30 + Math.random() * 40)) * this.#scale;\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n const [r, g, b] = this.#color;\n const rx = this.#radiusX;\n const ry = this.#radiusY;\n\n ctx.save();\n ctx.translate(this.#x, this.#y);\n ctx.rotate(this.#rotation);\n\n const gradient = ctx.createRadialGradient(-rx * 0.3, -ry * 0.3, rx * 0.1, 0, 0, Math.max(rx, ry));\n gradient.addColorStop(0, `rgba(${Math.min(255, r + 80)}, ${Math.min(255, g + 80)}, ${Math.min(255, b + 80)}, 0.95)`);\n gradient.addColorStop(0.6, `rgba(${r}, ${g}, ${b}, 0.9)`);\n gradient.addColorStop(1, `rgba(${Math.max(0, r - 40)}, ${Math.max(0, g - 40)}, ${Math.max(0, b - 40)}, 0.85)`);\n\n ctx.beginPath();\n ctx.ellipse(0, 0, rx, ry, 0, 0, Math.PI * 2);\n ctx.fillStyle = gradient;\n ctx.fill();\n\n ctx.beginPath();\n ctx.ellipse(-rx * 0.25, -ry * 0.3, rx * 0.2, ry * 0.15, -0.3, 0, Math.PI * 2);\n ctx.fillStyle = 'rgba(255, 255, 255, 0.35)';\n ctx.fill();\n\n const knotY = ry + 2 * this.#scale;\n ctx.beginPath();\n ctx.moveTo(-3 * this.#scale, knotY);\n ctx.lineTo(0, knotY + 5 * this.#scale);\n ctx.lineTo(3 * this.#scale, knotY);\n ctx.closePath();\n ctx.fillStyle = `rgba(${Math.max(0, r - 30)}, ${Math.max(0, g - 30)}, ${Math.max(0, b - 30)}, 0.9)`;\n ctx.fill();\n\n const stringDrift = Math.sin(this.#time * 2 + this.#driftPhase) * 8 * this.#scale;\n ctx.beginPath();\n ctx.moveTo(0, knotY + 5 * this.#scale);\n ctx.quadraticCurveTo(\n stringDrift,\n knotY + 5 * this.#scale + this.#stringLength * 0.5,\n -stringDrift * 0.5,\n knotY + 5 * this.#scale + this.#stringLength\n );\n ctx.strokeStyle = `rgba(${r}, ${g}, ${b}, 0.4)`;\n ctx.lineWidth = 1;\n ctx.stroke();\n\n ctx.restore();\n }\n\n tick(dt: number = 1): void {\n this.#time += 0.015 * dt;\n\n this.#y -= this.#riseSpeed * dt;\n this.#x += Math.sin(this.#time * this.#driftFreq + this.#driftPhase) * this.#driftAmp * dt;\n this.#rotation = Math.sin(this.#time * this.#rotationSpeed + this.#driftPhase) * 0.08;\n }\n}\n","import { SimulationCanvas } from '../simulation-canvas';\nimport { BalloonLayer } from './layer';\n\nexport interface BalloonSimulationConfig {\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 readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class BalloonSimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: BalloonSimulationConfig = {}) {\n super(canvas, new BalloonLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\n}\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { SimulationLayer } from '../layer';\nimport { MULBERRY } from './consts';\nimport type { BubbleSimulationConfig } from './simulation';\nimport type { Bubble, PopParticle } from './types';\n\nconst DEFAULT_COLORS = ['#88ccff', '#aaddff', '#ccbbff'];\n\nexport class BubbleLayer extends SimulationLayer {\n readonly #scale: number;\n readonly #speed: number;\n readonly #sizeRange: [number, number];\n readonly #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: BubbleSimulationConfig = {}) {\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 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 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\n let r = data[0] / 255;\n let g = data[1] / 255;\n let b = data[2] / 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 { SimulationCanvas } from '../simulation-canvas';\nimport { BubbleLayer } from './layer';\n\nexport interface BubbleSimulationConfig {\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 readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class BubbleSimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: BubbleSimulationConfig = {}) {\n super(canvas, new BubbleLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\n}\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 { SimulationLayer } from '../layer';\nimport { DEFAULT_CONFIG, MULBERRY, PALETTES } from './consts';\nimport { SHAPE_PATHS } from './shapes';\nimport type { ConfettiSimulationConfig } from './simulation';\nimport type { Config, Particle, ParticleConfig } from './types';\n\nconst TWO_PI = Math.PI * 2;\n\nexport class ConfettiLayer extends SimulationLayer {\n readonly #scale: number;\n #particles: Particle[] = [];\n #width: number = 0;\n #height: number = 0;\n #isFiring: boolean = false;\n\n constructor(config: ConfettiSimulationConfig = {}) {\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 fire(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 { 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 - (Math.random() * spread * Math.PI / 180);\n const speed = startVelocity * (0.5 + Math.random());\n const rotAngle = Math.random() * Math.PI * 2;\n\n this.#colorStr = color;\n this.#gravity = (config.gravity ?? 1) * scale;\n this.#shape = shape;\n this.#size = (5 + Math.random() * 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 + Math.random() * 0.1;\n this.#flipAngle = Math.random() * Math.PI * 2;\n this.#flipSpeed = 0.03 + Math.random() * 0.05;\n this.#rotAngle = rotAngle;\n this.#rotCos = Math.cos(rotAngle);\n this.#rotSin = Math.sin(rotAngle);\n this.#rotSpeed = (Math.random() - 0.5) * 0.06;\n this.#swing = Math.random() * Math.PI * 2;\n this.#swingAmp = 0.5 + Math.random() * 1.5;\n this.#swingSpeed = 0.025 + Math.random() * 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 { SimulationCanvas } from '../simulation-canvas';\nimport { ConfettiLayer } from './layer';\nimport type { Config } from './types';\n\nexport interface ConfettiSimulationConfig {\n readonly scale?: number;\n readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class ConfettiSimulation extends SimulationCanvas {\n readonly #layer: ConfettiLayer;\n\n constructor(canvas: HTMLCanvasElement, config: ConfettiSimulationConfig = {}) {\n const layer = new ConfettiLayer(config);\n super(canvas, layer, 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n this.#layer = layer;\n }\n\n fire(config: Partial<Config>): void {\n this.onResize();\n this.#layer.fire(config);\n\n if (!this.isTicking) {\n this.start();\n }\n }\n}\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\nimport type { DonutSimulationConfig } from './simulation';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n\nexport const DEFAULT_CONFIG: DonutSimulationConfig = {\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 { SimulationLayer } from '../layer';\nimport { DEFAULT_CONFIG, MULBERRY } from './consts';\nimport type { Donut } from './donut';\nimport type { DonutSimulationConfig } from './simulation';\n\nexport class DonutLayer extends SimulationLayer {\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 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: DonutSimulationConfig = {}) {\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 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 ctx.save();\n ctx.translate(donut.x, donut.y);\n ctx.rotate(donut.angle);\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 ctx.restore();\n }\n }\n\n #updateDonut(donut: Donut, dt: number): void {\n const currentSpeed = Math.sqrt(donut.vx * donut.vx + donut.vy * donut.vy);\n\n if (currentSpeed > donut.speed) {\n const damping = Math.pow(0.995, dt);\n donut.vx *= damping;\n donut.vy *= damping;\n }\n\n donut.x += donut.vx * dt;\n donut.y += donut.vy * dt;\n donut.angle += donut.rotationSpeed * dt;\n\n const limit = donut.outerRadius * 0.5;\n const width = this.#width;\n const height = this.#height;\n\n if (donut.x < -limit) {\n donut.x = -limit;\n donut.vx = Math.abs(donut.vx);\n }\n\n if (donut.x > width + limit) {\n donut.x = width + limit;\n donut.vx = -Math.abs(donut.vx);\n }\n\n if (donut.y < -limit) {\n donut.y = -limit;\n donut.vy = Math.abs(donut.vy);\n }\n\n if (donut.y > height + limit) {\n donut.y = height + limit;\n donut.vy = -Math.abs(donut.vy);\n }\n }\n\n #onMouseMove(event: MouseEvent): void {\n const target = event.currentTarget as HTMLCanvasElement;\n const rect = target.getBoundingClientRect();\n this.#mouseX = event.clientX - rect.left;\n this.#mouseY = event.clientY - rect.top;\n this.#mouseOnCanvas = true;\n }\n\n #onMouseLeave(): void {\n this.#mouseOnCanvas = false;\n }\n\n #resolveMouseAvoidance(dt: number): void {\n const radius = this.#mouseAvoidanceRadius;\n const strength = this.#mouseAvoidanceStrength;\n const mx = this.#mouseX;\n const my = this.#mouseY;\n\n for (const donut of this.#donuts) {\n const dx = donut.x - mx;\n const dy = donut.y - my;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const minDist = donut.outerRadius + radius;\n\n if (dist < minDist && dist > 0) {\n const overlap = minDist - dist;\n const nx = dx / dist;\n const ny = dy / dist;\n const force = overlap * strength * dt;\n\n donut.vx += nx * force;\n donut.vy += ny * force;\n }\n }\n }\n\n #resolveCollisions(dt: number): void {\n const padding = this.#collisionPadding;\n const strength = this.#repulsionStrength;\n\n for (let i = 0; i < this.#donuts.length; i++) {\n for (let j = i + 1; j < this.#donuts.length; j++) {\n const a = this.#donuts[i];\n const b = this.#donuts[j];\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const minDist = a.outerRadius + b.outerRadius + padding;\n\n if (dist < minDist && dist > 0) {\n const overlap = minDist - dist;\n const nx = dx / dist;\n const ny = dy / dist;\n const force = overlap * strength * dt;\n\n a.vx -= nx * force;\n a.vy -= ny * force;\n b.vx += nx * force;\n b.vy += ny * force;\n }\n }\n }\n }\n\n #createDonut(): Donut {\n const outerRadius = this.#rand(this.#radiusRange[0], this.#radiusRange[1]);\n const innerRadius = outerRadius * (1 - this.#thickness);\n const speed = this.#rand(this.#speedRange[0], this.#speedRange[1]);\n const direction = MULBERRY.next() * Math.PI * 2;\n\n return {\n outerRadius,\n innerRadius,\n x: this.#rand(-outerRadius, this.#width + outerRadius),\n y: this.#rand(-outerRadius, this.#height + outerRadius),\n angle: MULBERRY.next() * Math.PI * 2,\n speed,\n rotationSpeed: this.#rand(this.#rotationSpeedRange[0], this.#rotationSpeedRange[1]) * (MULBERRY.next() > 0.5 ? 1 : -1),\n color: this.#colors[Math.floor(MULBERRY.next() * this.#colors.length)],\n vx: Math.cos(direction) * speed,\n vy: Math.sin(direction) * speed\n };\n }\n\n #createNonOverlapping(maxAttempts: number = 200): Donut {\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const donut = this.#createDonut();\n\n if (!this.#overlapsAny(donut)) {\n return donut;\n }\n }\n\n return this.#createDonut();\n }\n\n #overlapsAny(donut: Donut): boolean {\n const minDist = this.#collisionPadding;\n\n return this.#donuts.some((other) => {\n const dx = donut.x - other.x;\n const dy = donut.y - other.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n return dist < donut.outerRadius + other.outerRadius + minDist;\n });\n }\n\n #rand(min: number, max: number): number {\n return MULBERRY.next() * (max - min) + min;\n }\n}\n","import { SimulationCanvas } from '../simulation-canvas';\nimport { DonutLayer } from './layer';\n\nexport interface DonutSimulationConfig {\n readonly background?: string;\n readonly canvasOptions?: CanvasRenderingContext2DSettings;\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 DonutSimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: DonutSimulationConfig = {}) {\n super(canvas, new DonutLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\n}\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { SimulationLayer } from '../layer';\nimport { MULBERRY } from './consts';\nimport type { FireflySimulationConfig } from './simulation';\nimport type { Firefly } from './types';\n\nconst SPRITE_SIZE = 64;\nconst SPRITE_CENTER = SPRITE_SIZE / 2;\nconst SPRITE_RADIUS = SPRITE_SIZE / 2;\n\nexport class FireflyLayer extends SimulationLayer {\n readonly #scale: number;\n readonly #size: number;\n readonly #speed: number;\n readonly #glowSpeed: number;\n #maxCount: number;\n #time: number = 0;\n #fireflies: Firefly[] = [];\n #sprite: HTMLCanvasElement;\n\n constructor(config: FireflySimulationConfig = {}) {\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 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 { SimulationCanvas } from '../simulation-canvas';\nimport { FireflyLayer } from './layer';\n\nexport interface FireflySimulationConfig {\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 readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class FireflySimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: FireflySimulationConfig = {}) {\n super(canvas, new FireflyLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\n}\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { SimulationLayer } from '../layer';\nimport { MULBERRY } from './consts';\nimport type { FirepitSimulationConfig } from './simulation';\nimport type { Ember, FlameLayer } from './types';\n\nexport class FirepitLayer extends SimulationLayer {\n readonly #scale: number;\n readonly #flameWidth: number;\n readonly #flameHeight: number;\n readonly #intensity: number;\n #maxEmbers: number;\n #time: number = 0;\n #embers: Ember[] = [];\n #flameLayers: FlameLayer[] = [];\n\n constructor(config: FirepitSimulationConfig = {}) {\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 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 { SimulationCanvas } from '../simulation-canvas';\nimport { FirepitLayer } from './layer';\n\nexport interface FirepitSimulationConfig {\n readonly embers?: number;\n readonly flameWidth?: number;\n readonly flameHeight?: number;\n readonly intensity?: number;\n readonly scale?: number;\n readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class FirepitSimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: FirepitSimulationConfig = {}) {\n super(canvas, new FirepitLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\n}\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 FireworkSimulationConfig {\n readonly scale?: number;\n readonly autoSpawn?: boolean;\n readonly canvasOptions?: CanvasRenderingContext2DSettings;\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 <= this.#decay * 3) {\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';\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.6;\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, 0.5)\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 { SimulationLayer } from '../layer';\nimport type { Point } from '../point';\nimport { MULBERRY } from './consts';\nimport { Explosion } from './explosion';\nimport { Firework } from './firework';\nimport { Spark } from './spark';\nimport { EXPLOSION_CONFIGS, type ExplosionType, type FireworkSimulationConfig, type FireworkVariant } from './types';\n\nexport class FireworkLayer extends SimulationLayer {\n #explosions: Explosion[] = [];\n #fireworks: Firework[] = [];\n #sparks: Spark[] = [];\n #hue: number = 120;\n #spawnTimer: number = 0;\n #positionRandom = MULBERRY.fork();\n readonly #autoSpawn: boolean;\n readonly #baseSize: number;\n readonly #scale: number;\n readonly #tailWidth: number;\n #width: number = 960;\n #height: number = 540;\n\n constructor(config: FireworkSimulationConfig = {}) {\n super();\n\n const scale = config.scale ?? 1;\n this.#autoSpawn = config.autoSpawn ?? true;\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 fireExplosion(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.#createExplosion(pos, this.#hue, variant);\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 this.#sparks.push(...firework.collectSparks());\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 < 8; j++) {\n newSparks.push(new Spark(\n explosion.position,\n explosion.hue + MULBERRY.nextBetween(-30, 30)\n ));\n }\n }\n }\n\n this.#explosions.push(...newExplosions);\n this.#sparks.push(...newSparks);\n\n this.#explosions = this.#explosions.filter(e => !e.isDead);\n this.#sparks = this.#sparks.filter(s => !s.isDead);\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 #createExplosion(position: Point, hue: number, variant?: FireworkVariant): void {\n const selected = variant ?? this.#pickVariant();\n\n if (selected === 'saturn') {\n this.#createSaturnExplosion(position, hue);\n return;\n }\n\n if (selected === 'dahlia') {\n this.#createDahliaExplosion(position, hue);\n return;\n }\n\n if (selected === 'heart') {\n this.#createHeartExplosion(position, hue);\n return;\n }\n\n if (selected === 'spiral') {\n this.#createSpiralExplosion(position, hue);\n return;\n }\n\n if (selected === 'flower') {\n this.#createFlowerExplosion(position, hue);\n return;\n }\n\n if (selected === 'concentric') {\n this.#createConcentricExplosion(position, hue);\n return;\n }\n\n const type: ExplosionType = selected;\n const config = EXPLOSION_CONFIGS[type];\n const particleCount = Math.floor(MULBERRY.nextBetween(config.particleCount[0], config.particleCount[1]));\n\n const effectiveHue = type === 'brocade'\n ? MULBERRY.nextBetween(35, 50)\n : hue;\n\n for (let i = 0; i < particleCount; i++) {\n let angle: number | undefined;\n let speed: number | undefined;\n\n if (type === 'ring') {\n angle = (i / particleCount) * Math.PI * 2;\n speed = MULBERRY.nextBetween(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 + MULBERRY.nextBetween(-spread, spread);\n }\n\n this.#explosions.push(new Explosion(position, effectiveHue, this.#baseSize, type, this.#scale, angle, speed));\n }\n }\n\n #createSaturnExplosion(position: Point, hue: number): void {\n const velocity = MULBERRY.nextBetween(4, 6);\n const shellCount = Math.floor(MULBERRY.nextBetween(25, 35));\n\n for (let i = 0; i < shellCount; i++) {\n const rad = (i / shellCount) * Math.PI * 2;\n\n this.#explosions.push(new Explosion(\n position,\n hue,\n this.#baseSize,\n 'peony',\n this.#scale,\n rad + MULBERRY.nextBetween(-0.05, 0.05),\n velocity + MULBERRY.nextBetween(-0.25, 0.25)\n ));\n }\n\n const fillCount = Math.floor(MULBERRY.nextBetween(40, 60));\n\n for (let i = 0; i < fillCount; i++) {\n const rad = MULBERRY.nextBetween(0, Math.PI * 2);\n const speed = velocity * MULBERRY.nextBetween(0, 1);\n\n this.#explosions.push(new Explosion(\n position,\n hue,\n this.#baseSize,\n 'peony',\n this.#scale,\n rad,\n speed\n ));\n }\n\n const ringRotation = MULBERRY.nextBetween(0, Math.PI * 2);\n const ringCount = Math.floor(MULBERRY.nextBetween(40, 55));\n const ringVx = velocity * MULBERRY.nextBetween(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\n const cx = Math.cos(rad) * ringVx + MULBERRY.nextBetween(-0.25, 0.25);\n const cy = Math.sin(rad) * ringVy + MULBERRY.nextBetween(-0.25, 0.25);\n\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\n const screenAngle = Math.atan2(vy, vx);\n const screenSpeed = Math.sqrt(vx * vx + vy * vy);\n const vz = Math.sin(rad) * velocity * 0.8;\n\n this.#explosions.push(new Explosion(\n position,\n hue + 60,\n this.#baseSize,\n 'ring',\n this.#scale,\n screenAngle,\n screenSpeed,\n vz\n ));\n }\n }\n\n #createDahliaExplosion(position: Point, hue: number): void {\n const petalCount = Math.floor(MULBERRY.nextBetween(6, 9));\n const particlesPerPetal = Math.floor(MULBERRY.nextBetween(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 const angle = baseAngle + MULBERRY.nextBetween(-0.3, 0.3);\n\n this.#explosions.push(new Explosion(\n position,\n petalHue,\n this.#baseSize,\n 'dahlia',\n this.#scale,\n angle\n ));\n }\n }\n }\n\n #createHeartExplosion(position: Point, hue: number): void {\n const velocity = MULBERRY.nextBetween(3, 5);\n const count = Math.floor(MULBERRY.nextBetween(60, 80));\n const rotation = MULBERRY.nextBetween(-0.3, 0.3);\n\n for (let i = 0; i < count; i++) {\n const t = (i / count) * Math.PI * 2;\n\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\n const scale = velocity / 16;\n const vx = hx * scale;\n const vy = hy * scale;\n\n const cosR = Math.cos(rotation);\n const sinR = Math.sin(rotation);\n const rvx = vx * cosR - vy * sinR;\n const rvy = vx * sinR + vy * cosR;\n\n const angle = Math.atan2(rvy, rvx);\n const speed = Math.sqrt(rvx * rvx + rvy * rvy);\n\n this.#explosions.push(new Explosion(\n position,\n hue,\n this.#baseSize,\n 'heart',\n this.#scale,\n angle,\n Math.max(0.1, speed + MULBERRY.nextBetween(-0.15, 0.15))\n ));\n }\n }\n\n #createSpiralExplosion(position: Point, hue: number): void {\n const arms = Math.floor(MULBERRY.nextBetween(3, 5));\n const particlesPerArm = Math.floor(MULBERRY.nextBetween(15, 20));\n const twist = MULBERRY.nextBetween(2, 3.5);\n const baseRotation = MULBERRY.nextBetween(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 const angle = baseAngle + progress * twist;\n const speed = 2 + progress * 8;\n\n this.#explosions.push(new Explosion(\n position,\n armHue,\n this.#baseSize,\n 'spiral',\n this.#scale,\n angle,\n speed + MULBERRY.nextBetween(-0.3, 0.3)\n ));\n }\n }\n }\n\n #createFlowerExplosion(position: Point, hue: number): void {\n const velocity = MULBERRY.nextBetween(4, 7);\n const count = Math.floor(MULBERRY.nextBetween(70, 90));\n const petals = Math.floor(MULBERRY.nextBetween(2, 4));\n const rotation = MULBERRY.nextBetween(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 this.#explosions.push(new Explosion(\n position,\n hue + MULBERRY.nextBetween(-15, 15),\n this.#baseSize,\n 'flower',\n this.#scale,\n t + rotation,\n speed + MULBERRY.nextBetween(-0.2, 0.2)\n ));\n }\n }\n\n #createConcentricExplosion(position: Point, hue: number): void {\n const outerCount = Math.floor(MULBERRY.nextBetween(35, 50));\n const outerSpeed = MULBERRY.nextBetween(7, 10);\n\n for (let i = 0; i < outerCount; i++) {\n const angle = (i / outerCount) * Math.PI * 2;\n\n this.#explosions.push(new Explosion(\n position,\n hue,\n this.#baseSize,\n 'ring',\n this.#scale,\n angle + MULBERRY.nextBetween(-0.05, 0.05),\n outerSpeed + MULBERRY.nextBetween(-0.25, 0.25)\n ));\n }\n\n const innerCount = Math.floor(MULBERRY.nextBetween(25, 35));\n const innerSpeed = MULBERRY.nextBetween(3, 5);\n\n for (let i = 0; i < innerCount; i++) {\n const angle = (i / innerCount) * Math.PI * 2;\n\n this.#explosions.push(new Explosion(\n position,\n hue + 120,\n this.#baseSize,\n 'ring',\n this.#scale,\n angle + MULBERRY.nextBetween(-0.05, 0.05),\n innerSpeed + MULBERRY.nextBetween(-0.25, 0.25)\n ));\n }\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.#createExplosion(firework.position, hue);\n }, {once: true});\n\n this.#fireworks.push(firework);\n }\n\n #pickVariant(): FireworkVariant {\n const roll = MULBERRY.nextBetween(0, 100);\n\n if (roll < 12) { return 'peony'; }\n if (roll < 22) { return 'chrysanthemum'; }\n if (roll < 29) { return 'willow'; }\n if (roll < 34) { return 'ring'; }\n if (roll < 39) { return 'palm'; }\n if (roll < 44) { return 'crackle'; }\n if (roll < 48) { return 'crossette'; }\n if (roll < 55) { return 'saturn'; }\n if (roll < 62) { return 'dahlia'; }\n if (roll < 67) { return 'brocade'; }\n if (roll < 71) { return 'horsetail'; }\n if (roll < 75) { return 'strobe'; }\n if (roll < 82) { return 'heart'; }\n if (roll < 89) { return 'spiral'; }\n if (roll < 94) { return 'flower'; }\n\n return 'concentric';\n }\n}\n","import { SimulationCanvas } from '../simulation-canvas';\nimport { FireworkLayer } from './layer';\nimport type { Point } from '../point';\nimport type { FireworkSimulationConfig, FireworkVariant } from './types';\n\nexport class FireworkSimulation extends SimulationCanvas {\n readonly #layer: FireworkLayer;\n\n constructor(canvas: HTMLCanvasElement, config: FireworkSimulationConfig = {}) {\n const layer = new FireworkLayer(config);\n super(canvas, layer, 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n this.#layer = layer;\n }\n\n fireExplosion(variant: FireworkVariant, position?: Point): void {\n this.#layer.fireExplosion(variant, position);\n }\n}\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 { SimulationLayer } from '../layer';\nimport { GLITTER_COLORS, MULBERRY } from './consts';\nimport type { GlitterSimulationConfig } from './simulation';\nimport type { FallingGlitter, SettledGlitter } from './types';\n\nexport class GlitterLayer extends SimulationLayer {\n readonly #scale: number;\n readonly #size: number;\n readonly #speed: number;\n readonly #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: GlitterSimulationConfig = {}) {\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 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 { SimulationCanvas } from '../simulation-canvas';\nimport { GlitterLayer } from './layer';\n\nexport interface GlitterSimulationConfig {\n readonly count?: number;\n readonly colors?: string[];\n readonly size?: number;\n readonly speed?: number;\n readonly groundLevel?: number;\n readonly maxSettled?: number;\n readonly scale?: number;\n readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class GlitterSimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: GlitterSimulationConfig = {}) {\n super(canvas, new GlitterLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\n}\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 { SimulationLayer } from '../layer';\nimport { LANTERN_COLORS, MULBERRY } from './consts';\nimport type { LanternSimulationConfig } from './simulation';\nimport type { Lantern } from './types';\n\nexport class LanternLayer extends SimulationLayer {\n readonly #scale: number;\n readonly #speed: number;\n readonly #size: number;\n readonly #colorRGBs: [number, number, number][];\n #maxCount: number;\n #time: number = 0;\n #lanterns: Lantern[] = [];\n\n constructor(config: LanternSimulationConfig = {}) {\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 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 }\n }\n }\n\n draw(ctx: CanvasRenderingContext2D, width: number, height: number): void {\n\n const sorted = [...this.#lanterns].sort((a, b) => a.size - b.size);\n\n for (const lantern of sorted) {\n const px = lantern.x * width;\n const py = lantern.y * height;\n const size = lantern.size;\n const [r, g, b] = this.#colorRGBs[lantern.colorIndex];\n\n const glowPulse = 0.6 + 0.4 * Math.sin(this.#time * lantern.glowSpeed + lantern.glowPhase);\n const alpha = lantern.opacity * glowPulse;\n\n const glowRadius = size * 3;\n const glowGradient = ctx.createRadialGradient(px, py, 0, px, py, glowRadius);\n glowGradient.addColorStop(0, `rgba(${r}, ${g}, ${b}, ${alpha * 0.35})`);\n glowGradient.addColorStop(0.3, `rgba(${r}, ${g}, ${b}, ${alpha * 0.15})`);\n glowGradient.addColorStop(0.6, `rgba(${r}, ${g}, ${b}, ${alpha * 0.05})`);\n glowGradient.addColorStop(1, `rgba(${r}, ${g}, ${b}, 0)`);\n\n ctx.fillStyle = glowGradient;\n ctx.beginPath();\n ctx.arc(px, py, glowRadius, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.save();\n ctx.translate(px, py);\n\n const bodyW = size * 0.8;\n const bodyH = size;\n const topW = bodyW * 0.6;\n\n ctx.beginPath();\n ctx.moveTo(-topW, -bodyH * 0.5);\n ctx.quadraticCurveTo(-bodyW, 0, -bodyW * 0.7, bodyH * 0.5);\n ctx.lineTo(bodyW * 0.7, bodyH * 0.5);\n ctx.quadraticCurveTo(bodyW, 0, topW, -bodyH * 0.5);\n ctx.closePath();\n\n const bodyGradient = ctx.createLinearGradient(0, -bodyH * 0.5, 0, bodyH * 0.5);\n bodyGradient.addColorStop(0, `rgba(${Math.min(255, r + 60)}, ${Math.min(255, g + 60)}, ${Math.min(255, b + 30)}, ${alpha * 0.9})`);\n bodyGradient.addColorStop(0.5, `rgba(${r}, ${g}, ${b}, ${alpha * 0.85})`);\n bodyGradient.addColorStop(1, `rgba(${Math.max(0, r - 30)}, ${Math.max(0, g - 30)}, ${Math.max(0, b - 20)}, ${alpha * 0.8})`);\n\n ctx.fillStyle = bodyGradient;\n ctx.fill();\n\n ctx.beginPath();\n ctx.moveTo(-topW * 0.7, -bodyH * 0.55);\n ctx.lineTo(topW * 0.7, -bodyH * 0.55);\n ctx.lineWidth = size * 0.06;\n ctx.strokeStyle = `rgba(${Math.max(0, r - 40)}, ${Math.max(0, g - 40)}, ${Math.max(0, b - 40)}, ${alpha * 0.7})`;\n ctx.stroke();\n\n const flameH = bodyH * 0.3;\n const flameW = bodyW * 0.15;\n const flameFlicker = Math.sin(this.#time * 8 + lantern.glowPhase) * flameW * 0.3;\n\n const flameGradient = ctx.createRadialGradient(\n flameFlicker, -flameH * 0.1, 0,\n flameFlicker, -flameH * 0.1, flameH\n );\n flameGradient.addColorStop(0, `rgba(255, 255, 200, ${alpha * 0.95})`);\n flameGradient.addColorStop(0.3, `rgba(255, 200, 80, ${alpha * 0.7})`);\n flameGradient.addColorStop(0.7, `rgba(255, 140, 40, ${alpha * 0.3})`);\n flameGradient.addColorStop(1, `rgba(255, 100, 20, 0)`);\n\n ctx.beginPath();\n ctx.moveTo(-flameW + flameFlicker, flameH * 0.2);\n ctx.quadraticCurveTo(-flameW * 0.5 + flameFlicker, -flameH * 0.3, flameFlicker, -flameH);\n ctx.quadraticCurveTo(flameW * 0.5 + flameFlicker, -flameH * 0.3, flameW + flameFlicker, flameH * 0.2);\n ctx.closePath();\n ctx.fillStyle = flameGradient;\n ctx.fill();\n\n const stringLen = size * 0.6;\n const stringDrift = Math.sin(this.#time * 1.5 + lantern.swayPhase) * size * 0.1;\n\n ctx.beginPath();\n ctx.moveTo(0, bodyH * 0.5);\n ctx.quadraticCurveTo(\n stringDrift,\n bodyH * 0.5 + stringLen * 0.5,\n -stringDrift * 0.5,\n bodyH * 0.5 + stringLen\n );\n ctx.strokeStyle = `rgba(${r}, ${g}, ${b}, ${alpha * 0.4})`;\n ctx.lineWidth = size * 0.04;\n ctx.stroke();\n\n ctx.restore();\n }\n }\n\n #createLantern(initialSpread: boolean): Lantern {\n const colorIndex = Math.floor(MULBERRY.next() * this.#colorRGBs.length);\n const sizeVariation = 0.6 + MULBERRY.next() * 0.8;\n\n return {\n x: 0.05 + MULBERRY.next() * 0.9,\n y: initialSpread ? MULBERRY.next() * 1.3 : 1.15 + MULBERRY.next() * 0.2,\n vx: 0,\n vy: 0.2 + MULBERRY.next() * 0.6,\n size: this.#size * sizeVariation,\n glowPhase: MULBERRY.next() * Math.PI * 2,\n glowSpeed: 0.8 + MULBERRY.next() * 1.2,\n swayPhase: MULBERRY.next() * Math.PI * 2,\n swaySpeed: 0.4 + MULBERRY.next() * 0.8,\n swayAmplitude: 0.3 + MULBERRY.next() * 0.7,\n colorIndex,\n opacity: 0.7 + MULBERRY.next() * 0.3\n };\n }\n}\n","import { SimulationCanvas } from '../simulation-canvas';\nimport { LanternLayer } from './layer';\n\nexport interface LanternSimulationConfig {\n readonly count?: number;\n readonly colors?: string[];\n readonly size?: number;\n readonly speed?: number;\n readonly scale?: number;\n readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class LanternSimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: LanternSimulationConfig = {}) {\n super(canvas, new LanternLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\n}\n","import { LimitedFrameRateCanvas } from './canvas';\nimport type { EdgeFade, EdgeFadeSide, SimulationLayer } from './layer';\n\nfunction parseSide(side: EdgeFadeSide): [number, number] {\n return typeof side === 'number' ? [0, side] : side;\n}\n\n\nfunction 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\nexport class LayeredSimulation 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, frameRate: number = 60, options: CanvasRenderingContext2DSettings = {colorSpace: 'display-p3'}) {\n super(canvas, frameRate, options);\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 add(layer: SimulationLayer): this {\n this.#layers.push(layer);\n\n if (this.isTicking) {\n layer.onMount(this.canvas);\n }\n\n return this;\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","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 { SimulationLayer } from '../layer';\nimport { LEAF_COLORS, MULBERRY } from './consts';\nimport type { LeafSimulationConfig } from './simulation';\nimport type { Leaf } from './types';\n\nexport class LeafLayer extends SimulationLayer {\n readonly #scale: number;\n readonly #size: number;\n readonly #speed: number;\n readonly #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: LeafSimulationConfig = {}) {\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 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\n ctx.save();\n ctx.translate(px, py);\n ctx.rotate(leaf.rotation);\n ctx.scale(scaleX, 1);\n ctx.globalAlpha = 0.3 + leaf.depth * 0.7;\n ctx.drawImage(\n this.#sprites[leaf.colorIndex % this.#sprites.length],\n -displaySize / 2,\n -displaySize / 2,\n displaySize,\n displaySize\n );\n ctx.restore();\n }\n\n ctx.globalAlpha = 1;\n }\n\n #createSprites(): HTMLCanvasElement[] {\n const sprites: HTMLCanvasElement[] = [];\n\n for (const color of this.#colors) {\n sprites.push(this.#createLeafSprite(color, 0));\n sprites.push(this.#createLeafSprite(color, 1));\n sprites.push(this.#createLeafSprite(color, 2));\n }\n\n return sprites;\n }\n\n #createLeafSprite(color: string, shape: number): HTMLCanvasElement {\n const size = 64;\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n const ctx = canvas.getContext('2d')!;\n\n const cx = size / 2;\n const cy = size / 2;\n\n ctx.fillStyle = color;\n\n switch (shape) {\n case 0:\n this.#drawOvalLeaf(ctx, cx, cy, size);\n break;\n case 1:\n this.#drawMapleLeaf(ctx, cx, cy, size);\n break;\n case 2:\n this.#drawPointedLeaf(ctx, cx, cy, size);\n break;\n }\n\n return canvas;\n }\n\n #drawOvalLeaf(ctx: CanvasRenderingContext2D, cx: number, cy: number, size: number): void {\n const hw = size * 0.3;\n const hh = size * 0.42;\n\n ctx.beginPath();\n ctx.moveTo(cx, cy - hh);\n ctx.bezierCurveTo(cx + hw * 1.2, cy - hh * 0.5, cx + hw, cy + hh * 0.5, cx, cy + hh);\n ctx.bezierCurveTo(cx - hw, cy + hh * 0.5, cx - hw * 1.2, cy - hh * 0.5, cx, cy - hh);\n ctx.fill();\n\n ctx.strokeStyle = 'rgba(0, 0, 0, 0.15)';\n ctx.lineWidth = 0.8;\n ctx.beginPath();\n ctx.moveTo(cx, cy - hh * 0.8);\n ctx.lineTo(cx, cy + hh * 0.8);\n ctx.stroke();\n\n for (const offset of [-0.3, 0, 0.3]) {\n const py = cy + hh * offset;\n ctx.beginPath();\n ctx.moveTo(cx, py);\n ctx.quadraticCurveTo(cx + hw * 0.5, py - 3, cx + hw * 0.7, py - 1);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(cx, py);\n ctx.quadraticCurveTo(cx - hw * 0.5, py - 3, cx - hw * 0.7, py - 1);\n ctx.stroke();\n }\n }\n\n #drawMapleLeaf(ctx: CanvasRenderingContext2D, cx: number, cy: number, size: number): void {\n const r = size * 0.38;\n\n ctx.beginPath();\n ctx.moveTo(cx, cy - r);\n\n const points = 5;\n for (let i = 0; i < points; i++) {\n const angle = (i / points) * Math.PI * 2 - Math.PI / 2;\n const nextAngle = ((i + 1) / points) * Math.PI * 2 - Math.PI / 2;\n const outerR = r * (0.85 + (i % 2) * 0.15);\n const innerR = r * 0.45;\n const midAngle = (angle + nextAngle) / 2;\n\n ctx.lineTo(cx + Math.cos(angle) * outerR, cy + Math.sin(angle) * outerR);\n ctx.lineTo(cx + Math.cos(midAngle) * innerR, cy + Math.sin(midAngle) * innerR);\n }\n\n ctx.closePath();\n ctx.fill();\n\n ctx.strokeStyle = 'rgba(0, 0, 0, 0.12)';\n ctx.lineWidth = 0.7;\n for (let i = 0; i < points; i++) {\n const angle = (i / points) * Math.PI * 2 - Math.PI / 2;\n const outerR = r * 0.7;\n ctx.beginPath();\n ctx.moveTo(cx, cy);\n ctx.lineTo(cx + Math.cos(angle) * outerR, cy + Math.sin(angle) * outerR);\n ctx.stroke();\n }\n }\n\n #drawPointedLeaf(ctx: CanvasRenderingContext2D, cx: number, cy: number, size: number): void {\n const hw = size * 0.22;\n const hh = size * 0.44;\n\n ctx.beginPath();\n ctx.moveTo(cx, cy - hh);\n ctx.quadraticCurveTo(cx + hw * 1.6, cy - hh * 0.1, cx + hw * 0.3, cy + hh * 0.6);\n ctx.quadraticCurveTo(cx, cy + hh, cx, cy + hh);\n ctx.quadraticCurveTo(cx, cy + hh, cx - hw * 0.3, cy + hh * 0.6);\n ctx.quadraticCurveTo(cx - hw * 1.6, cy - hh * 0.1, cx, cy - hh);\n ctx.fill();\n\n ctx.strokeStyle = 'rgba(0, 0, 0, 0.15)';\n ctx.lineWidth = 0.8;\n ctx.beginPath();\n ctx.moveTo(cx, cy - hh * 0.7);\n ctx.lineTo(cx, cy + hh * 0.9);\n ctx.stroke();\n }\n\n #createLeaf(initialSpread: boolean): Leaf {\n const depth = 0.3 + MULBERRY.next() * 0.7;\n\n return {\n x: MULBERRY.next(),\n y: initialSpread ? MULBERRY.next() * 2 - 1 : -0.05 - MULBERRY.next() * 0.15,\n size: (MULBERRY.next() * 0.6 + 0.5) * this.#size,\n depth,\n rotation: MULBERRY.next() * Math.PI * 2,\n rotationSpeed: (MULBERRY.next() - 0.5) * 0.04,\n flipAngle: MULBERRY.next() * Math.PI * 2,\n flipSpeed: 0.02 + MULBERRY.next() * 0.04,\n swingAmplitude: 0.4 + MULBERRY.next() * 0.8,\n swingFrequency: 0.5 + MULBERRY.next() * 1.5,\n swingOffset: MULBERRY.next() * Math.PI * 2,\n fallSpeed: 0.3 + MULBERRY.next() * 0.7,\n shape: Math.floor(MULBERRY.next() * 3),\n colorIndex: Math.floor(MULBERRY.next() * this.#colors.length * 3)\n };\n }\n}\n","import { SimulationCanvas } from '../simulation-canvas';\nimport { LeafLayer } from './layer';\n\nexport interface LeafSimulationConfig {\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 readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class LeafSimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: LeafSimulationConfig = {}) {\n super(canvas, new LeafLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\n}\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 { SimulationLayer } from '../layer';\nimport { MULBERRY } from './consts';\nimport type { LightningSimulationConfig } from './simulation';\nimport { LightningSystem } from './system';\n\nexport class LightningLayer extends SimulationLayer {\n readonly #system: LightningSystem;\n readonly #enableFlash: boolean;\n\n constructor(config: LightningSimulationConfig = {}) {\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 { SimulationCanvas } from '../simulation-canvas';\nimport { LightningLayer } from './layer';\n\nexport interface LightningSimulationConfig {\n readonly frequency?: number;\n readonly color?: string;\n readonly branches?: boolean;\n readonly flash?: boolean;\n readonly scale?: number;\n readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class LightningSimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: LightningSimulationConfig = {}) {\n super(canvas, new LightningLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\n}\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 { SimulationLayer } from '../layer';\nimport { MATRIX_CHARS, MULBERRY } from './consts';\nimport type { MatrixSimulationConfig } from './simulation';\nimport type { MatrixColumn } from './types';\n\nexport class MatrixLayer extends SimulationLayer {\n readonly #scale: number;\n readonly #speed: number;\n readonly #fontSize: number;\n readonly #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: MatrixSimulationConfig = {}) {\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 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 { SimulationCanvas } from '../simulation-canvas';\nimport { MatrixLayer } from './layer';\n\nexport interface MatrixSimulationConfig {\n readonly columns?: number;\n readonly speed?: number;\n readonly color?: string;\n readonly fontSize?: number;\n readonly trailLength?: number;\n readonly scale?: number;\n readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class MatrixSimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: MatrixSimulationConfig = {}) {\n super(canvas, new MatrixLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\n}\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 { SimulationLayer } from '../layer';\nimport { MULBERRY, ORBIT_COLORS } from './consts';\nimport type { OrbitSimulationConfig } from './simulation';\nimport type { OrbitalCenter, Orbiter } from './types';\n\nexport class OrbitLayer extends SimulationLayer {\n readonly #centerCount: number;\n readonly #orbitersPerCenter: number;\n readonly #speed: number;\n readonly #colors: string[];\n readonly #trailLength: number;\n readonly #showCenters: boolean;\n readonly #scale: number;\n #centers: OrbitalCenter[] = [];\n #orbiters: Orbiter[] = [];\n #time: number = 0;\n #initialized: boolean = false;\n\n constructor(config: OrbitSimulationConfig = {}) {\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 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 orbiter.trail.push({x: px, y: py});\n\n if (orbiter.trail.length > this.#trailLength) {\n orbiter.trail.shift();\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\n if (orbiter.trail.length > 1) {\n for (let ti = 0; ti < orbiter.trail.length - 1; ti++) {\n const progress = (ti + 1) / orbiter.trail.length;\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 ctx.globalAlpha = trailAlpha;\n ctx.strokeStyle = `rgb(${cr}, ${cg}, ${cb})`;\n ctx.lineWidth = trailWidth;\n ctx.beginPath();\n ctx.moveTo(orbiter.trail[ti].x, orbiter.trail[ti].y);\n ctx.lineTo(orbiter.trail[ti + 1].x, orbiter.trail[ti + 1].y);\n ctx.stroke();\n }\n }\n\n if (orbiter.trail.length > 0) {\n const head = orbiter.trail[orbiter.trail.length - 1];\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 };\n }\n}\n","import { SimulationCanvas } from '../simulation-canvas';\nimport { OrbitLayer } from './layer';\n\nexport interface OrbitSimulationConfig {\n readonly centers?: number;\n readonly orbitersPerCenter?: number;\n readonly speed?: number;\n readonly colors?: string[];\n readonly trailLength?: number;\n readonly showCenters?: boolean;\n readonly scale?: number;\n readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class OrbitSimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: OrbitSimulationConfig = {}) {\n super(canvas, new OrbitLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\n}\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { SimulationLayer } from '../layer';\nimport { MULBERRY } from './consts';\nimport type { ParticleSimulationConfig } from './simulation';\nimport type { NetworkParticle, ParticleMouseMode } from './types';\n\nexport class ParticleLayer extends SimulationLayer {\n readonly #scale: 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 #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: ParticleSimulationConfig = {}) {\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 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 { SimulationCanvas } from '../simulation-canvas';\nimport { ParticleLayer } from './layer';\n\nexport interface ParticleSimulationConfig {\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?: import('./types').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 readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class ParticleSimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: ParticleSimulationConfig = {}) {\n super(canvas, new ParticleLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\n}\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 { SimulationLayer } from '../layer';\nimport { MULBERRY, PETAL_COLORS } from './consts';\nimport type { PetalSimulationConfig } from './simulation';\nimport type { Petal } from './types';\n\nexport class PetalLayer extends SimulationLayer {\n readonly #scale: number;\n readonly #size: number;\n readonly #speed: number;\n readonly #wind: number;\n readonly #colors: string[];\n #maxCount: number;\n #time: number = 0;\n #petals: Petal[] = [];\n #sprites: HTMLCanvasElement[] = [];\n\n constructor(config: PetalSimulationConfig = {}) {\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 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\n ctx.save();\n ctx.translate(px, py);\n ctx.rotate(petal.rotation);\n ctx.scale(scaleX, 1);\n ctx.globalAlpha = 0.4 + petal.depth * 0.6;\n ctx.drawImage(\n this.#sprites[petal.colorIndex % this.#sprites.length],\n -displaySize / 2,\n -displaySize / 2,\n displaySize,\n displaySize\n );\n ctx.restore();\n }\n\n ctx.globalAlpha = 1;\n }\n\n #createSprites(): HTMLCanvasElement[] {\n const sprites: HTMLCanvasElement[] = [];\n\n for (const color of this.#colors) {\n sprites.push(this.#createPetalSprite(color));\n }\n\n return sprites;\n }\n\n #createPetalSprite(color: string): HTMLCanvasElement {\n const size = 64;\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n const ctx = canvas.getContext('2d')!;\n\n const cx = size / 2;\n const cy = size / 2;\n const hw = size * 0.28;\n const hh = size * 0.38;\n\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(cx, cy - hh);\n ctx.bezierCurveTo(cx + hw * 1.4, cy - hh * 0.6, cx + hw * 1.1, cy + hh * 0.3, cx, cy + hh);\n ctx.bezierCurveTo(cx - hw * 1.1, cy + hh * 0.3, cx - hw * 1.4, cy - hh * 0.6, cx, cy - hh);\n ctx.fill();\n\n ctx.strokeStyle = 'rgba(200, 100, 120, 0.15)';\n ctx.lineWidth = 0.6;\n ctx.beginPath();\n ctx.moveTo(cx, cy - hh * 0.6);\n ctx.quadraticCurveTo(cx + 1, cy, cx, cy + hh * 0.7);\n ctx.stroke();\n\n return canvas;\n }\n\n #createPetal(initialSpread: boolean): Petal {\n const depth = 0.5 + MULBERRY.next() * 0.5;\n\n return {\n x: MULBERRY.next(),\n y: initialSpread ? MULBERRY.next() * 2 - 1 : -0.05 - MULBERRY.next() * 0.15,\n size: (MULBERRY.next() * 0.4 + 0.6) * this.#size,\n depth,\n rotation: MULBERRY.next() * Math.PI * 2,\n rotationSpeed: (MULBERRY.next() - 0.5) * 0.03,\n flipAngle: MULBERRY.next() * Math.PI * 2,\n flipSpeed: 0.015 + MULBERRY.next() * 0.03,\n swingAmplitude: 0.5 + MULBERRY.next() * 1.0,\n swingFrequency: 0.4 + MULBERRY.next() * 1.2,\n swingOffset: MULBERRY.next() * Math.PI * 2,\n fallSpeed: 0.2 + MULBERRY.next() * 0.5,\n colorIndex: Math.floor(MULBERRY.next() * this.#colors.length)\n };\n }\n}\n","import { SimulationCanvas } from '../simulation-canvas';\nimport { PetalLayer } from './layer';\n\nexport interface PetalSimulationConfig {\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 readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class PetalSimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: PetalSimulationConfig = {}) {\n super(canvas, new PetalLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\n}\n","import { SimulationLayer } from '../layer';\nimport type { PlasmaSimulationConfig } from './simulation';\nimport type { PlasmaColor } from './types';\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 PlasmaLayer extends SimulationLayer {\n readonly #speed: number;\n readonly #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: PlasmaSimulationConfig = {}) {\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 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 { SimulationCanvas } from '../simulation-canvas';\nimport { PlasmaLayer } from './layer';\nimport type { PlasmaColor } from './types';\n\nexport interface PlasmaSimulationConfig {\n readonly speed?: number;\n readonly scale?: number;\n readonly resolution?: number;\n readonly palette?: PlasmaColor[];\n readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class PlasmaSimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: PlasmaSimulationConfig = {}) {\n super(canvas, new PlasmaLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\n}\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { parseColor } from '../color';\nimport { SimulationLayer } from '../layer';\nimport { MULBERRY } from './consts';\nimport type { RainSimulationConfig } from './simulation';\nimport type { Raindrop, RainVariant, Splash } from './types';\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 RainLayer extends SimulationLayer {\n readonly #scale: number;\n readonly #speed: number;\n readonly #wind: number;\n readonly #groundLevel: number;\n readonly #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: RainSimulationConfig = {}) {\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 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 { SimulationCanvas } from '../simulation-canvas';\nimport { RainLayer } from './layer';\nimport type { RainVariant } from './types';\n\nexport interface RainSimulationConfig {\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 readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class RainSimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: RainSimulationConfig = {}) {\n super(canvas, new RainLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\n}\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { SimulationLayer } from '../layer';\nimport { MULBERRY } from './consts';\nimport type { SandstormSimulationConfig } from './simulation';\nimport type { SandGrain } from './types';\n\nexport class SandstormLayer extends SimulationLayer {\n readonly #scale: number;\n readonly #wind: number;\n readonly #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: SandstormSimulationConfig = {}) {\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 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 { SimulationCanvas } from '../simulation-canvas';\nimport { SandstormLayer } from './layer';\n\nexport interface SandstormSimulationConfig {\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 readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class SandstormSimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: SandstormSimulationConfig = {}) {\n super(canvas, new SandstormLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\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 readonly verticalFade?: [number, 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 #verticalFade: [number, number] | null;\n readonly #rng: () => number;\n #cooldown: number;\n #height: number = 0;\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.#verticalFade = config.verticalFade ?? null;\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.#height = height;\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 star.trail.push({x: star.x, y: star.y});\n\n if (star.trail.length > this.#trailLength) {\n star.trail.shift();\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 const fullyFaded = this.#verticalFade !== null && star.y / height >= this.#verticalFade[1];\n\n if (inBounds && !fullyFaded) {\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 let fadeFactor = 1;\n\n if (this.#verticalFade && this.#height > 0) {\n const [fadeStart, fadeEnd] = this.#verticalFade;\n fadeFactor = 1 - Math.max(0, Math.min(1, (star.y / this.#height - fadeStart) / (fadeEnd - fadeStart)));\n }\n\n for (let t = 0; t < star.trail.length; t++) {\n const progress = t / star.trail.length;\n const trailAlpha = star.alpha * progress * this.#trailAlphaFactor * fadeFactor;\n const trailSize = star.size * progress * this.#scale;\n\n if (trailAlpha < 0.01) {\n continue;\n }\n\n ctx.globalAlpha = trailAlpha;\n ctx.beginPath();\n ctx.arc(star.trail[t].x, star.trail[t].y, trailSize, 0, Math.PI * 2);\n ctx.fillStyle = `rgb(${cr}, ${cg}, ${cb})`;\n ctx.fill();\n }\n\n const alpha = star.alpha * fadeFactor;\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 };\n }\n}\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { parseColor } from '../color';\nimport { SimulationLayer } from '../layer';\nimport { MULBERRY } from './consts';\nimport type { SnowSimulationConfig } from './simulation';\nimport type { Snowflake } from './snowflake';\n\nconst SPRITE_SIZE = 64;\nconst SPRITE_CENTER = SPRITE_SIZE / 2;\nconst SPRITE_RADIUS = SPRITE_SIZE / 2;\n\nexport class SnowLayer extends SimulationLayer {\n readonly #scale: number;\n readonly #size: number;\n readonly #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: SnowSimulationConfig = {}) {\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 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 ctx.save();\n ctx.translate(px, py);\n ctx.rotate(snowflake.rotation);\n ctx.drawImage(\n this.#sprites[snowflake.spriteIndex],\n -displayRadius,\n -displayRadius,\n displaySize,\n displaySize\n );\n ctx.restore();\n } else {\n ctx.drawImage(\n this.#sprites[snowflake.spriteIndex],\n px - displayRadius,\n py - displayRadius,\n displaySize,\n displaySize\n );\n }\n }\n\n ctx.globalAlpha = 1;\n }\n\n #createSprites(r: number, g: number, b: number): HTMLCanvasElement[] {\n const sprites: HTMLCanvasElement[] = [];\n\n const gradientProfiles: [number, number][][] = [\n [[0, 0.8], [0.3, 0.4], [0.7, 0.1], [1, 0]],\n [[0, 1], [0.15, 0.7], [0.5, 0.2], [1, 0]],\n [[0, 0.9], [0.25, 0.5], [0.5, 0.1], [1, 0]]\n ];\n\n for (const profile of gradientProfiles) {\n const canvas = document.createElement('canvas');\n canvas.width = SPRITE_SIZE;\n canvas.height = SPRITE_SIZE;\n const ctx = canvas.getContext('2d')!;\n\n const gradient = ctx.createRadialGradient(\n SPRITE_CENTER, SPRITE_CENTER, 0,\n SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS\n );\n\n for (const [stop, alpha] of profile) {\n gradient.addColorStop(stop, `rgba(${r}, ${g}, ${b}, ${alpha})`);\n }\n\n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.arc(SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS, 0, Math.PI * 2);\n ctx.fill();\n\n sprites.push(canvas);\n }\n\n sprites.push(this.#createCrystalSprite(r, g, b));\n\n return sprites;\n }\n\n #createCrystalSprite(r: number, g: number, b: number): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.width = SPRITE_SIZE;\n canvas.height = SPRITE_SIZE;\n const ctx = canvas.getContext('2d')!;\n\n const glow = ctx.createRadialGradient(\n SPRITE_CENTER, SPRITE_CENTER, 0,\n SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS\n );\n glow.addColorStop(0, `rgba(${r}, ${g}, ${b}, 0.6)`);\n glow.addColorStop(0.25, `rgba(${r}, ${g}, ${b}, 0.25)`);\n glow.addColorStop(0.6, `rgba(${r}, ${g}, ${b}, 0.05)`);\n glow.addColorStop(1, `rgba(${r}, ${g}, ${b}, 0)`);\n ctx.fillStyle = glow;\n ctx.beginPath();\n ctx.arc(SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.strokeStyle = `rgba(${r}, ${g}, ${b}, 0.7)`;\n ctx.lineWidth = 1.5;\n ctx.lineCap = 'round';\n\n const armLength = SPRITE_RADIUS * 0.75;\n\n for (let arm = 0; arm < 6; arm++) {\n const angle = (arm / 6) * Math.PI * 2 - Math.PI / 2;\n const tipX = SPRITE_CENTER + Math.cos(angle) * armLength;\n const tipY = SPRITE_CENTER + Math.sin(angle) * armLength;\n\n ctx.beginPath();\n ctx.moveTo(SPRITE_CENTER, SPRITE_CENTER);\n ctx.lineTo(tipX, tipY);\n ctx.stroke();\n\n for (const position of [0.4, 0.65]) {\n const branchX = SPRITE_CENTER + Math.cos(angle) * armLength * position;\n const branchY = SPRITE_CENTER + Math.sin(angle) * armLength * position;\n const branchLength = armLength * (0.4 - position * 0.3);\n\n for (const side of [-1, 1]) {\n const branchAngle = angle + side * Math.PI / 3;\n ctx.beginPath();\n ctx.moveTo(branchX, branchY);\n ctx.lineTo(\n branchX + Math.cos(branchAngle) * branchLength,\n branchY + Math.sin(branchAngle) * branchLength\n );\n ctx.stroke();\n }\n }\n }\n\n const centerGlow = ctx.createRadialGradient(\n SPRITE_CENTER, SPRITE_CENTER, 0,\n SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS * 0.12\n );\n centerGlow.addColorStop(0, `rgba(${r}, ${g}, ${b}, 0.9)`);\n centerGlow.addColorStop(1, `rgba(${r}, ${g}, ${b}, 0)`);\n ctx.fillStyle = centerGlow;\n ctx.beginPath();\n ctx.arc(SPRITE_CENTER, SPRITE_CENTER, SPRITE_RADIUS * 0.12, 0, Math.PI * 2);\n ctx.fill();\n\n return canvas;\n }\n\n #createSnowflake(initialSpread: boolean): Snowflake {\n const depth = 0.3 + MULBERRY.next() * 0.7;\n const radius = MULBERRY.next() * this.#size + 2 * this.#scale;\n\n let spriteIndex: number;\n if (depth > 0.85 && radius > this.#size * 0.6 && MULBERRY.next() > 0.65) {\n spriteIndex = 3;\n } else if (depth < 0.45) {\n spriteIndex = 2;\n } else {\n spriteIndex = MULBERRY.next() > 0.5 ? 0 : 1;\n }\n\n return {\n x: MULBERRY.next(),\n y: initialSpread ? MULBERRY.next() * 2 - 1 : -0.05 - MULBERRY.next() * 0.15,\n depth,\n radius,\n rotation: MULBERRY.next() * Math.PI * 2,\n rotationSpeed: (MULBERRY.next() - 0.5) * 0.03,\n swingAmplitude: 0.3 + MULBERRY.next() * 0.7,\n swingFrequency: 0.5 + MULBERRY.next() * 1.5,\n swingOffset: MULBERRY.next() * Math.PI * 2,\n fallSpeed: 0.5 + MULBERRY.next() * 0.5,\n spriteIndex\n };\n }\n}\n","import { SimulationCanvas } from '../simulation-canvas';\nimport { SnowLayer } from './layer';\n\nexport interface SnowSimulationConfig {\n readonly fillStyle?: string;\n readonly particles?: number;\n readonly scale?: number;\n readonly size?: number;\n readonly speed?: number;\n readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class SnowSimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: SnowSimulationConfig = {}) {\n super(canvas, new SnowLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\n}\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { SimulationLayer } from '../layer';\nimport { MULBERRY } from './consts';\nimport type { SparklerSimulationConfig } from './simulation';\nimport type { SparklerSpark } from './types';\n\nconst DEFAULT_COLORS = ['#ffcc33', '#ff9900', '#ffffff', '#ffee88'];\n\nexport class SparklerLayer extends SimulationLayer {\n readonly #scale: number;\n readonly #emitRate: number;\n readonly #maxSparks: number;\n readonly #colorRGBs: [number, number, number][];\n readonly #speedRange: [number, number];\n readonly #friction: number;\n readonly #gravity: number;\n readonly #decayRange: [number, number];\n readonly #trailLength: number;\n readonly #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\n constructor(config: SparklerSimulationConfig = {}) {\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 setPosition(x: number, y: number): void {\n this.#emitX = x;\n this.#emitY = y;\n }\n\n onMount(canvas: HTMLCanvasElement): void {\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 }\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 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 *= Math.pow(this.#friction, dt);\n spark.vy *= Math.pow(this.#friction, dt);\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 target = evt.currentTarget as HTMLCanvasElement;\n const rect = target.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 { SimulationCanvas } from '../simulation-canvas';\nimport { SparklerLayer } from './layer';\n\nexport interface SparklerSimulationConfig {\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 readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class SparklerSimulation extends SimulationCanvas {\n readonly #layer: SparklerLayer;\n\n constructor(canvas: HTMLCanvasElement, config: SparklerSimulationConfig = {}) {\n const layer = new SparklerLayer(config);\n super(canvas, layer, 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n this.#layer = layer;\n }\n\n setPosition(x: number, y: number): void {\n this.#layer.setPosition(x, y);\n }\n}\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { SimulationLayer } from '../layer';\nimport { ShootingStarSystem } from '../shooting-stars';\nimport { MULBERRY } from './consts';\nimport type { StarSimulationConfig } from './simulation';\nimport type { Star, StarMode } from './types';\n\nexport class StarLayer extends SimulationLayer {\n readonly #mode: StarMode;\n readonly #twinkleSpeed: number;\n readonly #colorRGB: [number, number, number];\n readonly #scale: number;\n readonly #verticalFade: [number, number] | null;\n readonly #shootingStarSystem: ShootingStarSystem | null;\n #starCount: number;\n #time: number = 0;\n #stars: Star[] = [];\n\n constructor(config: StarSimulationConfig = {}) {\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 this.#verticalFade = config.verticalFade ?? null;\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 verticalFade: this.#verticalFade ?? undefined\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 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 let alpha = star.brightness * (0.3 + 0.7 * (0.5 + 0.5 * Math.sin(this.#time * star.twinkleSpeed * this.#twinkleSpeed + star.twinklePhase)));\n\n if (this.#verticalFade) {\n const [fadeStart, fadeEnd] = this.#verticalFade;\n const fadeFactor = 1 - Math.max(0, Math.min(1, (star.y - fadeStart) / (fadeEnd - fadeStart)));\n alpha *= fadeFactor;\n\n if (alpha <= 0) {\n continue;\n }\n }\n\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 { SimulationCanvas } from '../simulation-canvas';\nimport { StarLayer } from './layer';\n\nexport interface StarSimulationConfig {\n readonly mode?: import('./types').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 readonly verticalFade?: [number, number];\n readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class StarSimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: StarSimulationConfig = {}) {\n super(canvas, new StarLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\n}\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 { SimulationLayer } from '../layer';\nimport { MULBERRY, STREAMER_COLORS } from './consts';\nimport type { StreamerSimulationConfig } from './simulation';\nimport type { Streamer } from './types';\n\nexport class StreamerLayer extends SimulationLayer {\n readonly #colors: string[];\n readonly #scale: number;\n readonly #speed: number;\n #count: number;\n #streamers: Streamer[] = [];\n #width: number = 960;\n #height: number = 540;\n #initialized: boolean = false;\n\n constructor(config: StreamerSimulationConfig = {}) {\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 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 { SimulationCanvas } from '../simulation-canvas';\nimport { StreamerLayer } from './layer';\n\nexport interface StreamerSimulationConfig {\n readonly count?: number;\n readonly colors?: string[];\n readonly speed?: number;\n readonly scale?: number;\n readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class StreamerSimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: StreamerSimulationConfig = {}) {\n super(canvas, new StreamerLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\n}\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 { SimulationLayer } from '../layer';\nimport { MULBERRY } from './consts';\nimport type { WaveSimulationConfig } from './simulation';\nimport type { Wave } from './types';\n\nconst DEFAULT_COLORS = ['#0a3d6b', '#0e5a8a', '#1a7ab5', '#3399cc', '#66c2e0'];\n\nexport class WaveLayer extends SimulationLayer {\n readonly #speed: number;\n readonly #foamColor: string;\n readonly #foamAmount: number;\n readonly #scale: number;\n #time: number = 0;\n #waves: Wave[] = [];\n #foamParticles: {x: number; y: number; alpha: number; size: number}[] = [];\n #maxFoamParticles: number;\n\n constructor(config: WaveSimulationConfig = {}) {\n super();\n\n const layers = config.layers ?? 5;\n const colors = config.colors ?? DEFAULT_COLORS;\n this.#speed = config.speed ?? 1;\n this.#foamColor = config.foamColor ?? '#ffffff';\n this.#foamAmount = config.foamAmount ?? 0.4;\n this.#scale = config.scale ?? 1;\n this.#maxFoamParticles = 120;\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) * this.#speed,\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 });\n }\n }\n\n tick(dt: number, width: number, height: number): void {\n this.#time += 0.02 * dt * this.#speed;\n\n for (const wave of this.#waves) {\n wave.phase += 0.015 * wave.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 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, this.#adjustAlpha(wave.color, 0.85));\n gradient.addColorStop(0.4, wave.color);\n gradient.addColorStop(1, this.#darkenColor(wave.color, 0.6));\n\n ctx.fillStyle = gradient;\n ctx.fill();\n }\n\n if (this.#foamAmount > 0) {\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 = this.#adjustAlpha(this.#foamColor, foam.alpha * this.#foamAmount);\n ctx.fill();\n }\n }\n }\n\n #adjustAlpha(color: string, alpha: number): string {\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 `rgba(${data[0]}, ${data[1]}, ${data[2]}, ${alpha})`;\n }\n\n #darkenColor(color: string, factor: number): string {\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 const r = Math.floor(data[0] * factor);\n const g = Math.floor(data[1] * factor);\n const b = Math.floor(data[2] * factor);\n return `rgb(${r}, ${g}, ${b})`;\n }\n}\n","import { SimulationCanvas } from '../simulation-canvas';\nimport { WaveLayer } from './layer';\n\nexport interface WaveSimulationConfig {\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 readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class WaveSimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: WaveSimulationConfig = {}) {\n super(canvas, new WaveLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\n}\n","import { type Mulberry32, mulberry32 } from '@basmilius/utils';\n\nexport const MULBERRY: Mulberry32 = mulberry32(13);\n","import { hexToRGB } from '@basmilius/utils';\nimport { SimulationLayer } from '../layer';\nimport { MULBERRY } from './consts';\nimport type { WormholeSimulationConfig } from './simulation';\nimport type { WormholeDirection, WormholeParticle } from './types';\n\nexport class WormholeLayer extends SimulationLayer {\n readonly #speed: number;\n readonly #colorRGB: [number, number, number];\n readonly #direction: WormholeDirection;\n readonly #scale: number;\n #count: number;\n #particles: WormholeParticle[] = [];\n #width: number = 960;\n #height: number = 540;\n #initialized: boolean = false;\n\n constructor(config: WormholeSimulationConfig = {}) {\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 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 { SimulationCanvas } from '../simulation-canvas';\nimport { WormholeLayer } from './layer';\n\nexport interface WormholeSimulationConfig {\n readonly count?: number;\n readonly speed?: number;\n readonly color?: string;\n readonly direction?: import('./types').WormholeDirection;\n readonly scale?: number;\n readonly canvasOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport class WormholeSimulation extends SimulationCanvas {\n constructor(canvas: HTMLCanvasElement, config: WormholeSimulationConfig = {}) {\n super(canvas, new WormholeLayer(config), 60, config.canvasOptions ?? {colorSpace: 'display-p3'});\n }\n}\n"],"mappings":"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"}
|