{"version":3,"sources":["../src/types.ts","../src/effects/base.ts","../src/elements/base.ts","../src/elements/background.ts","../src/elements/sun.ts","../src/elements/moon.ts","../src/utils/math.ts","../src/elements/stars.ts","../src/elements/shooting-stars.ts","../src/elements/cloud.ts","../src/elements/fog.ts","../src/elements/lightning.ts","../src/utils/particles.ts","../src/elements/rain.ts","../src/elements/snow.ts","../src/effects/sunny.ts","../src/effects/cloudy.ts","../src/effects/overcast.ts","../src/effects/rainy.ts","../src/effects/snowy.ts","../src/effects/haze.ts","../src/effects/foggy.ts","../src/effects/thunderstorm.ts","../src/effects/custom.ts","../src/renderer.ts","../src/custom-element.ts"],"sourcesContent":["export type WeatherType =\n    | 'sunny'\n    | 'cloudy'\n    | 'overcast'\n    | 'rainy'\n    | 'snowy'\n    | 'haze'\n    | 'foggy'\n    | 'thunderstorm'\n    | string;\n\nexport type TimeMode = 'day' | 'night';\nexport type RenderingContext2D = CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\n\nexport type BackgroundColors = {\n    day: [string, string];\n    night: [string, string];\n};\n\n/**\n * Weather intensity levels\n */\nexport type WeatherIntensity = 'light' | 'moderate' | 'heavy';\n\nexport interface RenderOptions {\n    width?: number;\n    height?: number;\n    fps?: number;\n    wind?: number;\n}\n\nexport interface WeatherConfig {\n    type: WeatherType;\n    mode: TimeMode;\n    intensity?: WeatherIntensity;\n}\n\nexport interface Particle {\n    x: number;\n    y: number;\n    vx: number;\n    vy: number;\n    life: number;\n    maxLife: number;\n    size?: number;\n    opacity?: number;\n    gravity?: number;\n}\n\nexport interface Cloud {\n    x: number;\n    y: number;\n    width: number;\n    height: number;\n    speed: number;\n    opacity: number;\n}\n\nexport interface Star {\n    x: number;\n    y: number;\n    radius: number;\n    opacity: number;\n    twinkleSpeed: number;\n    phase: number;\n}\n\nexport interface IntensityConfig {\n    opacity: number;\n    speed: number;\n    particleCount: number;\n    description: string;\n}\n\n// --- Element Configs ---\n\nexport type CloudStyle = 'rounded' | 'elliptical';\n\nexport interface CloudConfig {\n    count: number;\n    widthRange: [number, number];\n    heightRange: [number, number];\n    speedRange: [number, number];\n    opacityRange: [number, number];\n    yRange: [number, number]; // [min, max] as percentage of height\n    style?: CloudStyle;\n}\n\nexport interface RainConfig {\n    count: number;\n    speed: number;\n    opacity: number;\n}\n\nexport interface SnowConfig {\n    count: number;\n    speed: number;\n    opacity: number;\n}\n\nexport interface FogConfig {\n    count: number;\n    color: string; // 'R, G, B'\n}\n\nexport interface LightningConfig {\n    color?: string;\n}\n\nexport interface MoonConfig {\n    date?: Date;\n}\n\nexport interface StarsConfig {\n    count?: number;\n}\n\nexport interface ShootingStarsConfig {\n    frequency?: number;\n    speed?: number;\n    color?: string;\n    spawnInterval?: {\n        min: number;\n        max: number;\n    };\n    life?: {\n        min: number;\n        max: number;\n    };\n}\n\nexport interface BackgroundConfig {\n    topColor: string;\n    bottomColor: string;\n}\n\n// --- Custom Weather Config ---\n\nexport type WeatherElementType =\n    | 'sun'\n    | 'moon'\n    | 'stars'\n    | 'shooting-stars'\n    | 'cloud'\n    | 'rain'\n    | 'snow'\n    | 'fog'\n    | 'lightning'\n    | 'background';\n\nexport type ElementConfig =\n    | { type: 'sun'; options?: undefined }\n    | { type: 'moon'; options?: MoonConfig }\n    | { type: 'stars'; options?: StarsConfig }\n    | { type: 'shooting-stars'; options?: ShootingStarsConfig }\n    | { type: 'cloud'; options: CloudConfig }\n    | { type: 'rain'; options: RainConfig }\n    | { type: 'snow'; options: SnowConfig }\n    | { type: 'fog'; options: FogConfig }\n    | { type: 'lightning'; options?: LightningConfig }\n    | { type: 'background'; options: BackgroundConfig };\n\nexport interface CustomWeatherConfig {\n    background: {\n        day: [string, string]; // top, bottom\n        night: [string, string];\n    };\n    elements: Array<\n        ElementConfig & {\n            modes?: TimeMode[]; // If undefined, applies to both\n        }\n    >;\n}\n\n// Weather intensity configuration\nexport const INTENSITY_CONFIG = {\n    light: {\n        opacity: 0.6,\n        speed: 0.6,\n        particleCount: 0.5,\n        description: 'Light',\n    },\n    moderate: {\n        opacity: 0.8,\n        speed: 1.0,\n        particleCount: 1.0,\n        description: 'Moderate',\n    },\n    heavy: {\n        opacity: 1.0,\n        speed: 1.4,\n        particleCount: 1.8,\n        description: 'Heavy',\n    },\n};\n\n/**\n * Get intensity configuration\n */\nexport function getIntensityConfig(intensity: WeatherIntensity) {\n    return INTENSITY_CONFIG[intensity];\n}\n","import { IntensityConfig, RenderingContext2D, WeatherIntensity, getIntensityConfig } from '../types';\nimport { WeatherElement } from '../elements';\n\nexport abstract class WeatherEffect {\n    protected ctx: RenderingContext2D;\n    protected width: number;\n    protected height: number;\n    protected time = 0;\n    protected intensity: WeatherIntensity;\n    protected intensityConfig: IntensityConfig;\n    protected wind: number;\n    protected elements: WeatherElement[] = [];\n\n    constructor(\n        ctx: RenderingContext2D,\n        width: number,\n        height: number,\n        intensity: WeatherIntensity = 'moderate',\n        wind: number = 0\n    ) {\n        this.ctx = ctx;\n        this.width = width;\n        this.height = height;\n        this.intensity = intensity;\n        this.wind = wind;\n        this.intensityConfig = getIntensityConfig(intensity);\n    }\n\n    abstract render(time: number): void;\n\n    protected renderElements(time: number): void {\n        this.elements.forEach(element => element.render(time));\n    }\n\n    update(): void {\n        this.time += 1;\n        this.elements.forEach(element => element.update(this.time));\n    }\n\n    setWind(wind: number): void {\n        this.wind = wind;\n        this.elements.forEach(element => {\n            if (element.setWind) {\n                element.setWind(wind);\n            }\n        });\n    }\n\n    resize(width: number, height: number): void {\n        this.width = width;\n        this.height = height;\n        this.elements.forEach(element => element.resize(width, height));\n    }\n\n    protected getParticleCount(baseCount: number): number {\n        return Math.ceil(baseCount * this.intensityConfig.particleCount);\n    }\n\n    protected getSpeed(baseSpeed: number): number {\n        return baseSpeed * this.intensityConfig.speed;\n    }\n\n    protected getOpacity(baseOpacity: number): number {\n        return baseOpacity * this.intensityConfig.opacity;\n    }\n\n    // Deprecated helper methods (kept just in case subclasses still use them directly for some reason,\n    // but they should move to elements)\n    protected drawGradient(\n        x1: number,\n        y1: number,\n        x2: number,\n        y2: number,\n        stops: Array<[number, string]>\n    ): CanvasGradient {\n        const gradient = this.ctx.createLinearGradient(x1, y1, x2, y2);\n        stops.forEach(([offset, color]) => {\n            gradient.addColorStop(offset, color);\n        });\n        return gradient;\n    }\n\n    protected drawRadialGradient(\n        x: number,\n        y: number,\n        r1: number,\n        r2: number,\n        stops: Array<[number, string]>\n    ): CanvasGradient {\n        const gradient = this.ctx.createRadialGradient(x, y, r1, x, y, r2);\n        stops.forEach(([offset, color]) => {\n            gradient.addColorStop(offset, color);\n        });\n        return gradient;\n    }\n}\n","import { RenderingContext2D } from '../types';\n\nexport interface WeatherElement {\n    update(time?: number): void;\n    render(time?: number): void;\n    resize(width: number, height: number): void;\n    setWind?(wind: number): void;\n    destroy?(): void;\n}\n\nexport abstract class BaseElement implements WeatherElement {\n    protected ctx: RenderingContext2D;\n    protected width: number;\n    protected height: number;\n\n    constructor(ctx: RenderingContext2D, width: number, height: number) {\n        this.ctx = ctx;\n        this.width = width;\n        this.height = height;\n    }\n\n    abstract update(time?: number): void;\n    abstract render(time?: number): void;\n\n    resize(width: number, height: number): void {\n        this.width = width;\n        this.height = height;\n    }\n\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    setWind(_wind: number): void {\n        // Optional override\n    }\n\n    destroy(): void {\n        // Optional override\n    }\n}\n","import { BaseElement } from './base';\nimport { RenderingContext2D } from '../types';\n\nexport interface BackgroundConfig {\n    topColor: string;\n    bottomColor: string;\n}\n\nexport class BackgroundElement extends BaseElement {\n    private config: BackgroundConfig;\n\n    constructor(ctx: RenderingContext2D, width: number, height: number, config: BackgroundConfig) {\n        super(ctx, width, height);\n        this.config = config;\n    }\n\n    update(): void {\n        // Static element\n    }\n\n    render(): void {\n        const gradient = this.ctx.createLinearGradient(0, 0, 0, this.height);\n        gradient.addColorStop(0, this.config.topColor);\n        gradient.addColorStop(1, this.config.bottomColor);\n        this.ctx.fillStyle = gradient;\n        this.ctx.fillRect(0, 0, this.width, this.height);\n    }\n\n    setConfig(config: BackgroundConfig): void {\n        this.config = config;\n    }\n}\n","import { BaseElement } from './base';\nimport { RenderingContext2D } from '../types';\n\nexport class SunElement extends BaseElement {\n    constructor(ctx: RenderingContext2D, width: number, height: number) {\n        super(ctx, width, height);\n    }\n\n    update(): void {\n        // Static element (for now)\n    }\n\n    render(): void {\n        const sunX = this.width * 0.75;\n        const sunY = this.height * 0.25;\n        const sunRadius = 40;\n\n        // Sun glow\n        const glowGradient = this.ctx.createRadialGradient(sunX, sunY, sunRadius * 0.5, sunX, sunY, sunRadius * 2);\n        glowGradient.addColorStop(0, 'rgba(255, 223, 0, 0.3)');\n        glowGradient.addColorStop(1, 'rgba(255, 223, 0, 0)');\n        this.ctx.fillStyle = glowGradient;\n        this.ctx.fillRect(sunX - sunRadius * 2, sunY - sunRadius * 2, sunRadius * 4, sunRadius * 4);\n\n        // Sun\n        this.ctx.fillStyle = '#ffd700';\n        this.ctx.beginPath();\n        this.ctx.arc(sunX, sunY, sunRadius, 0, Math.PI * 2);\n        this.ctx.fill();\n    }\n}\n","import { BaseElement } from './base';\nimport { RenderingContext2D, MoonConfig } from '../types';\n\nexport class MoonElement extends BaseElement {\n    private phase: number = 0.5; // Default to Full Moon (0.5)\n\n    constructor(ctx: RenderingContext2D, width: number, height: number, config?: MoonConfig) {\n        super(ctx, width, height);\n        this.phase = this.getMoonPhase(config?.date ?? new Date());\n    }\n\n    /**\n     * Calculate moon phase (0 to 1)\n     * 0: New Moon\n     * 0.25: First Quarter\n     * 0.5: Full Moon\n     * 0.75: Last Quarter\n     */\n    private getMoonPhase(date: Date): number {\n        // Known new moon: 2000-01-06 18:14 UTC\n        const knownNewMoon = new Date('2000-01-06T18:14:00Z').getTime();\n        const cycle = 29.530588853;\n        const diffTime = date.getTime() - knownNewMoon;\n        const diffDays = diffTime / (1000 * 60 * 60 * 24);\n\n        let phase = (diffDays % cycle) / cycle;\n        if (phase < 0) phase += 1;\n        return phase;\n    }\n\n    update(): void {\n        // Static element\n    }\n\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    render(_time?: number): void {\n        const moonX = this.width * 0.75;\n        const moonY = this.height * 0.25;\n        const moonRadius = 35;\n\n        // Moon glow\n        // Adjust glow brightness based on phase (full moon = brightest)\n        // Phase 0.5 is max brightness, 0/1 is min\n        const brightness = Math.sin(this.phase * Math.PI); // 0 to 1\n        const glowOpacity = 0.2 * (0.2 + 0.8 * brightness);\n\n        const glowGradient = this.ctx.createRadialGradient(\n            moonX,\n            moonY,\n            moonRadius * 0.5,\n            moonX,\n            moonY,\n            moonRadius * 2\n        );\n        glowGradient.addColorStop(0, `rgba(240, 248, 255, ${glowOpacity})`);\n        glowGradient.addColorStop(1, 'rgba(240, 248, 255, 0)');\n        this.ctx.fillStyle = glowGradient;\n        this.ctx.fillRect(moonX - moonRadius * 2, moonY - moonRadius * 2, moonRadius * 4, moonRadius * 4);\n\n        // Moon Phase Clipping\n        this.ctx.save();\n        this.ctx.beginPath();\n\n        // If effectively New Moon, draw nothing for the disc\n        if (this.phase < 0.02 || this.phase > 0.98) {\n            this.ctx.restore();\n            return;\n        }\n\n        // If effectively Full Moon, draw circle\n        if (Math.abs(this.phase - 0.5) < 0.02) {\n            this.ctx.arc(moonX, moonY, moonRadius, 0, Math.PI * 2);\n        } else {\n            const isWaxing = this.phase < 0.5;\n            // w is the width of the terminator ellipse from center\n            // +w means bulging right, -w means bulging left relative to vertical axis\n            // However, we need to be careful with orientation\n            const w = moonRadius * Math.cos(this.phase * 2 * Math.PI);\n\n            if (isWaxing) {\n                // Waxing: Light on Right.\n                // 1. Outer Arc: Top to Bottom (Clockwise)\n                this.ctx.arc(moonX, moonY, moonRadius, -Math.PI / 2, Math.PI / 2, false);\n\n                // 2. Terminator: Bottom to Top\n                // w > 0 (Crescent): Curve to Right (CounterClockwise)\n                // w < 0 (Gibbous): Curve to Left (Clockwise)\n                // We use ellipse to connect PI/2 back to -Math.PI/2 (same as 3PI/2)\n                this.ctx.ellipse(moonX, moonY, Math.abs(w), moonRadius, 0, Math.PI / 2, (3 * Math.PI) / 2, w > 0);\n            } else {\n                // Waning: Light on Left.\n                // 1. Outer Arc: Bottom to Top (Clockwise)\n                this.ctx.arc(moonX, moonY, moonRadius, Math.PI / 2, (3 * Math.PI) / 2, false);\n\n                // 2. Terminator: Top to Bottom\n                // w < 0 (Gibbous): Curve to Left (CounterClockwise)\n                // w > 0 (Crescent): Curve to Right (Clockwise)\n                this.ctx.ellipse(moonX, moonY, Math.abs(w), moonRadius, 0, (3 * Math.PI) / 2, (5 * Math.PI) / 2, w < 0);\n            }\n        }\n\n        this.ctx.closePath();\n        this.ctx.clip();\n\n        // Moon Body\n        this.ctx.fillStyle = '#f0f8ff';\n        this.ctx.fillRect(moonX - moonRadius, moonY - moonRadius, moonRadius * 2, moonRadius * 2);\n\n        // Moon craters (will be clipped)\n        this.ctx.fillStyle = 'rgba(200, 210, 220, 0.3)';\n        this.ctx.beginPath();\n        this.ctx.arc(moonX - 10, moonY - 8, 6, 0, Math.PI * 2);\n        this.ctx.fill();\n        this.ctx.beginPath();\n        this.ctx.arc(moonX + 8, moonY + 5, 4, 0, Math.PI * 2);\n        this.ctx.fill();\n\n        this.ctx.restore();\n    }\n}\n","// src/utils/math.ts\n\nexport function randomBetween(min: number, max: number): number {\n    return Math.random() * (max - min) + min;\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n    return Math.max(min, Math.min(max, value));\n}\n\nexport function easeInOutQuad(t: number): number {\n    return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n}\n\nexport function easeInOutCubic(t: number): number {\n    return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;\n}\n","import { BaseElement } from './base';\nimport { RenderingContext2D, Star } from '../types';\nimport { randomBetween } from '../utils/math';\n\nexport class StarsElement extends BaseElement {\n    private stars: Star[] = [];\n    private starsInitialized = false;\n    private count: number;\n\n    constructor(ctx: RenderingContext2D, width: number, height: number, config: { count?: number } = {}) {\n        super(ctx, width, height);\n        this.count = config.count || 100;\n    }\n\n    private initializeStars(): void {\n        if (this.starsInitialized) {\n            return;\n        }\n\n        this.stars = [];\n        for (let i = 0; i < this.count; i++) {\n            this.stars.push({\n                x: Math.random() * this.width,\n                y: Math.random() * (this.height * 0.6),\n                radius: randomBetween(0.5, 1.5),\n                opacity: 0.5,\n                twinkleSpeed: randomBetween(0.02, 0.05),\n                phase: Math.random() * Math.PI * 2,\n            });\n        }\n\n        this.starsInitialized = true;\n    }\n\n    update(): void {\n        // Initialize if needed (lazy init)\n        if (!this.starsInitialized) {\n            this.initializeStars();\n        }\n    }\n\n    render(): void {\n        if (!this.starsInitialized) {\n            this.initializeStars();\n        }\n\n        this.stars.forEach(star => {\n            star.phase += star.twinkleSpeed;\n            const opacity = 0.5 + Math.sin(star.phase) * 0.5;\n\n            this.ctx.fillStyle = `rgba(255, 255, 255, ${opacity})`;\n            this.ctx.beginPath();\n            this.ctx.arc(star.x, star.y, star.radius, 0, Math.PI * 2);\n            this.ctx.fill();\n        });\n    }\n\n    resize(width: number, height: number): void {\n        super.resize(width, height);\n        this.starsInitialized = false;\n        this.stars = [];\n    }\n}\n","import { BaseElement } from './base';\nimport { RenderingContext2D, ShootingStarsConfig } from '../types';\nimport { randomBetween } from '../utils/math';\n\ninterface ShootingStarParticle {\n    x: number;\n    y: number;\n    length: number;\n    speed: number;\n    angle: number;\n    opacity: number;\n    life: number;\n    maxLife: number;\n    trail: { x: number; y: number; opacity: number }[];\n}\n\nexport class ShootingStarsElement extends BaseElement {\n    private stars: ShootingStarParticle[] = [];\n    private lastSpawnTime = 0;\n    private spawnInterval: number;\n    private options: ShootingStarsConfig;\n\n    constructor(ctx: RenderingContext2D, width: number, height: number, options: ShootingStarsConfig = {}) {\n        super(ctx, width, height);\n        this.options = options;\n        // Randomize spawn interval between 2 and 5 seconds initially\n        if (this.options.spawnInterval) {\n            this.spawnInterval = randomBetween(this.options.spawnInterval.min, this.options.spawnInterval.max);\n        } else {\n            this.spawnInterval = randomBetween(2000, 5000);\n        }\n    }\n\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    update(_time: number): void {\n        const now = Date.now();\n\n        // Spawn new shooting star\n        if (now - this.lastSpawnTime > this.spawnInterval) {\n            this.spawnStar();\n            this.lastSpawnTime = now;\n            // Reset interval for next star\n            if (this.options.spawnInterval) {\n                this.spawnInterval = randomBetween(this.options.spawnInterval.min, this.options.spawnInterval.max);\n            } else {\n                this.spawnInterval = randomBetween(1000, 4000);\n            }\n        }\n\n        // Update existing stars\n        for (let i = this.stars.length - 1; i >= 0; i--) {\n            const star = this.stars[i] as ShootingStarParticle;\n\n            // Save current position for trail\n            star.trail.unshift({ x: star.x, y: star.y, opacity: star.opacity });\n            if (star.trail.length > 10) {\n                star.trail.pop();\n            }\n\n            // Move star\n            star.x += Math.cos(star.angle) * star.speed;\n            star.y += Math.sin(star.angle) * star.speed;\n\n            // Fade in/out logic\n            star.life--;\n            if (star.life < 20) {\n                star.opacity = star.life / 20;\n            } else if (star.opacity < 1 && star.maxLife - star.life < 20) {\n                star.opacity = (star.maxLife - star.life) / 20;\n            }\n\n            // Remove if dead or out of bounds (with some margin)\n            if (\n                star.life <= 0 ||\n                star.x < -100 ||\n                star.x > this.width + 100 ||\n                star.y < -100 ||\n                star.y > this.height + 100\n            ) {\n                this.stars.splice(i, 1);\n            }\n        }\n    }\n\n    private spawnStar(): void {\n        // Start from a random position, often outside the screen or near edges\n        // Strategy: Pick a random side to start from (top, left, right)\n\n        const side = Math.floor(Math.random() * 3); // 0: top, 1: left, 2: right\n        let startX, startY, angle;\n\n        if (side === 0) {\n            // Top\n            startX = randomBetween(0, this.width);\n            startY = -50;\n            // Angle pointing down-ish\n            angle = randomBetween(Math.PI / 4, (3 * Math.PI) / 4);\n        } else if (side === 1) {\n            // Left\n            startX = -50;\n            startY = randomBetween(0, this.height * 0.5); // Top half\n            // Angle pointing right-ish\n            angle = randomBetween(-Math.PI / 4, Math.PI / 4);\n        } else {\n            // Right\n            startX = this.width + 50;\n            startY = randomBetween(0, this.height * 0.5); // Top half\n            // Angle pointing left-ish\n            angle = randomBetween((3 * Math.PI) / 4, (5 * Math.PI) / 4);\n        }\n\n        // Override with totally random direction as requested \"from different directions\"\n        // But let's make it look good - usually across the sky.\n        // Let's try totally random start point in the top half extended area\n\n        startX = randomBetween(-this.width * 0.2, this.width * 1.2);\n        startY = randomBetween(-this.height * 0.2, this.height * 0.5);\n\n        // Target a point in the central/lower area to ensure it crosses the screen\n        const targetX = randomBetween(this.width * 0.2, this.width * 0.8);\n        const targetY = randomBetween(this.height * 0.3, this.height * 0.8);\n\n        angle = Math.atan2(targetY - startY, targetX - startX);\n\n        const life = this.options.life\n            ? randomBetween(this.options.life.min, this.options.life.max)\n            : randomBetween(60, 100);\n\n        this.stars.push({\n            x: startX,\n            y: startY,\n            length: randomBetween(50, 150),\n            speed: randomBetween(15, 25),\n            angle: angle,\n            opacity: 0,\n            life: life, // Frames roughly\n            maxLife: 100, // placeholder, will set in logic\n            trail: [],\n        });\n\n        // Update maxLife for correct fade in\n        this.stars[this.stars.length - 1]!.maxLife = this.stars[this.stars.length - 1]!.life;\n    }\n\n    render(): void {\n        this.ctx.save();\n        this.ctx.lineCap = 'round';\n\n        for (let i = 0; i < this.stars.length; i++) {\n            const star = this.stars[i] as ShootingStarParticle;\n\n            // Draw head\n            // this.ctx.beginPath();\n            // this.ctx.fillStyle = `rgba(255, 255, 255, ${star.opacity})`;\n            // this.ctx.arc(star.x, star.y, 1.5, 0, Math.PI * 2);\n            // this.ctx.fill();\n\n            // Draw trail\n            if (star.trail.length > 0) {\n                const gradient = this.ctx.createLinearGradient(\n                    star.trail[star.trail.length - 1]!.x,\n                    star.trail[star.trail.length - 1]!.y,\n                    star.x,\n                    star.y\n                );\n                gradient.addColorStop(0, `rgba(255, 255, 255, 0)`);\n                gradient.addColorStop(1, `rgba(255, 255, 255, ${star.opacity})`);\n\n                this.ctx.strokeStyle = gradient;\n                this.ctx.lineWidth = 2;\n\n                this.ctx.beginPath();\n                // Draw line from end of trail to current pos\n                const tailEnd = star.trail[star.trail.length - 1]!;\n                this.ctx.moveTo(tailEnd.x, tailEnd.y);\n                this.ctx.lineTo(star.x, star.y);\n                this.ctx.stroke();\n            }\n        }\n\n        this.ctx.restore();\n    }\n}\n","import { BaseElement } from './base';\nimport { RenderingContext2D, Cloud, TimeMode, CloudConfig } from '../types';\nimport { randomBetween } from '../utils/math';\n\nexport class CloudElement extends BaseElement {\n    private clouds: Cloud[] = [];\n    private cloudsInitialized = false;\n    private config: CloudConfig;\n    private currentWind: number = 0;\n    private mode: TimeMode = 'day'; // Default mode\n\n    constructor(ctx: RenderingContext2D, width: number, height: number, config: CloudConfig) {\n        super(ctx, width, height);\n        this.config = config;\n    }\n\n    setMode(mode: TimeMode): void {\n        this.mode = mode;\n    }\n\n    private initializeClouds(): void {\n        if (this.cloudsInitialized) {\n            return;\n        }\n\n        this.clouds = [];\n        for (let i = 0; i < this.config.count; i++) {\n            const yMin = this.height * this.config.yRange[0];\n            const yMax = this.height * this.config.yRange[1];\n            this.clouds.push({\n                x: Math.random() * this.width,\n                y: Math.random() * (yMax - yMin) + yMin,\n                width: randomBetween(this.config.widthRange[0], this.config.widthRange[1]),\n                height: randomBetween(this.config.heightRange[0], this.config.heightRange[1]),\n                speed: randomBetween(this.config.speedRange[0], this.config.speedRange[1]),\n                opacity: randomBetween(this.config.opacityRange[0], this.config.opacityRange[1]),\n            });\n        }\n\n        this.cloudsInitialized = true;\n    }\n\n    update(): void {\n        if (!this.cloudsInitialized) {\n            this.initializeClouds();\n        }\n\n        this.clouds.forEach(cloud => {\n            cloud.x += cloud.speed + this.currentWind;\n            if (cloud.x > this.width + cloud.width) {\n                cloud.x = -cloud.width;\n            } else if (cloud.x < -cloud.width) {\n                cloud.x = this.width + cloud.width;\n            }\n        });\n    }\n\n    render(): void {\n        if (!this.cloudsInitialized) {\n            this.initializeClouds();\n        }\n\n        this.clouds.forEach(cloud => {\n            const cloudColor =\n                this.mode === 'night' ? `rgba(70, 80, 90, ${cloud.opacity})` : `rgba(255, 255, 255, ${cloud.opacity})`;\n\n            this.ctx.fillStyle = cloudColor;\n            if (this.config.style === 'elliptical') {\n                this.drawEllipticalCloud(cloud.x, cloud.y, cloud.width, cloud.height);\n            } else {\n                this.drawRoundedCloud(cloud.x, cloud.y, cloud.width, cloud.height);\n            }\n        });\n    }\n\n    setWind(wind: number): void {\n        this.currentWind = wind;\n    }\n\n    resize(width: number, height: number): void {\n        super.resize(width, height);\n        this.cloudsInitialized = false;\n        this.clouds = [];\n    }\n\n    private drawRoundedCloud(x: number, y: number, w: number, h: number): void {\n        this.ctx.beginPath();\n        this.ctx.arc(x, y, h * 0.6, 0, Math.PI * 2);\n        this.ctx.arc(x + w * 0.3, y - h * 0.2, h * 0.7, 0, Math.PI * 2);\n        this.ctx.arc(x + w * 0.7, y, h * 0.6, 0, Math.PI * 2);\n        this.ctx.arc(x + w * 0.5, y + h * 0.2, h * 0.5, 0, Math.PI * 2);\n        this.ctx.fill();\n    }\n\n    private drawEllipticalCloud(x: number, y: number, w: number, h: number): void {\n        this.ctx.beginPath();\n        this.ctx.ellipse(x + w * 0.15, y + h * 0.5, w * 0.25, h * 0.5, 0, 0, Math.PI * 2);\n        this.ctx.fill();\n\n        this.ctx.beginPath();\n        this.ctx.ellipse(x + w * 0.4, y, w * 0.3, h * 0.6, 0, 0, Math.PI * 2);\n        this.ctx.fill();\n\n        this.ctx.beginPath();\n        this.ctx.ellipse(x + w * 0.65, y + h * 0.3, w * 0.28, h * 0.55, 0, 0, Math.PI * 2);\n        this.ctx.fill();\n\n        this.ctx.beginPath();\n        this.ctx.ellipse(x + w * 0.85, y + h * 0.5, w * 0.25, h * 0.5, 0, 0, Math.PI * 2);\n        this.ctx.fill();\n    }\n}\n","import { BaseElement } from './base';\nimport { RenderingContext2D, FogConfig } from '../types';\nimport { randomBetween } from '../utils/math';\n\ninterface FogParticle {\n    x: number;\n    y: number;\n    radius: number;\n    speed: number;\n    opacity: number;\n}\n\nexport class FogElement extends BaseElement {\n    private particles: FogParticle[] = [];\n    private particlesInitialized = false;\n    private config: FogConfig;\n    private currentWind: number = 0;\n\n    constructor(ctx: RenderingContext2D, width: number, height: number, config: FogConfig) {\n        super(ctx, width, height);\n        this.config = config;\n    }\n\n    private initParticles(): void {\n        if (this.particlesInitialized) {\n            return;\n        }\n\n        this.particles = [];\n        for (let i = 0; i < this.config.count; i++) {\n            this.particles.push({\n                x: Math.random() * this.width,\n                y: Math.random() * this.height,\n                radius: randomBetween(30, 70),\n                speed: randomBetween(0.2, 0.7),\n                opacity: randomBetween(0.05, 0.2),\n            });\n        }\n\n        this.particlesInitialized = true;\n    }\n\n    update(): void {\n        if (!this.particlesInitialized) {\n            this.initParticles();\n        }\n\n        this.particles.forEach(particle => {\n            particle.x += particle.speed + this.currentWind;\n\n            if (particle.x > this.width + particle.radius) {\n                particle.x = -particle.radius;\n            } else if (particle.x < -particle.radius) {\n                particle.x = this.width + particle.radius;\n            }\n        });\n    }\n\n    render(): void {\n        if (!this.particlesInitialized) {\n            this.initParticles();\n        }\n\n        this.particles.forEach(particle => {\n            const gradient = this.ctx.createRadialGradient(\n                particle.x,\n                particle.y,\n                0,\n                particle.x,\n                particle.y,\n                particle.radius\n            );\n            gradient.addColorStop(0, `rgba(${this.config.color}, ${particle.opacity})`);\n            gradient.addColorStop(1, `rgba(${this.config.color}, 0)`);\n\n            this.ctx.fillStyle = gradient;\n            this.ctx.beginPath();\n            this.ctx.arc(particle.x, particle.y, particle.radius, 0, Math.PI * 2);\n            this.ctx.fill();\n        });\n    }\n\n    setWind(wind: number): void {\n        this.currentWind = wind;\n    }\n\n    resize(width: number, height: number): void {\n        super.resize(width, height);\n        this.particlesInitialized = false;\n        this.particles = [];\n    }\n}\n","import { BaseElement } from './base';\nimport { RenderingContext2D } from '../types';\n\nexport class LightningElement extends BaseElement {\n    private lightningFlash = 0;\n    private config: { color: string } = { color: '255, 255, 200' };\n\n    constructor(ctx: RenderingContext2D, width: number, height: number, config: { color?: string } = {}) {\n        super(ctx, width, height);\n        if (config.color) {\n            this.config.color = config.color;\n        }\n    }\n\n    update(): void {\n        // Random lightning flash\n        if (Math.random() < 0.01) {\n            this.lightningFlash = 1;\n        }\n\n        if (this.lightningFlash > 0) {\n            this.lightningFlash -= 0.05;\n        }\n    }\n\n    render(): void {\n        if (this.lightningFlash > 0) {\n            // Draw flash overlay\n            this.ctx.fillStyle = `rgba(255, 255, 255, ${this.lightningFlash * 0.3})`;\n            this.ctx.fillRect(0, 0, this.width, this.height);\n\n            // Draw lightning bolt\n            if (this.lightningFlash > 0.7) {\n                this.ctx.strokeStyle = `rgba(${this.config.color}, ${this.lightningFlash})`;\n                this.ctx.lineWidth = 3;\n                this.ctx.beginPath();\n\n                let x = this.width * 0.3 + Math.random() * this.width * 0.4;\n                let y = 0;\n                this.ctx.moveTo(x, y);\n\n                for (let i = 0; i < 5; i++) {\n                    x += (Math.random() - 0.5) * 40;\n                    y += this.height / 5;\n                    this.ctx.lineTo(x, y);\n                }\n\n                this.ctx.stroke();\n            }\n        }\n    }\n\n    resize(width: number, height: number): void {\n        super.resize(width, height);\n        this.lightningFlash = 0;\n    }\n}\n","// src/utils/particles.ts\n\nimport { Particle } from '../types';\nimport { clamp } from './math';\n\nexport class ParticlePool {\n    private pool: Particle[] = [];\n    private active: Particle[] = [];\n\n    constructor(initialSize: number = 100) {\n        for (let i = 0; i < initialSize; i++) {\n            this.pool.push(this.createParticle());\n        }\n    }\n\n    private createParticle(): Particle {\n        return {\n            x: 0,\n            y: 0,\n            vx: 0,\n            vy: 0,\n            life: 1,\n            maxLife: 1,\n            size: 2,\n            opacity: 1,\n        };\n    }\n\n    get(x: number, y: number, vx: number, vy: number, life: number, gravity: number = 0): Particle {\n        let particle: Particle;\n        if (this.pool.length > 0) {\n            particle = this.pool.pop()!;\n        } else {\n            particle = this.createParticle();\n        }\n        particle.x = x;\n        particle.y = y;\n        particle.vx = vx;\n        particle.vy = vy;\n        particle.life = 1;\n        particle.maxLife = life;\n        particle.opacity = 1;\n        particle.gravity = gravity;\n        this.active.push(particle);\n        return particle;\n    }\n\n    update(): void {\n        for (let i = this.active.length - 1; i >= 0; i--) {\n            const p = this.active[i] as Particle;\n            p.life -= 1 / p.maxLife;\n            p.opacity = clamp(p.life, 0, 1);\n\n            if (p.life <= 0) {\n                this.pool.push(this.active.splice(i, 1)[0] as Particle);\n            } else {\n                if (p.gravity) {\n                    p.vy += p.gravity;\n                }\n                p.x += p.vx;\n                p.y += p.vy;\n            }\n        }\n    }\n\n    getActive(): Particle[] {\n        return this.active;\n    }\n\n    clear(): void {\n        this.pool.push(...this.active);\n        this.active = [];\n    }\n}\n","import { BaseElement } from './base';\nimport { RenderingContext2D, RainConfig } from '../types';\nimport { ParticlePool } from '../utils/particles';\nimport { randomBetween } from '../utils/math';\n\ninterface RainDrop {\n    x: number;\n    y: number;\n    length: number;\n    speed: number;\n    opacity: number;\n}\n\nexport class RainElement extends BaseElement {\n    private rainDrops: RainDrop[] = [];\n    private particlesInitialized = false;\n    private splashPool: ParticlePool;\n    private config: RainConfig;\n    private currentWind: number = 0;\n\n    constructor(ctx: RenderingContext2D, width: number, height: number, config: RainConfig) {\n        super(ctx, width, height);\n        this.config = config;\n        this.splashPool = new ParticlePool(100);\n    }\n\n    private initRainDrops(): void {\n        if (this.particlesInitialized) {\n            return;\n        }\n\n        this.rainDrops = [];\n        for (let i = 0; i < this.config.count; i++) {\n            this.rainDrops.push({\n                x: Math.random() * this.width,\n                y: Math.random() * this.height,\n                length: randomBetween(10, 30),\n                speed: this.config.speed * randomBetween(1, 2), // vary speed slightly\n                opacity: randomBetween(0.5, 1) * this.config.opacity,\n            });\n        }\n\n        this.particlesInitialized = true;\n    }\n\n    update(): void {\n        if (!this.particlesInitialized) {\n            this.initRainDrops();\n        }\n\n        this.rainDrops.forEach(drop => {\n            drop.y += drop.speed;\n            drop.x += this.currentWind;\n\n            if (this.currentWind > 0 && drop.x > this.width) {\n                drop.x = -20;\n            } else if (this.currentWind < 0 && drop.x < -20) {\n                drop.x = this.width;\n            }\n\n            if (drop.y > this.height) {\n                this.createSplash(drop.x, this.height);\n                drop.y = -drop.length;\n                drop.x = Math.random() * this.width;\n            }\n        });\n\n        this.splashPool.update();\n    }\n\n    render(): void {\n        if (!this.particlesInitialized) {\n            this.initRainDrops();\n        }\n\n        // Draw Rain\n        this.rainDrops.forEach(drop => {\n            this.ctx.strokeStyle = `rgba(174, 194, 224, ${drop.opacity})`;\n            this.ctx.lineWidth = 1;\n            this.ctx.beginPath();\n            this.ctx.moveTo(drop.x, drop.y);\n            this.ctx.lineTo(drop.x + this.currentWind * 2, drop.y + drop.length);\n            this.ctx.stroke();\n        });\n\n        // Draw Splashes\n        const particles = this.splashPool.getActive();\n        this.ctx.fillStyle = 'rgba(174, 194, 224, 0.6)';\n\n        particles.forEach(p => {\n            this.ctx.beginPath();\n            this.ctx.arc(p.x, p.y, 1, 0, Math.PI * 2);\n            this.ctx.fill();\n        });\n    }\n\n    private createSplash(x: number, y: number): void {\n        const count = Math.floor(randomBetween(2, 4));\n        for (let i = 0; i < count; i++) {\n            const vx = randomBetween(-1, 1);\n            const vy = randomBetween(-2, -4.5);\n            const life = randomBetween(10, 20);\n            this.splashPool.get(x, y, vx, vy, life, 0.2);\n        }\n    }\n\n    setWind(wind: number): void {\n        this.currentWind = wind;\n    }\n\n    resize(width: number, height: number): void {\n        super.resize(width, height);\n        this.particlesInitialized = false;\n        this.rainDrops = [];\n        // clear splashes?\n        // this.splashPool.clear(); // Maybe not needed, they will just die out or be off screen\n    }\n}\n","import { BaseElement } from './base';\nimport { RenderingContext2D, SnowConfig } from '../types';\nimport { ParticlePool } from '../utils/particles';\nimport { randomBetween } from '../utils/math';\n\nexport class SnowElement extends BaseElement {\n    private particlePool: ParticlePool;\n    private config: SnowConfig;\n    private currentWind: number = 0;\n\n    constructor(ctx: RenderingContext2D, width: number, height: number, config: SnowConfig) {\n        super(ctx, width, height);\n        this.config = config;\n        this.particlePool = new ParticlePool(config.count);\n        this.initSnow();\n    }\n\n    private initSnow(): void {\n        // Pre-fill managed by pool on demand\n    }\n\n    update(): void {\n        // Emit new snowflakes\n        // Logic: config.count is emission density.\n        // In SnowyEffect logic, we want to maintain N snowflakes.\n        // ParticlePool doesn't automatically maintain count.\n        // So we emit up to config.count per frame? No that's too many.\n        // SnowyEffect was: for (let i = 0; i < snowflakeCount; i++) { ... } where snowflakeCount ~ 4\n        // So config.count should be small (emission rate).\n\n        for (let i = 0; i < this.config.count; i++) {\n            const speed = this.config.speed * randomBetween(1, 3);\n            const snowflake = this.particlePool.get(\n                Math.random() * this.width,\n                Math.random() * this.height - this.height, // start above\n                this.currentWind + randomBetween(-1, 1),\n                speed,\n                this.height / 2 // life\n            );\n            snowflake.size = randomBetween(2, 6) * (this.config.opacity / 0.8);\n        }\n\n        this.particlePool.update();\n\n        // Update wind for active particles is handled by emission direction + gravity/update logic\n        // We could modify active particles here if we wanted wind changes to affect falling snow.\n    }\n\n    render(): void {\n        this.ctx.fillStyle = 'rgba(255, 255, 255, 0.9)';\n        this.particlePool.getActive().forEach(particle => {\n            this.ctx.globalAlpha = particle.opacity!;\n            this.drawSnowflake(particle.x, particle.y, particle.size!);\n        });\n        this.ctx.globalAlpha = 1;\n    }\n\n    private drawSnowflake(x: number, y: number, size: number): void {\n        this.ctx.save();\n        this.ctx.translate(x, y);\n\n        for (let i = 0; i < 6; i++) {\n            this.ctx.rotate((Math.PI * 2) / 6);\n            this.ctx.beginPath();\n            this.ctx.moveTo(0, 0);\n            this.ctx.lineTo(0, -size);\n            this.ctx.stroke();\n\n            this.ctx.beginPath();\n            this.ctx.moveTo(-size * 0.3, -size * 0.7);\n            this.ctx.lineTo(size * 0.3, -size * 0.7);\n            this.ctx.stroke();\n        }\n\n        this.ctx.restore();\n    }\n\n    setWind(wind: number): void {\n        this.currentWind = wind;\n        this.particlePool.getActive().forEach(p => {\n            p.vx = wind + randomBetween(-1, 1);\n        });\n    }\n\n    resize(width: number, height: number): void {\n        super.resize(width, height);\n        this.particlePool.clear(); // Clear active particles\n    }\n}\n","import {\n    BackgroundElement,\n    CloudElement,\n    MoonElement,\n    ShootingStarsElement,\n    StarsElement,\n    SunElement,\n} from '../elements';\nimport { BackgroundColors, CloudConfig, RenderingContext2D, TimeMode, WeatherIntensity } from '../types';\nimport { WeatherEffect } from './base';\n\nconst BACKGROUND_COLORS: BackgroundColors = {\n    day: ['#4a90e2', '#87ceeb'],\n    night: ['#0a1128', '#1e3a5f'],\n};\n\nexport class SunnyEffect extends WeatherEffect {\n    constructor(\n        ctx: RenderingContext2D,\n        width: number,\n        height: number,\n        private mode: TimeMode = 'day',\n        intensity: WeatherIntensity = 'moderate',\n        wind: number = 0\n    ) {\n        super(ctx, width, height, intensity, wind);\n\n        // 1. Background\n        const bgColors = this.mode === 'night' ? BACKGROUND_COLORS.night : BACKGROUND_COLORS.day;\n        this.elements.push(\n            new BackgroundElement(ctx, width, height, {\n                topColor: bgColors[0],\n                bottomColor: bgColors[1],\n            })\n        );\n\n        // 2. Stars and Shooting Stars (Night only)\n        if (this.mode === 'night') {\n            this.elements.push(new StarsElement(ctx, width, height));\n            this.elements.push(new ShootingStarsElement(ctx, width, height));\n        }\n\n        // 3. Sun (Day) or Moon (Night)\n        if (this.mode === 'day') {\n            this.elements.push(new SunElement(ctx, width, height));\n        } else {\n            this.elements.push(new MoonElement(ctx, width, height));\n        }\n\n        // 4. Clouds\n        const cloudConfig: CloudConfig = {\n            count: 3,\n            widthRange: [80, 120],\n            heightRange: [30, 40],\n            speedRange: [0.1, 0.3],\n            opacityRange: [0.4, 0.5],\n            yRange: [0.1, 0.5],\n        };\n        // Adjust speed based on intensity\n        const speedMult = this.intensityConfig.speed;\n        cloudConfig.speedRange = [cloudConfig.speedRange[0] * speedMult, cloudConfig.speedRange[1] * speedMult];\n\n        const cloudElement = new CloudElement(ctx, width, height, cloudConfig);\n        cloudElement.setMode(this.mode);\n        cloudElement.setWind(this.wind);\n        this.elements.push(cloudElement);\n    }\n\n    render(time: number): void {\n        this.renderElements(time);\n    }\n}\n","import {\n    BackgroundElement,\n    CloudElement,\n    MoonElement,\n    ShootingStarsElement,\n    StarsElement,\n    SunElement,\n} from '../elements';\nimport { BackgroundColors, CloudConfig, RenderingContext2D, TimeMode, WeatherIntensity } from '../types';\nimport { WeatherEffect } from './base';\n\nconst BACKGROUND_COLORS: BackgroundColors = {\n    day: ['#87ceeb', '#b0d4f1'],\n    night: ['#0f1624', '#1f2937'],\n};\n\nexport class CloudyEffect extends WeatherEffect {\n    constructor(\n        ctx: RenderingContext2D,\n        width: number,\n        height: number,\n        private mode: TimeMode = 'day',\n        intensity: WeatherIntensity = 'moderate',\n        wind: number = 0\n    ) {\n        super(ctx, width, height, intensity, wind);\n\n        // 1. Background\n        const bgColors = this.mode === 'night' ? BACKGROUND_COLORS.night : BACKGROUND_COLORS.day;\n        this.elements.push(\n            new BackgroundElement(ctx, width, height, {\n                topColor: bgColors[0],\n                bottomColor: bgColors[1],\n            })\n        );\n\n        // 2. Stars (Night only)\n        if (this.mode === 'night') {\n            this.elements.push(new StarsElement(ctx, width, height));\n            this.elements.push(new ShootingStarsElement(ctx, width, height));\n        }\n\n        // 3. Sun/Moon\n        if (this.mode === 'day') {\n            this.elements.push(new SunElement(ctx, width, height));\n        } else {\n            this.elements.push(new MoonElement(ctx, width, height));\n        }\n\n        // 4. Clouds\n        const cloudCount = intensity === 'light' ? 3 : intensity === 'heavy' ? 7 : 5;\n        const opacityMin = intensity === 'light' ? 0.4 : 0.5;\n        const opacityMax = intensity === 'heavy' ? 0.9 : 0.8;\n\n        const cloudConfig: CloudConfig = {\n            count: cloudCount,\n            widthRange: [80, 120],\n            heightRange: [30, 40],\n            speedRange: [0.1, 0.3],\n            opacityRange: [opacityMin, opacityMax],\n            yRange: [0.1, 0.5],\n        };\n\n        const speedMult = this.intensityConfig.speed;\n        cloudConfig.speedRange = [cloudConfig.speedRange[0] * speedMult, cloudConfig.speedRange[1] * speedMult];\n\n        const cloudElement = new CloudElement(ctx, width, height, cloudConfig);\n        cloudElement.setMode(this.mode);\n        cloudElement.setWind(this.wind);\n        this.elements.push(cloudElement);\n    }\n\n    render(time: number): void {\n        this.renderElements(time);\n    }\n}\n","import { WeatherEffect } from './base';\nimport { RenderingContext2D, TimeMode, WeatherIntensity, BackgroundColors } from '../types';\nimport { BackgroundElement, CloudElement } from '../elements';\n\nconst BACKGROUND_COLORS: BackgroundColors = {\n    day: ['#778899', '#a0aec0'],\n    night: ['#0f1624', '#1f2937'],\n};\n\nexport class OvercastEffect extends WeatherEffect {\n    constructor(\n        ctx: RenderingContext2D,\n        width: number,\n        height: number,\n        private mode: TimeMode = 'day',\n        intensity: WeatherIntensity = 'moderate',\n        wind: number = 0\n    ) {\n        super(ctx, width, height, intensity, wind);\n\n        const bgColors = this.mode === 'night' ? BACKGROUND_COLORS.night : BACKGROUND_COLORS.day;\n        this.elements.push(\n            new BackgroundElement(ctx, width, height, {\n                topColor: bgColors[0],\n                bottomColor: bgColors[1],\n            })\n        );\n\n        const cloudElement = new CloudElement(ctx, width, height, {\n            count: 7,\n            widthRange: [100, 200],\n            heightRange: [60, 100],\n            speedRange: [0.05, 0.15],\n            opacityRange: [0.6, 1],\n            yRange: [0, 0.5],\n        });\n        cloudElement.setMode(this.mode);\n        cloudElement.setWind(this.wind);\n        this.elements.push(cloudElement);\n    }\n\n    render(time: number): void {\n        this.renderElements(time);\n    }\n}\n","import { WeatherEffect } from './base';\nimport { RenderingContext2D, TimeMode, WeatherIntensity, BackgroundColors } from '../types';\nimport { BackgroundElement, MoonElement, CloudElement, RainElement } from '../elements';\n\nconst BACKGROUND_COLORS: BackgroundColors = {\n    day: ['#4a5568', '#718096'],\n    night: ['#1a1a2e', '#16213e'],\n};\n\nexport class RainyEffect extends WeatherEffect {\n    constructor(\n        ctx: RenderingContext2D,\n        width: number,\n        height: number,\n        private mode: TimeMode = 'day',\n        intensity: WeatherIntensity = 'moderate',\n        wind: number = 0\n    ) {\n        super(ctx, width, height, intensity, wind);\n\n        // Background\n        const bgColors = this.mode === 'night' ? BACKGROUND_COLORS.night : BACKGROUND_COLORS.day;\n        this.elements.push(\n            new BackgroundElement(ctx, width, height, {\n                topColor: bgColors[0],\n                bottomColor: bgColors[1],\n            })\n        );\n\n        // Moon\n        this.elements.push(new MoonElement(ctx, width, height));\n\n        // Clouds\n        const cloudElement = new CloudElement(ctx, width, height, {\n            count: 3,\n            widthRange: [80, 200],\n            heightRange: [30, 70],\n            speedRange: [0.1, 0.4],\n            opacityRange: [0.5, 0.5],\n            yRange: [0, 0.4],\n        });\n        cloudElement.setMode(this.mode);\n        cloudElement.setWind(this.wind);\n        this.elements.push(cloudElement);\n\n        // Rain\n        const baseCount = 150;\n        const particleCount = this.getParticleCount(baseCount);\n        const rainElement = new RainElement(ctx, width, height, {\n            count: particleCount,\n            speed: this.getSpeed(8), // approximate average speed\n            opacity: 1,\n        });\n        rainElement.setWind(this.wind);\n        this.elements.push(rainElement);\n    }\n\n    render(time: number): void {\n        this.renderElements(time);\n    }\n}\n","import { WeatherEffect } from './base';\nimport { RenderingContext2D, TimeMode, WeatherIntensity, BackgroundColors } from '../types';\nimport { BackgroundElement, MoonElement, SnowElement } from '../elements';\n\nconst BACKGROUND_COLORS: BackgroundColors = {\n    day: ['#e0e7ef', '#f0f4f8'],\n    night: ['#1a2b4a', '#2d4563'],\n};\n\nexport class SnowyEffect extends WeatherEffect {\n    constructor(\n        ctx: RenderingContext2D,\n        width: number,\n        height: number,\n        private mode: TimeMode = 'day',\n        intensity: WeatherIntensity = 'moderate',\n        wind: number = 0\n    ) {\n        super(ctx, width, height, intensity, wind);\n\n        // Background\n        const bgColors = this.mode === 'night' ? BACKGROUND_COLORS.night : BACKGROUND_COLORS.day;\n        this.elements.push(\n            new BackgroundElement(ctx, width, height, {\n                topColor: bgColors[0],\n                bottomColor: bgColors[1],\n            })\n        );\n\n        // Snow\n        const baseCount = 4; // per frame emission\n        const snowflakeCount = this.getParticleCount(baseCount);\n\n        const snowElement = new SnowElement(ctx, width, height, {\n            count: snowflakeCount,\n            speed: this.getSpeed(2),\n            opacity: this.intensityConfig.opacity,\n        });\n        snowElement.setWind(this.wind);\n        this.elements.push(snowElement);\n\n        // Moon\n        this.elements.push(new MoonElement(ctx, width, height));\n    }\n\n    render(time: number): void {\n        this.renderElements(time);\n    }\n}\n","import { WeatherEffect } from './base';\nimport { RenderingContext2D, TimeMode, WeatherIntensity, BackgroundColors } from '../types';\nimport { BackgroundElement, MoonElement, FogElement } from '../elements';\n\nconst BACKGROUND_COLORS: BackgroundColors = {\n    day: ['#b8a58e', '#d4c5b0'],\n    night: ['#2d2416', '#3d3020'],\n};\n\nexport class HazeEffect extends WeatherEffect {\n    constructor(\n        ctx: RenderingContext2D,\n        width: number,\n        height: number,\n        private mode: TimeMode = 'day',\n        intensity: WeatherIntensity = 'moderate',\n        wind: number = 0\n    ) {\n        super(ctx, width, height, intensity, wind);\n\n        const bgColors = this.mode === 'night' ? BACKGROUND_COLORS.night : BACKGROUND_COLORS.day;\n        this.elements.push(\n            new BackgroundElement(ctx, width, height, {\n                topColor: bgColors[0],\n                bottomColor: bgColors[1],\n            })\n        );\n\n        this.elements.push(new MoonElement(ctx, width, height));\n\n        const baseCount = 50;\n        const particleCount = this.getParticleCount(baseCount);\n        const fogElement = new FogElement(ctx, width, height, {\n            count: particleCount,\n            color: '150, 130, 100',\n        });\n        fogElement.setWind(this.wind);\n        this.elements.push(fogElement);\n    }\n\n    render(time: number): void {\n        this.renderElements(time);\n    }\n}\n","import { WeatherEffect } from './base';\nimport { RenderingContext2D, TimeMode, WeatherIntensity, BackgroundColors } from '../types';\nimport { BackgroundElement, MoonElement, FogElement } from '../elements';\n\nconst BACKGROUND_COLORS: BackgroundColors = {\n    day: ['#c0c5ce', '#dfe3e8'],\n    night: ['#1c2128', '#2d3748'],\n};\n\nexport class FoggyEffect extends WeatherEffect {\n    constructor(\n        ctx: RenderingContext2D,\n        width: number,\n        height: number,\n        private mode: TimeMode = 'day',\n        intensity: WeatherIntensity = 'moderate',\n        wind: number = 0\n    ) {\n        super(ctx, width, height, intensity, wind);\n\n        const bgColors = this.mode === 'night' ? BACKGROUND_COLORS.night : BACKGROUND_COLORS.day;\n        this.elements.push(\n            new BackgroundElement(ctx, width, height, {\n                topColor: bgColors[0],\n                bottomColor: bgColors[1],\n            })\n        );\n\n        this.elements.push(new MoonElement(ctx, width, height));\n\n        const baseCount = 50;\n        const particleCount = this.getParticleCount(baseCount);\n        const fogElement = new FogElement(ctx, width, height, {\n            count: particleCount,\n            color: '180, 190, 200',\n        });\n        fogElement.setWind(this.wind);\n        this.elements.push(fogElement);\n    }\n\n    render(time: number): void {\n        this.renderElements(time);\n    }\n}\n","import { WeatherEffect } from './base';\nimport { RenderingContext2D, TimeMode, WeatherIntensity, BackgroundColors } from '../types';\nimport { BackgroundElement, MoonElement, CloudElement, RainElement, LightningElement } from '../elements';\n\nconst BACKGROUND_COLORS: BackgroundColors = {\n    day: ['#4a5568', '#718096'],\n    night: ['#1a1a2e', '#16213e'],\n};\n\nexport class ThunderstormEffect extends WeatherEffect {\n    constructor(\n        ctx: RenderingContext2D,\n        width: number,\n        height: number,\n        private mode: TimeMode = 'day',\n        intensity: WeatherIntensity = 'moderate',\n        wind: number = 0\n    ) {\n        super(ctx, width, height, intensity, wind);\n\n        const bgColors = this.mode === 'night' ? BACKGROUND_COLORS.night : BACKGROUND_COLORS.day;\n        this.elements.push(\n            new BackgroundElement(ctx, width, height, {\n                topColor: bgColors[0],\n                bottomColor: bgColors[1],\n            })\n        );\n\n        this.elements.push(new MoonElement(ctx, width, height));\n\n        const cloudElement = new CloudElement(ctx, width, height, {\n            count: 3,\n            widthRange: [80, 200],\n            heightRange: [30, 70],\n            speedRange: [0.1, 0.4],\n            opacityRange: [0.5, 0.5],\n            yRange: [0, 0.4],\n        });\n        cloudElement.setMode(this.mode);\n        cloudElement.setWind(this.wind);\n        this.elements.push(cloudElement);\n\n        const baseCount = 150;\n        const particleCount = this.getParticleCount(baseCount);\n        const rainElement = new RainElement(ctx, width, height, {\n            count: particleCount,\n            speed: this.getSpeed(8),\n            opacity: 1,\n        });\n        rainElement.setWind(this.wind);\n        this.elements.push(rainElement);\n\n        this.elements.push(new LightningElement(ctx, width, height));\n    }\n\n    render(time: number): void {\n        this.renderElements(time);\n    }\n}\n","import { WeatherEffect } from './base';\nimport { RenderingContext2D, TimeMode, WeatherIntensity, CustomWeatherConfig, ElementConfig } from '../types';\nimport {\n    BackgroundElement,\n    SunElement,\n    MoonElement,\n    StarsElement,\n    ShootingStarsElement,\n    CloudElement,\n    RainElement,\n    SnowElement,\n    FogElement,\n    LightningElement,\n} from '../elements';\n\nexport class CustomEffect extends WeatherEffect {\n    private config: CustomWeatherConfig;\n    private mode: TimeMode;\n\n    constructor(\n        ctx: RenderingContext2D,\n        width: number,\n        height: number,\n        config: CustomWeatherConfig,\n        mode: TimeMode = 'day',\n        intensity: WeatherIntensity = 'moderate',\n        wind: number = 0\n    ) {\n        super(ctx, width, height, intensity, wind);\n        this.config = config;\n        this.mode = mode;\n\n        this.initializeElements();\n    }\n\n    private initializeElements(): void {\n        // 1. Background\n        const bgColors = this.mode === 'night' ? this.config.background.night : this.config.background.day;\n\n        // Always add background first if configured (it's usually implicit in the config structure)\n        this.elements.push(\n            new BackgroundElement(this.ctx, this.width, this.height, {\n                topColor: bgColors[0],\n                bottomColor: bgColors[1],\n            })\n        );\n\n        // 2. Other Elements\n        this.config.elements.forEach(elConfig => {\n            // Check mode restriction\n            if (elConfig.modes && !elConfig.modes.includes(this.mode)) {\n                return;\n            }\n\n            this.addElement(elConfig);\n        });\n    }\n\n    private addElement(config: ElementConfig): void {\n        switch (config.type) {\n            case 'sun':\n                this.elements.push(new SunElement(this.ctx, this.width, this.height));\n                break;\n            case 'moon':\n                this.elements.push(new MoonElement(this.ctx, this.width, this.height, config.options));\n                break;\n            case 'stars':\n                this.elements.push(new StarsElement(this.ctx, this.width, this.height, config.options || {}));\n                break;\n            case 'shooting-stars':\n                this.elements.push(new ShootingStarsElement(this.ctx, this.width, this.height, config.options));\n                break;\n            case 'cloud':\n                {\n                    const cloudEl = new CloudElement(this.ctx, this.width, this.height, config.options);\n                    cloudEl.setMode(this.mode);\n                    cloudEl.setWind(this.wind);\n                    this.elements.push(cloudEl);\n                }\n                break;\n            case 'rain':\n                {\n                    const rainEl = new RainElement(this.ctx, this.width, this.height, config.options);\n                    rainEl.setWind(this.wind);\n                    this.elements.push(rainEl);\n                }\n                break;\n            case 'snow':\n                {\n                    const snowEl = new SnowElement(this.ctx, this.width, this.height, config.options);\n                    snowEl.setWind(this.wind);\n                    this.elements.push(snowEl);\n                }\n                break;\n            case 'fog':\n                {\n                    const fogEl = new FogElement(this.ctx, this.width, this.height, config.options);\n                    fogEl.setWind(this.wind);\n                    this.elements.push(fogEl);\n                }\n                break;\n            case 'lightning':\n                this.elements.push(new LightningElement(this.ctx, this.width, this.height, config.options || {}));\n                break;\n            case 'background':\n                // Background is handled separately at start of init\n                break;\n        }\n    }\n\n    render(time: number): void {\n        this.renderElements(time);\n    }\n}\n","import {\n    WeatherType,\n    TimeMode,\n    RenderOptions,\n    WeatherIntensity,\n    RenderingContext2D,\n    CustomWeatherConfig,\n} from './types';\nimport {\n    SunnyEffect,\n    CloudyEffect,\n    OvercastEffect,\n    RainyEffect,\n    SnowyEffect,\n    HazeEffect,\n    FoggyEffect,\n    ThunderstormEffect,\n    WeatherEffect,\n    CustomEffect,\n} from './effects';\n\n/**\n * Main weather Canvas renderer class\n */\nexport class WeatherCanvasRenderer {\n    private canvas: HTMLCanvasElement | OffscreenCanvas;\n    private ctx: RenderingContext2D;\n    private width: number;\n    private height: number;\n    private fps: number;\n    private frameInterval: number;\n    private animationId: number | null = null;\n    private lastFrameTime = 0;\n\n    private currentWeather: WeatherType = 'sunny';\n    private currentMode: TimeMode = 'day';\n    private currentIntensity: WeatherIntensity = 'moderate';\n    private currentEffect: WeatherEffect | null = null;\n    private currentWind: number = 0;\n\n    private effectMap: Map<string, WeatherEffect> = new Map();\n    private customWeatherMap: Map<string, CustomWeatherConfig> = new Map();\n\n    /**\n     * Constructor\n     * @param canvas Canvas DOM element\n     * @param options Configuration options\n     */\n    constructor(canvas: HTMLCanvasElement | OffscreenCanvas, options?: RenderOptions) {\n        this.canvas = canvas;\n        const ctx = canvas.getContext('2d');\n        if (!ctx) {\n            throw new Error('Failed to get 2D context from canvas');\n        }\n        this.ctx = ctx;\n\n        this.width = options?.width || canvas.width || 700;\n        this.height = options?.height || canvas.height || 400;\n        this.fps = options?.fps || 60;\n        this.currentWind = options?.wind || 0;\n        this.frameInterval = 1000 / this.fps;\n\n        this.canvas.width = this.width;\n        this.canvas.height = this.height;\n\n        this.initializeEffects();\n    }\n\n    /**\n     * Initialize all weather effects\n     */\n    private initializeEffects(): void {\n        const weatherTypes: WeatherType[] = [\n            'sunny',\n            'cloudy',\n            'overcast',\n            'rainy',\n            'snowy',\n            'haze',\n            'foggy',\n            'thunderstorm',\n        ];\n\n        weatherTypes.forEach(type => {\n            ['day', 'night'].forEach(mode => {\n                ['light', 'moderate', 'heavy'].forEach(intensity => {\n                    const effect = this.createEffect(type, mode as TimeMode, intensity as WeatherIntensity);\n                    if (effect) {\n                        const key = `${type}_${mode}_${intensity}`;\n                        this.effectMap.set(key, effect);\n                    }\n                });\n            });\n        });\n\n        // Re-initialize custom effects if any exist (useful when resizing)\n        this.customWeatherMap.forEach((config, name) => {\n            ['day', 'night'].forEach(mode => {\n                ['light', 'moderate', 'heavy'].forEach(intensity => {\n                    const effect = new CustomEffect(\n                        this.ctx,\n                        this.width,\n                        this.height,\n                        config,\n                        mode as TimeMode,\n                        intensity as WeatherIntensity,\n                        this.currentWind\n                    );\n                    const key = `${name}_${mode}_${intensity}`;\n                    this.effectMap.set(key, effect);\n                });\n            });\n        });\n    }\n\n    /**\n     * Create effect instance for specified weather, time mode and intensity\n     */\n    private createEffect(weatherType: WeatherType, mode: TimeMode, intensity: WeatherIntensity): WeatherEffect | null {\n        // Check custom weather first\n        if (this.customWeatherMap.has(weatherType as string)) {\n            const config = this.customWeatherMap.get(weatherType as string)!;\n            return new CustomEffect(this.ctx, this.width, this.height, config, mode, intensity, this.currentWind);\n        }\n\n        switch (weatherType) {\n            case 'sunny':\n                return new SunnyEffect(this.ctx, this.width, this.height, mode, intensity, this.currentWind);\n            case 'cloudy':\n                return new CloudyEffect(this.ctx, this.width, this.height, mode, intensity, this.currentWind);\n            case 'overcast':\n                return new OvercastEffect(this.ctx, this.width, this.height, mode, intensity, this.currentWind);\n            case 'rainy':\n                return new RainyEffect(this.ctx, this.width, this.height, mode, intensity, this.currentWind);\n            case 'snowy':\n                return new SnowyEffect(this.ctx, this.width, this.height, mode, intensity, this.currentWind);\n            case 'haze':\n                return new HazeEffect(this.ctx, this.width, this.height, mode, intensity, this.currentWind);\n            case 'foggy':\n                return new FoggyEffect(this.ctx, this.width, this.height, mode, intensity, this.currentWind);\n            case 'thunderstorm':\n                return new ThunderstormEffect(this.ctx, this.width, this.height, mode, intensity, this.currentWind);\n            default:\n                return null;\n        }\n    }\n\n    /**\n     * Register a custom weather effect configuration\n     * @param name Unique name for the weather effect\n     * @param config Configuration object defining the elements and background\n     */\n    registerWeather(name: string, config: CustomWeatherConfig): void {\n        this.customWeatherMap.set(name, config);\n        // Pre-generate effects for this new type\n        ['day', 'night'].forEach(mode => {\n            ['light', 'moderate', 'heavy'].forEach(intensity => {\n                const effect = new CustomEffect(\n                    this.ctx,\n                    this.width,\n                    this.height,\n                    config,\n                    mode as TimeMode,\n                    intensity as WeatherIntensity,\n                    this.currentWind\n                );\n                const key = `${name}_${mode}_${intensity}`;\n                this.effectMap.set(key, effect);\n            });\n        });\n    }\n\n    /**\n     * Render specified weather, time mode and intensity\n     */\n    render(weatherType: WeatherType, mode: TimeMode, intensity: WeatherIntensity = 'moderate'): void {\n        this.currentWeather = weatherType;\n        this.currentMode = mode;\n        this.currentIntensity = intensity;\n\n        const key = `${weatherType}_${mode}_${intensity}`;\n        let effect = this.effectMap.get(key);\n\n        if (!effect) {\n            const newEffect = this.createEffect(weatherType, mode, intensity);\n            if (newEffect) {\n                this.effectMap.set(key, newEffect);\n                effect = newEffect;\n            } else {\n                // Fallback to sunny if type not found\n                console.warn(`Weather type '${weatherType}' not found, falling back to sunny.`);\n                const fallbackKey = `sunny_${mode}_${intensity}`;\n                effect = this.effectMap.get(fallbackKey);\n                if (!effect) {\n                    effect = new SunnyEffect(this.ctx, this.width, this.height, mode, intensity, this.currentWind);\n                    this.effectMap.set(fallbackKey, effect);\n                }\n            }\n        }\n\n        this.currentEffect = effect!;\n        this.currentEffect.setWind(this.currentWind);\n    }\n\n    /**\n     * Start animation loop\n     */\n    start(): void {\n        if (this.animationId === null) {\n            this.animate();\n        }\n    }\n\n    /**\n     * Stop animation loop\n     */\n    stop(): void {\n        if (this.animationId !== null) {\n            cancelAnimationFrame(this.animationId);\n            this.animationId = null;\n        }\n    }\n\n    /**\n     * Main animation loop\n     */\n    private animate = (timestamp = 0): void => {\n        if (timestamp - this.lastFrameTime >= this.frameInterval) {\n            this.update();\n            this.draw();\n            this.lastFrameTime = timestamp;\n        }\n        this.animationId = requestAnimationFrame(this.animate);\n    };\n\n    /**\n     * Update animation state\n     */\n    private update(): void {\n        if (this.currentEffect) {\n            this.currentEffect.update();\n        }\n    }\n\n    /**\n     * Draw frame\n     */\n    private draw(): void {\n        this.ctx.clearRect(0, 0, this.width, this.height);\n        if (this.currentEffect) {\n            this.currentEffect.render(this.lastFrameTime);\n        }\n    }\n\n    /**\n     * Set Canvas size\n     */\n    setSize(width: number, height: number): void {\n        this.width = width;\n        this.height = height;\n        this.canvas.width = width;\n        this.canvas.height = height;\n\n        this.effectMap.clear();\n        this.initializeEffects();\n\n        // Re-apply current weather to generate currentEffect\n        this.render(this.currentWeather, this.currentMode, this.currentIntensity);\n    }\n\n    /**\n     * Change weather type\n     */\n    setWeatherType(weatherType: WeatherType): void {\n        this.render(weatherType, this.currentMode, this.currentIntensity);\n    }\n\n    /**\n     * Change time mode\n     */\n    setMode(mode: TimeMode): void {\n        this.render(this.currentWeather, mode, this.currentIntensity);\n    }\n\n    /**\n     * Change weather intensity\n     */\n    setIntensity(intensity: WeatherIntensity): void {\n        this.render(this.currentWeather, this.currentMode, intensity);\n    }\n\n    /**\n     * Change wind speed\n     */\n    setWind(wind: number): void {\n        this.currentWind = wind;\n        if (this.currentEffect) {\n            this.currentEffect.setWind(wind);\n        }\n    }\n\n    /**\n     * Clear Canvas\n     */\n    clear(): void {\n        this.ctx.clearRect(0, 0, this.width, this.height);\n    }\n\n    /**\n     * Destroy instance\n     */\n    destroy(): void {\n        this.stop();\n        this.clear();\n        this.effectMap.clear();\n        this.currentEffect = null;\n    }\n\n    getWeatherType(): WeatherType {\n        return this.currentWeather;\n    }\n\n    getMode(): TimeMode {\n        return this.currentMode;\n    }\n\n    getIntensity(): WeatherIntensity {\n        return this.currentIntensity;\n    }\n\n    getWind(): number {\n        return this.currentWind;\n    }\n\n    getCanvas(): HTMLCanvasElement | OffscreenCanvas {\n        return this.canvas;\n    }\n\n    getWidth(): number {\n        return this.width;\n    }\n\n    getHeight(): number {\n        return this.height;\n    }\n}\n\nexport default WeatherCanvasRenderer;\n","import { WeatherCanvasRenderer } from './renderer';\nimport { WeatherType, TimeMode, WeatherIntensity, CustomWeatherConfig } from './types';\n\nconst DEFAULT_WIDTH = 700;\nconst DEFAULT_HEIGHT = 400;\n\nexport class WeatherCanvas extends HTMLElement {\n    private renderer: WeatherCanvasRenderer | null = null;\n    private canvas: HTMLCanvasElement | null = null;\n    private shadow: ShadowRoot;\n\n    constructor() {\n        super();\n        this.shadow = this.attachShadow({ mode: 'open' });\n        this.shadow.innerHTML = `\n            <style>\n                :host {\n                    display: inline-block;\n                    width: fit-content;\n                    height: fit-content;\n                    overflow: hidden;\n                    line-height: 0;\n                }\n                canvas {\n                    width: 100%;\n                    height: 100%;\n                }\n            </style>\n        `;\n    }\n\n    connectedCallback() {\n        if (!this.canvas) {\n            this.canvas = document.createElement('canvas');\n            this.shadow.appendChild(this.canvas);\n        }\n\n        const width = this.getAttribute('width');\n        const height = this.getAttribute('height');\n\n        const canvasWidth = parseInt(width ?? '' + DEFAULT_WIDTH, 10);\n        const canvasHeight = parseInt(height ?? '' + DEFAULT_HEIGHT, 10);\n\n        this.canvas.width = canvasWidth;\n        this.canvas.height = canvasHeight;\n\n        this.renderer = new WeatherCanvasRenderer(this.canvas);\n\n        const weatherType = (this.getAttribute('weather-type') || 'sunny') as WeatherType;\n        const timeMode = (this.getAttribute('time-mode') || 'day') as TimeMode;\n        const intensity = (this.getAttribute('intensity') || 'moderate') as WeatherIntensity;\n        const wind = parseFloat(this.getAttribute('wind') || '0');\n\n        this.renderer.setWind(wind);\n        this.renderer.render(weatherType, timeMode, intensity);\n        this.renderer.start();\n    }\n\n    disconnectedCallback() {\n        if (this.renderer) {\n            this.renderer.destroy();\n            this.renderer = null;\n        }\n    }\n\n    static get observedAttributes() {\n        return ['weather-type', 'time-mode', 'intensity', 'width', 'height', 'wind'];\n    }\n\n    attributeChangedCallback(name: string, oldValue: string, newValue: string) {\n        if (!this.renderer) {\n            return;\n        }\n\n        switch (name) {\n            case 'weather-type':\n                this.renderer.setWeatherType(newValue as WeatherType);\n                break;\n            case 'time-mode':\n                this.renderer.setMode(newValue as TimeMode);\n                break;\n            case 'intensity':\n                this.renderer.setIntensity(newValue as WeatherIntensity);\n                break;\n            case 'width':\n                if (this.canvas) {\n                    this.canvas.width = parseInt(newValue, 10);\n                    this.renderer?.setSize(this.canvas.width, this.canvas.height);\n                }\n                break;\n            case 'height':\n                if (this.canvas) {\n                    this.canvas.height = parseInt(newValue, 10);\n                    this.renderer?.setSize(this.canvas.width, this.canvas.height);\n                }\n                break;\n            case 'wind':\n                this.renderer.setWind(parseFloat(newValue));\n                break;\n        }\n    }\n    start() {\n        this.renderer?.start();\n    }\n    stop() {\n        this.renderer?.stop();\n    }\n    registerCustomWeather(name: string, config: CustomWeatherConfig) {\n        this.renderer?.registerWeather(name, config);\n    }\n}\n\ncustomElements.define('weather-canvas', WeatherCanvas);\n"],"mappings":"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","names":["BACKGROUND_COLORS","BACKGROUND_COLORS","BACKGROUND_COLORS","BACKGROUND_COLORS","BACKGROUND_COLORS","BACKGROUND_COLORS","BACKGROUND_COLORS"]}